From 35fcfb89c1029d18b5e17152c074bd2fab10de90 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 14 Sep 2022 01:58:52 -0700 Subject: [PATCH 001/384] Remove obsolete fragment identifier from IDE manual download link The Arduino IDE has an auto update capability. A new version is checked for on every startup, and if available the user is offered an update. Although this update can usually be done automatically by the IDE, under some conditions this is not possible. For example: - The IDE package in use does not support auto update (i.e., Linux ZIP package) - The file could not be downloaded due to a transient network service outage In this case, the user is presented with a friendly dialog that explains the situation and links to the "Software" page on arduino.cc, where the user can manually download and install the new version. During the pre-release development phase of the project, the download links for Arduino IDE 2.x were on a sub-section of the "Software" page. For this reason, the linked URL included the fragment identifier `#experimental-software` so that the page would load scrolled down to the anchor at that section of the page. With the 2.0.0 release, the Arduino IDE 2.x project has graduated to a production development phase. For this reason, the download links have been moved to the top of the "Software" page and the now inaccurate `experimental-software` anchor removed from the page. The previous link with that fragment is still perfectly functional, but the fragment to a non-existent anchor serves no purpose and also miscommunicates the project status to users who notice the URL that was loaded. For this reason, it is hereby removed from the link. --- .../src/browser/dialogs/ide-updater/ide-updater-dialog.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index 06e357e8c..7dc2d7347 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -20,8 +20,7 @@ import { import { LocalStorageService } from '@theia/core/lib/browser'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; -const DOWNLOAD_PAGE_URL = - 'https://www.arduino.cc/en/software#experimental-software'; +const DOWNLOAD_PAGE_URL = 'https://www.arduino.cc/en/software'; @injectable() export class IDEUpdaterDialogWidget extends ReactWidget { From 5f82577bc19fa38a3f24fa27c1c2f6a01a977083 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 5 Sep 2022 19:24:11 +0200 Subject: [PATCH 002/384] Can send message to the monitor with `Enter`. Removed the required `Ctrl/Cmd` modifier. Closes #572 Signed-off-by: Akos Kitta --- .../browser/serial/monitor/serial-monitor-send-input.tsx | 8 +++----- i18n/en.json | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx index 180949726..f96636455 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx @@ -1,7 +1,6 @@ import * as React from '@theia/core/shared/react'; import { Key, KeyCode } from '@theia/core/lib/browser/keys'; import { Board } from '../../../common/protocol/boards-service'; -import { isOSX } from '@theia/core/lib/common/os'; import { DisposableCollection, nls } from '@theia/core/lib/common'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; @@ -81,8 +80,7 @@ export class SerialMonitorSendInput extends React.Component< const port = this.props.boardsServiceProvider.boardsConfig.selectedPort; return nls.localize( 'arduino/serial/message', - "Message ({0} + Enter to send message to '{1}' on '{2}')", - isOSX ? '⌘' : nls.localize('vscode/keybindingLabels/ctrlKey', 'Ctrl'), + "Message (Enter to send message to '{0}' on '{1}')", board ? Board.toString(board, { useFqbn: false, @@ -110,8 +108,8 @@ export class SerialMonitorSendInput extends React.Component< protected onKeyDown(event: React.KeyboardEvent): void { const keyCode = KeyCode.createKeyCode(event.nativeEvent); if (keyCode) { - const { key, meta, ctrl } = keyCode; - if (key === Key.ENTER && ((isOSX && meta) || (!isOSX && ctrl))) { + const { key } = keyCode; + if (key === Key.ENTER) { this.onSend(); } } diff --git a/i18n/en.json b/i18n/en.json index af2a8730b..cd6a7a2b7 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", From d07d83fdfe2d3a841a27763ba9bb871783782d82 Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 9 Sep 2022 20:54:57 -0700 Subject: [PATCH 003/384] Move development documentation to a more suitable location Previously, information about project development was stored in a file named BUILDING.md in the root of the repository. That content is hereby moved to the file docs/development.md. This will provide the following benefits: - Broaden the scope of the file to all information related to development rather than building only - Store all documentation content under a single folder instead of randomly putting some in the root and others under docs --- BUILDING.md | 121 +------------------------------------------ README.md | 2 +- docs/development.md | 120 ++++++++++++++++++++++++++++++++++++++++++ docs/internal/Arm.md | 2 +- 4 files changed, 124 insertions(+), 121 deletions(-) create mode 100644 docs/development.md diff --git a/BUILDING.md b/BUILDING.md index b70bd0540..95c05f8f6 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1,120 +1,3 @@ -# Development - -This page includes technical documentation for developers who want to build the IDE locally and contribute to the project. - -## Architecture overview - -The IDE consists of three major parts: - - the _Electron main_ process, - - the _backend_, and - - the _frontend_. - -The _Electron main_ process is responsible for: - - creating the application, - - managing the application lifecycle via listeners, and - - creating and managing the web pages for the app. - -In Electron, the process that runs the main entry JavaScript file is called the main process. The _Electron main_ process can display a GUI by creating web pages. An Electron app always has exactly one main process. - -By default, whenever the _Electron main_ process creates a web page, it will instantiate a new `BrowserWindow` instance. Since Electron uses Chromium for displaying web pages, Chromium's multi-process architecture is also used. Each web page in Electron runs in its own process, which is called the renderer process. Each `BrowserWindow` instance runs the web page in its own renderer process. When a `BrowserWindow` instance is destroyed, the corresponding renderer process is also terminated. The main process manages all web pages and their corresponding renderer processes. Each renderer process is isolated and only cares about the web page running in it.[[1]] - -In normal browsers, web pages usually run in a sandboxed environment, and accessing native resources are disallowed. However, Electron has the power to use Node.js APIs in the web pages allowing lower-level OS interactions. Due to security reasons, accessing native resources is an undesired behavior in the IDE. So by convention, we do not use Node.js APIs. (Note: the Node.js integration is [not yet disabled](https://github.com/eclipse-theia/theia/issues/2018) although it is not used). In the IDE, only the _backend_ allows OS interaction. - -The _backend_ process is responsible for: - - providing access to the filesystem, - - communicating with the [Arduino CLI](https://github.com/arduino/arduino-cli) via gRPC, - - running your terminal, - - exposing additional RESTful APIs, - - performing the Git commands in the local repositories, - - hosting and running any VS Code extensions, or - - executing VS Code tasks[[2]]. - -The _Electron main_ process spawns the _backend_ process. There is always exactly one _backend_ process. However, due to performance considerations, the _backend_ spawns several sub-processes for the filesystem watching, Git repository discovery, etc. The communication between the _backend_ process and its sub-processes is established via IPC. Besides spawning sub-processes, the _backend_ will start an HTTP server on a random available port, and serves the web application as static content. When the sub-processes are up and running, and the HTTP server is also listening, the _backend_ process sends the HTTP server port to the _Electron main_ process via IPC. The _Electron main_ process will load the _backend_'s endpoint in the `BrowserWindow`. - -The _frontend_ is running as an Electron renderer process and can invoke services implemented on the _backend_. The communication between the _backend_ and the _frontend_ is done via JSON-RPC over a websocket connection. This means, the services running in the _frontend_ are all proxies, and will ask the corresponding service implementation on the _backend_. - -[1]: https://www.electronjs.org/docs/tutorial/application-architecture#differences-between-main-process-and-renderer-process -[2]: https://code.visualstudio.com/Docs/editor/tasks - - -## Build from source - -If you’re familiar with TypeScript, the [Theia IDE](https://theia-ide.org/), and if you want to contribute to the -project, you should be able to build the Arduino IDE locally. -Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites) documentation for the setup instructions. -> **Note**: Node.js 14 must be used instead of the version 12 recommended at the link above. - -Once you have all the tools installed, you can build the editor following these steps - -1. Install the dependencies and build - ```sh - yarn - ``` - -2. Rebuild the dependencies - ```sh - yarn rebuild:browser - ``` - -3. Rebuild the electron dependencies - ```sh - yarn rebuild:electron - ``` - -4. Start the application - ```sh - yarn start - ``` - -### Notes for Windows contributors -Windows requires the Microsoft Visual C++ (MSVC) compiler toolset to be installed on your development machine. - -In case it's not already present, it can be downloaded from the "**Tools for Visual Studio 20XX**" section of the Visual Studio [downloads page](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) via the "**Build Tools for Visual Studio 20XX**" (e.g., "**Build Tools for Visual Studio 2022**") download link. - -Select "**Desktop development with C++**" from the "**Workloads**" tab during the installation procedure. - -### CI - -This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide/actions). - - - _Snapshot_ builds run when changes are pushed to the `main` branch, or when a PR is created against the `main` branch. For the sake of the review and verification process, the build artifacts for each operating system can be downloaded from the GitHub Actions page. - - _Nightly_ builds run every day at 03:00 GMT from the `main` branch. - - _Release_ builds run when a new tag is pushed to the remote. The tag must follow the [semver](https://semver.org/). For instance, `1.2.3` is a correct tag, but `v2.3.4` won't work. Steps to trigger a new release build: - - Create a local tag: - ```sh - git tag -a 1.2.3 -m "Creating a new tag for the `1.2.3` release." - ``` - - Push it to the remote: - ```sh - git push origin 1.2.3 - ``` - -## Notes for macOS contributors -Beginning in macOS 10.14.5, the software [must be notarized to run](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution). The signing and notarization processes for the Arduino IDE are managed by our Continuous Integration (CI) workflows, implemented with GitHub Actions. On every push and pull request, the Arduino IDE is built and saved to a workflow artifact. These artifacts can be used by contributors and beta testers who don't want to set up a build system locally. -For security reasons, signing and notarization are disabled for workflow runs for pull requests from forks of this repository. This means that macOS will block you from running those artifacts. -Due to this limitation, Mac users have two options for testing contributions from forks: - -### The Safe approach (recommended) - -Follow [the instructions above](#build-from-source) to create the build environment locally, then build the code you want to test. - -### The Risky approach - -*Please note that this approach is risky as you are lowering the security on your system, therefore we strongly discourage you from following it.* -1. Use [this guide](https://help.apple.com/xcode/mac/10.2/index.html?localePath=en.lproj#/dev9b7736b0e), in order to disable Gatekeeper (at your own risk!). -1. Download the unsigned artifact provided by the CI workflow run related to the Pull Request at each push. -1. Re-enable Gatekeeper after tests are done, following the guide linked above. - -## FAQ - -* *Can I manually change the version of the [`arduino-cli`](https://github.com/arduino/arduino-cli/) used by the IDE?* - - Yes. It is possible but not recommended. The CLI exposes a set of functionality via [gRPC](https://github.com/arduino/arduino-cli/tree/master/rpc) and the IDE uses this API to communicate with the CLI. Before we build a new version of IDE, we pin a specific version of CLI and use the corresponding `proto` files to generate TypeScript modules for gRPC. This means, a particular version of IDE is compliant only with the pinned version of CLI. Mismatching IDE and CLI versions might not be able to communicate with each other. This could cause unpredictable IDE behavior. - -* *I have understood that not all versions of the CLI are compatible with my version of IDE but how can I manually update the `arduino-cli` inside the IDE?* - - [Get](https://arduino.github.io/arduino-cli/installation) the desired version of `arduino-cli` for your platform and manually replace the one inside the IDE. The CLI can be found inside the IDE at: - - Windows: `C:\path\to\Arduino IDE\resources\app\node_modules\arduino-ide-extension\build\arduino-cli.exe`, - - macOS: `/path/to/Arduino IDE.app/Contents/Resources/app/node_modules/arduino-ide-extension/build/arduino-cli`, and - - Linux: `/path/to/Arduino IDE/resources/app/node_modules/arduino-ide-extension/build/arduino-cli`. +# Development Guide +This documentation has been moved [**here**](docs/development.md#development-guide). diff --git a/README.md b/README.md index 324da2691..cb19f42fe 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ 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 -See the [BUILDING.md](BUILDING.md) for a technical overview of the application and instructions for building the code. +See the [development guide](docs/development.md) for a technical overview of the application and instructions for building the code. You can help with the translation of the Arduino IDE to your language here: [Arduino IDE on Transifex](https://www.transifex.com/arduino-1/ide2/dashboard/). diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 000000000..2edfd0e59 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,120 @@ +# Development Guide + +This page includes technical documentation for developers who want to build the IDE locally and contribute to the project. + +## Architecture overview + +The IDE consists of three major parts: + - the _Electron main_ process, + - the _backend_, and + - the _frontend_. + +The _Electron main_ process is responsible for: + - creating the application, + - managing the application lifecycle via listeners, and + - creating and managing the web pages for the app. + +In Electron, the process that runs the main entry JavaScript file is called the main process. The _Electron main_ process can display a GUI by creating web pages. An Electron app always has exactly one main process. + +By default, whenever the _Electron main_ process creates a web page, it will instantiate a new `BrowserWindow` instance. Since Electron uses Chromium for displaying web pages, Chromium's multi-process architecture is also used. Each web page in Electron runs in its own process, which is called the renderer process. Each `BrowserWindow` instance runs the web page in its own renderer process. When a `BrowserWindow` instance is destroyed, the corresponding renderer process is also terminated. The main process manages all web pages and their corresponding renderer processes. Each renderer process is isolated and only cares about the web page running in it.[[1]] + +In normal browsers, web pages usually run in a sandboxed environment, and accessing native resources are disallowed. However, Electron has the power to use Node.js APIs in the web pages allowing lower-level OS interactions. Due to security reasons, accessing native resources is an undesired behavior in the IDE. So by convention, we do not use Node.js APIs. (Note: the Node.js integration is [not yet disabled](https://github.com/eclipse-theia/theia/issues/2018) although it is not used). In the IDE, only the _backend_ allows OS interaction. + +The _backend_ process is responsible for: + - providing access to the filesystem, + - communicating with the [Arduino CLI](https://github.com/arduino/arduino-cli) via gRPC, + - running your terminal, + - exposing additional RESTful APIs, + - performing the Git commands in the local repositories, + - hosting and running any VS Code extensions, or + - executing VS Code tasks[[2]]. + +The _Electron main_ process spawns the _backend_ process. There is always exactly one _backend_ process. However, due to performance considerations, the _backend_ spawns several sub-processes for the filesystem watching, Git repository discovery, etc. The communication between the _backend_ process and its sub-processes is established via IPC. Besides spawning sub-processes, the _backend_ will start an HTTP server on a random available port, and serves the web application as static content. When the sub-processes are up and running, and the HTTP server is also listening, the _backend_ process sends the HTTP server port to the _Electron main_ process via IPC. The _Electron main_ process will load the _backend_'s endpoint in the `BrowserWindow`. + +The _frontend_ is running as an Electron renderer process and can invoke services implemented on the _backend_. The communication between the _backend_ and the _frontend_ is done via JSON-RPC over a websocket connection. This means, the services running in the _frontend_ are all proxies, and will ask the corresponding service implementation on the _backend_. + +[1]: https://www.electronjs.org/docs/tutorial/application-architecture#differences-between-main-process-and-renderer-process +[2]: https://code.visualstudio.com/Docs/editor/tasks + + +## Build from source + +If you’re familiar with TypeScript, the [Theia IDE](https://theia-ide.org/), and if you want to contribute to the +project, you should be able to build the Arduino IDE locally. +Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites) documentation for the setup instructions. +> **Note**: Node.js 14 must be used instead of the version 12 recommended at the link above. + +Once you have all the tools installed, you can build the editor following these steps + +1. Install the dependencies and build + ```sh + yarn + ``` + +2. Rebuild the dependencies + ```sh + yarn rebuild:browser + ``` + +3. Rebuild the electron dependencies + ```sh + yarn rebuild:electron + ``` + +4. Start the application + ```sh + yarn start + ``` + +### Notes for Windows contributors +Windows requires the Microsoft Visual C++ (MSVC) compiler toolset to be installed on your development machine. + +In case it's not already present, it can be downloaded from the "**Tools for Visual Studio 20XX**" section of the Visual Studio [downloads page](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) via the "**Build Tools for Visual Studio 20XX**" (e.g., "**Build Tools for Visual Studio 2022**") download link. + +Select "**Desktop development with C++**" from the "**Workloads**" tab during the installation procedure. + +### CI + +This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide/actions). + + - _Snapshot_ builds run when changes are pushed to the `main` branch, or when a PR is created against the `main` branch. For the sake of the review and verification process, the build artifacts for each operating system can be downloaded from the GitHub Actions page. + - _Nightly_ builds run every day at 03:00 GMT from the `main` branch. + - _Release_ builds run when a new tag is pushed to the remote. The tag must follow the [semver](https://semver.org/). For instance, `1.2.3` is a correct tag, but `v2.3.4` won't work. Steps to trigger a new release build: + - Create a local tag: + ```sh + git tag -a 1.2.3 -m "Creating a new tag for the `1.2.3` release." + ``` + - Push it to the remote: + ```sh + git push origin 1.2.3 + ``` + +## Notes for macOS contributors +Beginning in macOS 10.14.5, the software [must be notarized to run](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution). The signing and notarization processes for the Arduino IDE are managed by our Continuous Integration (CI) workflows, implemented with GitHub Actions. On every push and pull request, the Arduino IDE is built and saved to a workflow artifact. These artifacts can be used by contributors and beta testers who don't want to set up a build system locally. +For security reasons, signing and notarization are disabled for workflow runs for pull requests from forks of this repository. This means that macOS will block you from running those artifacts. +Due to this limitation, Mac users have two options for testing contributions from forks: + +### The Safe approach (recommended) + +Follow [the instructions above](#build-from-source) to create the build environment locally, then build the code you want to test. + +### The Risky approach + +*Please note that this approach is risky as you are lowering the security on your system, therefore we strongly discourage you from following it.* +1. Use [this guide](https://help.apple.com/xcode/mac/10.2/index.html?localePath=en.lproj#/dev9b7736b0e), in order to disable Gatekeeper (at your own risk!). +1. Download the unsigned artifact provided by the CI workflow run related to the Pull Request at each push. +1. Re-enable Gatekeeper after tests are done, following the guide linked above. + +## FAQ + +* *Can I manually change the version of the [`arduino-cli`](https://github.com/arduino/arduino-cli/) used by the IDE?* + + Yes. It is possible but not recommended. The CLI exposes a set of functionality via [gRPC](https://github.com/arduino/arduino-cli/tree/master/rpc) and the IDE uses this API to communicate with the CLI. Before we build a new version of IDE, we pin a specific version of CLI and use the corresponding `proto` files to generate TypeScript modules for gRPC. This means, a particular version of IDE is compliant only with the pinned version of CLI. Mismatching IDE and CLI versions might not be able to communicate with each other. This could cause unpredictable IDE behavior. + +* *I have understood that not all versions of the CLI are compatible with my version of IDE but how can I manually update the `arduino-cli` inside the IDE?* + + [Get](https://arduino.github.io/arduino-cli/installation) the desired version of `arduino-cli` for your platform and manually replace the one inside the IDE. The CLI can be found inside the IDE at: + - Windows: `C:\path\to\Arduino IDE\resources\app\node_modules\arduino-ide-extension\build\arduino-cli.exe`, + - macOS: `/path/to/Arduino IDE.app/Contents/Resources/app/node_modules/arduino-ide-extension/build/arduino-cli`, and + - Linux: `/path/to/Arduino IDE/resources/app/node_modules/arduino-ide-extension/build/arduino-cli`. + diff --git a/docs/internal/Arm.md b/docs/internal/Arm.md index 8bcca9db4..f6f1d52aa 100644 --- a/docs/internal/Arm.md +++ b/docs/internal/Arm.md @@ -41,7 +41,7 @@ Building the Pro IDE on Linux `armv7l` (aka `armhf`) and `aarch64` (aka `arm64`) - `libx11-dev`, and - `libxkbfile-dev` -4. [Build it](../../BUILDING.md#build-from-source) from the source: +4. [Build it](../development.md#build-from-source) from the source: ``` git clone https://github.com/arduino/arduino-ide.git \ && cd arduino-ide \ From 96e229d80308ee847282bb429a277b555179bd8d Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 9 Sep 2022 21:05:27 -0700 Subject: [PATCH 004/384] Move documentation assets to standard location --- docs/README.md | 4 ++-- docs/{static => assets}/preferences.png | Bin docs/{static => assets}/remote.png | Bin 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/{static => assets}/preferences.png (100%) rename docs/{static => assets}/remote.png (100%) diff --git a/docs/README.md b/docs/README.md index c5d9cf00f..6c6f59479 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ # Remote Sketchbook Arduino IDE provides a Remote Sketchbook feature that can be used to upload sketches to Arduino Cloud. -![](static/remote.png) +![](assets/remote.png) @@ -13,7 +13,7 @@ A developer could use the content of this repo to create a customized version of ### 1. Changing remote connection parameters in the Preferences panel (be careful while editing the Preferences panel!) Here a screenshot of the Preferences panel -![](static/preferences.png) +![](assets/preferences.png) - The settings under _Arduino > Auth_ should be edited to match the OAuth2 configuration of your custom remote sketchbook storage - The setting under _Arduino > Sketch Sync Endpoint_ should be edited to point to your custom remote sketchbook storage service ### 2. Implementing the Arduino Cloud Store APIs for your custom remote sketchbook storage diff --git a/docs/static/preferences.png b/docs/assets/preferences.png similarity index 100% rename from docs/static/preferences.png rename to docs/assets/preferences.png diff --git a/docs/static/remote.png b/docs/assets/remote.png similarity index 100% rename from docs/static/remote.png rename to docs/assets/remote.png From 0ba88d5ab6a932b084944ff34ba1079a771710e7 Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 9 Sep 2022 21:34:44 -0700 Subject: [PATCH 005/384] Move beta testing information to a dedicated documentation file Previously, the information about tester builds was mixed in with the documentation about building the project from source. The two subjects are of relevance to two distinct contribution options. Building from source will primarily be done by developers working on the project code base. Tester builds will be used by beta testers and reviewers. For this reason, it doesn't make sense to require beta testers to wade through a lot of development documentation not directly related to their work in order to find the instructions for obtaining tester builds. Likewise, it doesn't make sense to clutter up the development documentation with such information. Moving the information about tester builds to a dedicated file makes it easier for the interested parties to find, and also allows the creation of a comprehensive guide for beta testers without making a negative impact on the development documentation content. --- docs/contributor-guide/assets/checks-tab.png | Bin 0 -> 42700 bytes .../assets/tester-build-artifacts.png | Bin 0 -> 17208 bytes .../assets/tester-build-link.png | Bin 0 -> 20961 bytes docs/contributor-guide/beta-testing.md | 106 ++++++++++++++++++ docs/development.md | 22 +--- 5 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 docs/contributor-guide/assets/checks-tab.png create mode 100644 docs/contributor-guide/assets/tester-build-artifacts.png create mode 100644 docs/contributor-guide/assets/tester-build-link.png create mode 100644 docs/contributor-guide/beta-testing.md diff --git a/docs/contributor-guide/assets/checks-tab.png b/docs/contributor-guide/assets/checks-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..ee18549524c988f3f1a9903a61db093f0e542666 GIT binary patch literal 42700 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%0ABU{d()L_ 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 R+ZO-;002ovPDHLkV1g{-fa?GN literal 0 HcmV?d00001 diff --git a/docs/contributor-guide/assets/tester-build-artifacts.png b/docs/contributor-guide/assets/tester-build-artifacts.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9dada84a09a5ab619aab162fee44e2a8b57f36 GIT binary patch literal 17208 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 D(`@%8 literal 0 HcmV?d00001 diff --git a/docs/contributor-guide/beta-testing.md b/docs/contributor-guide/beta-testing.md new file mode 100644 index 000000000..9f4dba110 --- /dev/null +++ b/docs/contributor-guide/beta-testing.md @@ -0,0 +1,106 @@ + + +# Beta Testing Guide + +Beta testing of development versions is a valuable contribution to the project. You can help to ensure the quality of the production release that will be distributed to the user community. + +Builds of the project are automatically created after every relevant change to the project in order to make it easy for anyone to participate in the testing effort. + +--- + +❗ Make sure to always download the newest available tester build in order to ensure effective results from your beta testing efforts. + +--- + +Beta testing is done during both the proposal (pull request) and pre-release (nightly build) phases of development: + +## Testing Pull Requests + +Tester builds are automatically created for every [pull request](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) (PR) that proposes a relevant change. + +The builds are updated if the author pushes changes to the PR. + +### Installation + +The tester build for a PR can be downloaded by following these instructions: + +1. Sign in to your [**GitHub**](https://github.com/) account.
+ (GitHub only allows downloads of the tester builds when you are signed in.) +1. Open the PR you are interested in.
+ They are listed here:
+ https://github.com/arduino/arduino-ide/pulls +1. Click the "**Checks**" tab at the top of the PR's page. +1. From the list on the left side of the page, click on "**Arduino IDE**". +1. Scroll down to the "**Artifacts**" section of the page that opens. +1. Click the download link for your operating system.
+ **ⓘ** For example, if you are using Windows, click the "**Windows_X86-64_zip**" link. +1. Wait for the download to finish. +1. Extract or install the downloaded file as usual. + +![checks tab](assets/checks-tab.png) + +![tester build link](assets/tester-build-link.png) + +![tester build artifacts](assets/tester-build-artifacts.png) + +#### Notes for macOS + +Beginning in macOS 10.14.5, the software [must be notarized to run](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution). + +For security reasons, signing and notarization are disabled when creating tester builds for pull requests from forks of this repository. This means that macOS will block you from running the tester builds for those PRs. + +Due to this limitation, Mac users have two options for testing PRs from forks: + +##### The Safe Approach + +Build the version of the Arduino IDE you want to test from source instead of using the automatically created tester build. + +[Instructions for building the project](../development.md#build-from-source) + +##### The Risky Approach + +--- + +⚠ Please note that this approach is risky as you are lowering the security on your system, therefore we strongly discourage you from following it. + +--- + +1. Use [this guide](https://help.apple.com/xcode/mac/10.2/index.html?localePath=en.lproj#/dev9b7736b0e), in order to disable Gatekeeper (at your own risk!). +1. Beta test the tester build. +1. Re-enable Gatekeeper after tests are done, following the guide linked above. + +### Feedback + +Feedback after beta testing a pull request is always valuable, regardless of which categories your findings fall under: + +- working as expected +- problems encountered +- areas for improvement + +Please submit feedback related to the changes made in the pull request as a PR review: + +https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews + +--- + +If you discover problems or areas for improvement that are unrelated to the changes made by the PR (i.e., they also occur when using the [nightly build](#testing-nightly-build)), please submit that feedback as an issue report instead of a review. + +[More information on issue reports](issues.md#issue-report-guide) + +## Testing Nightly Build + +Builds of the project's production branch are produced daily. This build represents the current pre-release state of the project, which is planned for distribution in the next release. + +### Installation + +1. Open Arduino's "**Software**" page:
+ https://www.arduino.cc/en/software#nightly-builds +1. Select the appropriate download link from the "**Nightly Builds**" section of the page. +1. Wait for the download to finish. +1. Extract or install the downloaded file as usual. + +### Feedback + +If you discover any problems or areas for improvement please submit an issue report. + +[More information on issue reports](issues.md#issue-report-guide) diff --git a/docs/development.md b/docs/development.md index 2edfd0e59..ac8a2e5ed 100644 --- a/docs/development.md +++ b/docs/development.md @@ -39,6 +39,12 @@ The _frontend_ is running as an Electron renderer process and can invoke service ## Build from source +--- + +**ⓘ** If you only want to test an existing version of the project, automatically generated builds are available for download without building from source. See the instructions in the [**beta testing guide**](contributor-guide/beta-testing.md#beta-testing-guide). + +--- + If you’re familiar with TypeScript, the [Theia IDE](https://theia-ide.org/), and if you want to contribute to the project, you should be able to build the Arduino IDE locally. Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites) documentation for the setup instructions. @@ -89,22 +95,6 @@ This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide git push origin 1.2.3 ``` -## Notes for macOS contributors -Beginning in macOS 10.14.5, the software [must be notarized to run](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution). The signing and notarization processes for the Arduino IDE are managed by our Continuous Integration (CI) workflows, implemented with GitHub Actions. On every push and pull request, the Arduino IDE is built and saved to a workflow artifact. These artifacts can be used by contributors and beta testers who don't want to set up a build system locally. -For security reasons, signing and notarization are disabled for workflow runs for pull requests from forks of this repository. This means that macOS will block you from running those artifacts. -Due to this limitation, Mac users have two options for testing contributions from forks: - -### The Safe approach (recommended) - -Follow [the instructions above](#build-from-source) to create the build environment locally, then build the code you want to test. - -### The Risky approach - -*Please note that this approach is risky as you are lowering the security on your system, therefore we strongly discourage you from following it.* -1. Use [this guide](https://help.apple.com/xcode/mac/10.2/index.html?localePath=en.lproj#/dev9b7736b0e), in order to disable Gatekeeper (at your own risk!). -1. Download the unsigned artifact provided by the CI workflow run related to the Pull Request at each push. -1. Re-enable Gatekeeper after tests are done, following the guide linked above. - ## FAQ * *Can I manually change the version of the [`arduino-cli`](https://github.com/arduino/arduino-cli/) used by the IDE?* From 7c1ca04c75711764c77639a99b9ff2ff9f603a5f Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 10 Sep 2022 02:37:29 -0700 Subject: [PATCH 006/384] Add a project contributor guide Documentation of how to contribute to the project gives everyone the opportunity to participate, while also reducing the maintenance effort and increasing the quality of contributions. This guide documents the various ways of contributing to the project. --- .github/ISSUE_TEMPLATE/config.yml | 6 + docs/CONTRIBUTING.md | 29 ++++ docs/contributor-guide/assets/checks.png | Bin 0 -> 40075 bytes docs/contributor-guide/beta-testing.md | 2 +- docs/contributor-guide/issues.md | 33 ++++ docs/contributor-guide/pull-requests.md | 199 +++++++++++++++++++++++ 6 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/contributor-guide/assets/checks.png create mode 100644 docs/contributor-guide/issues.md create mode 100644 docs/contributor-guide/pull-requests.md diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 00769ec0d..e87427856 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -8,6 +8,12 @@ contact_links: - name: Support request url: https://forum.arduino.cc/ about: We can help you out on the Arduino Forum! + - name: Issue report guide + url: https://github.com/arduino/arduino-ide/blob/main/docs/issues.md#issue-report-guide + about: Learn about submitting issue reports to this repository. + - name: Contributor guide + url: https://github.com/arduino/arduino-ide/blob/main/docs/CONTRIBUTING.md#contributor-guide + about: Learn about contributing to this project. - name: Discuss development work on the project url: https://groups.google.com/a/arduino.cc/g/developers about: Arduino Developers Mailing List diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 000000000..72e6a6e36 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,29 @@ + + +# Contributor Guide + +Thanks for your interest in contributing to this project! + +There are several ways you can get involved: + +| Type of contribution | Contribution method | +| ----------------------------------------- | -------------------------------------------------------------------------------- | +| - Support
- Question
- Discussion | Post on the [**Arduino Forum**][forum] | +| - Bug report
- Feature request | Issue report (see the guide [**here**][issues]) | +| Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) | +| Translation | [Transifex project][translate] | +| - Bug fix
- Enhancement | Pull request (see the guide [**here**][prs]) | +| Monetary | - [Donate][donate]
- [Sponsor][sponsor]
- [Buy official products][store] | + +[forum]: https://forum.arduino.cc +[issues]: contributor-guide/issues.md#issue-report-guide +[beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide +[translate]: https://www.transifex.com/arduino-1/ide2/dashboard/ +[prs]: contributor-guide/pull-requests.md#pull-request-guide +[donate]: https://www.arduino.cc/en/donate/ +[sponsor]: https://github.com/sponsors/arduino +[store]: https://store.arduino.cc + +## Resources + +- [**Development Guide**](development.md#development-guide) diff --git a/docs/contributor-guide/assets/checks.png b/docs/contributor-guide/assets/checks.png new file mode 100644 index 0000000000000000000000000000000000000000..888e711b4a2ea0c64d0e470aa4997c0c21ecaa59 GIT binary patch literal 40075 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

W`+0NwJpCYq|gkp3MnG?=k~g0**X^r20} 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 + # Beta Testing Guide diff --git a/docs/contributor-guide/issues.md b/docs/contributor-guide/issues.md new file mode 100644 index 000000000..6fdb9ea8c --- /dev/null +++ b/docs/contributor-guide/issues.md @@ -0,0 +1,33 @@ + + +# Issue Report Guide + +--- + +❗ Do you need help or have a question about using this project? Support requests should be made to the [Arduino Forum](https://forum.arduino.cc). + +--- + +High quality bug reports and feature requests are valuable contributions to this project. These can be made by submitting an issue report to the project's GitHub repository: + +https://github.com/arduino/arduino-ide/issues/new/choose + +## Before Reporting an Issue + +- Give the latest development version a test drive to see if your issue was already resolved:
+ https://www.arduino.cc/en/software#nightly-builds +- Search [existing pull requests and issues](https://github.com/arduino/arduino-ide/issues?q=) to see if it was already reported.
+ If you have additional information to provide about an existing issue, please comment there instead of creating a duplicate. You can use [GitHub's "Reactions" feature](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) if you only want to express support 👍. + +## Qualities of an Excellent Report + +- Concise and descriptive issue title.
+ Vague titles make it difficult to decipher the purpose of the issue when looking through the list of reports, which might result in your issue not being given proper attention. +- Describe the issue and what behavior you were expecting.
+ Include the full and exact text of any relevant error or warning messages you might have encountered. +- Provide a full set of steps necessary to reproduce the issue.
+ Demonstration code or commands should be complete and simplified to the minimum necessary to reproduce the issue. +- Be responsive.
+ We may need you to provide additional information in order to investigate and resolve the issue.
+ Make sure your GitHub account is configured so that you will receive notifications of responses to your issue report. +- If you find a solution to your problem, please comment on your issue report with an explanation of how you were able to fix it, then close the issue. diff --git a/docs/contributor-guide/pull-requests.md b/docs/contributor-guide/pull-requests.md new file mode 100644 index 000000000..6c3d29b23 --- /dev/null +++ b/docs/contributor-guide/pull-requests.md @@ -0,0 +1,199 @@ + + +# Pull Request Guide + +A [**pull request**](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) (PR) is the mechanism used to propose changes to the content of this project's repository. + +If you are looking for ideas of what to work on, check [the list of open issue reports](https://github.com/arduino/arduino-ide/issues). Pull requests addressing any of those bug reports and feature requests are welcome. + +## Contribution Workflow + +Each contribution travels through a formal process which allows it to be efficiently incorporated into the project. + +### 1. Plan + +#### Research + +Start by searching the repository for existing pull requests and issues related to your planned contribution so you can see any related conversations and proposals and avoid duplicate effort: + +https://github.com/arduino/arduino-ide/issues?q= + +#### Discussion + +It can sometimes be useful to get feedback from others during the planning process. There are a couple good options for discussing planned development work: + +- Talk with the user community on the [Arduino Forum](https://forum.arduino.cc/). +- Talk with Arduino developers on the [Arduino Developers Mailing List](https://groups.google.com/a/arduino.cc/g/developers). + +### 2. Fork + +Forking a GitHub repository creates a copy of it under your account. You will stage contributions in your fork of this project. + +[More information about forking repositories](https://docs.github.com/get-started/quickstart/fork-a-repo) + +#### Enabling CI in Your Fork + +The repository is configured to run automated [continuous integration](https://wikipedia.org/wiki/Continuous_integration) (CI) checks and tests. It's a good idea to enable CI in your fork so you can make sure your work will pass the checks before you submit a pull request: + +1. Open the homepage of your fork in the browser. +1. Click the "**Actions**" tab. +1. Click the **I understand my workflows, go ahead and enable them** button. +1. Some of the workflows will now need to be activated individually. Perform the following steps for each of the useful workflows listed on the left side of the page that have a "**!**" icon: + 1. Click on the workflow name. + 1. Click the **Enable workflow** button. + +### 3. Clone + +Cloning a repository creates a copy of it on your computer. + +It is possible to make simple changes to your repository using the GitHub web interface without cloning the repository. However, the GitHub web interface is quite limiting so you will likely find the need to work with a clone (using **Git** directly or your choice of [Git client software](https://git-scm.com/downloads/guis)) for any significant development work. + +[More information about cloning repositories](https://git-scm.com/docs/git-clone) + +### 4. Branch + +Create a branch in your fork to contain the changes for your contribution. You must make a separate branch in your fork for each pull request you submit. + +[More information about branches](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches) + +### 5. Make a change + +Some things to keep in mind: + +- Make sure your change complies with the project's established style conventions. +- Remember to also update the documentation content in the repository if required by your changes. +- If the project contains a test suite, update or add tests according to your change as appropriate. + +See [the development guide](../development.md#development-guide) for more information. + +### 6. Test + +Test your change carefully to make sure it works correctly and did not break other components of the project. + +As a supplement for general testing, the project is set up with automated checks and tests to facilitate development. + +See [the development guide](../development.md#development-guide) for instructions. + +### 7. Commit + +Once the work on your change is complete, add it to the revision history of the Git repository by making a commit. + +Make sure to follow the [Commit Guidelines](#commit-guidelines). + +[More information about commits](https://git-scm.com/docs/git-commit) + +### 8. Push + +If you're working from a [clone](#3-clone), you will need to push your commit to your fork on GitHub. + +[More information about pushing commits](https://git-scm.com/docs/git-push) + +#### Checking CI Results + +If you have [enabled CI in your repository](#enabling-ci-in-your-fork), GitHub will run the relevant checks automatically every time you push a commit to your fork. + +You can see the results of these checks by doing either of the following: + +- Clicking the status icon (✔️ or ❌) shown to the right of a commit. +- Opening the repository's "**Actions**" tab. + +### 9. Pull request + +A pull request (PR) is a proposal to make a change in a repository. The repository maintainer is able to accept the changes you propose in a pull request by simply clicking a button. + +[More information about pull requests](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) + +#### Scope + +Each pull request should address a single bug fix or enhancement. If you have multiple unrelated fixes or enhancements to contribute, submit them as separate pull requests. + +#### Description + +Pull request title and description should follow [the same guidelines as commit messages](#commit-message). + +If your pull request fixes an issue in the issue tracker, use [a closing keyword](https://docs.github.com/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) in the body to indicate this. + +In some cases, it might make sense to request feedback on a proposal before it is ready to be merged. You can indicate this by starting the pull request title with **[WIP]** (work in progress). Once the pull request is ready to be merged, edit the title and remove the "[WIP]". + +#### Cross-repository Contributions + +Some proposals may require changes to multiple repositories. Pull requests should be submitted in parallel to each repository. + +Clearly note any dependencies on other PRs in the description so that these can be evaluated by the reviewer and the merges coordinated. + +--- + +Please check whether any changes are required to the related documentation content hosted in the separate dedicated repositories: + +- [**arduino/docs-content**](https://github.com/arduino/docs-content) +- [**arduino/help-center-content**](https://github.com/arduino/help-center-content) + +### 10. Resolve CI failures + +Relevant checks will run automatically once you have submitted the pull request. Once these checks are finished, you can see a summary of the results near the bottom of the pull request page: + +![checks](assets/checks.png) + +Failed checks will be indicated with an ❌. If any checks failed, please fix whatever caused it to fail. Click the "**Details**" link to the right of the check name to open the logs, which provide details about the failure. + +--- + +**ⓘ** In some rare cases, a CI failure may be unrelated to the changes made in your pull request. So if the information in the logs doesn't seem relevant, please comment on the pull request to ask a maintainer to take a look. + +--- + +When you push to the branch of your fork the pull request was submitted from, the commit is automatically added to the pull request. Don't create a new pull request to fix problems; update the existing pull request. + +### 11. Resolve changes requested from reviews + +Interested parties may review your pull request and suggest improvements. + +To act on general review suggestions, you can add commits to the branch you submitted the pull request from, which will automatically be added to the pull request. Don't create a new pull request to act on review suggestions; update the existing pull request. + +Reviewers may suggest specific changes, which can be applied by [clicking the **Commit suggestion** button](https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request#applying-suggested-changes). + +[More information about pull request reviews](https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews) + +### 12. Merge + +One of the repository maintainers can now choose to accept your proposed change. Once the pull request is [merged](https://docs.github.com/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/merging-a-pull-request), you can delete the branch you created in your fork for the pull request and delete the fork as well if you like. + +Thanks so much for your contribution! + +--- + +It is possible that the maintainers may decide a pull request doesn't align with Arduino's goals for the project and close it rather than merging. A record of the proposed changes will always be available on GitHub for future reference. If you think your modifications will be of use to others, you are welcome to maintain your own fork of the repository. + +--- + +## Commit Guidelines + +The commit history of a repository is an important resource for developers. Repositories may accumulate thousands of commits over the course of decades. Each individual commit contributes either to the commit history being pleasant and efficient to work with, or to it being a confusing mess. For this reason, it's essential for contributors to create clean, high quality commits. + +### Scope + +Commits must be "atomic". This means that the commit completely accomplishes a single task. Each commit should result in fully functional code. Multiple tasks should not be combined in a single commit, but a single task should not be split over multiple commits (e.g., one commit per file modified is not a good practice). + +[More information about atomic commits](https://www.freshconsulting.com/insights/blog/atomic-commits/) + +### Commit Message + +The commit message documents what the change was and why it was done. A little effort now writing a good commit message can save future developers from wasted time and frustration trying to understand the purpose of a poorly documented commit. + +#### Commit Message Title + +- Use the [imperative mood](https://cbea.ms/git-commit/#imperative) in the title.
+ For example: + > Use LED_BUILTIN macro in LED pin definition +- Capitalize the title. +- Do not end the title with punctuation. +- Do not use GitHub's default commit titles (e.g., "Update examples/Foo/Foo.ino"). + +#### Commit Message Body + +- Separate title from the body with a blank line. If you're committing via GitHub or [GitHub Desktop](https://desktop.github.com/) this will be done automatically. +- Wrap body at 120 characters. +- Completely explain the purpose of the commit.
+ Include a rationale for the change, any caveats, side-effects, etc. + +[More information on commit messages](https://cbea.ms/git-commit/) From e8b0ea4f2df1555d56a35f97158e9407e918b8ea Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 10 Sep 2022 03:02:31 -0700 Subject: [PATCH 007/384] Reduce overlap between readme and development+contributor guides The readme should provide a concise overview of the essential information about the project. Additional details are provided in dedicated documents, so the readme only needs to provide links to that information. --- README.md | 18 ++++++++---------- docs/development.md | 6 ++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index cb19f42fe..4297eea3d 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,9 @@ If you need assistance, see the [Help Center](https://support.arduino.cc/hc/en-u ## Bugs & Issues -If you want to report an issue, you can submit it to the [issue tracker](https://github.com/arduino/arduino-ide/issues) of this repository. A few rules apply: +If you want to report an issue, you can submit it to the [issue tracker](https://github.com/arduino/arduino-ide/issues) of this repository. -- Before posting, please check if the same problem has been already reported by someone else to avoid duplicates. -- Remember to include as much detail as you can about your hardware set-up, code and steps for reproducing the issue. Make sure you're using an original Arduino board. +See [**the issue report guide**](docs/contributor-guide/issues.md#issue-report-guide) for instructions. ### Security @@ -35,16 +34,15 @@ e-mail contact: security@arduino.cc ## Contributions and development -Contributions are very welcome! You can browse the list of open issues to see what's needed and then you can submit your code using a Pull Request. Please provide detailed descriptions. We also appreciate any help in testing issues and patches contributed by other users. +Contributions are very welcome! There are several ways to participate in this project, including: -This repository contains the main code, but two more repositories are included during the build process: +- Fixing bugs +- Beta testing +- Translation -- [vscode-arduino-tools](https://github.com/arduino/vscode-arduino-tools): provides support for the language server and the debugger -- [arduino-language-server](https://github.com/arduino/arduino-language-server): provides the language server that parses Arduino code +See [**the contributor guide**](docs/CONTRIBUTING.md#contributor-guide) for more information. -See the [development guide](docs/development.md) for a technical overview of the application and instructions for building the code. - -You can help with the translation of the Arduino IDE to your language here: [Arduino IDE on Transifex](https://www.transifex.com/arduino-1/ide2/dashboard/). +See the [**development guide**](docs/development.md) for a technical overview of the application and instructions for building the code. ## Donations diff --git a/docs/development.md b/docs/development.md index ac8a2e5ed..b3146acae 100644 --- a/docs/development.md +++ b/docs/development.md @@ -36,6 +36,12 @@ The _frontend_ is running as an Electron renderer process and can invoke service [1]: https://www.electronjs.org/docs/tutorial/application-architecture#differences-between-main-process-and-renderer-process [2]: https://code.visualstudio.com/Docs/editor/tasks +### Additional Components + +This repository contains the main code, but two more repositories are included during the build process: + +- [vscode-arduino-tools](https://github.com/arduino/vscode-arduino-tools): provides support for the language server and the debugger +- [arduino-language-server](https://github.com/arduino/arduino-language-server): provides the language server that parses Arduino code ## Build from source From 0151e4c224533b9e08912e1a1d2ca775bf75c9f9 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 15 Sep 2022 05:36:40 -0700 Subject: [PATCH 008/384] Make instructions re: non-notarized PR tester build more user friendly For security reasons, the macOS tester builds generated for PRs from forks are not notarized. Instructions are provided for beta testing under these conditions. Previously, the instructions for bypassing the macOS notarization requirement involved disabling macOS Gatekeeper entirely using the spctl command. These instructions are hereby replaced by an alternative approach, where the restriction is bypassed for the Arduino IDE application alone, via the macOS GUI. The new approach is superior for the following reasons: - More secure due to having limited scope - More accessible due to the use of the macOS GUI --- docs/contributor-guide/beta-testing.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/contributor-guide/beta-testing.md b/docs/contributor-guide/beta-testing.md index 4c1541289..487713f28 100644 --- a/docs/contributor-guide/beta-testing.md +++ b/docs/contributor-guide/beta-testing.md @@ -65,9 +65,11 @@ Build the version of the Arduino IDE you want to test from source instead of usi --- -1. Use [this guide](https://help.apple.com/xcode/mac/10.2/index.html?localePath=en.lproj#/dev9b7736b0e), in order to disable Gatekeeper (at your own risk!). -1. Beta test the tester build. -1. Re-enable Gatekeeper after tests are done, following the guide linked above. +1. Start the tester build.
+ A warning will appear: + > "Arduino IDE" cannot be opened because the developer cannot be verified. +1. Follow the instructions from the "**If you want to open an app that hasn't been notarized or is from an unidentified developer**" section of this page to bypass the security restriction:
+ [https://support.apple.com/en-us/HT202491](https://support.apple.com/en-us/HT202491#:~:text=If%20you%20want%20to%20open%20an%20app%20that%20hasn%E2%80%99t%20been%20notarized%20or%20is%20from%20an%20unidentified%20developer) ### Feedback From fdf6f0f9c894de9403b980bbaee0dc70b1e41f9f Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 5 Sep 2022 11:22:16 +0200 Subject: [PATCH 009/384] Avoid deleting the workspace when it's still in use. - From now on, NSFW service disposes after last reference is removed. No more 10sec delay. - Moved the temp workspace deletion to a startup task. - Can set initial task for the window from electron-main. - Removed the `browser-app`. Closes #39 Signed-off-by: Akos Kitta --- .eslintrc.js | 1 - .vscode/launch.json | 31 ------- .vscode/tasks.json | 30 ------ arduino-ide-extension/package.json | 2 - .../browser/arduino-ide-frontend-module.ts | 12 ++- .../src/browser/boards/boards-config.tsx | 48 ---------- .../browser/boards/boards-service-provider.ts | 60 ++++++++++-- .../browser/contributions/delete-sketch.ts | 45 +++++++++ .../browser/contributions/save-as-sketch.ts | 32 +++---- .../contributions/sketch-files-tracker.ts | 3 +- .../src/browser/contributions/startup-task.ts | 52 +++++++++++ .../theia/core/browser-main-menu-factory.ts | 26 ------ .../browser/theia/core/browser-menu-module.ts | 18 ---- .../theia/core/browser-window-module.ts | 10 -- .../theia/core/default-window-service.ts | 17 ---- .../browser/theia/core/window-service-ext.ts | 3 + .../theia/workspace/workspace-service.ts | 79 ++++++++-------- .../widgets/sketchbook/startup-task.ts | 92 ------------------- .../protocol/sketches-service-client-impl.ts | 9 -- .../src/common/protocol/sketches-service.ts | 4 +- .../theia/core/electron-window-service.ts | 31 ++++++- .../src/electron-common/startup-task.ts | 50 ++++++++++ .../arduino-electron-main-module.ts | 11 +-- .../electron-main-window-service-ext-impl.ts | 15 --- .../theia/electron-main-window-service.ts | 73 ++++++++++----- .../theia/theia-electron-window.ts | 57 +++++++----- .../src/electron-main/theia/window.ts | 33 +++++++ .../src/node/arduino-ide-backend-module.ts | 73 ++++----------- .../src/node/sketches-service-impl.ts | 20 ++-- .../theia/filesystem/nsfw-watcher/index.ts | 31 +++++++ .../filesystem/nsfw-watcher/nsfw-bindings.ts | 42 +++++++++ .../nsfw-watcher/nsfw-filesystem-service.ts | 32 +++++++ browser-app/package.json | 62 ------------- browser-app/webpack.config.js | 20 ---- docs/internal/release-procedure.md | 2 +- electron/packager/index.js | 8 +- package.json | 7 +- scripts/update-version.js | 1 - 38 files changed, 560 insertions(+), 582 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/delete-sketch.ts create mode 100644 arduino-ide-extension/src/browser/contributions/startup-task.ts delete mode 100644 arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts delete mode 100644 arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts delete mode 100644 arduino-ide-extension/src/browser/theia/core/browser-window-module.ts delete mode 100644 arduino-ide-extension/src/browser/theia/core/default-window-service.ts delete mode 100644 arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts create mode 100644 arduino-ide-extension/src/electron-common/startup-task.ts delete mode 100644 arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts create mode 100644 arduino-ide-extension/src/electron-main/theia/window.ts create mode 100644 arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts create mode 100644 arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts create mode 100644 arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts delete mode 100644 browser-app/package.json delete mode 100644 browser-app/webpack.config.js diff --git a/.eslintrc.js b/.eslintrc.js index 6be699cf7..fbf46eda5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -17,7 +17,6 @@ module.exports = { 'scripts/*', 'electron/*', 'electron-app/*', - 'browser-app/*', 'plugins/*', 'arduino-ide-extension/src/node/cli-protocol', ], diff --git a/.vscode/launch.json b/.vscode/launch.json index 820ba07b8..06f959e85 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -80,37 +80,6 @@ "port": 9222, "webRoot": "${workspaceFolder}/electron-app" }, - { - "type": "node", - "request": "launch", - "name": "App (Browser)", - "program": "${workspaceRoot}/browser-app/src-gen/backend/main.js", - "args": [ - "--hostname=0.0.0.0", - "--port=3000", - "--no-cluster", - "--no-app-auto-install", - "--plugins=local-dir:plugins" - ], - "windows": { - "env": { - "NODE_ENV": "development", - "NODE_PRESERVE_SYMLINKS": "1" - } - }, - "env": { - "NODE_ENV": "development" - }, - "sourceMaps": true, - "outFiles": [ - "${workspaceRoot}/browser-app/src-gen/backend/*.js", - "${workspaceRoot}/browser-app/lib/**/*.js", - "${workspaceRoot}/arduino-ide-extension/lib/**/*.js" - ], - "smartStep": true, - "internalConsoleOptions": "openOnSessionStart", - "outputCapture": "std" - }, { "type": "node", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index de5ee90fc..9d3e8e0db 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,17 +12,6 @@ "clear": false } }, - { - "label": "Arduino IDE - Start Browser App", - "type": "shell", - "command": "yarn --cwd ./browser-app start", - "group": "build", - "presentation": { - "reveal": "always", - "panel": "new", - "clear": true - } - }, { "label": "Arduino IDE - Watch IDE Extension", "type": "shell", @@ -34,17 +23,6 @@ "clear": false } }, - { - "label": "Arduino IDE - Watch Browser App", - "type": "shell", - "command": "yarn --cwd ./browser-app watch", - "group": "build", - "presentation": { - "reveal": "always", - "panel": "new", - "clear": false - } - }, { "label": "Arduino IDE - Watch Electron App", "type": "shell", @@ -56,14 +34,6 @@ "clear": false } }, - { - "label": "Arduino IDE - Watch All [Browser]", - "type": "shell", - "dependsOn": [ - "Arduino IDE - Watch IDE Extension", - "Arduino IDE - Watch Browser App" - ] - }, { "label": "Arduino IDE - Watch All [Electron]", "type": "shell", diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 8f41acb7b..ac951c619 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -147,11 +147,9 @@ "frontend": "lib/browser/arduino-ide-frontend-module" }, { - "frontend": "lib/browser/theia/core/browser-menu-module", "frontendElectron": "lib/electron-browser/theia/core/electron-menu-module" }, { - "frontend": "lib/browser/theia/core/browser-window-module", "frontendElectron": "lib/electron-browser/theia/core/electron-window-module" }, { diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 9ff8a5389..000e9d0f9 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -105,7 +105,8 @@ import { } from '@theia/core/lib/browser/connection-status-service'; import { BoardsDataMenuUpdater } from './boards/boards-data-menu-updater'; import { BoardsDataStore } from './boards/boards-data-store'; -import { ILogger } from '@theia/core'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { bindContributionProvider } from '@theia/core/lib/common/contribution-provider'; import { FileSystemExt, FileSystemExtPath, @@ -308,7 +309,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 './widgets/sketchbook/startup-task'; +import { StartupTasks } from './contributions/startup-task'; import { IndexesUpdateProgress } from './contributions/indexes-update-progress'; import { Daemon } from './contributions/daemon'; import { FirstStartupInstaller } from './contributions/first-startup-installer'; @@ -334,6 +335,8 @@ import { } from './widgets/component-list/filter-renderer'; import { CheckForUpdates } from './contributions/check-for-updates'; import { OutputEditorFactory } from './theia/output/output-editor-factory'; +import { StartupTaskProvider } from '../electron-common/startup-task'; +import { DeleteSketch } from './contributions/delete-sketch'; const registerArduinoThemes = () => { const themes: MonacoThemeJson[] = [ @@ -433,6 +436,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // Boards service client to receive and delegate notifications from the backend. bind(BoardsServiceProvider).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(BoardsServiceProvider); + bind(CommandContribution).toService(BoardsServiceProvider); // To be able to track, and update the menu based on the core settings (aka. board details) of the currently selected board. bind(FrontendApplicationContribution) @@ -757,6 +761,10 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, OpenBoardsConfig); Contribution.configure(bind, SketchFilesTracker); Contribution.configure(bind, CheckForUpdates); + Contribution.configure(bind, DeleteSketch); + + bindContributionProvider(bind, StartupTaskProvider); + bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window // Disabled the quick-pick customization from Theia when multiple formatters are available. // Use the default VS Code behavior, and pick the first one. In the IDE2, clang-format has `exclusive` selectors. diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index fb04b0e2e..7edd30e76 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -413,53 +413,5 @@ export namespace BoardsConfig { const { name } = selectedBoard; return `${name}${port ? ` at ${port.address}` : ''}`; } - - export function setConfig( - config: Config | undefined, - urlToAttachTo: URL - ): URL { - const copy = new URL(urlToAttachTo.toString()); - if (!config) { - copy.searchParams.delete('boards-config'); - return copy; - } - - const selectedBoard = config.selectedBoard - ? { - name: config.selectedBoard.name, - fqbn: config.selectedBoard.fqbn, - } - : undefined; - const selectedPort = config.selectedPort - ? { - protocol: config.selectedPort.protocol, - address: config.selectedPort.address, - } - : undefined; - const jsonConfig = JSON.stringify({ selectedBoard, selectedPort }); - copy.searchParams.set('boards-config', encodeURIComponent(jsonConfig)); - return copy; - } - - export function getConfig(url: URL): Config | undefined { - const encoded = url.searchParams.get('boards-config'); - if (!encoded) { - return undefined; - } - try { - const raw = decodeURIComponent(encoded); - const candidate = JSON.parse(raw); - if (typeof candidate === 'object') { - return candidate; - } - console.warn( - `Expected candidate to be an object. It was ${typeof candidate}. URL was: ${url}` - ); - return undefined; - } catch (e) { - console.log(`Could not get board config from URL: ${url}.`, e); - return undefined; - } - } } } diff --git a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts index 0f0fbbea9..25aa8d058 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -1,7 +1,12 @@ 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 { CommandService } from '@theia/core/lib/common/command'; +import { + Command, + CommandContribution, + CommandRegistry, + CommandService, +} from '@theia/core/lib/common/command'; import { MessageService } from '@theia/core/lib/common/message-service'; import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; import { RecursiveRequired } from '../../common/types'; @@ -23,9 +28,18 @@ 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 { + StartupTask, + StartupTaskProvider, +} from '../../electron-common/startup-task'; @injectable() -export class BoardsServiceProvider implements FrontendApplicationContribution { +export class BoardsServiceProvider + implements + FrontendApplicationContribution, + StartupTaskProvider, + CommandContribution +{ @inject(ILogger) protected logger: ILogger; @@ -50,6 +64,7 @@ export class BoardsServiceProvider implements FrontendApplicationContribution { AvailableBoard[] >(); protected readonly onAvailablePortsChangedEmitter = new Emitter(); + private readonly inheritedConfig = new Deferred(); /** * Used for the auto-reconnecting. Sometimes, the attached board gets disconnected after uploading something to it. @@ -115,6 +130,13 @@ export class BoardsServiceProvider implements FrontendApplicationContribution { }); } + registerCommands(registry: CommandRegistry): void { + registry.registerCommand(USE_INHERITED_CONFIG, { + execute: (inheritedConfig: BoardsConfig.Config) => + this.inheritedConfig.resolve(inheritedConfig), + }); + } + get reconciled(): Promise { return this._reconciled.promise; } @@ -655,11 +677,14 @@ export class BoardsServiceProvider implements FrontendApplicationContribution { let storedLatestBoardsConfig = await this.getData< BoardsConfig.Config | undefined >('latest-boards-config'); - // Try to get from the URL if it was not persisted. + // Try to get from the startup task. Wait for it, then timeout. Maybe it never arrives. if (!storedLatestBoardsConfig) { - storedLatestBoardsConfig = BoardsConfig.Config.getConfig( - new URL(window.location.href) - ); + storedLatestBoardsConfig = await Promise.race([ + this.inheritedConfig.promise, + new Promise((resolve) => + setTimeout(() => resolve(undefined), 2_000) + ), + ]); } if (storedLatestBoardsConfig) { this.latestBoardsConfig = storedLatestBoardsConfig; @@ -682,8 +707,31 @@ export class BoardsServiceProvider implements FrontendApplicationContribution { key ); } + + tasks(): StartupTask[] { + return [ + { + command: USE_INHERITED_CONFIG.id, + args: [this.boardsConfig], + }, + ]; + } } +/** + * It should be neither visible nor called from outside. + * + * This service creates a startup task with the current board config and + * passes the task to the electron-main process so that the new window + * can inherit the boards config state of this service. + * + * Note that the state is always set, but new windows might ignore it. + * For example, the new window already has a valid boards config persisted to the local storage. + */ +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`. diff --git a/arduino-ide-extension/src/browser/contributions/delete-sketch.ts b/arduino-ide-extension/src/browser/contributions/delete-sketch.ts new file mode 100644 index 000000000..c72b77df9 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/delete-sketch.ts @@ -0,0 +1,45 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { SketchesError } from '../../common/protocol'; +import { + Command, + CommandRegistry, + SketchContribution, + Sketch, +} from './contribution'; + +@injectable() +export class DeleteSketch extends SketchContribution { + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(DeleteSketch.Commands.DELETE_SKETCH, { + execute: (uri: string) => this.deleteSketch(uri), + }); + } + + private async deleteSketch(uri: string): Promise { + const sketch = await this.loadSketch(uri); + if (!sketch) { + console.info(`Sketch not found at ${uri}. Skipping deletion.`); + return; + } + return this.sketchService.deleteSketch(sketch); + } + + private async loadSketch(uri: string): Promise { + try { + const sketch = await this.sketchService.loadSketch(uri); + return sketch; + } catch (err) { + if (SketchesError.NotFound.is(err)) { + return undefined; + } + throw err; + } + } +} +export namespace DeleteSketch { + export namespace Commands { + export const DELETE_SKETCH: Command = { + id: 'arduino-delete-sketch', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts index 2954a6038..6898add2a 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -12,21 +12,19 @@ import { } from './contribution'; import { nls } from '@theia/core/lib/common'; import { ApplicationShell, NavigatableWidget, Saveable } from '@theia/core/lib/browser'; -import { EditorManager } from '@theia/editor/lib/browser'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; +import { WorkspaceInput } from '@theia/workspace/lib/browser'; +import { StartupTask } from '../../electron-common/startup-task'; +import { DeleteSketch } from './delete-sketch'; @injectable() export class SaveAsSketch extends SketchContribution { - @inject(ApplicationShell) - protected readonly applicationShell: ApplicationShell; - - @inject(EditorManager) - protected override readonly editorManager: EditorManager; + private readonly applicationShell: ApplicationShell; @inject(WindowService) - protected readonly windowService: WindowService; + private readonly windowService: WindowService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(SaveAsSketch.Commands.SAVE_AS_SKETCH, { @@ -107,21 +105,19 @@ export class SaveAsSketch extends SketchContribution { this.sketchService.markAsRecentlyOpened(workspaceUri); } } + const options: WorkspaceInput & StartupTask.Owner = { + preserveWindow: true, + tasks: [], + }; if (workspaceUri && openAfterMove) { this.windowService.setSafeToShutDown(); if (wipeOriginal || (openAfterMove && execOnlyIfTemp)) { - // This window will navigate away. - // Explicitly stop the contribution to dispose the file watcher before deleting the temp sketch. - // Otherwise, users might see irrelevant _Unable to watch for file changes in this large workspace._ notification. - // https://github.com/arduino/arduino-ide/issues/39. - this.sketchServiceClient.onStop(); - // TODO: consider implementing the temp sketch deletion the following way: - // Open the other sketch with a `delete the temp sketch` startup-task. - this.sketchService.notifyDeleteSketch(sketch); // This is a notification and will execute on the backend. + options.tasks.push({ + command: DeleteSketch.Commands.DELETE_SKETCH.id, + args: [sketch.uri], + }); } - this.workspaceService.open(new URI(workspaceUri), { - preserveWindow: true, - }); + this.workspaceService.open(new URI(workspaceUri), options); } return !!workspaceUri; } diff --git a/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts b/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts index fcd07cb67..3c7daea48 100644 --- a/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts +++ b/arduino-ide-extension/src/browser/contributions/sketch-files-tracker.ts @@ -4,7 +4,7 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { FileSystemFrontendContribution } from '@theia/filesystem/lib/browser/filesystem-frontend-contribution'; import { FileChangeType } from '@theia/filesystem/lib/common/files'; import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; -import { Sketch, SketchContribution, URI } from './contribution'; +import { Sketch, SketchContribution } from './contribution'; import { OpenSketchFiles } from './open-sketch-files'; @injectable() @@ -31,7 +31,6 @@ export class SketchFilesTracker extends SketchContribution { override onReady(): void { this.sketchServiceClient.currentSketch().then(async (sketch) => { if (CurrentSketch.isValid(sketch)) { - this.toDisposeOnStop.push(this.fileService.watch(new URI(sketch.uri))); this.toDisposeOnStop.push( this.fileService.onDidFilesChange(async (event) => { for (const { type, resource } of event.changes) { diff --git a/arduino-ide-extension/src/browser/contributions/startup-task.ts b/arduino-ide-extension/src/browser/contributions/startup-task.ts new file mode 100644 index 000000000..b37b558ea --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/startup-task.ts @@ -0,0 +1,52 @@ +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/theia/core/browser-main-menu-factory.ts b/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts deleted file mode 100644 index 737ca98ac..000000000 --- a/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { - BrowserMainMenuFactory as TheiaBrowserMainMenuFactory, - MenuBarWidget, -} from '@theia/core/lib/browser/menu/browser-menu-plugin'; -import { MainMenuManager } from '../../../common/main-menu-manager'; - -@injectable() -export class BrowserMainMenuFactory - extends TheiaBrowserMainMenuFactory - implements MainMenuManager -{ - protected menuBar: MenuBarWidget | undefined; - - override createMenuBar(): MenuBarWidget { - this.menuBar = super.createMenuBar(); - return this.menuBar; - } - - update(): void { - if (this.menuBar) { - this.menuBar.clearMenus(); - this.fillMenuBar(this.menuBar); - } - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts b/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts deleted file mode 100644 index fb887142f..000000000 --- a/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import '../../../../src/browser/style/browser-menu.css'; -import { ContainerModule } from '@theia/core/shared/inversify'; -import { - BrowserMenuBarContribution, - BrowserMainMenuFactory as TheiaBrowserMainMenuFactory, -} from '@theia/core/lib/browser/menu/browser-menu-plugin'; -import { MainMenuManager } from '../../../common/main-menu-manager'; -import { ArduinoMenuContribution } from './browser-menu-plugin'; -import { BrowserMainMenuFactory } from './browser-main-menu-factory'; - -export default new ContainerModule((bind, unbind, isBound, rebind) => { - bind(BrowserMainMenuFactory).toSelf().inSingletonScope(); - bind(MainMenuManager).toService(BrowserMainMenuFactory); - rebind(TheiaBrowserMainMenuFactory).toService(BrowserMainMenuFactory); - rebind(BrowserMenuBarContribution) - .to(ArduinoMenuContribution) - .inSingletonScope(); -}); diff --git a/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts b/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts deleted file mode 100644 index ac0862b75..000000000 --- a/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DefaultWindowService as TheiaDefaultWindowService } from '@theia/core/lib/browser/window/default-window-service'; -import { ContainerModule } from '@theia/core/shared/inversify'; -import { DefaultWindowService } from './default-window-service'; -import { WindowServiceExt } from './window-service-ext'; - -export default new ContainerModule((bind, unbind, isBound, rebind) => { - bind(DefaultWindowService).toSelf().inSingletonScope(); - rebind(TheiaDefaultWindowService).toService(DefaultWindowService); - bind(WindowServiceExt).toService(DefaultWindowService); -}); diff --git a/arduino-ide-extension/src/browser/theia/core/default-window-service.ts b/arduino-ide-extension/src/browser/theia/core/default-window-service.ts deleted file mode 100644 index 145691727..000000000 --- a/arduino-ide-extension/src/browser/theia/core/default-window-service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DefaultWindowService as TheiaDefaultWindowService } from '@theia/core/lib/browser/window/default-window-service'; -import { injectable } from '@theia/core/shared/inversify'; -import { WindowServiceExt } from './window-service-ext'; - -@injectable() -export class DefaultWindowService - extends TheiaDefaultWindowService - implements WindowServiceExt -{ - /** - * The default implementation always resolves to `true`. - * IDE2 does not use it. It's currently an electron-only app. - */ - async isFirstWindow(): Promise { - return true; - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts b/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts index f22e55cc4..a34f6882b 100644 --- a/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts +++ b/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts @@ -1,7 +1,10 @@ +import type { StartupTask } from '../../../electron-common/startup-task'; + export const WindowServiceExt = Symbol('WindowServiceExt'); export interface WindowServiceExt { /** * Returns with a promise that resolves to `true` if the current window is the first window. */ isFirstWindow(): Promise; + reload(options?: StartupTask.Owner): void; } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts index 38f15c9d1..e9d1e1e69 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts @@ -1,54 +1,41 @@ import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { injectable, inject } from '@theia/core/shared/inversify'; +import { injectable, inject, named } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { EditorWidget } from '@theia/editor/lib/browser'; -import { LabelProvider } from '@theia/core/lib/browser/label-provider'; -import { MessageService } from '@theia/core/lib/common/message-service'; import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; import { FocusTracker, Widget } from '@theia/core/lib/browser'; -import { DEFAULT_WINDOW_HASH } from '@theia/core/lib/common/window'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + DEFAULT_WINDOW_HASH, + NewWindowOptions, +} from '@theia/core/lib/common/window'; import { WorkspaceInput, WorkspaceService as TheiaWorkspaceService, } from '@theia/workspace/lib/browser/workspace-service'; -import { ConfigService } from '../../../common/protocol/config-service'; import { SketchesService, Sketch, } from '../../../common/protocol/sketches-service'; -import { BoardsServiceProvider } from '../../boards/boards-service-provider'; -import { BoardsConfig } from '../../boards/boards-config'; import { FileStat } from '@theia/filesystem/lib/common/files'; import { StartupTask, - StartupTasks, -} from '../../widgets/sketchbook/startup-task'; -import { setURL } from '../../utils/window'; + StartupTaskProvider, +} from '../../../electron-common/startup-task'; +import { WindowServiceExt } from '../core/window-service-ext'; +import { ContributionProvider } from '@theia/core/lib/common/contribution-provider'; @injectable() export class WorkspaceService extends TheiaWorkspaceService { @inject(SketchesService) - protected readonly sketchService: SketchesService; - - @inject(ConfigService) - protected readonly configService: ConfigService; - - @inject(LabelProvider) - protected override readonly labelProvider: LabelProvider; - - @inject(MessageService) - protected override readonly messageService: MessageService; - + private readonly sketchService: SketchesService; @inject(ApplicationServer) - protected readonly applicationServer: ApplicationServer; - - @inject(FrontendApplicationStateService) - protected readonly appStateService: FrontendApplicationStateService; - - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider; + private readonly applicationServer: ApplicationServer; + @inject(WindowServiceExt) + private readonly windowServiceExt: WindowServiceExt; + @inject(ContributionProvider) + @named(StartupTaskProvider) + private readonly providers: ContributionProvider; private version?: string; @@ -156,27 +143,33 @@ export class WorkspaceService extends TheiaWorkspaceService { } protected override reloadWindow(options?: WorkspaceInput): void { - if (StartupTasks.WorkspaceInput.is(options)) { - setURL(StartupTask.append(options.tasks, new URL(window.location.href))); - } - super.reloadWindow(); + const tasks = this.tasks(options); + this.setURLFragment(this._workspace?.resource.path.toString() || ''); + this.windowServiceExt.reload({ tasks }); } protected override openNewWindow( workspacePath: string, options?: WorkspaceInput ): void { - const { boardsConfig } = this.boardsServiceProvider; - let url = BoardsConfig.Config.setConfig( - boardsConfig, - new URL(window.location.href) - ); // Set the current boards config for the new browser window. - url.hash = workspacePath; - if (StartupTasks.WorkspaceInput.is(options)) { - url = StartupTask.append(options.tasks, url); - } + const tasks = this.tasks(options); + const url = new URL(window.location.href); + url.hash = encodeURI(workspacePath); + this.windowService.openNewWindow( + url.toString(), + Object.assign({} as NewWindowOptions, { tasks }) + ); + } - this.windowService.openNewWindow(url.toString()); + private tasks(options?: WorkspaceInput): StartupTask[] { + const tasks = this.providers + .getContributions() + .map((contribution) => contribution.tasks()) + .reduce((prev, curr) => prev.concat(curr), []); + if (StartupTask.has(options)) { + tasks.push(...options.tasks); + } + return tasks; } protected onCurrentWidgetChange({ diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts deleted file mode 100644 index 25cf33a3e..000000000 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/startup-task.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { WorkspaceInput as TheiaWorkspaceInput } from '@theia/workspace/lib/browser'; -import { Contribution } from '../../contributions/contribution'; -import { setURL } from '../../utils/window'; - -@injectable() -export class StartupTasks extends Contribution { - override onReady(): void { - const tasks = StartupTask.get(new URL(window.location.href)); - console.log(`Executing startup tasks: ${JSON.stringify(tasks)}`); - tasks.forEach(({ command, args = [] }) => - this.commandService - .executeCommand(command, ...args) - .catch((err) => - console.error( - `Error occurred when executing the startup task '${command}'${ - args?.length ? ` with args: '${JSON.stringify(args)}` : '' - }.`, - err - ) - ) - ); - if (tasks.length) { - // Remove the startup tasks after the execution. - // Otherwise, IDE2 executes them again on a window reload event. - setURL(StartupTask.set([], new URL(window.location.href))); - console.info(`Removed startup tasks from URL.`); - } - } -} - -export interface StartupTask { - command: string; - /** - * Must be JSON serializable. - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - args?: any[]; -} -export namespace StartupTask { - const QUERY = 'startupTasks'; - export function is(arg: unknown): arg is StartupTasks { - if (typeof arg === 'object') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const object = arg as any; - return 'command' in object && typeof object['command'] === 'string'; - } - return false; - } - export function get(url: URL): StartupTask[] { - const { searchParams } = url; - const encodedTasks = searchParams.get(QUERY); - if (encodedTasks) { - const rawTasks = decodeURIComponent(encodedTasks); - const tasks = JSON.parse(rawTasks); - if (Array.isArray(tasks)) { - return tasks.filter((task) => { - if (StartupTask.is(task)) { - return true; - } - console.warn(`Was not a task: ${JSON.stringify(task)}. Ignoring.`); - return false; - }); - } else { - debugger; - console.warn(`Startup tasks was not an array: ${rawTasks}. Ignoring.`); - } - } - return []; - } - export function set(tasks: StartupTask[], url: URL): URL { - const copy = new URL(url); - copy.searchParams.set(QUERY, encodeURIComponent(JSON.stringify(tasks))); - return copy; - } - export function append(tasks: StartupTask[], url: URL): URL { - return set([...get(url), ...tasks], url); - } -} - -export namespace StartupTasks { - export interface WorkspaceInput extends TheiaWorkspaceInput { - tasks: StartupTask[]; - } - export namespace WorkspaceInput { - export function is( - input: (TheiaWorkspaceInput & Partial) | undefined - ): input is WorkspaceInput { - return !!input && !!input.tasks; - } - } -} diff --git a/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts b/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts index 34da46bfd..595761be7 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service-client-impl.ts @@ -165,15 +165,6 @@ export class SketchesServiceClientImpl .reachedState('started_contributions') .then(async () => { const currentSketch = await this.loadCurrentSketch(); - if (CurrentSketch.isValid(currentSketch)) { - this.toDispose.pushAll([ - // Watch the file changes of the current sketch - this.fileService.watch(new URI(currentSketch.uri), { - recursive: true, - excludes: [], - }), - ]); - } this.useCurrentSketch(currentSketch); }); } diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 719ecaacd..dbb7c2654 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -97,9 +97,9 @@ export interface SketchesService { getIdeTempFolderUri(sketch: Sketch): Promise; /** - * Notifies the backend to recursively delete the sketch folder with all its content. + * Recursively deletes the sketch folder with all its content. */ - notifyDeleteSketch(sketch: Sketch): void; + deleteSketch(sketch: Sketch): Promise; } export interface SketchRef { diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts index d0d0a1ef2..74629f297 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,10 +1,14 @@ 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 { 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, @@ -12,6 +16,7 @@ import { } 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'; @injectable() export class ElectronWindowService @@ -60,14 +65,30 @@ export class ElectronWindowService return response === 0; // 'Yes', close the window. } - private _firstWindow: boolean | undefined; + 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._firstWindow = await this.mainWindowServiceExt.isFirstWindow( - windowId - ); + this.mainWindowServiceExt + .isFirstWindow(windowId) + .then((firstWindow) => this._firstWindow?.resolve(firstWindow)); + } + return this._firstWindow.promise; + } + + // Overridden because the default Theia implementation destroys the additional properties of the `options` arg, such as `tasks`. + 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 }); + } else { + ipcRenderer.send(RELOAD_REQUESTED_SIGNAL); } - return this._firstWindow; } } diff --git a/arduino-ide-extension/src/electron-common/startup-task.ts b/arduino-ide-extension/src/electron-common/startup-task.ts new file mode 100644 index 000000000..1bde3673d --- /dev/null +++ b/arduino-ide-extension/src/electron-common/startup-task.ts @@ -0,0 +1,50 @@ +export interface StartupTask { + 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[]; +} +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; + return ( + 'tasks' in object && + Array.isArray(object['tasks']) && + object['tasks'].every(is) + ); + } + 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[]; + } +} + +export const StartupTaskProvider = Symbol('StartupTaskProvider'); +export interface StartupTaskProvider { + tasks(): StartupTask[]; +} diff --git a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts index b6767e57d..9ab5bc99d 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 @@ -12,12 +12,8 @@ import { IDEUpdaterClient, IDEUpdaterPath, } from '../common/protocol/ide-updater'; -import { - ElectronMainWindowServiceExt, - electronMainWindowServiceExtPath, -} from '../electron-common/electron-main-window-service-ext'; +import { electronMainWindowServiceExtPath } from '../electron-common/electron-main-window-service-ext'; import { IsTempSketch } from '../node/is-temp-sketch'; -import { ElectronMainWindowServiceExtImpl } from './electron-main-window-service-ext-impl'; import { IDEUpdaterImpl } from './ide-updater/ide-updater-impl'; import { ElectronMainApplication } from './theia/electron-main-application'; import { ElectronMainWindowServiceImpl } from './theia/electron-main-window-service'; @@ -52,14 +48,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(TheiaElectronWindow).toSelf(); rebind(DefaultTheiaElectronWindow).toService(TheiaElectronWindow); - bind(ElectronMainWindowServiceExt) - .to(ElectronMainWindowServiceExtImpl) - .inSingletonScope(); bind(ElectronConnectionHandler) .toDynamicValue( (context) => new JsonRpcConnectionHandler(electronMainWindowServiceExtPath, () => - context.container.get(ElectronMainWindowServiceExt) + context.container.get(ElectronMainWindowServiceImpl) ) ) .inSingletonScope(); diff --git a/arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts b/arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts deleted file mode 100644 index a0c872786..000000000 --- a/arduino-ide-extension/src/electron-main/electron-main-window-service-ext-impl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import { ElectronMainWindowServiceExt } from '../electron-common/electron-main-window-service-ext'; -import { ElectronMainApplication } from './theia/electron-main-application'; - -@injectable() -export class ElectronMainWindowServiceExtImpl - implements ElectronMainWindowServiceExt -{ - @inject(ElectronMainApplication) - private readonly app: ElectronMainApplication; - - async isFirstWindow(windowId: number): Promise { - return this.app.firstWindowId === windowId; - } -} diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts index 2248ac543..d26055dec 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts @@ -1,34 +1,63 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +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 { ElectronMainApplication } from './electron-main-application'; -import { NewWindowOptions } from '@theia/core/lib/common/window'; +import { load } from './window'; @injectable() -export class ElectronMainWindowServiceImpl extends TheiaElectronMainWindowService { +export class ElectronMainWindowServiceImpl + extends TheiaElectronMainWindowService + implements ElectronMainWindowServiceExt +{ @inject(ElectronMainApplication) protected override readonly app: ElectronMainApplication; - override openNewWindow(url: string, { external }: NewWindowOptions): undefined { - if (!external) { - const sanitizedUrl = this.sanitize(url); - const existing = this.app.browserWindows.find( - (window) => this.sanitize(window.webContents.getURL()) === sanitizedUrl - ); - if (existing) { - existing.focus(); - return; - } - } - return super.openNewWindow(url, { external }); + async isFirstWindow(windowId: number): Promise { + return this.app.firstWindowId === windowId; } - private sanitize(url: string): string { - const copy = new URL(url); - const searchParams: string[] = []; - copy.searchParams.forEach((_, key) => searchParams.push(key)); - for (const param of searchParams) { - copy.searchParams.delete(param); + override openNewWindow(url: string, options: NewWindowOptions): undefined { + // External window has highest precedence. + if (options?.external) { + return super.openNewWindow(url, options); + } + + // Look for existing window with the same URL and focus it. + const existing = this.app.browserWindows.find( + ({ webContents }) => webContents.getURL() === url + ); + if (existing) { + existing.focus(); + return undefined; } - return copy.toString(); + + // 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); + } + + private loadURL( + electronWindow: BrowserWindow, + url: string + ): Promise { + return load(electronWindow, (electronWindow) => + electronWindow.loadURL(url) + ); } } diff --git a/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts b/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts index 8c5fd03bd..74dee4e90 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,12 +1,15 @@ import { injectable } from '@theia/core/shared/inversify'; import { ipcMain, IpcMainEvent } from '@theia/electron/shared/electron'; -import { StopReason } from '@theia/core/lib/electron-common/messaging/electron-messages'; +import { + RELOAD_REQUESTED_SIGNAL, + StopReason, +} from '@theia/core/lib/electron-common/messaging/electron-messages'; import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window'; import { FileUri } from '@theia/core/lib/node'; import URI from '@theia/core/lib/common/uri'; -import { FrontendApplicationState } from '@theia/core/lib/common/frontend-application-state'; import { createDisposableListener } from '@theia/core/lib/electron-main/event-utils'; -import { APPLICATION_STATE_CHANGE_SIGNAL } from '@theia/core/lib/electron-common/messaging/electron-messages'; +import { StartupTask } from '../../electron-common/startup-task'; +import { load } from './window'; @injectable() export class TheiaElectronWindow extends DefaultTheiaElectronWindow { @@ -38,30 +41,42 @@ export class TheiaElectronWindow extends DefaultTheiaElectronWindow { return false; } - // Note: does the same as the Theia impl, but logs state changes. - protected override trackApplicationState(): void { + protected override reload(tasks?: StartupTask[]): 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 } + ) + ); + } else { + this._window.reload(); + } + }, StopReason.Reload); + } + + protected override attachReloadListener(): void { createDisposableListener( ipcMain, - APPLICATION_STATE_CHANGE_SIGNAL, - (e: IpcMainEvent, state: FrontendApplicationState) => { - console.log( - 'app-state-change', - `>>> new app state <${state} was received from sender <${e.sender.id}>. current window ID: ${this._window.id}` - ); + RELOAD_REQUESTED_SIGNAL, + (e: IpcMainEvent, arg: unknown) => { if (this.isSender(e)) { - this.applicationState = state; - console.log( - 'app-state-change', - `<<< new app state is <${this.applicationState}> for window <${this._window.id}>` - ); - } else { - console.log( - 'app-state-change', - `<<< new app state <${state}> is ignored from <${e.sender.id}>. current window ID is <${this._window.id}>` - ); + if (StartupTask.has(arg)) { + this.reload(arg.tasks); + } else { + this.reload(); + } } }, this.toDispose ); } + + // 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 new file mode 100644 index 000000000..8eac41f51 --- /dev/null +++ b/arduino-ide-extension/src/electron-main/theia/window.ts @@ -0,0 +1,33 @@ +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-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index b007b1bc3..b2486e478 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -1,4 +1,4 @@ -import { ContainerModule } from '@theia/core/shared/inversify'; +import { ContainerModule, interfaces } from '@theia/core/shared/inversify'; import { ArduinoDaemonImpl } from './arduino-daemon-impl'; import { ArduinoFirmwareUploader, @@ -110,6 +110,7 @@ import { SurveyNotificationServicePath, } from '../common/protocol/survey-service'; import { IsTempSketch } from './is-temp-sketch'; +import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-watcher/nsfw-bindings'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -288,6 +289,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ) ) .inSingletonScope(); + rebindNsfwFileSystemWatcher(rebind); // Output service per connection. bind(ConnectionContainerModule).toConstantValue( @@ -325,58 +327,14 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { }) ); - // Logger for the Arduino daemon - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get(ILogger); - return parentLogger.child('daemon'); - }) - .inSingletonScope() - .whenTargetNamed('daemon'); - - // Logger for the Arduino daemon - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get(ILogger); - return parentLogger.child('fwuploader'); - }) - .inSingletonScope() - .whenTargetNamed('fwuploader'); - - // Logger for the "serial discovery". - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get(ILogger); - return parentLogger.child('discovery-log'); // TODO: revert - }) - .inSingletonScope() - .whenTargetNamed('discovery-log'); // TODO: revert - - // Logger for the CLI config service. From the CLI config (FS path aware), we make a URI-aware app config. - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get(ILogger); - return parentLogger.child('config'); - }) - .inSingletonScope() - .whenTargetNamed('config'); - - // Logger for the monitor manager and its services - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get(ILogger); - return parentLogger.child(MonitorManagerName); - }) - .inSingletonScope() - .whenTargetNamed(MonitorManagerName); - - bind(ILogger) - .toDynamicValue((ctx) => { - const parentLogger = ctx.container.get(ILogger); - return parentLogger.child(MonitorServiceName); - }) - .inSingletonScope() - .whenTargetNamed(MonitorServiceName); + [ + 'daemon', // Logger for the Arduino daemon + 'fwuploader', // Arduino Firmware uploader + 'discovery-log', // Boards discovery + 'config', // Logger for the CLI config reading and manipulation + MonitorManagerName, // Logger for the monitor manager and its services + MonitorServiceName, + ].forEach((name) => bindChildLogger(bind, name)); // Remote sketchbook bindings bind(AuthenticationServiceImpl).toSelf().inSingletonScope(); @@ -423,3 +381,12 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(IsTempSketch).toSelf().inSingletonScope(); }); + +function bindChildLogger(bind: interfaces.Bind, name: string): void { + bind(ILogger) + .toDynamicValue(({ container }) => + container.get(ILogger).child(name) + ) + .inSingletonScope() + .whenTargetNamed(name); +} diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index bba68f941..0912d4733 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -561,14 +561,18 @@ void loop() { return path.join(os.tmpdir(), `arduino-ide2-${suffix}`); } - notifyDeleteSketch(sketch: Sketch): void { - const sketchPath = FileUri.fsPath(sketch.uri); - fs.rm(sketchPath, { recursive: true, maxRetries: 5 }, (error) => { - if (error) { - console.error(`Failed to delete sketch at ${sketchPath}.`, error); - } else { - console.error(`Successfully delete sketch at ${sketchPath}.`); - } + async deleteSketch(sketch: Sketch): Promise { + return new Promise((resolve, reject) => { + const sketchPath = FileUri.fsPath(sketch.uri); + fs.rm(sketchPath, { recursive: true, maxRetries: 5 }, (error) => { + if (error) { + console.error(`Failed to delete sketch at ${sketchPath}.`, error); + reject(error); + } else { + console.log(`Successfully deleted sketch at ${sketchPath}.`); + resolve(); + } + }); }); } } 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 new file mode 100644 index 000000000..93e0d267a --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts @@ -0,0 +1,31 @@ +import * as yargs from '@theia/core/shared/yargs'; +import { JsonRpcProxyFactory } from '@theia/core'; +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'; + +const options: { + verbose: boolean; +} = yargs + .option('verbose', { + default: false, + alias: 'v', + type: 'boolean', + }) + .option('nsfwOptions', { + alias: 'o', + type: 'string', + coerce: JSON.parse, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + }).argv as any; + +export default ((connection) => { + const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService( + options + ); + const factory = new JsonRpcProxyFactory( + server + ); + server.setClient(factory.createProxy()); + factory.listen(connection); +}); diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts new file mode 100644 index 000000000..77cdd11d7 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts @@ -0,0 +1,42 @@ +import { join } from 'path'; +import { interfaces } from '@theia/core/shared/inversify'; +import { + NsfwFileSystemWatcherServiceProcessOptions, + NSFW_SINGLE_THREADED, + spawnNsfwFileSystemWatcherServiceProcess, +} from '@theia/filesystem/lib/node/filesystem-backend-module'; +import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; +import { NsfwFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service'; +import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher'; +import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-filesystem-service'; + +export function rebindNsfwFileSystemWatcher(rebind: interfaces.Rebind): void { + rebind( + NsfwFileSystemWatcherServiceProcessOptions + ).toConstantValue({ + entryPoint: join(__dirname, 'index.js'), + }); + rebind(FileSystemWatcherService) + .toDynamicValue((context) => + NSFW_SINGLE_THREADED + ? createNsfwFileSystemWatcherService(context) + : spawnNsfwFileSystemWatcherServiceProcess(context) + ) + .inSingletonScope(); +} + +function createNsfwFileSystemWatcherService({ + container, +}: interfaces.Context): FileSystemWatcherService { + const options = container.get( + NsfwFileSystemWatcherServerOptions + ); + const dispatcher = container.get( + FileSystemWatcherServiceDispatcher + ); + const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService( + options + ); + server.setClient(dispatcher); + return server; +} diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts new file mode 100644 index 000000000..6bf40ead2 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts @@ -0,0 +1,32 @@ +import { Minimatch } from 'minimatch'; +import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; +import { + NsfwFileSystemWatcherService, + NsfwWatcher, +} from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service'; + +// Dispose the watcher immediately when the last reference is removed. By default, Theia waits 10 sec. +// https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708 +const NoDelay = 0; + +export class NoDelayDisposalTimeoutNsfwFileSystemWatcherService extends NsfwFileSystemWatcherService { + protected override createWatcher( + clientId: number, + fsPath: string, + options: WatchOptions + ): NsfwWatcher { + const watcherOptions = { + ignored: options.ignored.map( + (pattern) => new Minimatch(pattern, { dot: true }) + ), + }; + return new NsfwWatcher( + clientId, + fsPath, + watcherOptions, + this.options, + this.maybeClient, + NoDelay + ); + } +} diff --git a/browser-app/package.json b/browser-app/package.json deleted file mode 100644 index c7a9dacd3..000000000 --- a/browser-app/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "private": true, - "name": "browser-app", - "version": "2.0.0", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@theia/core": "1.25.0", - "@theia/debug": "1.25.0", - "@theia/editor": "1.25.0", - "@theia/file-search": "1.25.0", - "@theia/filesystem": "1.25.0", - "@theia/keymaps": "1.25.0", - "@theia/messages": "1.25.0", - "@theia/monaco": "1.25.0", - "@theia/navigator": "1.25.0", - "@theia/plugin-ext": "1.25.0", - "@theia/plugin-ext-vscode": "1.25.0", - "@theia/preferences": "1.25.0", - "@theia/process": "1.25.0", - "@theia/terminal": "1.25.0", - "@theia/workspace": "1.25.0", - "arduino-ide-extension": "2.0.0" - }, - "devDependencies": { - "@theia/cli": "1.25.0" - }, - "scripts": { - "prepare": "theia build --mode development", - "start": "theia start --plugins=local-dir:../plugins", - "watch": "theia build --watch --mode development" - }, - "theia": { - "frontend": { - "config": { - "applicationName": "Arduino IDE", - "defaultTheme": "arduino-theme", - "preferences": { - "files.autoSave": "afterDelay", - "editor.minimap.enabled": false, - "editor.tabSize": 2, - "editor.scrollBeyondLastLine": false, - "editor.quickSuggestions": { - "other": false, - "comments": false, - "strings": false - }, - "breadcrumbs.enabled": false - } - } - }, - "backend": { - "config": { - "configDirName": ".arduinoIDE" - } - }, - "generator": { - "config": { - "preloadTemplate": "

" - } - } - } -} diff --git a/browser-app/webpack.config.js b/browser-app/webpack.config.js deleted file mode 100644 index 38baa16f8..000000000 --- a/browser-app/webpack.config.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * This file can be edited to customize webpack configuration. - * To reset delete this file and rerun theia build again. - */ -// @ts-check -const config = require('./gen-webpack.config.js'); - -config.resolve.fallback['http'] = false; -config.resolve.fallback['fs'] = false; - -/** - * Expose bundled modules on window.theia.moduleName namespace, e.g. - * window['theia']['@theia/core/lib/common/uri']. - * Such syntax can be used by external code, for instance, for testing. -config.module.rules.push({ - test: /\.js$/, - loader: require.resolve('@theia/application-manager/lib/expose-loader') -}); */ - -module.exports = config; \ No newline at end of file diff --git a/docs/internal/release-procedure.md b/docs/internal/release-procedure.md index d0c034f7c..b95916367 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -12,7 +12,7 @@ https://github.com/arduino/arduino-ide/pulls/app%2Fgithub-actions ## ⚙ Create the release on GitHub -First of all, you need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, `./browser-app/package.json`, `./electron-app/package.json`), create a PR, and merge it on the `main` branch. +First of all, you need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. To do so, you can make use of the `update:version` script. diff --git a/electron/packager/index.js b/electron/packager/index.js index eb9430cab..12b36097a 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -119,14 +119,14 @@ } verifyVersions(allDependencies); - //-------------------------------------------------------------+ - // Save some time: no need to build the `browser-app` example. | - //-------------------------------------------------------------+ + //---------------------------------------------------------------------------------------------------+ + // Save some time: no need to build the projects that are not needed in final app. Currently unused. | + //---------------------------------------------------------------------------------------------------+ //@ts-ignore let pkg = require('../working-copy/package.json'); const workspaces = pkg.workspaces; // We cannot remove the `electron-app`. Otherwise, there is not way to collect the unused dependencies. - const dependenciesToRemove = ['browser-app']; + const dependenciesToRemove = []; for (const dependencyToRemove of dependenciesToRemove) { const index = workspaces.indexOf(dependencyToRemove); if (index !== -1) { diff --git a/package.json b/package.json index 0e0b28e37..9800d23e7 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ }, "scripts": { "prepare": "lerna run prepare && yarn download:plugins", - "cleanup": "npx rimraf ./**/node_modules && rm -rf ./node_modules ./.browser_modules ./arduino-ide-extension/build ./arduino-ide-extension/downloads ./arduino-ide-extension/Examples ./arduino-ide-extension/lib ./browser-app/lib ./browser-app/src-gen ./browser-app/gen-webpack.config.js ./electron-app/lib ./electron-app/src-gen ./electron-app/gen-webpack.config.js", + "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", "rebuild:browser": "theia rebuild:browser", "rebuild:electron": "theia rebuild:electron", "start": "yarn --cwd ./electron-app start", @@ -49,7 +49,7 @@ "test": "lerna run test", "download:plugins": "theia download:plugins", "update:version": "node ./scripts/update-version.js", - "i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|browser-app|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json", + "i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json", "i18n:check": "yarn i18n:generate && git add -N ./i18n && git diff --exit-code ./i18n", "i18n:push": "node ./scripts/i18n/transifex-push.js ./i18n/en.json", "i18n:pull": "node ./scripts/i18n/transifex-pull.js ./i18n/", @@ -69,8 +69,7 @@ }, "workspaces": [ "arduino-ide-extension", - "electron-app", - "browser-app" + "electron-app" ], "theiaPluginsDir": "plugins", "theiaPlugins": { diff --git a/scripts/update-version.js b/scripts/update-version.js index f504e5258..fea65ed27 100644 --- a/scripts/update-version.js +++ b/scripts/update-version.js @@ -27,7 +27,6 @@ console.log(`🛠️ Updating current version from '${currentVersion}' to '${tar for (const toUpdate of [ path.join(repoRootPath, 'package.json'), path.join(repoRootPath, 'electron-app', 'package.json'), - path.join(repoRootPath, 'browser-app', 'package.json'), path.join(repoRootPath, 'arduino-ide-extension', 'package.json') ]) { process.stdout.write(` Updating ${toUpdate}'...`); From 026e80e7fc803f45e084242f76957235c0315184 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Thu, 15 Sep 2022 15:29:28 +0200 Subject: [PATCH 010/384] fix #1383: missing port labels (#1412) * fallback to port.address if addressLabel is false * addressLabel if possible, reconcileAvailableBoards * remove fallback --- .../src/browser/boards/boards-service-provider.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 25aa8d058..8097e45c6 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -600,6 +600,7 @@ export class BoardsServiceProvider boardsConfig.selectedBoard && availableBoards.every(({ selected }) => !selected) ) { + 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. @@ -607,11 +608,15 @@ export class BoardsServiceProvider (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); } availableBoards.push({ ...boardsConfig.selectedBoard, - port: boardsConfig.selectedPort, + port, selected: true, state: AvailableBoard.State.incomplete, }); From 4e590ab618eefa6c7a6cf9a754eb29d6865603af Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 15 Sep 2022 16:07:13 +0200 Subject: [PATCH 011/384] use ipc message to focus on serial plotter window (#1410) --- .../plotter/plotter-frontend-contribution.ts | 8 ++++++-- .../src/common/ipc-communication.ts | 2 ++ .../theia/electron-main-application.ts | 18 ++++++++++++++---- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 arduino-ide-extension/src/common/ipc-communication.ts diff --git a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts index 2a7c0a23f..3914c061a 100644 --- a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts @@ -14,6 +14,10 @@ import { MonitorManagerProxyClient } from '../../../common/protocol'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { ArduinoToolbar } from '../../toolbar/arduino-toolbar'; +import { + CLOSE_PLOTTER_WINDOW, + SHOW_PLOTTER_WINDOW, +} from '../../../common/ipc-communication'; const queryString = require('query-string'); @@ -58,7 +62,7 @@ export class PlotterFrontendContribution extends Contribution { override onStart(app: FrontendApplication): MaybePromise { this.url = new Endpoint({ path: '/plotter' }).getRestUrl().toString(); - ipcRenderer.on('CLOSE_CHILD_WINDOW', async () => { + ipcRenderer.on(CLOSE_PLOTTER_WINDOW, async () => { if (!!this.window) { this.window = null; } @@ -96,7 +100,7 @@ export class PlotterFrontendContribution extends Contribution { async startPlotter(): Promise { await this.monitorManagerProxy.startMonitor(); if (!!this.window) { - this.window.focus(); + ipcRenderer.send(SHOW_PLOTTER_WINDOW); return; } const wsPort = this.monitorManagerProxy.getWebSocketPort(); diff --git a/arduino-ide-extension/src/common/ipc-communication.ts b/arduino-ide-extension/src/common/ipc-communication.ts new file mode 100644 index 000000000..826daf532 --- /dev/null +++ b/arduino-ide-extension/src/common/ipc-communication.ts @@ -0,0 +1,2 @@ +export const SHOW_PLOTTER_WINDOW = 'SHOW_PLOTTER_WINDOW'; +export const CLOSE_PLOTTER_WINDOW = 'CLOSE_PLOTTER_WINDOW'; diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index 981c5ad68..bb85405b3 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 @@ -23,6 +23,10 @@ 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'; app.commandLine.appendSwitch('disable-http-cache'); @@ -324,15 +328,21 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { webPreferences: { devTools: true, nativeWindowOpen: true, - openerId: electronWindow?.webContents.id, + 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', () => { - electronWindow?.webContents.send('CLOSE_CHILD_WINDOW'); + event.newGuest.on('closed', () => { + ipcMain.removeListener(SHOW_PLOTTER_WINDOW, showPlotterWindow); + electronWindow.webContents.send(CLOSE_PLOTTER_WINDOW); }); - event.newGuest?.loadURL(url); + event.newGuest.loadURL(url); } } ); From 9a65ef6ea840cae2c862d0bcc5432de6429d427a Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 16 Sep 2022 17:26:40 +0200 Subject: [PATCH 012/384] Disabled the tokenizer after 500 chars. Closes #1343. Signed-off-by: Akos Kitta --- electron-app/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/electron-app/package.json b/electron-app/package.json index 1794ec5bd..c2e71bc24 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -48,6 +48,7 @@ "comments": false, "strings": false }, + "editor.maxTokenizationLineLength": 500, "breadcrumbs.enabled": false, "workbench.tree.renderIndentGuides": "none", "explorer.compactFolders": false From 671d2eabd4eb9b08dd49262f565a369b5cb4e926 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 20 Sep 2022 09:27:09 +0200 Subject: [PATCH 013/384] Show user fields dialog again if upload fails (#1415) * Show user fields dialog again if upload fails * move user fields logic into own contribution * apply suggestions --- .../browser/arduino-ide-frontend-module.ts | 2 + .../browser/contributions/upload-sketch.ts | 155 ++++-------------- .../src/browser/contributions/user-fields.ts | 150 +++++++++++++++++ 3 files changed, 180 insertions(+), 127 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/user-fields.ts 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 000e9d0f9..d6e9571f7 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -337,6 +337,7 @@ import { CheckForUpdates } from './contributions/check-for-updates'; import { OutputEditorFactory } from './theia/output/output-editor-factory'; import { StartupTaskProvider } from '../electron-common/startup-task'; import { DeleteSketch } from './contributions/delete-sketch'; +import { UserFields } from './contributions/user-fields'; const registerArduinoThemes = () => { const themes: MonacoThemeJson[] = [ @@ -761,6 +762,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, OpenBoardsConfig); Contribution.configure(bind, SketchFilesTracker); Contribution.configure(bind, CheckForUpdates); + Contribution.configure(bind, UserFields); Contribution.configure(bind, DeleteSketch); bindContributionProvider(bind, StartupTaskProvider); diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index 5d6135cec..f337fb1d7 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -1,7 +1,7 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { Emitter } from '@theia/core/lib/common/event'; -import { BoardUserField, CoreService, Port } from '../../common/protocol'; -import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; +import { CoreService, Port } from '../../common/protocol'; +import { ArduinoMenus } from '../menu/arduino-menus'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { Command, @@ -11,96 +11,36 @@ import { TabBarToolbarRegistry, CoreServiceContribution, } from './contribution'; -import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog'; -import { deepClone, DisposableCollection, nls } from '@theia/core/lib/common'; +import { deepClone, nls } from '@theia/core/lib/common'; import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl'; import type { VerifySketchParams } from './verify-sketch'; +import { UserFields } from './user-fields'; @injectable() export class UploadSketch extends CoreServiceContribution { - @inject(MenuModelRegistry) - private readonly menuRegistry: MenuModelRegistry; - - @inject(UserFieldsDialog) - private readonly userFieldsDialog: UserFieldsDialog; - - private boardRequiresUserFields = false; - private readonly cachedUserFields: Map = new Map(); - private readonly menuActionsDisposables = new DisposableCollection(); - private readonly onDidChangeEmitter = new Emitter(); private readonly onDidChange = this.onDidChangeEmitter.event; private uploadInProgress = false; - protected override init(): void { - super.init(); - this.boardsServiceProvider.onBoardsConfigChanged(async () => { - const userFields = - await this.boardsServiceProvider.selectedBoardUserFields(); - this.boardRequiresUserFields = userFields.length > 0; - this.registerMenus(this.menuRegistry); - }); - } - - private selectedFqbnAddress(): string { - const { boardsConfig } = this.boardsServiceProvider; - const fqbn = boardsConfig.selectedBoard?.fqbn; - if (!fqbn) { - return ''; - } - const address = - boardsConfig.selectedBoard?.port?.address || - boardsConfig.selectedPort?.address; - if (!address) { - return ''; - } - return fqbn + '|' + address; - } + @inject(UserFields) + private readonly userFields: UserFields; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(UploadSketch.Commands.UPLOAD_SKETCH, { execute: async () => { - const key = this.selectedFqbnAddress(); - if ( - this.boardRequiresUserFields && - key && - !this.cachedUserFields.has(key) - ) { - // Deep clone the array of board fields to avoid editing the cached ones - this.userFieldsDialog.value = ( - await this.boardsServiceProvider.selectedBoardUserFields() - ).map((f) => ({ ...f })); - const result = await this.userFieldsDialog.open(); - if (!result) { - return; - } - this.cachedUserFields.set(key, result); + if (await this.userFields.checkUserFieldsDialog()) { + this.uploadSketch(); } - this.uploadSketch(); }, isEnabled: () => !this.uploadInProgress, }); registry.registerCommand(UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION, { execute: async () => { - const key = this.selectedFqbnAddress(); - if (!key) { - return; - } - - const cached = this.cachedUserFields.get(key); - // Deep clone the array of board fields to avoid editing the cached ones - this.userFieldsDialog.value = ( - cached ?? (await this.boardsServiceProvider.selectedBoardUserFields()) - ).map((f) => ({ ...f })); - - const result = await this.userFieldsDialog.open(); - if (!result) { - return; + if (await this.userFields.checkUserFieldsDialog(true)) { + this.uploadSketch(); } - this.cachedUserFields.set(key, result); - this.uploadSketch(); }, - isEnabled: () => !this.uploadInProgress && this.boardRequiresUserFields, + isEnabled: () => !this.uploadInProgress && this.userFields.isRequired(), }); registry.registerCommand( UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER, @@ -120,45 +60,20 @@ export class UploadSketch extends CoreServiceContribution { } override registerMenus(registry: MenuModelRegistry): void { - this.menuActionsDisposables.dispose(); - this.menuActionsDisposables.push( - registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { - commandId: UploadSketch.Commands.UPLOAD_SKETCH.id, - label: nls.localize('arduino/sketch/upload', 'Upload'), - order: '1', - }) - ); - if (this.boardRequiresUserFields) { - this.menuActionsDisposables.push( - registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { - commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, - label: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, - order: '2', - }) - ); - } else { - this.menuActionsDisposables.push( - registry.registerMenuNode( - ArduinoMenus.SKETCH__MAIN_GROUP, - new PlaceholderMenuNode( - ArduinoMenus.SKETCH__MAIN_GROUP, - // commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, - UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, - { order: '2' } - ) - ) - ); - } - this.menuActionsDisposables.push( - registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { - commandId: UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER.id, - label: nls.localize( - 'arduino/sketch/uploadUsingProgrammer', - 'Upload Using Programmer' - ), - order: '3', - }) - ); + registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { + commandId: UploadSketch.Commands.UPLOAD_SKETCH.id, + label: nls.localize('arduino/sketch/upload', 'Upload'), + order: '1', + }); + + registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { + commandId: UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER.id, + label: nls.localize( + 'arduino/sketch/uploadUsingProgrammer', + 'Upload Using Programmer' + ), + order: '3', + }); } override registerKeybindings(registry: KeybindingRegistry): void { @@ -215,18 +130,7 @@ export class UploadSketch extends CoreServiceContribution { return; } - // TODO: This does not belong here. - // IDE2 should not do any preliminary checks but let the CLI fail and then toast a user consumable error message. - if ( - uploadOptions.userFields.length === 0 && - this.boardRequiresUserFields - ) { - this.messageService.error( - nls.localize( - 'arduino/sketch/userFieldsNotFoundError', - "Can't find user fields for connected board" - ) - ); + if (!this.userFields.checkUserFieldsForUpload()) { return; } @@ -242,6 +146,7 @@ export class UploadSketch extends CoreServiceContribution { { timeout: 3000 } ); } catch (e) { + this.userFields.notifyFailedWithError(e); this.handleError(e); } finally { this.uploadInProgress = false; @@ -258,7 +163,7 @@ export class UploadSketch extends CoreServiceContribution { if (!CurrentSketch.isValid(sketch)) { return undefined; } - const userFields = this.userFields(); + const userFields = this.userFields.getUserFields(); const { boardsConfig } = this.boardsServiceProvider; const [fqbn, { selectedProgrammer: programmer }, verify, verbose] = await Promise.all([ @@ -301,10 +206,6 @@ export class UploadSketch extends CoreServiceContribution { return port; } - private userFields(): BoardUserField[] { - return this.cachedUserFields.get(this.selectedFqbnAddress()) ?? []; - } - /** * Converts the `VENDOR:ARCHITECTURE:BOARD_ID[:MENU_ID=OPTION_ID[,MENU2_ID=OPTION_ID ...]]` FQBN to * `VENDOR:ARCHITECTURE:BOARD_ID` format. diff --git a/arduino-ide-extension/src/browser/contributions/user-fields.ts b/arduino-ide-extension/src/browser/contributions/user-fields.ts new file mode 100644 index 000000000..c73ead9e6 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/user-fields.ts @@ -0,0 +1,150 @@ +import { inject, injectable } from '@theia/core/shared/inversify'; +import { DisposableCollection, nls } from '@theia/core/lib/common'; +import { BoardUserField, CoreError } from '../../common/protocol'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog'; +import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; +import { MenuModelRegistry, Contribution } from './contribution'; +import { UploadSketch } from './upload-sketch'; + +@injectable() +export class UserFields extends Contribution { + private boardRequiresUserFields = false; + private userFieldsSet = false; + private readonly cachedUserFields: Map = new Map(); + private readonly menuActionsDisposables = new DisposableCollection(); + + @inject(UserFieldsDialog) + private readonly userFieldsDialog: UserFieldsDialog; + + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + + @inject(MenuModelRegistry) + private readonly menuRegistry: MenuModelRegistry; + + protected override init(): void { + super.init(); + this.boardsServiceProvider.onBoardsConfigChanged(async () => { + const userFields = + await this.boardsServiceProvider.selectedBoardUserFields(); + this.boardRequiresUserFields = userFields.length > 0; + this.registerMenus(this.menuRegistry); + }); + } + + override registerMenus(registry: MenuModelRegistry): void { + this.menuActionsDisposables.dispose(); + if (this.boardRequiresUserFields) { + this.menuActionsDisposables.push( + registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, { + commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, + label: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, + order: '2', + }) + ); + } else { + this.menuActionsDisposables.push( + registry.registerMenuNode( + ArduinoMenus.SKETCH__MAIN_GROUP, + new PlaceholderMenuNode( + ArduinoMenus.SKETCH__MAIN_GROUP, + // commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id, + UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label, + { order: '2' } + ) + ) + ); + } + } + + private selectedFqbnAddress(): string | undefined { + const { boardsConfig } = this.boardsServiceProvider; + const fqbn = boardsConfig.selectedBoard?.fqbn; + if (!fqbn) { + return undefined; + } + const address = + boardsConfig.selectedBoard?.port?.address || + boardsConfig.selectedPort?.address; + if (!address) { + return undefined; + } + return fqbn + '|' + address; + } + + private async showUserFieldsDialog( + key: string + ): Promise { + const cached = this.cachedUserFields.get(key); + // Deep clone the array of board fields to avoid editing the cached ones + this.userFieldsDialog.value = cached ? cached.slice() : await this.boardsServiceProvider.selectedBoardUserFields(); + const result = await this.userFieldsDialog.open(); + if (!result) { + return; + } + + this.userFieldsSet = true; + this.cachedUserFields.set(key, result); + return result; + } + + async checkUserFieldsDialog(forceOpen = false): Promise { + const key = this.selectedFqbnAddress(); + if (!key) { + return false; + } + /* + If the board requires to be configured with user fields, we want + to show the user fields dialog, but only if they weren't already + filled in or if they were filled in, but the previous upload failed. + */ + if ( + !forceOpen && + (!this.boardRequiresUserFields || + (this.cachedUserFields.has(key) && this.userFieldsSet)) + ) { + return true; + } + const userFieldsFilledIn = Boolean(await this.showUserFieldsDialog(key)); + return userFieldsFilledIn; + } + + checkUserFieldsForUpload(): boolean { + // TODO: This does not belong here. + // IDE2 should not do any preliminary checks but let the CLI fail and then toast a user consumable error message. + if (!this.boardRequiresUserFields || this.getUserFields().length > 0) { + this.userFieldsSet = true; + return true; + } + this.messageService.error( + nls.localize( + 'arduino/sketch/userFieldsNotFoundError', + "Can't find user fields for connected board" + ) + ); + this.userFieldsSet = false; + return false; + } + + getUserFields(): BoardUserField[] { + const fqbnAddress = this.selectedFqbnAddress(); + if (!fqbnAddress) { + return []; + } + return this.cachedUserFields.get(fqbnAddress) ?? []; + } + + isRequired(): boolean { + return this.boardRequiresUserFields; + } + + notifyFailedWithError(e: Error): void { + if ( + this.boardRequiresUserFields && + CoreError.UploadFailed.is(e) + ) { + this.userFieldsSet = false; + } + } +} From 364f8b8e51dcf66290dc186adc6b33a6917bef70 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Tue, 20 Sep 2022 11:48:19 +0200 Subject: [PATCH 014/384] Move primary buttons on the right of the dialogs (#1382) Closes #1368. --- .../browser/dialogs/settings/settings-dialog.tsx | 2 +- .../src/browser/library/library-list-widget.ts | 8 +++++--- .../src/browser/style/settings-dialog.css | 1 + .../theia/workspace/workspace-input-dialog.ts | 13 ++++++++++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 62d67859c..b4ad879d1 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -181,10 +181,10 @@ export class AdditionalUrlsDialog extends AbstractDialog { ); this.contentNode.appendChild(anchor); - this.appendAcceptButton(nls.localize('vscode/issueMainService/ok', 'OK')); this.appendCloseButton( nls.localize('vscode/issueMainService/cancel', 'Cancel') ); + this.appendAcceptButton(nls.localize('vscode/issueMainService/ok', 'OK')); } get value(): string[] { diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 5c654b615..9e8eba64c 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -126,13 +126,13 @@ export class LibraryListWidget extends ListWidget< ), message, buttons: [ - nls.localize('arduino/library/installAll', 'Install all'), + nls.localize('vscode/issueMainService/cancel', 'Cancel'), nls.localize( 'arduino/library/installOnly', 'Install {0} only', item.name ), - nls.localize('vscode/issueMainService/cancel', 'Cancel'), + nls.localize('arduino/library/installAll', 'Install all'), ], maxWidth: 740, // Aligned with `settings-dialog.css`. }).open(); @@ -201,7 +201,9 @@ class MessageBoxDialog extends AbstractDialog { options.buttons || [nls.localize('vscode/issueMainService/ok', 'OK')] ).forEach((text, index) => { const button = this.createButton(text); - button.classList.add(index === 0 ? 'main' : 'secondary'); + const isPrimaryButton = + index === (options.buttons ? options.buttons.length - 1 : 0); + button.classList.add(isPrimaryButton ? 'main' : 'secondary'); this.controlPanel.appendChild(button); this.toDisposeOnDetach.push( addEventListener(button, 'click', () => { diff --git a/arduino-ide-extension/src/browser/style/settings-dialog.css b/arduino-ide-extension/src/browser/style/settings-dialog.css index 10ddfd0a0..017f8c07e 100644 --- a/arduino-ide-extension/src/browser/style/settings-dialog.css +++ b/arduino-ide-extension/src/browser/style/settings-dialog.css @@ -93,4 +93,5 @@ .p-Widget.dialogOverlay .dialogBlock .dialogContent.additional-urls-dialog { display: block; + overflow: hidden; } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts index d70d7e27d..7dca96b7f 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts @@ -14,7 +14,8 @@ export class WorkspaceInputDialog extends TheiaWorkspaceInputDialog { constructor( @inject(WorkspaceInputDialogProps) protected override readonly props: WorkspaceInputDialogProps, - @inject(LabelProvider) protected override readonly labelProvider: LabelProvider + @inject(LabelProvider) + protected override readonly labelProvider: LabelProvider ) { super(props, labelProvider); this.appendCloseButton( @@ -41,4 +42,14 @@ export class WorkspaceInputDialog extends TheiaWorkspaceInputDialog { this.errorMessageNode.innerText = DialogError.getMessage(error); } } + + protected override appendCloseButton(text: string): HTMLButtonElement { + this.closeButton = this.createButton(text); + this.controlPanel.insertBefore( + this.closeButton, + this.controlPanel.lastChild + ); + this.closeButton.classList.add('secondary'); + return this.closeButton; + } } From f5c36bb691e0df1ef8e3e2f539dc58fba1a32d5c Mon Sep 17 00:00:00 2001 From: Dwight <83466469+dwightfowler-cd@users.noreply.github.com> Date: Tue, 20 Sep 2022 06:26:57 -0400 Subject: [PATCH 015/384] Serial Monitor autoscroll only makes bottom line partially visible #972 (#1446) --- arduino-ide-extension/src/browser/style/monitor.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index 9e8bd44cc..fdcdfc21c 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -14,6 +14,10 @@ font-family: monospace } +.serial-monitor-messages pre { + margin: 0px; +} + .serial-monitor .head { display: flex; padding: 5px; From 8de6cf84d9b9ee64e7fbe8ccf611dccc4fe77516 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Sep 2022 12:57:27 +0200 Subject: [PATCH 016/384] Updated translation files (#1462) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 2 +- i18n/ar.json | 2 +- i18n/az.json | 2 +- i18n/bg.json | 2 +- i18n/ca_ES.json | 2 +- i18n/cs.json | 2 +- i18n/de.json | 112 +++++------ i18n/el.json | 2 +- i18n/es.json | 2 +- i18n/eu.json | 2 +- i18n/fa.json | 12 +- i18n/fil.json | 2 +- i18n/fr.json | 2 +- i18n/he.json | 8 +- i18n/hu.json | 2 +- i18n/it.json | 72 +++---- i18n/ja.json | 80 ++++---- i18n/ko.json | 506 ++++++++++++++++++++++++------------------------ i18n/my_MM.json | 2 +- i18n/ne.json | 2 +- i18n/nl.json | 86 ++++---- i18n/pl.json | 72 +++---- i18n/pt.json | 24 +-- i18n/ro.json | 2 +- i18n/ru.json | 2 +- i18n/sr.json | 2 +- i18n/tr.json | 2 +- i18n/vi.json | 2 +- i18n/zh.json | 2 +- i18n/zh_TW.json | 2 +- 30 files changed, 507 insertions(+), 507 deletions(-) diff --git a/i18n/af.json b/i18n/af.json index 2b1a8db1f..946ca2ffc 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Wagterugkeer", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nuwe lyn", "newLineCarriageReturn": "Beide NL & CR", "noLineEndings": "No Line Ending", diff --git a/i18n/ar.json b/i18n/ar.json index 09d79a229..890daab04 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "تمرير تلقائي", "carriageReturn": "اعادة الحمل", - "message": "الرسالة ({0} + ادخل لارسال رسالة الى '{1}' على '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "سطر جديد", "newLineCarriageReturn": " NL & CR معاً", "noLineEndings": "نهاية السطر غير موجودة", diff --git a/i18n/az.json b/i18n/az.json index 66c66f757..3d7e313cc 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", diff --git a/i18n/bg.json b/i18n/bg.json index 6ebefd32c..aabf8bdaa 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Автоматично превъртане", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нов ред", "newLineCarriageReturn": "Както NL, така и CR", "noLineEndings": "Без край на реда", diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 93ba69872..d19c9976a 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Desplaçament automàtic", "carriageReturn": "Retorn de carro", - "message": "Missatge ({0}+ Intro per enviar el missatge a '{1}' a '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nova Línia", "newLineCarriageReturn": "Ambdós NL & CR", "noLineEndings": "Sense final de línia", diff --git a/i18n/cs.json b/i18n/cs.json index 3d2ecdaf7..69410774f 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Enter (CR)", - "message": "Zpráva ({0}+ Enter pro odeslání zprávy do '{1}' na '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nový řádek (NL)", "newLineCarriageReturn": "Oba NL & CR", "noLineEndings": "Bez konce řádku", diff --git a/i18n/de.json b/i18n/de.json index b2fb2cae6..f778b3ffb 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -6,27 +6,27 @@ }, "board": { "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Anderes Boards und Ports wählen", "boardInfo": "Board-Informationen", "configDialog1": "Wählen Sie ein Board und einen Port, wenn Sie den Sketch hochladen möchten.", "configDialog2": "Wenn Sie nur ein Board auswählen, werden Sie den Sketch nur kompilieren können, jedoch nicht hochladen.", "couldNotFindPreviouslySelected": "Zuvor gewähltes Board '{0}' wurde nicht in der installierten Plaftform '{1}' gefunden. Bitte Board erneut auswählen. Jetzt auswählen?", - "disconnected": "Disconnected", + "disconnected": " Verbindung getrennt", "getBoardInfo": "Board-Informationen abrufen", "inSketchbook": "(im Sketchbook)", "installNow": "Der \"{0} {1}\" Core muss für das ausgewählte \"{2}\" Board installiert werden. Jetzt installieren?", "noFQBN": "Der FQBN ist für das gewählte Board \"{0}\" nicht verfügbar. Wurde der zugehörige Core installiert?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Keine Ports gefunden", "noPortsSelected": "Kein Port für das Board : '{0}' ausgewählt.", "noneSelected": "Kein Board ausgewählt.", "openBoardsConfig": "Wähle einen anderes Board und einen anderen Port...", "platformMissing": "Die Plattform für das gewählte '{0}' Board ist nicht installiert.", "pleasePickBoard": "Bitte wählen Sie das Board, welches am ausgewählten Port angeschlossen ist.", "port": "Port{0}", - "portLabel": "Port: {0}", + "portLabel": "Port{0}", "programmer": "Programmer", "reselectLater": "Später auswählen", - "searchBoard": "Search board", + "searchBoard": "Board suchen", "selectBoard": "Board wählen", "selectBoardForInfo": "Wähle ein Board für die Board-Informationen.", "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", @@ -36,11 +36,11 @@ }, "boardsManager": "Board-Verwaltung", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino-zertifiziert" }, "bootloader": { "burnBootloader": "Bootloader brennen", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Brenne Bootloader...", "doneBurningBootloader": "Bootloader erfolgreich gebrannt." }, "burnBootloader": { @@ -64,20 +64,20 @@ "uploadingCertificates": "Zertifikate hochladen..." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Nach Arduino Updates suchen", + "installAll": "Alle installieren", + "noUpdates": "Es sind keine aktuellen Updates verfügbar.", + "promptUpdateBoards": "Es sind Updates für einige ihrer Boards verfügbar.", + "promptUpdateLibraries": "Es sind Updates für einige ihrer Blibliotheken verfügbar.", + "updatingBoards": "Boards werden aktualisiert...", + "updatingLibraries": "Bibliotheken werden aktualisiert..." }, "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 '?" + "keyboardError": "'Keyboard' nicht gefunden. Enthält ihr Sketch die Zeile '#include '?", + "mouseError": "'Mouse' nicht gefunden. Enthält ihr Sketch die Zeile '#include '?" }, "cloud": { - "account": "Account", + "account": "Konto", "chooseSketchVisibility": "Wähle die Sichtbarkeit deines Sketches:", "connected": "Verbunden", "continue": "Fortfahren", @@ -102,20 +102,20 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "Das ist ein öffentliches Sketch. Vor dem Pushen solltest du überprüfen, ob alle sensiblen Informationen in arduino_secrets.h definiert sind. Du kannst einen Sketch mit dem Teilen-Feld privat machen.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", + "remoteSketchbook": "Cloud Sketchbook", "share": "Teilen....", "shareSketch": "Sketch teilen", "showHideRemoveSketchbook": "Zeige/Verstecke Remote Sketchbook", "signIn": "Anmelden", "signInToCloud": "Anmelden zur Arduino Cloud", "signOut": "Abmelden", - "sync": "Sync", + "sync": "Synchronisiere", "syncEditSketches": "Synchronisiere und editiere deine Arduino Cloud Sketches.", "visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Alle", + "contributed": "Beigetragen", "installManually": "Manuell installieren", "later": "später", "noBoardSelected": "Kein Board ausgewählt", @@ -124,19 +124,19 @@ "oldFormat": "Der Sketch '{0}' verwendet noch das alte '.pde' Format. Möchtest du auf die neuere '.ino' Endung wechseln?", "partner": "Partner", "processing": "Verarbeiten", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Empfohlen", + "retired": "Zurückgezogen", "selectedOn": "an {0}", "serialMonitor": "Serieller Monitor", - "type": "Type", + "type": "Typ", "unknown": "unbekannt", - "updateable": "Updatable" + "updateable": "Aktualisierbar" }, "compile": { "error": "Fehler beim kompilieren: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "In diesem Paket enthaltene Boards:", "by": "von", "filterSearch": "Filtern Sie Ihre Suche...", "install": "Installieren", @@ -151,13 +151,13 @@ "replaceTitle": "Ersetzten" }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Fehlermeldungen kopieren", + "noBoardSelected": "Kein Board ausgewählt. Bitte Arduino Board im Menü wählen mit Werkzeuge > Board" }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "Dämon neu starten", + "start": "Dämon starten", + "stop": "Dämon stoppen" }, "debug": { "debugWithMessage": "Debug - {0}", @@ -176,9 +176,9 @@ "decreaseIndent": "Einrückung verringern ", "increaseFontSize": "Schriftgröße vergrößern ", "increaseIndent": "Einrückung erweitern", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "nextError": "Nächster Fehler", + "previousError": "Vorheriger Fehler", + "revealError": "Fehler zeigen" }, "electron": { "couldNotSave": "Der Sketch konnte nicht gesichert werden. Bitte kopiere deine ungesicherte Arbeit in deinen bevorzugten Texteditor und starte die IDE neu.", @@ -216,7 +216,7 @@ "visit": "Besuche Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Nach Arduino IDE Updates suchen", "closeAndInstallButton": "Schließen und Installieren", "closeToInstallNotice": "Schließe die Software und installiere das Update auf deinem Computer", "downloadButton": "Download", @@ -255,25 +255,25 @@ "zipLibrary": "Bibliothek" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Thema" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", + "communication": "Kommunikation", + "dataProcessing": "Datenverarbeitung", + "dataStorage": "Datenspeicher", + "deviceControl": "Gerätesteuerung", + "display": "Anzeige", + "other": "Andere/s", + "sensors": "Sensoren", + "signalInputOutput": "Signal Ein-/Ausgang", "timing": "Timing", - "uncategorized": "Uncategorized" + "uncategorized": "Nicht kategoriesiert" }, "libraryType": { - "installed": "Installed" + "installed": "Installiert" }, "menu": { - "advanced": "Advanced", + "advanced": "Fortgeschritten", "sketch": "Sketch", "tools": "Werkzeuge" }, @@ -290,7 +290,7 @@ "automatic": "Automatisch", "board.certificates": "Liste der Zertifikate, welche zu den Boards hochgeladen werden können.", "browse": "Durchsuchen", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Erhalte Benachrichtigungen bei verfügbaren Updates für die IDE, die Boards und Bibliotheken. Nach Änderung ist ein Neustart der IDE notwendig. Standardmäßig eingeschaltet.", "choose": "Wähle", "cli.daemonDebug": "Aktivieren Sie die Debug-Protokollierung der gRPC-Aufrufe an das Arduino CLI. Ein Neustart der IDE ist erforderlich, damit diese Einstellung wirksam wird. Standardmäßig ist sie deaktiviert.", "cloud.enabled": "Wahr, wenn die Sketch-Syncfunctionen aktiv sind. Standardeinstellung ist wahr.", @@ -299,8 +299,8 @@ "cloud.pushpublic.warn": "Wahr, wenn Benutzer vor dem Hochladen eines öffentlichen Sketches in die Cloud gewarnt werden sollen. Standardmäßig Wahr.", "cloud.sketchSyncEndpoint": "Der Endpunkt, um Sketches zu/von einem Backend zu laden. Standardeinstellung ist die Arduino Cloud API.", "compile": "Kompilieren", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "Aktivieren, wenn die IDE mehrere Fehler des Compiler behandeln soll. Standardmäßig ausgeschaltet.", + "compile.revealRange": "Legt fest, wie Compilerfehler im Editor nach einer fehlgeschlagenen Überprüfung/einem fehlgeschlagenen Upload angezeigt werden. Mögliche Werte: 'auto': bei Bedarf vertikal scrollen, um die Zeile anzuzeigen. 'center': bei Bedarf vertikal scrollen und die Zeile zentriert anzeigen. 'top': bei Bedarf vertikal scrollen und die Zeile nahe am oberen Ende des Darstellungsbereichs anzeigen. Optimiert für das Betrachten einer Codedefinition. 'centerIfOutsideViewport': bei Bedarf vertikal scrollen und die Zeile nur anzeigen, wenn sie außerhalb des Anzeigebereichs liegt. Der Standardwert ist '{0}'.", "compile.verbose": "Wahr für ausführliche Compilerausgaben. Standardmäßig Falsch", "compile.warnings": "Einstellung des Warnlevels für den GCC. Standardeinstellung ist 'None'.", "compilerWarnings": "Warnungen des Übersetzers", @@ -315,7 +315,7 @@ "invalid.sketchbook.location": "Ungültiger Sketchbook Speicherort: {0}", "invalid.theme": "Ungültiges Erscheinungsbild", "language.log": "Wahr, wenn der Arduino Language Server Logfiles in den Sketch-Ordner schreiben soll. Sonst falsch. Standardeinstellung ist falsch.\n ", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "Wenn aktiviert, bietet der Sprachserver bei der Eingabe im Editor eine Echtzeitdiagnose. Ist standardmäßig deaktiviert.", "manualProxy": "Manuelle Proxy Einstellung", "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", @@ -336,12 +336,12 @@ "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Zeilenumbruch", - "message": "Nachricht ({0} + Enter, um Nachricht an '{1}' auf '{2}') zu senden", + "message": "Nachicht (Enter um Nachricht für '{0}' auf '{1}' zu senden)", "newLine": "Neue Zeile", "newLineCarriageReturn": "Sowohl NL als auch CR", "noLineEndings": "Kein Zeilenende", "notConnected": "Nicht verbunden. Wählen Sie ein Board und einen Port, um automatisch zu verbinden.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "Serieller Plotter", "timestamp": "Zeitstempel", "toggleTimestamp": "Zeitstempel an/aus" }, @@ -349,7 +349,7 @@ "archiveSketch": "Sketch archivieren", "cantOpen": "Ein Ordner mit dem Namen \"{0}\" ist bereits vorhanden. Der Sketch kann nicht geöffnet werden.", "close": "Sind Sie sicher, dass Sie diesen Sketch schließen möchten?", - "compile": "Compiling sketch...", + "compile": "Kompiliere Sketch...", "configureAndUpload": "Konfigurieren und hochladen", "createdArchive": "Archiv '{0}' erstellt.", "doneCompiling": "Kompilieren erfolgreich!", @@ -371,7 +371,7 @@ "titleSketchbook": "Sketchbook", "upload": "Hochladen", "uploadUsingProgrammer": "Mit Programmer hochladen", - "uploading": "Uploading...", + "uploading": "Hochladen...", "userFieldsNotFoundError": "User Fields für das angeschlossene Board nicht gefunden", "verify": "Überprüfen", "verifyOrCompile": "Überprüfen/Kompilieren" @@ -386,7 +386,7 @@ }, "userFields": { "cancel": "abbrechen", - "enterField": "Enter {0}", + "enterField": "Eingabe {0}", "upload": "Hochladen" } }, diff --git a/i18n/el.json b/i18n/el.json index bb20c1b77..b0e3c8797 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Νέα γραμμή", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", diff --git a/i18n/es.json b/i18n/es.json index 2e6a6c603..486363970 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Retorno de carro", - "message": "Mensaje ({0} + Enter para enviar el mensaje a '{1}' en '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nueva línea", "newLineCarriageReturn": "Ambos NL & CR", "noLineEndings": "Sin ajuste de línea", diff --git a/i18n/eu.json b/i18n/eu.json index f0ec106d6..c2151934d 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Korritze automatikoa", "carriageReturn": "Orga-itzulera", - "message": "Mezua ({0} + Enter honi mezua bidaltzeko: '{1}' hemen: '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Lerro berria", "newLineCarriageReturn": "NL & CR biak", "noLineEndings": "Lerro amaierarik ez", diff --git a/i18n/fa.json b/i18n/fa.json index e0dfab928..324806b0a 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -6,27 +6,27 @@ }, "board": { "board": "بورد {0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر", "boardInfo": "مشخصات برد", "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", "configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.", "couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟", - "disconnected": "Disconnected", + "disconnected": "اتصال قطع شد", "getBoardInfo": "دریافت راهنمای برد", "inSketchbook": "(در منبع طرح ها)", "installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟", "noFQBN": "FQBN برای برد انتخاب شده \"{0}\" موجود نیست. آیا هسته مربوطه را نصب کرده اید؟", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "هیچ پورتی پیدا نشد", "noPortsSelected": "هیچ پورتی برای برد انتخاب نشده است.{0}", "noneSelected": "هیچ بردی انتخاب نشده است.", "openBoardsConfig": "انتخاب سایر برد ها و پورت ها", "platformMissing": "پلت فرم برای برد انتخابی '{0}' نصب نشده است.", "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", - "portLabel": "Port: {0}", + "portLabel": "پورت: {0}", "programmer": "برنامه ریز", "reselectLater": "بعدا انتخاب کنید", - "searchBoard": "Search board", + "searchBoard": "جستجوی بورد", "selectBoard": "انتخاب برد", "selectBoardForInfo": "لطفاً یک برد را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", @@ -336,7 +336,7 @@ "serial": { "autoscroll": "پیمایش خودکار", "carriageReturn": "رفتن به سر سطر", - "message": "پیام ( {0} + بزنید تا پیام به '{1}' بر '{2}' ارسال شود)", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "خط جدید", "newLineCarriageReturn": "هم NL و هم CR", "noLineEndings": "بدون پایان خط", diff --git a/i18n/fil.json b/i18n/fil.json index 60f0114b1..8c0d4b790 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", diff --git a/i18n/fr.json b/i18n/fr.json index 1585cb01c..b40f4c396 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Défilement automatique", "carriageReturn": "Retour chariot", - "message": "Message ({0} + Entrée pour envoyer le message à '{1}' sur '{2}'", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nouvelle ligne", "newLineCarriageReturn": "Les deux, NL et CR", "noLineEndings": "Pas de fin de ligne", diff --git a/i18n/he.json b/i18n/he.json index d2b9f1cef..d26a3b539 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -15,7 +15,7 @@ "getBoardInfo": "פרטי הלוח", "inSketchbook": "(בסקיצה)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "noFQBN": "הFQBN אינו זמין ללוח \"{0}\". האם הותקן הליבה המתאימה?", "noPortsDiscovered": "לא נמצאו פורטים", "noPortsSelected": "לא נבחרו פורטים ללוחות '{0}'.", "noneSelected": "לא נבחרו לוחות.", @@ -110,7 +110,7 @@ "signInToCloud": "התחברות לענן של ארדואינו Arduino Cloud", "signOut": "התנתק", "sync": "סנכרון", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", + "syncEditSketches": "סנכרון ועריכת הסקיצה בענן של ארדואינו", "visitArduinoCloud": "כנס.י לענן של ארדואינו ליצור סקיצה בענן" }, "common": { @@ -125,7 +125,7 @@ "partner": "שותף", "processing": "מעבד", "recommended": "מומלץ", - "retired": "Retired", + "retired": "פרש", "selectedOn": "ב {0}", "serialMonitor": "מוניטור סיריאלי", "type": "סוג", @@ -336,7 +336,7 @@ "serial": { "autoscroll": "גלילה אוטומטית", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "שורה חדשה", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "ללא סיום שורה", diff --git a/i18n/hu.json b/i18n/hu.json index 7899d3fc1..6da748c43 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Automatikus görgetés", "carriageReturn": "Kocsi vissza", - "message": "Üzenet ({0} + Enter az üzenet elküldéséhez az {1} itt: {2})", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Új sor", "newLineCarriageReturn": "Mindkettő: Új sor és Kocsi vissza - NL&CR", "noLineEndings": "Nincs sorvége ", diff --git a/i18n/it.json b/i18n/it.json index d74d69501..a915148f0 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -6,7 +6,7 @@ }, "board": { "board": "Scheda{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta", "boardInfo": "Informazioni sulla scheda", "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.", @@ -16,7 +16,7 @@ "inSketchbook": "(nella raccolta degli sketch)", "installNow": "Il \"{0} {1}\" core non è installato per la scheda \"{2}\" . Vuoi installarlo ora?", "noFQBN": "La FQBN non è disponibile per la scheda selezionata\"{0}\". Sei sicuro che il core specifico sia stato installato?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Nessuna porta rilevata", "noPortsSelected": "Nessuna porta selezionata per la scheda: '{0}'.", "noneSelected": "Nessuna scheda selezionata.", "openBoardsConfig": "Scegli un'altra scheda e un altra porta...", @@ -26,7 +26,7 @@ "portLabel": "Porta: {0}", "programmer": "Programmatore", "reselectLater": "Riselezionare più tardi", - "searchBoard": "Search board", + "searchBoard": "Seleziona la scheda", "selectBoard": "Seleziona la scheda", "selectBoardForInfo": "Seleziona la scheda per la quale desideri informazioni.", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", @@ -36,7 +36,7 @@ }, "boardsManager": "Gestore schede", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificato Arduino" }, "bootloader": { "burnBootloader": "Scrivi il bootloader", @@ -64,13 +64,13 @@ "uploadingCertificates": "Caricamento dei certificati." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Controlla gli aggiornamenti di Arduino", + "installAll": "Installa tutto", + "noUpdates": "Non sono disponibili aggiornamenti recenti.", + "promptUpdateBoards": "Sono disponibili aggiornamenti per alcune schede.", + "promptUpdateLibraries": "Sono disponibili aggiornamenti per alcune librerie.", + "updatingBoards": "Aggiornamento delle schede in corso...", + "updatingLibraries": "Aggiornamento delle librerie in corso..." }, "cli-error-parser": { "keyboardError": "'Keyboard' non è stato trovato. Il tuo sketch include la linea '#include ' nel codice?", @@ -114,8 +114,8 @@ "visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch " }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Tutti", + "contributed": "Fornita da terzi", "installManually": "Installa manualmente", "later": "Salta", "noBoardSelected": "Nessuna scheda selezionata", @@ -124,19 +124,19 @@ "oldFormat": "Il '{0}' utilizza ancora il vecchio formato `.pde` . Vuoi sostituirlo con la nuova estensione `.ino?", "partner": "Partner", "processing": "In elaborazione", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Consigliato", + "retired": "Fuori produzione", "selectedOn": "su {0}", "serialMonitor": "Monitor seriale", - "type": "Type", + "type": "Tipo", "unknown": "Sconosciuto", - "updateable": "Updatable" + "updateable": "Aggiornabile" }, "compile": { "error": "Errore di compilazione: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Schede incluse in questo pacchetto:", "by": "da", "filterSearch": "Filtra la tua ricerca...", "install": "Installa", @@ -152,7 +152,7 @@ }, "coreContribution": { "copyError": "Copia messaggi di errore", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Non è stata selezionata alcuna scheda. Selezionare la tua scheda Arduino dal menu Strumenti > Scheda." }, "daemon": { "restart": "Riavvia il demone", @@ -178,7 +178,7 @@ "increaseIndent": "Aumenta indentazione", "nextError": "Errore Successivo", "previousError": "Errore Precedente", - "revealError": "Reveal Error" + "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. ", @@ -216,7 +216,7 @@ "visit": "Vai al sito Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Controlla gli aggiornamenti dell'IDE di Arduino", "closeAndInstallButton": "Chiudi e Installa", "closeToInstallNotice": "Chiudi il software e installa l’aggiornamento sulla tua macchina", "downloadButton": "Scarica", @@ -255,22 +255,22 @@ "zipLibrary": "Libreria" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Argomento" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Comunicazione", + "dataProcessing": "Elaborazione dati", + "dataStorage": "Archiviazione dati", + "deviceControl": "Controllo dispositivi", + "display": "Schermo", + "other": "Altro", + "sensors": "Sensori", + "signalInputOutput": "Segnale di ingresso/uscita", + "timing": "Sincronizzazione", + "uncategorized": "Senza categoria" }, "libraryType": { - "installed": "Installed" + "installed": "Installata" }, "menu": { "advanced": "Avanzate", @@ -290,7 +290,7 @@ "automatic": "Automatico", "board.certificates": "Lista dei certificati che possono essere caricati nelle schede", "browse": "Sfoglia", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Ricevere le notifiche degli aggiornamenti disponibili per l'IDE, le schede e le librerie. Richiede il riavvio dell'IDE dopo la modifica. È abilitata per impostazione predefinita.", "choose": "Scegli", "cli.daemonDebug": "Abilita il debug logging delle chiamate gRPC alla CLI di Arduino. Per rendere effettiva questa impostazione, è necessario un riavvio dell'IDE. L'impostazione predefinita è false.", "cloud.enabled": "Imposta su true per abilitare le funzioni di sincronia dello sketch. Il valore predefinito è true.", @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Scorrimento automatico", "carriageReturn": "Ritorno carrello (CR)", - "message": "Messaggio({0} + Invio per inviare il messaggio a '{1}' su '{2}')", + "message": "Messaggio (premi Enter per inviare il messaggio a '{0}' on '{1}')", "newLine": "A capo (NL)", "newLineCarriageReturn": "Entrambi NL & CR", "noLineEndings": "Nessun fine riga", @@ -386,7 +386,7 @@ }, "userFields": { "cancel": "Annulla", - "enterField": "Enter {0}", + "enterField": "Inserisci {0}", "upload": "Carica" } }, diff --git a/i18n/ja.json b/i18n/ja.json index c05d5b40a..f2aea63eb 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -6,7 +6,7 @@ }, "board": { "board": "ボード{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "他のボードとポートを選択", "boardInfo": "ボード情報", "configDialog1": "スケッチを書き込みたい場合には、ボードとポートの両方を選択してください。", "configDialog2": "ボードのみを選択した場合、コンパイルはできますが、スケッチの書き込みはできません。", @@ -16,7 +16,7 @@ "inSketchbook": "(スケッチブック内)", "installNow": "現在選択されているボード\"{2}\"用にコア\"{0} {1}\"をインストールする必要があります。今すぐインストールしますか?", "noFQBN": "選択されたボード\"{0}\"にはFQBNがありません。対応するコアをインストール済みですか?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "ポートが見つかりませんでした", "noPortsSelected": "ボード用に選択されたポートがありません: '{0}'.", "noneSelected": "ボード未選択です。", "openBoardsConfig": "他のボードとポートを選択…", @@ -26,7 +26,7 @@ "portLabel": "ポート: {0}", "programmer": "書き込み装置", "reselectLater": "後で選択しなおす", - "searchBoard": "Search board", + "searchBoard": "ボードを検索", "selectBoard": "ボードを選択", "selectBoardForInfo": "ボード情報を得るには、ボードを選択してください。", "selectPortForInfo": "ボード情報を得るには、ポートを選択してください。", @@ -36,11 +36,11 @@ }, "boardsManager": "ボードマネージャ", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino認定" }, "bootloader": { "burnBootloader": "ブートローダを書き込む", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "ブートローダを書き込み中…", "doneBurningBootloader": "ブートローダの書き込みが完了しました。" }, "burnBootloader": { @@ -64,13 +64,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": "Arduinoのアップデートを確認", + "installAll": "全てをインストール", + "noUpdates": "最近のアップデートはありません。", + "promptUpdateBoards": "一部のボードにアップデートがあります。", + "promptUpdateLibraries": "一部のライブラリにアップデートがあります。", + "updatingBoards": "ボードをアップデート中…", + "updatingLibraries": "ライブラリをアップデート中…" }, "cli-error-parser": { "keyboardError": "'Keyboard'が見つかりません。スケッチに'#include 'という行はありますか?", @@ -114,29 +114,29 @@ "visitArduinoCloud": "Arduino Cloudにアクセスしてクラウドスケッチを作成する" }, "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": "シリアルモニタ", - "type": "Type", + "type": "タイプ", "unknown": "不明", - "updateable": "Updatable" + "updateable": "アップデート可能" }, "compile": { "error": "コンパイルエラー: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "このパッケージに含まれるボード:", "by": "by", "filterSearch": "検索をフィルタ…", "install": "インストール", @@ -152,7 +152,7 @@ }, "coreContribution": { "copyError": "エラーメッセージをコピー", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "ボードが選択されていません。ツール > ボードメニューからArduinoボードを選択してください。" }, "daemon": { "restart": "Daemonを再起動", @@ -178,7 +178,7 @@ "increaseIndent": "インデントを増やす", "nextError": "次のエラー", "previousError": "前のエラー", - "revealError": "Reveal Error" + "revealError": "エラーを表示" }, "electron": { "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディタにコピーして、IDEを再起動してください。", @@ -216,7 +216,7 @@ "visit": "Arduino.ccウェブサイトを開く" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Arduino IDEのアップデートを確認", "closeAndInstallButton": "終了してインストール", "closeToInstallNotice": "ソフトウェアを終了してアップデートをインストールする。", "downloadButton": "ダウンロード", @@ -255,22 +255,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": "詳細", @@ -290,7 +290,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の再起動が必要です。デフォルトはtrue。", "choose": "選択", "cli.daemonDebug": "Arduino CLIへのgRPC呼び出しのデバッグロギングを有効にします。この設定を有効にするにはIDEを再起動する必要があります。デフォルトはfalseです。", "cloud.enabled": "スケッチの同期機能が有効な場合にはtrueを指定。デフォルトではtrue。", @@ -336,7 +336,7 @@ "serial": { "autoscroll": "自動スクロール", "carriageReturn": "CRのみ", - "message": "メッセージ('{2}'の'{1}'にメッセージを送信するには{0} + Enter)", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "LFのみ", "newLineCarriageReturn": "CRおよびLF", "noLineEndings": "改行なし", @@ -349,7 +349,7 @@ "archiveSketch": "スケッチをアーカイブする", "cantOpen": "「{0}」というフォルダはすでに存在します。スケッチを開けません。", "close": "本当にスケッチを閉じますか?", - "compile": "Compiling sketch...", + "compile": "スケッチをコンパイル中…", "configureAndUpload": "構成と書き込み", "createdArchive": "アーカイブ'{0}'を作成しました。", "doneCompiling": "コンパイル完了。", @@ -371,7 +371,7 @@ "titleSketchbook": "スケッチブック", "upload": "書き込み", "uploadUsingProgrammer": "書き込み装置を使って書き込む", - "uploading": "Uploading...", + "uploading": "書き込み中…", "userFieldsNotFoundError": "接続されたボードのユーザーフィールドが見つかりません。", "verify": "検証", "verifyOrCompile": "検証・コンパイル" @@ -386,7 +386,7 @@ }, "userFields": { "cancel": "キャンセル", - "enterField": "Enter {0}", + "enterField": "{0}を入力", "upload": "マイコンボードに書き込む" } }, diff --git a/i18n/ko.json b/i18n/ko.json index 1c71ca237..9e5e2b921 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -1,122 +1,122 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" + "detail": "버전: {0}\n날짜: {1}{2}\nCLI 버전: {3}{4} [{5}]\n\n{6}", + "label": "프로그램 정보 {0}" }, "board": { - "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardInfo": "Board Info", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", + "board": "보드{0}", + "boardConfigDialogTitle": "보드 및 포트 선택", + "boardInfo": "보드정보", + "configDialog1": "스케치를 업로드할 보드 및 포트를 선택", + "configDialog2": "보드를 선택하면 컴파일은 가능하지만, 스케치를 업로드 할 수 없습니다.", + "couldNotFindPreviouslySelected": "선택된 보드를 찾을 수 없습니다. '{0}' 설치된 플랫폼에서'{1}'. 수동으로 사용 할 보드를 선택해주세요.\n지금 보드를 다시 선택하시겠습니까?", + "disconnected": "연결해제됨", + "getBoardInfo": "보드정보 얻기", + "inSketchbook": "(스케치북에서)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", + "noPortsDiscovered": "포트를 찾을 수 없습니다.", + "noPortsSelected": "보드에 맞는 포트가 없습니다: '{0}'.", + "noneSelected": "보드가 선택되지 않았습니다.", + "openBoardsConfig": "보드 및 포트를 선택하세요.", "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", + "pleasePickBoard": "선택한 포트에 연결할 보드를 선택하십시오", + "port": "포트{0}", + "portLabel": "포트: {0}", + "programmer": "프로그래머", + "reselectLater": "나중에 선택", + "searchBoard": "보드찾기", "selectBoard": "보드 선택", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "selectBoardForInfo": "보드 정보를 얻으려면 보드를 선택하십시오.", + "selectPortForInfo": "보드 정보를 얻으려면 포트를 선택하십시오.", + "showAllAvailablePorts": "활성화된 사용 가능한 모든 포트를 표시합니다.", + "succesfullyInstalledPlatform": "성공적으로 설치된 플랫폼{0}:{1}", + "succesfullyUninstalledPlatform": "성공적으로 설치된 플랫폼 {0}:{1}" }, - "boardsManager": "Boards Manager", + "boardsManager": "보드매니저", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "아두이노 인증" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "부트로더 굽기", + "burningBootloader": "부트로더 굽기...", + "doneBurningBootloader": "부트로더 굽기 완료." }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "부트로더 굽기 중 에러: {0}" }, "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", + "addNew": "추가", + "addURL": "SSL 인증서를 가져올 URL 추가", "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "certificatesUploaded": "인증서 업로드 완료", + "enterURL": "URL 입력", + "noSupportedBoardConnected": "지원되는 보드가 연결되지 않았습니다.", + "openContext": "열린 내용", + "remove": "제거", + "selectBoard": "보드 선택...", + "selectCertificateToUpload": "1. 업로드할 인증서 선택", + "selectDestinationBoardToUpload": "2. 보드 선택 및 인증서 업로드", + "upload": "업로드", + "uploadFailed": "업로드에 실패했습니다. 다시 시도해 주세요.", + "uploadRootCertificates": "SSL 루트 인증서 업로드", + "uploadingCertificates": "인증서를 업로드 중입니다." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "아두이노 업데이트 확인", + "installAll": "모두 설치", + "noUpdates": "사용 가능한 최신 업데이트가 없습니다.", + "promptUpdateBoards": "일부 보드에 대한 업데이트가 있습니다.", + "promptUpdateLibraries": "일부 라이브러리에 대한 업데이트가 있습니다.", + "updatingBoards": "보드 업데이트 중...", + "updatingLibraries": "라이브러리 업데이트 중..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" + "keyboardError": "'Keyboard'를 찾을 수 없습니다. 스케치에 '#include ' 줄이 포함되어 있습니까?", + "mouseError": "'Mouse'를 찾을 수 없습니다. 스케치에 '#include ' 줄이 포함되어 있습니까?" }, "cloud": { - "account": "Account", + "account": "계정", "chooseSketchVisibility": "Choose visibility of your Sketch:", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "connected": "연결됨", + "continue": "계속", + "donePulling": "pulling 완료 ‘{0}’.", + "donePushing": "pushing 완료 ‘{0}’.", "embed": "Embed:", - "emptySketchbook": "Your Sketchbook is empty", - "learnMore": "Learn more", - "link": "Link:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "offline": "Offline", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "privateVisibility": "Private. Only you can view the Sketch.", - "profilePicture": "Profile picture", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", + "emptySketchbook": "스케치북이 비어 있습니다.", + "learnMore": "더 배우기", + "link": "링크:", + "notYetPulled": "클라우드에 push 할수 없습니다. 아직 pull 되지 않았습니다.", + "offline": "오프라인", + "openInCloudEditor": "클라우드 편집기에서 열기", + "options": "옵션...", + "privateVisibility": "비공개. 나만이 스케치를 볼 수 있습니다.", + "profilePicture": "프로필 사진", + "publicVisibility": "공개. 링크가 있는 사람은 누구나 스케치를 볼 수 있습니다.", "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", + "pullFirst": "클라우드로 Push하려면 먼저 Pull 합니다.", + "pullSketch": "Pull 스케치", "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", "push": "Push", - "pushSketch": "Push Sketch", + "pushSketch": "Push 스케치", "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." + "remote": "원격", + "remoteSketchbook": "원격 스케치북", + "share": "공유...", + "shareSketch": "스케치 공유", + "showHideRemoveSketchbook": "보이기/숨기기 원격 스케치북", + "signIn": "로그인", + "signInToCloud": "아두이노 클라우드에 로그인", + "signOut": "로그아웃", + "sync": "동기화", + "syncEditSketches": "아두이노 클라우드 스케치 동기화 및 편집", + "visitArduinoCloud": "아두이노 클라우드를 방문하여 클라우드 스케치를 만드십시오." }, "common": { "all": "All", "contributed": "Contributed", - "installManually": "Install Manually", + "installManually": "수동설치", "later": "나중에", "noBoardSelected": "선택된 보드 없음", "notConnected": "[연결되지 않음]", @@ -124,99 +124,99 @@ "oldFormat": "'{0}' 파일은 오래된 `.pde` 확장자로 되어있어요. 새로운 `.ino` 확장자로 변경하시겠어요?", "partner": "Partner", "processing": "처리 중", - "recommended": "Recommended", + "recommended": "추천됨", "retired": "Retired", "selectedOn": "{0} 켜기", "serialMonitor": "시리얼 모니터", "type": "Type", "unknown": "알 수 없음", - "updateable": "Updatable" + "updateable": "업데이트가능함" }, "compile": { - "error": "Compilation error: {0}" + "error": "컴파일 오류: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "이 패키지에 포함된 보드:", "by": "by", "filterSearch": "Filter your search...", - "install": "INSTALL", - "moreInfo": "More info", - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "install": "설치", + "moreInfo": "더 많은 정보", + "uninstall": "설치해제", + "uninstallMsg": "설치해제를 원하십니까 {0}?", + "version": "버전 {0}" }, "contributions": { - "addFile": "Add File", - "fileAdded": "One file added to the sketch.", - "replaceTitle": "Replace" + "addFile": "파일 추가", + "fileAdded": "스케치에 하나의 파일이 추가되었습니다.", + "replaceTitle": "교체" }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "에러 메시지 복사", + "noBoardSelected": "보드가 선택되지 않았습니다. Tools > Board menu 에서 당신의 보드를 선택해주세요." }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "데몬 재시작", + "start": "데몬 시작", + "stop": "데몬 정지" }, "debug": { "debugWithMessage": "디버그 - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "'{0}'에 대한 플랫폼이 설치되어 있지 않습니다", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "디버깅 최적화" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "다시 묻지 않음" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "autoFormat": "자동 형식", + "commentUncomment": "주석/주석 삭제", + "copyForForum": "포럼용으로 복사 (Markdown)", + "decreaseFontSize": "글꼴 크기 줄이기", + "decreaseIndent": "들여쓰기 줄이기", + "increaseFontSize": "글꼴 크기 키우기", + "increaseIndent": "들여쓰기 늘이기", + "nextError": "다음 에러", + "previousError": "이전 에러", + "revealError": "에러 표시" }, "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." + "couldNotSave": "스케치를 저장할 수 없습니다. 저장하지 않은 작업을 즐겨 사용하는 텍스트 편집기에 복사하고 IDE를 다시 시작하세요.", + "unsavedChanges": "저장되지 않은 변경 사항은 저장되지 않습니다." }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", + "builtInExamples": "포함된 예제들", + "couldNotInitializeExamples": "내장된 예제를 초기화 할 수 없습니다.", + "customLibrary": "사용자 정의 라이브러리의 예", "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" + "forAny": "모든 보드의 예", + "menu": "예제" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "checkUpdates": "업데이트 확인", + "failedInstall": "설치에 실패했습니다. 다시 시도해 주세요.", + "install": "설치", + "installingFirmware": "펌웨어 설치중.", + "overwriteSketch": "설치하면 보드의 스케치를 덮어씁니다.", "selectBoard": "보드 선택", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "selectVersion": "펌웨어 버전 선택", + "successfullyInstalled": "펌웨어가 성공적으로 설치되었습니다.", + "updater": "WiFi101 / WiFiNINA 펌웨어 업데이터" }, "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" + "environment": "환경", + "faq": "자주 묻는 질문", + "findInReference": "참조에서 찾기", + "gettingStarted": "시작하기", + "keyword": "키워드 입력", + "privacyPolicy": "개인정보 정책", + "reference": "참조", + "search": "on Arduino.cc 에서 검색", + "troubleshooting": "문제 해결", + "visit": "Arduino.cc 방문" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Arduino IDE 업데이트 확인", "closeAndInstallButton": "닫고 설치하기", "closeToInstallNotice": "소프트웨어를 닫고 장치에 업데이트를 설치해주세요.", "downloadButton": "다운로드", @@ -233,44 +233,44 @@ "versionDownloaded": "Arduino IDE {0} 버전이 다운로드 되었습니다. " }, "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", + "addZip": ".ZIP 라이브러리 추가...", + "arduinoLibraries": "아두이노 라이브러리", "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?", + "dependenciesForLibrary": "라이브러리에 대한 종속성 {0}:{1}", + "include": "라이브러리 포함", + "installAll": "모두 설치", + "installMissingDependencies": "누락된 모든 종속성을 설치하시겠습니까?", "installOneMissingDependency": "Would you like to install the missing dependency?", "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "manageLibraries": "Manage Libraries...", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "needsMultipleDependencies": "The library {0}:{1} needs some other dependencies currently not installed:", + "installedSuccessfully": "성공적으로 설치된 라이브러리 {0}:{1}", + "libraryAlreadyExists": "라이브러리가 이미 존재합니다. 덮어 쓰시겠습니까? ", + "manageLibraries": "라이브러리 관리...", + "namedLibraryAlreadyExists": " {0} 이라는 라이브러리 폴더이름이 이미 존재합니다. 덮어 쓰시겠습니까?", + "needsMultipleDependencies": "라이브러리 {0}:{1} 는 현재 설치되지 않은 다른 종속성이 필요합니다.", "needsOneDependency": "The library {0}:{1} needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "overwriteExistingLibrary": "기존 라이브러리를 덮어쓰시겠습니까?", "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" + "title": "라이브러리 매니저", + "uninstalledSuccessfully": "라이브러리가 성공적으로 제거됨 {0}:{1}", + "zipLibrary": "라이브러리" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "주제" }, "libraryTopic": { "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "dataProcessing": "데이터 처리", + "dataStorage": "데이터 저장소", + "deviceControl": "장치 제어", + "display": "화면표시", + "other": "기타", + "sensors": "센서", + "signalInputOutput": "신호 입/출력", + "timing": "타이밍", + "uncategorized": "미분류" }, "libraryType": { - "installed": "Installed" + "installed": "설치됨" }, "menu": { "advanced": "Advanced", @@ -278,132 +278,132 @@ "tools": "도구" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "unableToCloseWebSocket": "웹소켓을 닫을 수 없습니다.", + "unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다." }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", + "additionalManagerURLs": "추가 보드 관리자 URL", "auth.audience": "The OAuth2 audience.", "auth.clientID": "The OAuth2 client ID.", "auth.domain": "The OAuth2 domain.", "auth.registerUri": "The URI used to register a new user.", "automatic": "Automatic", "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "browse": "검색", + "checkForUpdate": "IDE, 보드 및 라이브러리에 대한 사용 가능한 업데이트 알림을 받습니다. 변경 후 IDE를 다시 시작해야 합니다. 알림받기가 기본설정입니다.", + "choose": "선택", + "cli.daemonDebug": "Arduino CLI에 대한 gRPC 호출의 디버그 로깅을 활성화합니다. 이 설정을 적용하려면 IDE를 다시 시작해야 합니다. 기본적으로 false입니다.", + "cloud.enabled": "스케치 동기화 기능이 활성화된 경우 True입니다. 기본값은 true입니다.", + "cloud.pull.warn": "클라우드 스케치를 pulling 전에 사용자에게 경고해야 하는 경우 True입니다. 기본값은 true입니다.", + "cloud.push.warn": "클라우드 스케치를 pushing 전에 사용자에게 경고해야 하는 경우 True입니다. 기본값은 true입니다.", + "cloud.pushpublic.warn": "공개 스케치를 클라우드로 pushing 전에 사용자에게 경고해야 하는 경우 True입니다.기본값은 true입니다.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile": "컴파일", + "compile.experimental": "IDE가 여러 컴파일러 오류를 처리해야 하는 경우 True입니다.기본적으로 False입니다.", "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", + "compile.verbose": "자세한 컴파일 출력의 경우 True입니다. 기본은 False입니다.", "compile.warnings": "gcc에 사용할 경고 수준을 알려줍니다. 기본값은 '없음'입니다.", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "compilerWarnings": "컴파일러 경고", + "editorFontSize": "에디터 글꼴 크기", + "editorQuickSuggestions": "에디터 빠른 제안", + "enterAdditionalURLs": "각 행에 하나씩 추가 URL을 입력하세요.", + "files.inside.sketches": "스케치 내부에 파일 표시", + "ide.updateBaseUrl": "업데이트를 다운로드할 기본 URL입니다. 기본값은 \n'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "업데이트를 받을 릴리스 채널입니다. 'stable'은 안정적인 릴리스이고 'nightly'는 최신 개발 빌드입니다.", "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "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", + "invalid.editorFontSize": "잘못된 에디터 글꼴크기, 반드시 양의 정수를 사용해야합니다.", + "invalid.sketchbook.location": "잘못된 스케치북 위치: {0}", + "invalid.theme": "잘못된 테마.", + "language.log": "Arduino 언어 서버가 스케치 폴더에 로그 파일을 생성해야 하는 경우 true이고, 그렇지 않으면 false입니다. 기본은 false입니다.", + "language.realTimeDiagnostics": "true인 경우 언어 서버는 편집기에 입력할 때 실시간 진단을 제공하며 기본적으로 false입니다.", + "manualProxy": "수동 프록시 구성", + "network": "네트워크", + "newSketchbookLocation": "새 스케치북 위치 선택", "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", + "showVerbose": "출력 중 자세한 표시", + "sketchbook.location": "스케치북 위치", + "sketchbook.showAllFiles": "스케치 내부의 모든 스케치 파일을 표시하려면 True입니다. 기본은 false입니다.", + "survey.notification": "설문조사를 사용할 수 있는 경우 사용자에게 알림을 보내야 하는 경우 True입니다. 기본은 True입니다.", + "unofficialBoardSupport": "비공식 보드 지원 URL 목록을 보려면 클릭하십시오.", + "upload": "업로드", + "upload.verbose": "자세한 업로드 출력의 경우 True이고 기본적으로 False입니다.", + "verifyAfterUpload": "업로드 후 코드확인", + "window.autoScale": "사용자 인터페이스가 글꼴 크기에 따라 자동으로 조정되는 경우 True입니다.", + "window.zoomLevel": "창의 확대/축소 수준을 조정합니다. 원래 크기는 0이고 위(예: 1) 또는 아래(예: -1)의 각 증가는 확대/축소를 20% 더 크거나 작게 나타냅니다. 소수를 입력하여 확대/축소 수준을 미세하게 조정할 수도 있습니다." + }, + "replaceMsg": "{0}의 기존 버젼을 바꾸시겠습니까?", + "selectZip": "추가하려는 라이브러리가 포함된 zip 파일을 선택하세요.", "serial": { - "autoscroll": "Autoscroll", + "autoscroll": "자동스크롤", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", + "message": "Message (Enter to send message to '{0}' on '{1}')", + "newLine": "새 줄", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", + "notConnected": "연결되지 않음. 자동으로 연결할 보드와 포트를 선택합니다.", + "openSerialPlotter": "시리얼 플로터", "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", + "cantOpen": "이름이 \"{0}\" 인 폴더가 이미 존재합니다. 스케치를 열 수 없습니다.", + "close": "스케치를 닫으시겠습니까?", + "compile": "스케치 컴파일중...", + "configureAndUpload": "구성 및 업로드", "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", + "doneCompiling": "컴파일 완료.", + "doneUploading": "업로딩 완료.", + "exportBinary": "컴파일된 바이너리 내보내기", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", + "new": "새 파일", + "openFolder": "폴더 열기", + "openRecent": "최근 파일 열기", + "openSketchInNewWindow": "새 창에서 스케치 열기", + "saveFolderAs": "스케치 폴더를 다른 이름으로 저장...", + "saveSketch": "스케치를 저장하여 나중에 다시 엽니다.", + "saveSketchAs": "스케치 폴더를 다른 이름으로 저장...", + "showFolder": "스케치 폴더 보기", "sketch": "스케치", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", + "sketchbook": "스케치북", + "titleLocalSketchbook": "로컬 스케치북", + "titleSketchbook": "스케치북", + "upload": "업로드", + "uploadUsingProgrammer": "프로그래머를 사용하여 업로드", + "uploading": "업로딩...", "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" + "verify": "확인", + "verifyOrCompile": "확인/컴파일" }, "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", + "answerSurvey": "설문조사 응답", + "dismissSurvey": "다시보지 않기", "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." }, "upload": { - "error": "{0} error: {1}" + "error": "{0} 오류: {1}" }, "userFields": { - "cancel": "Cancel", + "cancel": "취소", "enterField": "Enter {0}", - "upload": "Upload" + "upload": "업로드" } }, "cloud": { - "GoToCloud": "GO TO CLOUD" + "GoToCloud": "클라우드로 이동" }, "theia": { "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitTitle": "Are you sure you want to quit?" + "cannotConnectBackend": "백엔드에 연결 할 수 없습니다.", + "cannotConnectDaemon": "CLI 데몬에 연결 할 수 없습니다.", + "couldNotSave": "스케치를 저장할 수 없습니다. 저장하지 않은 작업을 즐겨 사용하는 텍스트 편집기에 복사하고 IDE를 다시 시작하세요.", + "daemonOffline": "CLI 데몬 오프라인", + "offline": "오프라인", + "quitTitle": "정말 종료하시겠습니까?" }, "debug": { - "start": "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." }, @@ -415,10 +415,10 @@ "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.", + "deleteCurrentSketch": "현재 스케치를 삭제하겠습니까?", + "fileNewName": "새 파일의 이름", + "invalidExtension": ".{0} 유효한 확장자가 아닙니다", + "invalidFilename": "잘못된 파일이름.", "newFileName": "New name for file" } } diff --git a/i18n/my_MM.json b/i18n/my_MM.json index fe68eda65..2e867a6f9 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "အလိုအလျောက်လှိမ့်ဆွဲခြင်း", "carriageReturn": "လက်နှိပ်စက်အတံပြန်အက္ခရာ", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "စာကြောင်းအသစ်အက္ခရာ", "newLineCarriageReturn": "စာကြောင်းအသစ်နှင့်လက်နှိပ်စက်အတံပြန်အက္ခရာနှစ်ခုလုံး", "noLineEndings": "စာကြောင်းအဆုံးသတ်အက္ခရာမရှိ", diff --git a/i18n/ne.json b/i18n/ne.json index d32dbf792..a4a593a24 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", diff --git a/i18n/nl.json b/i18n/nl.json index d0c87f669..6293c79af 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -6,27 +6,27 @@ }, "board": { "board": "Bord{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Selecteer Ander Bord en Poort", "boardInfo": "Bord Informatie", "configDialog1": "Selecteer een Bord en een Poort als U een schets wilt uploaden.", "configDialog2": "Als je alleen een Board kiest, kun je wel compileren, maar niet je schets uploaden.", "couldNotFindPreviouslySelected": "Kon het voordien geselecteerde bord '{0}' in het geïnstalleerde platform '{1}' niet vinden. Gelieve manueel het bord te kiezen dat U wilt gebruiken. Wilt U het bord nu selecteren?", - "disconnected": "Disconnected", + "disconnected": "Losgekoppeld", "getBoardInfo": "Verkrijg Bord Informatie", "inSketchbook": "(in Schetsboek)", "installNow": "De \"{0} {1}\" kern moet geïnstalleerd zijn om het huidige geselecteerde \"{2}\" bord. Wilt U dit nu installeren?", "noFQBN": "De FQBN is niet beschikbaar voor het geselecteerde bord \"{0}\". Heeft U de bijhorende kern geïnstalleerd?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Geen poorten gevonden", "noPortsSelected": "Geen poorten geselecteerd voor bord: '{0}'.", "noneSelected": "Geen borden geselecteerd.", "openBoardsConfig": "Selecteer een ander bord en poort...", "platformMissing": "Het platform voor het geselecteerde '{0}' bord is niet geïnstalleerd.", "pleasePickBoard": "Gelieve een bord te selecteren dat verbonden is met de door U gekozen poort.", "port": "Poort{0}", - "portLabel": "Port: {0}", + "portLabel": "Poort: {0}", "programmer": "Programmeerapparaat", "reselectLater": "Later opnieuw selecteren", - "searchBoard": "Search board", + "searchBoard": "Bord zoeken", "selectBoard": "Selecteer Bord", "selectBoardForInfo": "Selecteer een bord om bord informatie te bekomen.", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", @@ -36,11 +36,11 @@ }, "boardsManager": "Borden Beheerder", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino gecertificeerd" }, "bootloader": { "burnBootloader": "Bootloader branden", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Bootloader branden...", "doneBurningBootloader": "Klaar met het branden van de bootloader." }, "burnBootloader": { @@ -64,13 +64,13 @@ "uploadingCertificates": "Certificaten uploaden." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Controleren op Arduino-updates", + "installAll": "Alles installeren", + "noUpdates": "Er zijn geen recente updates beschikbaar.", + "promptUpdateBoards": "Voor sommige van je borden zijn updates beschikbaar.", + "promptUpdateLibraries": "Voor sommige van je bibliotheken zijn updates beschikbaar.", + "updatingBoards": "Borden bijwerken...", + "updatingLibraries": "Bibliotheken bijwerken..." }, "cli-error-parser": { "keyboardError": "'Keyboard' niet gevonden. Bevat je schets de regel '#include '?", @@ -114,8 +114,8 @@ "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Alle", + "contributed": "Bijgedragen", "installManually": "Handmatig installeren", "later": "Later", "noBoardSelected": "Geen bord geselecteerd", @@ -124,19 +124,19 @@ "oldFormat": "De '{0}' gebruikt nog steeds het oude '.pde' formaat. Wil je overstappen naar de nieuwe `.ino` extensie?", "partner": "Partner", "processing": "Verwerken", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Aanbevolen", + "retired": "Stopgezet", "selectedOn": "aan {0}", "serialMonitor": "Seriële Monitor", "type": "Type", "unknown": "Onbekend", - "updateable": "Updatable" + "updateable": "Bijwerkbaar" }, "compile": { "error": "Compilatiefout: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Borden in dit pakket:", "by": "door", "filterSearch": "Filter je zoekopdracht...", "install": "INSTALLEREN", @@ -152,11 +152,11 @@ }, "coreContribution": { "copyError": "Foutmeldingen kopiëren", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Geen bord geselecteerd. Selecteer je Arduino-bord in het menu Extra > Board." }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", + "restart": "Daemon opnieuw starten", + "start": "Daemon starten", "stop": "Stop Daemon" }, "debug": { @@ -178,7 +178,7 @@ "increaseIndent": "Inspringing vergroten", "nextError": "Volgende Fout", "previousError": "Vorige Fout", - "revealError": "Reveal Error" + "revealError": "Onthul fout" }, "electron": { "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en start de IDE opnieuw. ", @@ -216,7 +216,7 @@ "visit": "Bezoek Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Controleren op Arduino IDE-updates", "closeAndInstallButton": "Sluiten en installeren", "closeToInstallNotice": "Sluit de software en installeer de update op je machine.", "downloadButton": "Download", @@ -255,22 +255,22 @@ "zipLibrary": "Bibliotheek" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Onderwerp" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", + "communication": "Communicatie", + "dataProcessing": "Gegevensverwerking", + "dataStorage": "Gegevensopslag", + "deviceControl": "Apparaatcontrole", + "display": "Toon", + "other": "Andere", + "sensors": "Sensoren", + "signalInputOutput": "Signaalingang/uitgang", "timing": "Timing", - "uncategorized": "Uncategorized" + "uncategorized": "Geen categorie" }, "libraryType": { - "installed": "Installed" + "installed": "Geïnstalleerd" }, "menu": { "advanced": "Geavanceerd", @@ -290,7 +290,7 @@ "automatic": "Automatisch", "board.certificates": "Lijst met certificaten die kunnen worden geüpload naar borden", "browse": "Bladeren", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Meldingen ontvangen van beschikbare updates voor de IDE, borden en bibliotheken. Vereist een IDE herstart na wijziging. Standaard waar.", "choose": "Kies", "cli.daemonDebug": "Schakel debug logging van de gRPC aanroepen naar de Arduino CLI in. Een herstart van de IDE is nodig om deze instelling in werking te laten treden. Standaard Onwaar.", "cloud.enabled": "Waar als de schets synchronisatie functies zijn ingeschakeld. Standaard ingesteld op waar.", @@ -315,7 +315,7 @@ "invalid.sketchbook.location": "Ongeldige schetsboek locatie: {0}", "invalid.theme": "Ongeldig Thema.", "language.log": "Waar als de Arduino Taal Server log bestanden moet genereren in de schets map. Anders onwaar. Standaard ingesteld op onwaar.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "Indien waar, geeft de taalserver real-time diagnostiek tijdens het typen in de editor. Standaard is dit onwaar.", "manualProxy": "Manuele proxy configuratie", "network": "Netwerk", "newSketchbookLocation": "Selecteer een nieuwe schetsboeklocatie.", @@ -336,12 +336,12 @@ "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Carriage Return", - "message": "Bericht ({0} + Enter om bericht te verzenden naar '{1}' op '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nieuwe Regel", "newLineCarriageReturn": "Zowel NL & CR", "noLineEndings": "Geen RegelEinde", "notConnected": "Niet verbonden. Kies een bord en een poort om automatisch te verbinden.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "Seriële plotter", "timestamp": "Tijdstempel", "toggleTimestamp": "Tijdstempel omschakelen" }, @@ -349,7 +349,7 @@ "archiveSketch": "Archiveer Schets", "cantOpen": "Er bestaat al een map met de naam \"{0}\". Kan schets niet openen.", "close": "Weet je zeker dat je de schets wilt sluiten?", - "compile": "Compiling sketch...", + "compile": "Sketch compileren...", "configureAndUpload": "Configureren en uploaden", "createdArchive": "Archief '{0}' gemaakt.", "doneCompiling": "Klaar met compileren.", @@ -371,7 +371,7 @@ "titleSketchbook": "Schetsboek", "upload": "Uploaden", "uploadUsingProgrammer": "Uploaden met behulp van Programmeerapparaat", - "uploading": "Uploading...", + "uploading": "Uploaden...", "userFieldsNotFoundError": "Kan gebruiker veld van verbonden bord niet vinden", "verify": "Verifiëren", "verifyOrCompile": "Verifiëren/Compileren" @@ -386,7 +386,7 @@ }, "userFields": { "cancel": "Annuleer", - "enterField": "Enter {0}", + "enterField": "Ga naar {0}", "upload": "Uploaden" } }, diff --git a/i18n/pl.json b/i18n/pl.json index a506aecf5..41f14afc6 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -6,7 +6,7 @@ }, "board": { "board": "Płytka{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Wybierz inną płytkę i port", "boardInfo": "Informacje o płytce", "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ć.", @@ -16,7 +16,7 @@ "inSketchbook": "(w Szkicowniku)", "installNow": "Jądro \" 1{0} 2{1} \" musi zostać zainstalowane dla wybranej płytki \"{2}\". Czy chcesz zainstalować je teraz?", "noFQBN": "FQBN jest niedostępny dla wybranej płytki \" 1{0} \". Sprawdź czy zainstalowane jądro jest prawidłowe.", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Nie wykryto portów", "noPortsSelected": "Nie wybrano portu dla płytki: '{0}'.", "noneSelected": "Nie wybrano płytki.", "openBoardsConfig": "Wybierz inną płytkę i port...", @@ -26,7 +26,7 @@ "portLabel": "Port: 1{0}", "programmer": "Programator", "reselectLater": "Wybierz ponownie później", - "searchBoard": "Search board", + "searchBoard": "Szukaj płytki", "selectBoard": "Wybierz płytkę", "selectBoardForInfo": "Wybierz płytkę, aby uzyskać o niej informacje.", "selectPortForInfo": "Wybierz port, aby uzyskać informacje o płytce.", @@ -36,7 +36,7 @@ }, "boardsManager": "Menedżer Płytek", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certyfikat Arduino" }, "bootloader": { "burnBootloader": "Wypal Bootloader'a", @@ -64,13 +64,13 @@ "uploadingCertificates": "Przesyłanie certyfikatów." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Sprawdź uaktualnienia dla Arduino IDE.", + "installAll": "Zainstaluj wszystko", + "noUpdates": "Brak nowych aktualizacji do zainstalowania", + "promptUpdateBoards": "Dostępne nowe aktualizację dla płytek.", + "promptUpdateLibraries": "Dostępne aktualizacje dla bibliotek.", + "updatingBoards": "Aktualizuję płytki...", + "updatingLibraries": "Aktualizuję biblioteki..." }, "cli-error-parser": { "keyboardError": "Nie znaleziono klawiatury. Czy szkic posiada linię kodu: '#include '?", @@ -114,8 +114,8 @@ "visitArduinoCloud": "Odwiedź chmurę Arduino, aby tworzyć szkice w chmurze." }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Wszytko", + "contributed": "Przyczynił się", "installManually": "Zainstaluj ręcznie", "later": "Później", "noBoardSelected": "Nie wybrano płytki", @@ -124,19 +124,19 @@ "oldFormat": "'{0}' nadal używa starego formatu `.pde`. Czy chcesz się przełączyć na nowe rozszerzenie `.ino`?", "partner": "Partner", "processing": "Przetwarzanie", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Zalecane", + "retired": "Odosobniony", "selectedOn": "na 1{0}", "serialMonitor": "Monitor portu szeregowego", - "type": "Type", + "type": "Typ", "unknown": "Nieznany", - "updateable": "Updatable" + "updateable": "Możliwość aktualizacji" }, "compile": { "error": "Błąd kompilacji: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Płytka dołączona w pakiecie:", "by": "przez", "filterSearch": "Filtruj przeszukiwanie....", "install": "ZAINSTALUJ", @@ -152,7 +152,7 @@ }, "coreContribution": { "copyError": "Kopiuj komunikat błędu", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Nie wybrano płytki. Proszę wybierz płytkę z Narzędzia > Lista płytek" }, "daemon": { "restart": "Restartuj Daemon", @@ -178,7 +178,7 @@ "increaseIndent": "Zwiększ wcięcie", "nextError": "Następny Błąd", "previousError": "Poprzedni Błąd", - "revealError": "Reveal Error" + "revealError": "Pokaż Error" }, "electron": { "couldNotSave": "Wszystkie niezapisane zmiany zostaną utracone.", @@ -216,7 +216,7 @@ "visit": "Odwiedź Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Sprawdź uaktualnienia dla Arduino IDE.", "closeAndInstallButton": "Wyjdź i instaluj", "closeToInstallNotice": "Zamknij aplikacje i zainstaluj aktualizacje.", "downloadButton": "Pobierz", @@ -255,22 +255,22 @@ "zipLibrary": "Biblioteka" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Temat" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Komunikacja", + "dataProcessing": "Przetwarzanie danych", + "dataStorage": "Magazyn danych", + "deviceControl": "Kontrola urządzenia", + "display": "Wyświetlacz", + "other": "Inne", + "sensors": "Czujniki", + "signalInputOutput": "Sygnał Wejściowy/Wyjściowy", + "timing": "Wyczucie czasu", + "uncategorized": "Brak kategorii" }, "libraryType": { - "installed": "Installed" + "installed": "Zainstalowane" }, "menu": { "advanced": "Niewłaściwy schemat.", @@ -290,7 +290,7 @@ "automatic": "Automatyczne", "board.certificates": "Lista certyfikatów, które można przesłać do płytki", "browse": "Przeglądaj", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Otrzymano powiadomienie o dostępności nowych aktualizacji dla IDE, płytek i bibliotek. Wymaga ponownego uruchomienia IDE po zmianie. Domyślnie ustawione na tak", "choose": "Wybierz", "cli.daemonDebug": "Włącz rejestrowanie debugowania wywołań gRPC do interfejsu Arduino CLI. Aby to ustawienie zaczęło obowiązywać, konieczne jest ponowne uruchomienie środowiska IDE. Domyślnie jest to fałszywy.", "cloud.enabled": "Prawdziwy jeśli włączone są funkcje synchronizacji szkicu. Wartość domyślna to prawdziwy.", @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Powrót karetki", - "message": "Wiadomość({0} + Enter aby wysłać wiadomość do '{1}' on '{2}')", + "message": "Message(Kliknij aby wysłać wiadomość do '{0}' od '{1}')", "newLine": "Nowa linia", "newLineCarriageReturn": "Nowa linia i powrót karetki", "noLineEndings": "Brak końca linii", @@ -386,7 +386,7 @@ }, "userFields": { "cancel": "Anuluj", - "enterField": "Enter {0}", + "enterField": "Kliknij {0}", "upload": "Prześlij" } }, diff --git a/i18n/pt.json b/i18n/pt.json index ae6b1d45b..f27afceb3 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -16,7 +16,7 @@ "inSketchbook": "(no Sketchbook)", "installNow": "O núcleo \"{0} {1}\" deve ser instalado para a placa \"{2}\" atualmente selecionada. Quer instalar agora?", "noFQBN": "O FQBN não está disponível para a placa selecionada \"{0}\". Você tem o núcleo correspondente instalado?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Nenhuma porta detectada", "noPortsSelected": "Nenhuma porta selecionada para placa: '{0}'.", "noneSelected": "Nenhuma placa selecionada.", "openBoardsConfig": "Selecione outra placa e porta...", @@ -26,7 +26,7 @@ "portLabel": "Porta{0}", "programmer": "Programador/Gravador", "reselectLater": "Selecionar novamente mais tarde", - "searchBoard": "Search board", + "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", "selectBoardForInfo": "Selecione uma placa para obter informações sobre ela.", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", @@ -65,12 +65,12 @@ }, "checkForUpdates": { "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", + "installAll": "Instalar todas", + "noUpdates": "Não há atualizações recentes disponíveis.", "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": "Atualizando placas...", + "updatingLibraries": "Atualizando bibliotecas..." }, "cli-error-parser": { "keyboardError": "'Keyboard' não encontrado. O seu sketch inclue a linha '#include '?", @@ -115,7 +115,7 @@ }, "common": { "all": "All", - "contributed": "Contributed", + "contributed": "Contribuído", "installManually": "Instalar Manualmente", "later": "Depois", "noBoardSelected": "Nenhuma placa selecionada.", @@ -124,11 +124,11 @@ "oldFormat": "O '{0}' ainda utiliza o formato antigo `.pde`. Deseja mudar para a nova extensão `.ino`?", "partner": "Partner", "processing": "Em processamento", - "recommended": "Recommended", + "recommended": "Recomendado", "retired": "Retired", "selectedOn": "em {0}", "serialMonitor": "Monitor Serial", - "type": "Type", + "type": "Tipo", "unknown": "Desconhecido", "updateable": "Updatable" }, @@ -136,7 +136,7 @@ "error": "Erro de compilação: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Placas incluídas nesse pacote:", "by": "por", "filterSearch": "Filtrar a sua pesquisa…", "install": "Instalar", @@ -216,7 +216,7 @@ "visit": "Visitar Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Checar atualizações da Arduino IDE", "closeAndInstallButton": "Fechar e instalar ", "closeToInstallNotice": "Feche o software e instale a atualização em sua máquina. ", "downloadButton": "Baixar", @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Avanço automático de linha", "carriageReturn": "Retorno de linha", - "message": "Mensagem ({0} + Enter para enviar mensagem para '{1}' em '{2}'", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nova linha", "newLineCarriageReturn": "Nova linha e retorno de linha", "noLineEndings": "Sem final de linha", diff --git a/i18n/ro.json b/i18n/ro.json index adbb37415..db489e75a 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Autoderulare", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Linie Nouă", "newLineCarriageReturn": "NL și CR", "noLineEndings": "No Line Ending", diff --git a/i18n/ru.json b/i18n/ru.json index a992ee54d..3e0649b10 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Автопрокрутка", "carriageReturn": "CR Возврат каретки", - "message": "Сообщение ({0} + Enter, чтобы отправить сообщение для '{1}' на '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Новая строка", "newLineCarriageReturn": "NL & CR", "noLineEndings": "Нет конца строки", diff --git a/i18n/sr.json b/i18n/sr.json index 1b0eed34e..c37c7f447 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Аутоматско скроловање", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нова линија", "newLineCarriageReturn": "И нова линија и CR", "noLineEndings": "Без завршетка линије", diff --git a/i18n/tr.json b/i18n/tr.json index 6df12a641..9363b9d03 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Otomatik Kaydırma", "carriageReturn": "Satır Başı", - "message": "Mesaj ({0} + Mesaj göndermek için Enter '{1}' / '{2}')", + "message": "Mesaj ('{0}' - '{1}''a mesaj göndermek için Enter'a basın)", "newLine": "Yeni Satır", "newLineCarriageReturn": "NL ve CR ile Birlikte", "noLineEndings": "Satır Sonu Yok", diff --git a/i18n/vi.json b/i18n/vi.json index e988ac844..8a1601a6e 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "Tự động cuộn", "carriageReturn": "Về đầu dòng", - "message": "Nhắn tin ({0} + Enter để gửi tin nhắn tới '{1}' trên cổng '{2}')", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Dòng mới", "newLineCarriageReturn": "Vừa xuống dòng & về đầu dòng", "noLineEndings": "Không có kết thúc dòng", diff --git a/i18n/zh.json b/i18n/zh.json index dcb23bdab..a2d28e6b8 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "自动滚屏", "carriageReturn": "回车", - "message": "消息({0}+Enter 将消息发送到 {2} 上的 {1})", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "换行", "newLineCarriageReturn": "换行 和 回车 两者都是", "noLineEndings": "没有结束符", diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index cbb5194be..f5a6f667f 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -336,7 +336,7 @@ "serial": { "autoscroll": "自動滾頁面", "carriageReturn": "回車", - "message": "訊息 (1{0}+Enter將訊息發送到'{2}'上的2{1})", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "換行", "newLineCarriageReturn": "兩者都是NL和CR", "noLineEndings": "沒有斷行符號", From 8a5995920aad77216db491ea406e6431fe2e17cd Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 20 Sep 2022 14:36:02 +0200 Subject: [PATCH 017/384] fix board selection and workspace input dialogs width and height (#1406) * fix board selection and workspace input dialogs width and height * use same dialog for new file and rename * fix board list getting small when filtering * board select dialog: show variant text when no board is found * fix addition boards url outline --- .../browser/boards/boards-config-dialog.ts | 1 + .../src/browser/boards/boards-config.tsx | 38 ++++++++++++------- .../dialogs/settings/settings-dialog.tsx | 1 - .../browser/style/boards-config-dialog.css | 21 ++++++++++ .../src/browser/style/dialogs.css | 4 +- .../src/browser/style/settings-dialog.css | 6 ++- .../theia/workspace/workspace-commands.ts | 33 +++++++++------- .../theia/workspace/workspace-input-dialog.ts | 1 + i18n/en.json | 1 + 9 files changed, 74 insertions(+), 32 deletions(-) diff --git a/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts b/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts index ffec830d1..b08c6de36 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts +++ b/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts @@ -34,6 +34,7 @@ export class BoardsConfigDialog extends AbstractDialog { ) { super({ ...props, maxWidth: 500 }); + this.node.id = 'select-board-dialog-container'; this.contentNode.classList.add('select-board-dialog'); this.contentNode.appendChild(this.createDescription()); diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index 7edd30e76..c145ec924 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -299,6 +299,18 @@ export class BoardsConfig extends React.Component< } } + 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 (
@@ -315,19 +327,17 @@ export class BoardsConfig extends React.Component< />
-
- {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} - /> - ))} -
+ {boardsList.length > 0 ? ( +
{boardsList}
+ ) : ( +
+ {nls.localize( + 'arduino/board/noBoardsFound', + 'No boards found for "{0}"', + query + )} +
+ )}
); } @@ -342,7 +352,7 @@ export class BoardsConfig extends React.Component< ); } return !ports.length ? ( -
+
{nls.localize('arduino/board/noPortsDiscovered', 'No ports discovered')}
) : ( diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index b4ad879d1..7ebc7c5ba 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -155,7 +155,6 @@ export class AdditionalUrlsDialog extends AbstractDialog { this.textArea = document.createElement('textarea'); this.textArea.className = 'theia-input'; - this.textArea.setAttribute('style', 'flex: 0;'); this.textArea.value = urls .filter((url) => url.trim()) .filter((url) => !!url) diff --git a/arduino-ide-extension/src/browser/style/boards-config-dialog.css b/arduino-ide-extension/src/browser/style/boards-config-dialog.css index 1beb7c4f9..59633efb4 100644 --- a/arduino-ide-extension/src/browser/style/boards-config-dialog.css +++ b/arduino-ide-extension/src/browser/style/boards-config-dialog.css @@ -1,5 +1,11 @@ +#select-board-dialog-container > .dialogBlock { + width: 640px; + height: 500px; +} + div#select-board-dialog { margin: 5px; + height: 100%; } div#select-board-dialog .selectBoardContainer { @@ -7,12 +13,17 @@ div#select-board-dialog .selectBoardContainer { gap: 10px; overflow: hidden; max-height: 100%; + height: 100%; } .select-board-dialog .head { margin: 5px; } +.dialogContent.select-board-dialog { + height: 100%; +} + div.dialogContent.select-board-dialog > div.head .title { font-weight: 400; letter-spacing: 0.02em; @@ -63,6 +74,7 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { display: flex; flex-direction: column; max-height: 100%; + height: 100%; } #select-board-dialog .selectBoardContainer .left.container .content { @@ -131,6 +143,7 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { #select-board-dialog .selectBoardContainer .list { max-height: 200px; overflow-y: auto; + flex: 1; } #select-board-dialog .selectBoardContainer .ports.list { @@ -282,3 +295,11 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { display: none; } } + +#select-board-dialog .no-result { + text-transform: uppercase; + height: 100%; + user-select: none; + padding: 10px 5px; + overflow-wrap: break-word; +} diff --git a/arduino-ide-extension/src/browser/style/dialogs.css b/arduino-ide-extension/src/browser/style/dialogs.css index aa5ef3fe1..4d56484e8 100644 --- a/arduino-ide-extension/src/browser/style/dialogs.css +++ b/arduino-ide-extension/src/browser/style/dialogs.css @@ -9,7 +9,8 @@ total = padding + margin = 96px */ max-width: calc(100% - 96px) !important; - min-width: unset; + + min-width: 424px; max-height: 560px; padding: 0 28px; } @@ -85,3 +86,4 @@ max-height: 400px; } } + \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/style/settings-dialog.css b/arduino-ide-extension/src/browser/style/settings-dialog.css index 017f8c07e..a3315454c 100644 --- a/arduino-ide-extension/src/browser/style/settings-dialog.css +++ b/arduino-ide-extension/src/browser/style/settings-dialog.css @@ -88,10 +88,12 @@ } .additional-urls-dialog textarea { - width: 100%; + resize: none; } .p-Widget.dialogOverlay .dialogBlock .dialogContent.additional-urls-dialog { - display: block; + display: flex; overflow: hidden; + padding: 0 1px; + margin: 0 -1px; } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts index 5b864732b..2fbcbdb26 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-commands.ts @@ -17,7 +17,6 @@ import { SketchesServiceClientImpl, } from '../../../common/protocol/sketches-service-client-impl'; import { SaveAsSketch } from '../../contributions/save-as-sketch'; -import { SingleTextInputDialog } from '@theia/core/lib/browser'; import { nls } from '@theia/core/lib/common'; @injectable() @@ -161,20 +160,26 @@ export class WorkspaceCommandContribution extends TheiaWorkspaceCommandContribut return; } const initialValue = uri.path.base; - const dialog = new SingleTextInputDialog({ - title: nls.localize('theia/workspace/newFileName', 'New name for file'), - initialValue, - initialSelectionRange: { - start: 0, - end: uri.path.name.length, - }, - validate: (name, mode) => { - if (initialValue === name && mode === 'preview') { - return false; - } - return this.validateFileName(name, parent, false); + const parentUri = parent.resource; + + const dialog = new WorkspaceInputDialog( + { + title: nls.localize('theia/workspace/newFileName', 'New name for file'), + initialValue, + parentUri, + initialSelectionRange: { + start: 0, + end: uri.path.name.length, + }, + validate: (name, mode) => { + if (initialValue === name && mode === 'preview') { + return false; + } + return this.validateFileName(name, parent, false); + }, }, - }); + this.labelProvider + ); const newName = await dialog.open(); const newNameWithExt = this.maybeAppendInoExt(newName); if (newNameWithExt) { diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts index 7dca96b7f..5f4deb5b2 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts @@ -18,6 +18,7 @@ export class WorkspaceInputDialog extends TheiaWorkspaceInputDialog { protected override readonly labelProvider: LabelProvider ) { super(props, labelProvider); + this.node.classList.add('workspace-input-dialog'); this.appendCloseButton( nls.localize('vscode/issueMainService/cancel', 'Cancel') ); diff --git a/i18n/en.json b/i18n/en.json index cd6a7a2b7..dff1729e5 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -15,6 +15,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No ports selected for board: '{0}'.", From b3ab5cbd2add12edbda415c54959763a416054f0 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Tue, 20 Sep 2022 14:47:30 +0200 Subject: [PATCH 018/384] Fix input background in Firmware Updater dialog (#1465) Closes #1441. --- .../src/browser/style/firmware-uploader-dialog.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css b/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css index 3143d02a8..e49f5e5aa 100644 --- a/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css +++ b/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css @@ -7,7 +7,7 @@ } .firmware-uploader-dialog .arduino-select__control { height: 31px; - background: var(--theia-menubar-selectionBackground) !important; + background: var(--theia-input-background) !important; } .firmware-uploader-dialog .dialogRow > button{ @@ -28,4 +28,4 @@ .firmware-uploader-dialog .status-icon { margin-right: 10px; -} \ No newline at end of file +} From 6983c5bf7f40de76542de0c4a0810bcd3f204612 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 16 Sep 2022 11:12:58 +0200 Subject: [PATCH 019/384] Ensure `directories.user` exists. Closes #1445 Signed-off-by: Akos Kitta --- .../src/node/config-service-impl.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index 27c560856..904be5882 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -56,7 +56,10 @@ export class ConfigServiceImpl this.loadCliConfig().then(async (cliConfig) => { this.cliConfig = cliConfig; if (this.cliConfig) { - const config = await this.mapCliConfigToAppConfig(this.cliConfig); + const [config] = await Promise.all([ + this.mapCliConfigToAppConfig(this.cliConfig), + this.ensureUserDirExists(this.cliConfig), + ]); if (config) { this.config = config; this.ready.resolve(); @@ -263,4 +266,11 @@ export class ConfigServiceImpl grpc.credentials.createInsecure() ) as SettingsServiceClient; } + + // #1445 + private async ensureUserDirExists( + cliConfig: DefaultCliConfig + ): Promise { + await fs.mkdir(cliConfig.directories.user, { recursive: true }); + } } From 42f6f438704e67ce0d74b98454a0ed983045754a Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Wed, 21 Sep 2022 11:51:38 +0200 Subject: [PATCH 020/384] Avoid new line if 3rd party URLs text is too long (#1474) Closes #1470. --- arduino-ide-extension/src/browser/style/settings-dialog.css | 1 + 1 file changed, 1 insertion(+) diff --git a/arduino-ide-extension/src/browser/style/settings-dialog.css b/arduino-ide-extension/src/browser/style/settings-dialog.css index a3315454c..61e806ec0 100644 --- a/arduino-ide-extension/src/browser/style/settings-dialog.css +++ b/arduino-ide-extension/src/browser/style/settings-dialog.css @@ -89,6 +89,7 @@ .additional-urls-dialog textarea { resize: none; + white-space: nowrap; } .p-Widget.dialogOverlay .dialogBlock .dialogContent.additional-urls-dialog { From 6a35bbfa7ec233bf8afe0ccb429cd6485d2ee285 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 4 Aug 2022 14:41:35 +0200 Subject: [PATCH 021/384] Made the file dialogs modal. Signed-off-by: Akos Kitta --- .../src/browser/contributions/add-file.ts | 5 ++- .../browser/contributions/add-zip-library.ts | 39 ++++++++++--------- .../browser/contributions/archive-sketch.ts | 19 +++++---- .../src/browser/contributions/open-sketch.ts | 39 ++++++++++--------- .../browser/contributions/save-as-sketch.ts | 19 +++++---- .../dialogs/settings/settings-component.tsx | 1 + 6 files changed, 68 insertions(+), 54 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/add-file.ts b/arduino-ide-extension/src/browser/contributions/add-file.ts index b7cb48f73..a5d616b0c 100644 --- a/arduino-ide-extension/src/browser/contributions/add-file.ts +++ b/arduino-ide-extension/src/browser/contributions/add-file.ts @@ -15,7 +15,7 @@ import { CurrentSketch } from '../../common/protocol/sketches-service-client-imp @injectable() export class AddFile extends SketchContribution { @inject(FileDialogService) - protected readonly fileDialogService: FileDialogService; + private readonly fileDialogService: FileDialogService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(AddFile.Commands.ADD_FILE, { @@ -31,7 +31,7 @@ export class AddFile extends SketchContribution { }); } - protected async addFile(): Promise { + private async addFile(): Promise { const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; @@ -41,6 +41,7 @@ export class AddFile extends SketchContribution { canSelectFiles: true, canSelectFolders: false, canSelectMany: false, + modal: true, }); if (!toAddUri) { return; diff --git a/arduino-ide-extension/src/browser/contributions/add-zip-library.ts b/arduino-ide-extension/src/browser/contributions/add-zip-library.ts index d3d3dbd3a..13edb03f0 100644 --- a/arduino-ide-extension/src/browser/contributions/add-zip-library.ts +++ b/arduino-ide-extension/src/browser/contributions/add-zip-library.ts @@ -17,13 +17,13 @@ import { nls } from '@theia/core/lib/common'; @injectable() export class AddZipLibrary extends SketchContribution { @inject(EnvVariablesServer) - protected readonly envVariableServer: EnvVariablesServer; + private readonly envVariableServer: EnvVariablesServer; @inject(ResponseServiceClient) - protected readonly responseService: ResponseServiceClient; + private readonly responseService: ResponseServiceClient; @inject(LibraryService) - protected readonly libraryService: LibraryService; + private readonly libraryService: LibraryService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(AddZipLibrary.Commands.ADD_ZIP_LIBRARY, { @@ -43,23 +43,26 @@ export class AddZipLibrary extends SketchContribution { }); } - async addZipLibrary(): Promise { + private async addZipLibrary(): Promise { const homeUri = await this.envVariableServer.getHomeDirUri(); const defaultPath = await this.fileService.fsPath(new URI(homeUri)); - const { canceled, filePaths } = await remote.dialog.showOpenDialog({ - 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 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'], + }, + ], + } + ); 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 abe22d77f..80da956e6 100644 --- a/arduino-ide-extension/src/browser/contributions/archive-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/archive-sketch.ts @@ -28,7 +28,7 @@ export class ArchiveSketch extends SketchContribution { }); } - protected async archiveSketch(): Promise { + private async archiveSketch(): Promise { const [sketch, config] = await Promise.all([ this.sketchServiceClient.currentSketch(), this.configService.getConfiguration(), @@ -43,13 +43,16 @@ export class ArchiveSketch extends SketchContribution { const defaultPath = await this.fileService.fsPath( new URI(config.sketchDirUri).resolve(archiveBasename) ); - const { filePath, canceled } = await remote.dialog.showSaveDialog({ - title: nls.localize( - 'arduino/sketch/saveSketchAs', - 'Save sketch folder as...' - ), - defaultPath, - }); + const { filePath, canceled } = await remote.dialog.showSaveDialog( + remote.getCurrentWindow(), + { + title: nls.localize( + 'arduino/sketch/saveSketchAs', + 'Save sketch folder as...' + ), + defaultPath, + } + ); if (!filePath || canceled) { return; } diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-sketch.ts index abb667c91..063b86a1e 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch.ts @@ -26,21 +26,21 @@ import { nls } from '@theia/core/lib/common'; @injectable() export class OpenSketch extends SketchContribution { @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; + private readonly menuRegistry: MenuModelRegistry; @inject(ContextMenuRenderer) - protected readonly contextMenuRenderer: ContextMenuRenderer; + private readonly contextMenuRenderer: ContextMenuRenderer; @inject(BuiltInExamples) - protected readonly builtInExamples: BuiltInExamples; + private readonly builtInExamples: BuiltInExamples; @inject(ExamplesService) - protected readonly examplesService: ExamplesService; + private readonly examplesService: ExamplesService; @inject(Sketchbook) - protected readonly sketchbook: Sketchbook; + private readonly sketchbook: Sketchbook; - protected readonly toDispose = new DisposableCollection(); + private readonly toDispose = new DisposableCollection(); override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketch.Commands.OPEN_SKETCH, { @@ -130,7 +130,7 @@ export class OpenSketch extends SketchContribution { }); } - async openSketch( + private async openSketch( toOpen: MaybePromise = this.selectSketch() ): Promise { const sketch = await toOpen; @@ -139,21 +139,24 @@ export class OpenSketch extends SketchContribution { } } - protected async selectSketch(): Promise { + private async selectSketch(): Promise { const config = await this.configService.getConfiguration(); const defaultPath = await this.fileService.fsPath( new URI(config.sketchDirUri) ); - const { filePaths } = await remote.dialog.showOpenDialog({ - defaultPath, - properties: ['createDirectory', 'openFile'], - filters: [ - { - name: nls.localize('arduino/sketch/sketch', 'Sketch'), - extensions: ['ino', 'pde'], - }, - ], - }); + const { filePaths } = await remote.dialog.showOpenDialog( + remote.getCurrentWindow(), + { + defaultPath, + properties: ['createDirectory', 'openFile'], + filters: [ + { + name: nls.localize('arduino/sketch/sketch', 'Sketch'), + extensions: ['ino', 'pde'], + }, + ], + } + ); if (!filePaths.length) { return undefined; } 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 6898add2a..55e32f5fe 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -50,7 +50,7 @@ export class SaveAsSketch extends SketchContribution { /** * Resolves `true` if the sketch was successfully saved as something. */ - async saveAs( + private async saveAs( { execOnlyIfTemp, openAfterMove, @@ -82,13 +82,16 @@ export class SaveAsSketch extends SketchContribution { : sketch.name ); const defaultPath = await this.fileService.fsPath(defaultUri); - const { filePath, canceled } = await remote.dialog.showSaveDialog({ - title: nls.localize( - 'arduino/sketch/saveFolderAs', - 'Save sketch folder as...' - ), - defaultPath, - }); + const { filePath, canceled } = await remote.dialog.showSaveDialog( + remote.getCurrentWindow(), + { + title: nls.localize( + 'arduino/sketch/saveFolderAs', + 'Save sketch folder as...' + ), + defaultPath, + } + ); if (!filePath || canceled) { return false; } diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index c4f635964..f6d380c4d 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -502,6 +502,7 @@ export class SettingsComponent extends React.Component< canSelectFiles: false, canSelectMany: false, canSelectFolders: true, + modal: true, }); if (uri) { const sketchbookPath = await this.props.fileService.fsPath(uri); From 878395221af0d8eb18639e7c58948b0850621ebd Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 4 Aug 2022 17:36:28 +0200 Subject: [PATCH 022/384] Use the parent of the existing sketch if not temp. Signed-off-by: Akos Kitta --- .../browser/contributions/save-as-sketch.ts | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) 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 55e32f5fe..3fee8491e 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -58,7 +58,10 @@ export class SaveAsSketch extends SketchContribution { markAsRecentlyOpened, }: SaveAsSketch.Options = SaveAsSketch.Options.DEFAULT ): Promise { - const sketch = await this.sketchServiceClient.currentSketch(); + const [sketch, configuration] = await Promise.all([ + this.sketchServiceClient.currentSketch(), + this.configService.getConfiguration(), + ]); if (!CurrentSketch.isValid(sketch)) { return false; } @@ -68,15 +71,23 @@ export class SaveAsSketch extends SketchContribution { return false; } - // If target does not exist, propose a `directories.user`/${sketch.name} path - // If target exists, propose `directories.user`/${sketch.name}_copy_${yyyymmddHHMMss} - const sketchDirUri = new URI( - (await this.configService.getConfiguration()).sketchDirUri - ); + const sketchUri = new URI(sketch.uri); + const sketchbookDirUri = new URI(configuration.sketchDirUri); + // If the sketch is temp, IDE2 proposes the default sketchbook folder URI. + // If the sketch is not temp, but not contained in the default sketchbook folder, IDE2 proposes the default location. + // Otherwise, it proposes the parent folder of the current sketch. + const containerDirUri = isTemp + ? sketchbookDirUri + : !sketchbookDirUri.isEqualOrParent(sketchUri) + ? sketchbookDirUri + : sketchUri.parent; const exists = await this.fileService.exists( - sketchDirUri.resolve(sketch.name) + containerDirUri.resolve(sketch.name) ); - const defaultUri = sketchDirUri.resolve( + + // If target does not exist, propose a `directories.user`/${sketch.name} path + // If target exists, propose `directories.user`/${sketch.name}_copy_${yyyymmddHHMMss} + const defaultUri = containerDirUri.resolve( exists ? `${sketch.name}_copy_${dateFormat(new Date(), 'yyyymmddHHMMss')}` : sketch.name From 707f3bef610703f51d5cf498e46a633d67492ab8 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 21 Sep 2022 16:38:48 +0200 Subject: [PATCH 023/384] Listen on keyboard layout changes from the OS. Closes #989 Signed-off-by: Akos Kitta --- .../src/electron-main/arduino-electron-main-module.ts | 5 +++++ 1 file changed, 5 insertions(+) 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 9ab5bc99d..e209da523 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 @@ -18,6 +18,7 @@ import { IDEUpdaterImpl } from './ide-updater/ide-updater-impl'; import { ElectronMainApplication } from './theia/electron-main-application'; import { ElectronMainWindowServiceImpl } from './theia/electron-main-window-service'; import { TheiaElectronWindow } from './theia/theia-electron-window'; +import { ElectronNativeKeymap } from '@theia/core/lib/electron-main/electron-native-keymap'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronMainApplication).toSelf().inSingletonScope(); @@ -58,4 +59,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .inSingletonScope(); bind(IsTempSketch).toSelf().inSingletonScope(); + + // https://github.com/eclipse-theia/theia/issues/11688 + bind(ElectronNativeKeymap).toSelf().inSingletonScope(); + bind(ElectronMainApplicationContribution).toService(ElectronNativeKeymap); }); From 9ef04bb8d6930a75936bcbff2d0da73a2e858b2a Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 15 Sep 2022 15:50:21 +0200 Subject: [PATCH 024/384] Fixed missing translations Aligned the languge pack versions. Closes #1431 Signed-off-by: Akos Kitta --- .../browser/arduino-ide-frontend-module.ts | 20 -- .../src/browser/boards/boards-config.tsx | 11 +- .../browser/contributions/board-selection.ts | 7 +- .../dialogs/settings/settings-component.tsx | 23 ++- .../plotter/plotter-frontend-contribution.ts | 8 +- .../src/browser/style/list-widget.css | 6 +- .../search-in-workspace-result-tree-widget.ts | 44 ----- .../search-in-workspace-widget.tsx | 80 -------- .../component-list/list-item-renderer.tsx | 9 +- .../src/common/protocol/boards-service.ts | 23 +++ .../src/common/protocol/core-service.ts | 12 ++ .../i18n/arduino-localization-contribution.ts | 173 ++++-------------- .../i18n/localization-backend-contribution.ts | 4 +- electron-app/patch/frontend/index.js | 56 +++++- electron/build/template-package.json | 19 -- electron/packager/index.js | 37 ++-- i18n/en.json | 27 ++- package.json | 25 ++- 18 files changed, 235 insertions(+), 349 deletions(-) delete mode 100644 arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-result-tree-widget.ts delete mode 100644 arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-widget.tsx 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 d6e9571f7..0a6df55ff 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -53,8 +53,6 @@ import { DockPanelRenderer as TheiaDockPanelRenderer, TabBarRendererFactory, ContextMenuRenderer, - createTreeContainer, - TreeWidget, } from '@theia/core/lib/browser'; import { MenuContribution } from '@theia/core/lib/common/menu'; import { @@ -207,12 +205,8 @@ import { WorkspaceVariableContribution as TheiaWorkspaceVariableContribution } f import { WorkspaceVariableContribution } from './theia/workspace/workspace-variable-contribution'; import { DebugConfigurationManager } from './theia/debug/debug-configuration-manager'; import { DebugConfigurationManager as TheiaDebugConfigurationManager } from '@theia/debug/lib/browser/debug-configuration-manager'; -import { SearchInWorkspaceWidget as TheiaSearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget'; -import { SearchInWorkspaceWidget } from './theia/search-in-workspace/search-in-workspace-widget'; import { SearchInWorkspaceFactory as TheiaSearchInWorkspaceFactory } from '@theia/search-in-workspace/lib/browser/search-in-workspace-factory'; import { SearchInWorkspaceFactory } from './theia/search-in-workspace/search-in-workspace-factory'; -import { SearchInWorkspaceResultTreeWidget as TheiaSearchInWorkspaceResultTreeWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-result-tree-widget'; -import { SearchInWorkspaceResultTreeWidget } from './theia/search-in-workspace/search-in-workspace-result-tree-widget'; import { MonacoEditorProvider } from './theia/monaco/monaco-editor-provider'; import { MonacoEditorFactory, @@ -605,9 +599,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(MonacoEditorProvider).toSelf().inSingletonScope(); rebind(TheiaMonacoEditorProvider).toService(MonacoEditorProvider); - bind(SearchInWorkspaceWidget).toSelf(); - rebind(TheiaSearchInWorkspaceWidget).toService(SearchInWorkspaceWidget); - // Disabled reference counter in the editor manager to avoid opening the same editor (with different opener options) multiple times. bind(EditorManager).toSelf().inSingletonScope(); rebind(TheiaEditorManager).toService(EditorManager); @@ -617,17 +608,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .to(SearchInWorkspaceFactory) .inSingletonScope(); - rebind(TheiaSearchInWorkspaceResultTreeWidget).toDynamicValue( - ({ container }) => { - const childContainer = createTreeContainer(container); - childContainer.bind(SearchInWorkspaceResultTreeWidget).toSelf(); - childContainer - .rebind(TreeWidget) - .toService(SearchInWorkspaceResultTreeWidget); - return childContainer.get(SearchInWorkspaceResultTreeWidget); - } - ); - // Show a disconnected status bar, when the daemon is not available bind(ApplicationConnectionStatusContribution).toSelf().inSingletonScope(); rebind(TheiaApplicationConnectionStatusContribution).toService( diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index c145ec924..df5ed5a33 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -259,9 +259,12 @@ export class BoardsConfig extends React.Component< override render(): React.ReactNode { return ( <> - {this.renderContainer('boards', this.renderBoards.bind(this))} {this.renderContainer( - 'ports', + 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) )} @@ -384,7 +387,9 @@ export class BoardsConfig extends React.Component< defaultChecked={this.state.showAllPorts} onChange={this.toggleFilterPorts} /> - Show all ports + + {nls.localize('arduino/board/showAllPorts', 'Show all ports')} +
); diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 21acc221b..037587d99 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -5,7 +5,6 @@ import { DisposableCollection, Disposable, } from '@theia/core/lib/common/disposable'; -import { firstToUpperCase } from '../../common/utils'; import { BoardsConfig } from '../boards/boards-config'; import { MainMenuManager } from '../../common/main-menu-manager'; import { BoardsListWidget } from '../boards/boards-list-widget'; @@ -267,7 +266,11 @@ PID: ${PID}`; ]; const placeholder = new PlaceholderMenuNode( menuPath, - `${firstToUpperCase(protocol)} ports`, + nls.localize( + 'arduino/board/typeOfPorts', + '{0} ports', + Port.Protocols.protocolLabel(protocol) + ), { order: protocolOrder.toString() } ); this.menuModelRegistry.registerMenuNode(menuPath, placeholder); diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index f6d380c4d..dac80d61c 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -10,6 +10,7 @@ import { FileDialogService } from '@theia/filesystem/lib/browser/file-dialog/fil import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { AdditionalUrls, + CompilerWarnings, CompilerWarningLiterals, Network, ProxySettings, @@ -260,7 +261,7 @@ export class SettingsComponent extends React.Component< > {CompilerWarningLiterals.map((value) => ( ))} @@ -398,10 +399,22 @@ export class SettingsComponent extends React.Component<
-
Host name:
-
Port number:
-
Username:
-
Password:
+
{`${nls.localize( + 'arduino/preferences/proxySettings/hostname', + 'Host name' + )}:`}
+
{`${nls.localize( + 'arduino/preferences/proxySettings/port', + 'Port number' + )}:`}
+
{`${nls.localize( + 'arduino/preferences/proxySettings/username', + 'Username' + )}:`}
+
{`${nls.localize( + 'arduino/preferences/proxySettings/password', + 'Password' + )}:`}
diff --git a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts index 3914c061a..c403c4201 100644 --- a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts @@ -18,6 +18,7 @@ import { CLOSE_PLOTTER_WINDOW, SHOW_PLOTTER_WINDOW, } from '../../../common/ipc-communication'; +import { nls } from '@theia/core/lib/common/nls'; const queryString = require('query-string'); @@ -107,7 +108,12 @@ export class PlotterFrontendContribution extends Contribution { if (wsPort) { this.open(wsPort); } else { - this.messageService.error(`Couldn't open serial plotter`); + this.messageService.error( + nls.localize( + 'arduino/contributions/plotter/couldNotOpen', + "Couldn't open serial plotter" + ) + ); } } diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index f60159e34..843be61f9 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -111,13 +111,15 @@ font-weight: bold; max-height: calc(1em + 4px); color: var(--theia-button-foreground); - content: 'INSTALLED'; + content: attr(install); + text-transform: uppercase; } .component-list-item .header .installed:hover:before { background-color: var(--theia-button-foreground); color: var(--theia-button-background); - content: 'UNINSTALL'; + content: attr(uninstall); + text-transform: uppercase; } .component-list-item[min-width~="170px"] .footer { diff --git a/arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-result-tree-widget.ts b/arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-result-tree-widget.ts deleted file mode 100644 index e831cd402..000000000 --- a/arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-result-tree-widget.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; -import { - SearchInWorkspaceFileNode, - SearchInWorkspaceResultTreeWidget as TheiaSearchInWorkspaceResultTreeWidget, -} from '@theia/search-in-workspace/lib/browser/search-in-workspace-result-tree-widget'; -import { MEMORY_TEXT } from '@theia/core/lib/common/resource'; - -/** - * Workaround for https://github.com/eclipse-theia/theia/pull/9192/. - */ -@injectable() -export class SearchInWorkspaceResultTreeWidget extends TheiaSearchInWorkspaceResultTreeWidget { - protected override async createReplacePreview( - node: SearchInWorkspaceFileNode - ): Promise { - const fileUri = new URI(node.fileUri).withScheme('file'); - const openedEditor = this.editorManager.all.find( - ({ editor }) => editor.uri.toString() === fileUri.toString() - ); - let content: string; - if (openedEditor) { - content = openedEditor.editor.document.getText(); - } else { - const resource = await this.fileResourceResolver.resolve(fileUri); - content = await resource.readContents(); - } - - const lines = content.split('\n'); - node.children.map((l) => { - const leftPositionedNodes = node.children.filter( - (rl) => rl.line === l.line && rl.character < l.character - ); - const diff = - (this._replaceTerm.length - this.searchTerm.length) * - leftPositionedNodes.length; - const start = lines[l.line - 1].substr(0, l.character - 1 + diff); - const end = lines[l.line - 1].substr(l.character - 1 + diff + l.length); - lines[l.line - 1] = start + this._replaceTerm + end; - }); - - return fileUri.withScheme(MEMORY_TEXT).withQuery(lines.join('\n')); - } -} diff --git a/arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-widget.tsx b/arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-widget.tsx deleted file mode 100644 index cae633024..000000000 --- a/arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-widget.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { injectable, postConstruct } from '@theia/core/shared/inversify'; -import * as React from '@theia/core/shared/react'; -import { Key, KeyCode } from '@theia/core/lib/browser'; -import { SearchInWorkspaceWidget as TheiaSearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget'; - -/** - * Workaround for https://github.com/eclipse-theia/theia/pull/9183. - */ -@injectable() -export class SearchInWorkspaceWidget extends TheiaSearchInWorkspaceWidget { - @postConstruct() - protected override init(): void { - super.init(); - this.title.iconClass = 'fa fa-arduino-search'; - } - - protected override renderGlobField(kind: 'include' | 'exclude'): React.ReactNode { - const currentValue = this.searchInWorkspaceOptions[kind]; - const value = (currentValue && currentValue.join(', ')) || ''; - return ( -
-
{'files to ' + kind}
- { - if (e.target) { - const targetValue = (e.target as HTMLInputElement).value || ''; - let shouldSearch = - Key.ENTER.keyCode === - KeyCode.createKeyCode(e.nativeEvent).key?.keyCode; - const currentOptions = (this.searchInWorkspaceOptions[kind] || []) - .slice() - .map((s) => s.trim()) - .sort(); - const candidateOptions = this.splitOnComma(targetValue) - .map((s) => s.trim()) - .sort(); - const sameAs = (left: string[], right: string[]) => { - if (left.length !== right.length) { - return false; - } - for (let i = 0; i < left.length; i++) { - if (left[i] !== right[i]) { - return false; - } - } - return true; - }; - if (!sameAs(currentOptions, candidateOptions)) { - this.searchInWorkspaceOptions[kind] = - this.splitOnComma(targetValue); - shouldSearch = true; - } - if (shouldSearch) { - this.resultTreeWidget.search( - this.searchTerm, - this.searchInWorkspaceOptions - ); - } - } - }} - onFocus={ - kind === 'include' - ? this.handleFocusIncludesInputBox - : this.handleFocusExcludesInputBox - } - onBlur={ - kind === 'include' - ? this.handleBlurIncludesInputBox - : this.handleBlurExcludesInputBox - } - > -
- ); - } -} diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx index 537f4d415..ea9e257ec 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 @@ -55,7 +55,14 @@ export class ListItemRenderer { item.installedVersion )} - +
); diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index 7be49725e..763fc9bd6 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -285,6 +285,29 @@ export namespace Port { return false; }; } + + export namespace Protocols { + export const KnownProtocolLiterals = ['serial', 'network'] as const; + export type KnownProtocol = typeof KnownProtocolLiterals[number]; + export namespace KnownProtocol { + export function is(protocol: unknown): protocol is KnownProtocol { + return ( + typeof protocol === 'string' && + KnownProtocolLiterals.indexOf(protocol as KnownProtocol) >= 0 + ); + } + } + export const ProtocolLabels: Record = { + serial: nls.localize('arduino/portProtocol/serial', 'Serial'), + network: nls.localize('arduino/portProtocol/network', 'Network'), + }; + export function protocolLabel(protocol: string): string { + if (KnownProtocol.is(protocol)) { + return ProtocolLabels[protocol]; + } + return protocol; + } + } } export interface BoardsPackage extends ArduinoComponent { diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index a7124d865..a4b63a604 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -1,3 +1,4 @@ +import { nls } from '@theia/core/lib/common/nls'; import { ApplicationError } from '@theia/core/lib/common/application-error'; import type { Location, @@ -18,6 +19,17 @@ export const CompilerWarningLiterals = [ 'All', ] as const; export type CompilerWarnings = typeof CompilerWarningLiterals[number]; +export namespace CompilerWarnings { + export function labelOf(warning: CompilerWarnings): string { + return CompilerWarningLabels[warning]; + } + const CompilerWarningLabels: Record = { + None: nls.localize('arduino/core/compilerWarnings/none', 'None'), + Default: nls.localize('arduino/core/compilerWarnings/default', 'Default'), + More: nls.localize('arduino/core/compilerWarnings/more', 'More'), + All: nls.localize('arduino/core/compilerWarnings/all', 'All'), + }; +} export namespace CoreError { export interface ErrorLocationRef { readonly message: string; diff --git a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts index 3465ab83d..686d28bd7 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -3,150 +3,45 @@ import { LocalizationRegistry, } from '@theia/core/lib/node/i18n/localization-contribution'; import { injectable } from '@theia/core/shared/inversify'; +import { join } from 'path'; @injectable() export class ArduinoLocalizationContribution implements LocalizationContribution { - async registerLocalizations(registry: LocalizationRegistry): Promise { - registry.registerLocalizationFromRequire( - 'af', - require('../../../build/i18n/af.json') - ); - - registry.registerLocalizationFromRequire( - 'en', - require('../../../build/i18n/en.json') - ); - - registry.registerLocalizationFromRequire( - 'fr', - require('../../../build/i18n/fr.json') - ); - - registry.registerLocalizationFromRequire( - 'ko', - require('../../../build/i18n/ko.json') - ); - - registry.registerLocalizationFromRequire( - 'pt-br', - require('../../../build/i18n/pt.json') - ); - - registry.registerLocalizationFromRequire( - 'uk_UA', - require('../../../build/i18n/uk_UA.json') - ); - - registry.registerLocalizationFromRequire( - 'ar', - require('../../../build/i18n/ar.json') - ); - - registry.registerLocalizationFromRequire( - 'es', - require('../../../build/i18n/es.json') - ); - - registry.registerLocalizationFromRequire( - 'he', - require('../../../build/i18n/he.json') - ); - - registry.registerLocalizationFromRequire( - 'my_MM', - require('../../../build/i18n/my_MM.json') - ); - - registry.registerLocalizationFromRequire( - 'ro', - require('../../../build/i18n/ro.json') - ); - - registry.registerLocalizationFromRequire( - 'zh-cn', - require('../../../build/i18n/zh.json') - ); - - registry.registerLocalizationFromRequire( - 'bg', - require('../../../build/i18n/bg.json') - ); - - registry.registerLocalizationFromRequire( - 'eu', - require('../../../build/i18n/eu.json') - ); + // 0. index: locale + // 1. index: optional JSON file to `require` (if differs from the locale) + // 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'], + ]; - registry.registerLocalizationFromRequire( - 'hu', - require('../../../build/i18n/hu.json') - ); - - registry.registerLocalizationFromRequire( - 'ne', - require('../../../build/i18n/ne.json') - ); - - registry.registerLocalizationFromRequire( - 'ru', - require('../../../build/i18n/ru.json') - ); - - registry.registerLocalizationFromRequire( - 'zh_TW', - require('../../../build/i18n/zh_TW.json') - ); - - registry.registerLocalizationFromRequire( - 'de', - require('../../../build/i18n/de.json') - ); - - registry.registerLocalizationFromRequire( - 'fa', - require('../../../build/i18n/fa.json') - ); - - registry.registerLocalizationFromRequire( - 'it', - require('../../../build/i18n/it.json') - ); - - registry.registerLocalizationFromRequire( - 'nl', - require('../../../build/i18n/nl.json') - ); - - registry.registerLocalizationFromRequire( - 'sv_SE', - require('../../../build/i18n/sv_SE.json') - ); - - registry.registerLocalizationFromRequire( - 'el', - require('../../../build/i18n/el.json') - ); - - registry.registerLocalizationFromRequire( - 'fil', - require('../../../build/i18n/fil.json') - ); - - registry.registerLocalizationFromRequire( - 'ja', - require('../../../build/i18n/ja.json') - ); - - registry.registerLocalizationFromRequire( - 'pl', - require('../../../build/i18n/pl.json') - ); - - registry.registerLocalizationFromRequire( - 'tr', - require('../../../build/i18n/tr.json') - ); + async registerLocalizations(registry: LocalizationRegistry): Promise { + for (const [locale, jsonFilename] of this.locales) { + registry.registerLocalizationFromRequire( + locale, + require(join( + __dirname, + `../../../build/i18n/${jsonFilename ?? locale}.json` + )) + ); + } } } diff --git a/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts b/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts index e5bc11f03..75ea0deba 100644 --- a/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts @@ -23,8 +23,8 @@ export class LocalizationBackendContribution extends TheiaLocalizationBackendCon app.get('/i18n/:locale', async (req, res) => { let locale = req.params.locale; /* - Waiting for the deploy of the language plugins is neecessary to avoid checking the available - languages before they're finished to be loaded: https://github.com/eclipse-theia/theia/issues/11471 + Waiting for the deploy of the language plugins is necessary to avoid checking the available + languages before they're finished to be loaded: https://github.com/eclipse-theia/theia/issues/11471 */ const start = performance.now(); await this.initialized.promise; diff --git a/electron-app/patch/frontend/index.js b/electron-app/patch/frontend/index.js index 26afbfedd..c227aef44 100644 --- a/electron-app/patch/frontend/index.js +++ b/electron-app/patch/frontend/index.js @@ -17,6 +17,53 @@ const { FrontendApplicationConfigProvider, } = require('@theia/core/lib/browser/frontend-application-config-provider'); +function fetchFrom(path) { + const { Endpoint } = require('@theia/core/lib/browser/endpoint'); + const endpoint = new Endpoint({ path }).getRestUrl().toString(); + return fetch(endpoint); +} + +async function loadTranslations() { + const { nls } = require('@theia/core/lib/common/nls'); + const defaultLocale = typeof window === 'object' && window && window.localStorage.getItem(nls.localeId) || ''; + if (defaultLocale && !nls.locale) { + Object.assign(nls, { + locale: defaultLocale + }); + } + if (nls.locale) { + const response = await fetchFrom(`/i18n/${nls.locale}`); + nls.localization = await response.json(); + } +} + +async function loadBackendOS() { + const response = await fetchFrom('/os'); + const osType = await response.text(); + const isWindows = osType === 'Windows'; + const isOSX = osType === 'OSX'; + OS.backend.isOSX = isOSX; + OS.backend.isWindows = isWindows; + OS.backend.type = () => osType; +} + +function customizeMonacoNls() { + const MonacoNls = require('@theia/monaco-editor-core/esm/vs/nls'); + const { nls: TheiaNls } = require('@theia/core/lib/common/nls'); + const { Localization } = require('@theia/core/lib/common/i18n/localization'); + Object.assign(MonacoNls, { + localize(_, label, ...args) { + if (TheiaNls.locale) { + const defaultKey = TheiaNls.getDefaultKey(label); + if (defaultKey) { + return TheiaNls.localize(defaultKey, label, ...args); + } + } + return Localization.format(label, args); + } + }); +} + // It is a mighty hack to support theme updates in the bundled IDE2. // If the custom theme registration happens before the restoration of the existing monaco themes, then any custom theme changes will be ignored. // This patch introduces a static deferred promise in the monaco-theming service that will be resolved when the restoration is ready. @@ -25,8 +72,14 @@ const { // This patch customizes the monaco theme service behavior before loading the DI containers via the preload. // The preload is called only once before the app loads. The Theia extensions are not loaded at that point, but the app config provider is ready. const preloader = require('@theia/core/lib/browser/preloader'); -const originalPreload = preloader.preload; preloader.preload = async function () { + // Must require the monaco frontend module to activate the NLS customization for monaco. + // Otherwise, the NLS customization would trigger after the monaco UI components with all their translations are already loaded. + await Promise.allSettled([ + loadTranslations(), + loadBackendOS(), + ]); + customizeMonacoNls(); const { MonacoThemingService } = require('@theia/monaco/lib/browser/monaco-theming-service'); const { MonacoThemeServiceIsReady } = require('arduino-ide-extension/lib/browser/utils/window'); const { Deferred } = require('@theia/core/lib/common/promise-util'); @@ -42,7 +95,6 @@ preloader.preload = async function () { await this.restore(); ready.resolve(); }.bind(MonacoThemingService); - return originalPreload(); }.bind(preloader); const lightTheme = 'arduino-theme'; diff --git a/electron/build/template-package.json b/electron/build/template-package.json index 5c15d0560..f934a176f 100644 --- a/electron/build/template-package.json +++ b/electron/build/template-package.json @@ -137,24 +137,5 @@ "path": "arduino-ide/nightly" } ] - }, - "theiaPluginsDir": "plugins", - "theiaPlugins": { - "vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.52.1/file/vscode.cpp-1.52.1.vsix", - "vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.0.2-beta.5.vsix", - "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.1.vsix", - "vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.46.1/file/vscode.json-language-features-1.46.1.vsix", - "cortex-debug": "https://open-vsx.org/api/marus25/cortex-debug/0.3.10/file/marus25.cortex-debug-0.3.10.vsix", - "vscode-language-pack-nl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-nl/1.48.3/file/MS-CEINTL.vscode-language-pack-nl-1.48.3.vsix", - "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.69.0/file/MS-CEINTL.vscode-language-pack-fr-1.69.0.vsix", - "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.69.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.69.0.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.69.0/file/MS-CEINTL.vscode-language-pack-de-1.69.0.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.69.0/file/MS-CEINTL.vscode-language-pack-ja-1.69.0.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.69.0/file/MS-CEINTL.vscode-language-pack-tr-1.69.0.vsix", - "vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.69.0/file/MS-CEINTL.vscode-language-pack-it-1.69.0.vsix", - "vscode-language-pack-ru":"https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.69.0/file/MS-CEINTL.vscode-language-pack-ru-1.69.0.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.69.0/file/MS-CEINTL.vscode-language-pack-es-1.69.0.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.69.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.69.0.vsix", - "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.69.0/file/MS-CEINTL.vscode-language-pack-cs-1.69.0.vsix" } } diff --git a/electron/packager/index.js b/electron/packager/index.js index 12b36097a..d769fecc0 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -123,8 +123,8 @@ // Save some time: no need to build the projects that are not needed in final app. Currently unused. | //---------------------------------------------------------------------------------------------------+ //@ts-ignore - let pkg = require('../working-copy/package.json'); - const workspaces = pkg.workspaces; + const rootPackageJson = require('../working-copy/package.json'); + const workspaces = rootPackageJson.workspaces; // We cannot remove the `electron-app`. Otherwise, there is not way to collect the unused dependencies. const dependenciesToRemove = []; for (const dependencyToRemove of dependenciesToRemove) { @@ -133,10 +133,10 @@ workspaces.splice(index, 1); } } - pkg.workspaces = workspaces; + rootPackageJson.workspaces = workspaces; fs.writeFileSync( path('..', workingCopy, 'package.json'), - JSON.stringify(pkg, null, 2) + JSON.stringify(rootPackageJson, null, 2) ); //-------------------------------------------------------------------------------------------------+ @@ -169,13 +169,13 @@ if (extension !== 'arduino-ide-extension') { // Do not unlink self. // @ts-ignore - pkg = require(`../working-copy/${extension}/package.json`); + rootPackageJson = require(`../working-copy/${extension}/package.json`); // @ts-ignore - pkg.dependencies['arduino-ide-extension'] = + rootPackageJson.dependencies['arduino-ide-extension'] = 'file:../arduino-ide-extension'; fs.writeFileSync( path('..', workingCopy, extension, 'package.json'), - JSON.stringify(pkg, null, 2) + JSON.stringify(rootPackageJson, null, 2) ); } } @@ -184,7 +184,7 @@ // Merge the `working-copy/package.json` with `electron/build/template-package.json`. | //------------------------------------------------------------------------------------+ // @ts-ignore - pkg = require('../working-copy/electron-app/package.json'); + const appPackageJson = require('../working-copy/electron-app/package.json'); template.build.files = [ ...template.build.files, ...unusedDependencies.map((name) => `!node_modules/${name}`), @@ -195,25 +195,26 @@ dependencies[extension] = `file:../working-copy/${extension}`; } // @ts-ignore - pkg.dependencies = { ...pkg.dependencies, ...dependencies }; - pkg.devDependencies = { ...pkg.devDependencies, ...template.devDependencies }; - // Deep-merging the Theia application configuration. We enable the electron window reload in dev mode but not for the final product. (arduino/arduino-pro-ide#187) + appPackageJson.dependencies = { ...appPackageJson.dependencies, ...dependencies }; + appPackageJson.devDependencies = { ...appPackageJson.devDependencies, ...template.devDependencies }; + // Deep-merging the Theia application configuration. // @ts-ignore - const theia = merge(pkg.theia || {}, template.theia || {}); + const theia = merge(appPackageJson.theia || {}, template.theia || {}); const content = { - ...pkg, + ...appPackageJson, ...template, theia, // @ts-ignore - dependencies: pkg.dependencies, - devDependencies: pkg.devDependencies, + dependencies: appPackageJson.dependencies, + devDependencies: appPackageJson.devDependencies, + // VS Code extensions and the plugins folder is defined in the top level `package.json`. The template picks them up. + theiaPluginsDir: rootPackageJson.theiaPluginsDir, + theiaPlugins: rootPackageJson.theiaPlugins, }; - const overwriteMerge = (destinationArray, sourceArray, options) => - sourceArray; fs.writeFileSync( path('..', 'build', 'package.json'), JSON.stringify( - merge(content, template, { arrayMerge: overwriteMerge }), + merge(content, template, { arrayMerge: (_, sourceArray) => sourceArray }), null, 2 ) diff --git a/i18n/en.json b/i18n/en.json index dff1729e5..4db465ba8 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -8,6 +8,7 @@ "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?", @@ -25,6 +26,7 @@ "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", @@ -32,8 +34,10 @@ "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", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Boards Manager", "boardsType": { @@ -149,8 +153,19 @@ "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." @@ -282,6 +297,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -321,6 +340,12 @@ "network": "Network", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "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.", diff --git a/package.json b/package.json index 9800d23e7..92b49adfe 100644 --- a/package.json +++ b/package.json @@ -78,16 +78,21 @@ "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.1.vsix", "vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.46.1/file/vscode.json-language-features-1.46.1.vsix", "cortex-debug": "https://open-vsx.org/api/marus25/cortex-debug/0.3.10/file/marus25.cortex-debug-0.3.10.vsix", + "vscode-language-pack-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-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.69.0/file/MS-CEINTL.vscode-language-pack-fr-1.69.0.vsix", - "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.69.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.69.0.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.69.0/file/MS-CEINTL.vscode-language-pack-de-1.69.0.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.69.0/file/MS-CEINTL.vscode-language-pack-ja-1.69.0.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.69.0/file/MS-CEINTL.vscode-language-pack-tr-1.69.0.vsix", - "vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.69.0/file/MS-CEINTL.vscode-language-pack-it-1.69.0.vsix", - "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.69.0/file/MS-CEINTL.vscode-language-pack-ru-1.69.0.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.69.0/file/MS-CEINTL.vscode-language-pack-es-1.69.0.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.69.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.69.0.vsix", - "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.69.0/file/MS-CEINTL.vscode-language-pack-cs-1.69.0.vsix" + "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" } } From 39538f163fb2fbc64a57eb3a8f91686675bb5bdd Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 24 Sep 2022 16:36:18 -0700 Subject: [PATCH 025/384] Move package metadata update step to dedicated section of release docs Previously the instructions for updating the npm package metadata, submitting a PR for that, and merging the PR was in the same section as the tag push instructions in the release procedure documentation. These two operations are distinct from each other. Mashing them into a single step makes the release procedure document difficult to read and the process more prone to error. For this reason, a dedicated step is used for each of the two things. --- docs/internal/release-procedure.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/internal/release-procedure.md b/docs/internal/release-procedure.md index b95916367..5cf1f8349 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -10,9 +10,9 @@ It will be shown in these search results: https://github.com/arduino/arduino-ide/pulls/app%2Fgithub-actions -## ⚙ Create the release on GitHub +## ⚙ Update metadata of packages -First of all, you need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. +You need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. To do so, you can make use of the `update:version` script. @@ -29,6 +29,8 @@ git push origin version- replacing `` with the version you want to release. Then create a PR and merge it. +## 🚢 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. From 3c2b2a073490359aab40440ef553a2cea773bba8 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 24 Sep 2022 17:00:36 -0700 Subject: [PATCH 026/384] Format release procedure document as ordered list The release procedure is a set of steps which must be performed in a specific sequence. This fact is more effectively communicated by formatting it as an ordered list. --- docs/internal/release-procedure.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/internal/release-procedure.md b/docs/internal/release-procedure.md index 5cf1f8349..ee5b3cdf1 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -1,6 +1,6 @@ # Release Procedure -## 🗺️ Merge localization sync PR +## 1. 🗺️ Merge localization sync PR A pull request titled "**Update translation files**" is submitted periodically by the "**github-actions**" bot to pull in the localization data from [**Transifex**](https://www.transifex.com/arduino-1/ide2/dashboard/). @@ -10,7 +10,7 @@ It will be shown in these search results: https://github.com/arduino/arduino-ide/pulls/app%2Fgithub-actions -## ⚙ Update metadata of packages +## 2. ⚙ Update metadata of packages You need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. @@ -29,7 +29,7 @@ git push origin version- replacing `` with the version you want to release. Then create a PR and merge it. -## 🚢 Create the release on GitHub +## 3. 🚢 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). @@ -44,7 +44,7 @@ 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. -## 📄 Create the changelog +## 4. 📄 Create the changelog **Create GitHub issues for the known issues** that we haven't solved in the current release: @@ -63,7 +63,7 @@ Add a list of mentions of GitHub users who contributed to the release in any of Add a "**Known Issues**" section at the bottom of the changelog. -## ✎ Update the "**Software**" Page +## 5. ✎ 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. @@ -80,7 +80,7 @@ When the deploy workflow is done, check if links on the "**Software**" page are https://www.arduino.cc/en/software#future-version-of-the-arduino-ide -## 😎 Brag about it +## 6. 😎 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).
From 8f88aa69bff30c5716f25306564dbad7c6220da5 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 24 Sep 2022 17:27:04 -0700 Subject: [PATCH 027/384] Adjust release procedure to produce correct tester and nightly build version precedence On every startup, the Arduino IDE checks for new versions of the IDE. If a newer version is available, a notification/dialog is shown offering an update. "Newer" is determined by comparing the version of the user's IDE to the latest available version on the update channel. This comparison is done according to the Semantic Versioning Specification ("SemVer"). In order to facilitate beta testing, builds are generated of the Arduino IDE at the current stage in development. These builds are given an identifying version of the following form: - -snapshot- - builds generated for every push and pull request that modifies relevant files - -nightly- - daily builds of the tip of the default branch The previous release procedure caused the component of these to be the version of the most recent release. During the pre-release phase of the project development, all releases had a pre-release suffix (e.g., 2.0.0-rc9.4). Appending the "snapshot" or "nightly" suffix to that pre-release version caused these builds to have the correct precedence (e.g., 2.0.0-rc9.2.snapshot-20cc34c > 2.0.0-rc9.2). This situation has changed now that the project is using production release versions (e.g., 2.0.0-nightly-20220915 < 2.0.0). This caused users of "snapshot" or "nightly" builds to be presented with a spurious update notification on startup. The solution is to add a step to the end of the release procedure to do a minor bump of the version metadata after creating the release tag. This means that the metadata bump traditionally done before the creation of the release tag will already have been done in advance for patch releases. However, it will still need to be done for minor or major releases. The release procedure documentation is hereby updated to produce correct tester and nightly build version precedence. The metadata bump step is moved from before to after the tag creation step, replaced by a new step to verify the version before the tag creation, updating it in the event it is not a patch release. Both those steps may require updating the metadata. As an alternative to maintaining duplicate copies, each step links to a single copy of the fairly complex instructions for doing so. The structure of the document is adjusted to accomodate this, by placing the steps of the procedure under a "Steps" section and creating a new "Operations" section to contain any such shared content. --- docs/internal/release-procedure.md | 69 ++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/docs/internal/release-procedure.md b/docs/internal/release-procedure.md index ee5b3cdf1..12afe0e26 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -1,6 +1,10 @@ # Release Procedure -## 1. 🗺️ Merge localization sync PR +## Steps + +The following are the steps to follow to make a release of Arduino IDE: + +### 1. 🗺️ Merge localization sync PR A pull request titled "**Update translation files**" is submitted periodically by the "**github-actions**" bot to pull in the localization data from [**Transifex**](https://www.transifex.com/arduino-1/ide2/dashboard/). @@ -10,26 +14,24 @@ It will be shown in these search results: https://github.com/arduino/arduino-ide/pulls/app%2Fgithub-actions -## 2. ⚙ Update metadata of packages +### 2. 👀 Check version of packages -You need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. +The [`version` field](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#version) of the project's `package.json` metadata files received a patch version bump (e.g., `2.0.1` -> `2.0.2`) at the time of the previous release. -To do so, you can make use of the `update:version` script. +If this is a patch release, the current metadata values are correct and no action is needed. -For example, if you want to release the version ``, you should run the following commands: +The changes contained in this release might be considered to change the project's "API". If so, a patch version bump will not be appropriate and the version must be adjusted in compliance with the [**Semantic Versioning Specification**](https://semver.org/). -```text -git checkout main -git pull -git checkout -b version- -yarn update:version -git commit -am -git push origin version- -``` +Follow the instructions for updating the version metadata [**here**](#update-version-metadata). + +#### Examples + +If the version number of the previous release was `2.0.1`: -replacing `` with the version you want to release. Then create a PR and merge it. +- 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`. -## 3. 🚢 Create the release on GitHub +### 3. 🚢 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). @@ -44,7 +46,13 @@ 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. -## 4. 📄 Create the changelog +### 4. ⬆️ 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). + +### 5. 📄 Create the changelog **Create GitHub issues for the known issues** that we haven't solved in the current release: @@ -63,7 +71,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. -## 5. ✎ Update the "**Software**" Page +### 6. ✎ 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. @@ -80,7 +88,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 -## 6. 😎 Brag about it +### 7. 😎 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).
@@ -99,3 +107,28 @@ https://www.arduino.cc/en/software#future-version-of-the-arduino-ide > > To see the details, you can take a look at the [Changelog](https://github.com/arduino/arduino-ide/releases/tag/2.0.0-beta.12) > If you want to post about it on social media and you need more details feel free to ask us on #team_tooling! :wink: + +## Operations + +The following are detailed descriptions of operations performed during the release process: + + + +### ⚙ Update version metadata of packages + +You need to **set the new version in all the `package.json` files** across the app (`./package.json`, `./arduino-ide-extension/package.json`, and `./electron-app/package.json`), create a PR, and merge it on the `main` branch. + +To do so, you can make use of the `update:version` script. + +For example, if you want to update the version to ``, you should run the following commands: + +```text +git checkout main +git pull +git checkout -b version- +yarn update:version +git commit -am +git push origin version- +``` + +replacing `` with the version you want. Then create a PR and merge it. From 6416c431c6b6b8b7098fa83ba8e48c5b1594aeeb Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 24 Sep 2022 17:49:04 -0700 Subject: [PATCH 028/384] Bump version metadata to produce correct tester and nightly build precedence On every startup, the Arduino IDE checks for new versions of the IDE. If a newer version is available, a notification/dialog is shown offering an update. "Newer" is determined by comparing the version of the user's IDE to the latest available version on the update channel. This comparison is done according to the Semantic Versioning Specification ("SemVer"). In order to facilitate beta testing, builds are generated of the Arduino IDE at the current stage in development. These builds are given an identifying version of the following form: - -snapshot- - builds generated for every push and pull request that modifies relevant files - -nightly- - daily builds of the tip of the default branch The previous release procedure caused the component of these to be the version of the most recent release. During the pre-release phase of the project development, all releases had a pre-release suffix (e.g., 2.0.0-rc9.4). Appending the "snapshot" or "nightly" suffix to that pre-release version caused these builds to have the correct precedence (e.g., 2.0.0-rc9.2.snapshot-20cc34c > 2.0.0-rc9.2). This situation has changed now that the project is using production release versions (e.g., 2.0.0-nightly-20220915 < 2.0.0). This caused users of "snapshot" or "nightly" builds to be presented with a spurious update notification on startup. The solution is to do a minor bump of the version metadata after creating the release tag. That was not done immediately following the 2.0.0 release. The omission is hereby corrected. This will provide the metadata bump traditionally done before the creation of the release tag in the event the version number of the next release is 2.0.1. In case it is instead a minor or major release, the version metadata will need to be updated once more before the release tag is created. --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index ac951c619..90f97bfa0 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.0.0", + "version": "2.0.1", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index c2e71bc24..1e26d5c74 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.0.0", + "version": "2.0.1", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "1.25.0", "@theia/terminal": "1.25.0", "@theia/workspace": "1.25.0", - "arduino-ide-extension": "2.0.0" + "arduino-ide-extension": "2.0.1" }, "devDependencies": { "@theia/cli": "1.25.0", diff --git a/package.json b/package.json index 92b49adfe..7e31aaf44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.0.0", + "version": "2.0.1", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From a4ab204400680fa3c6ec75d7751a9db0ed98ebfc Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 24 Sep 2022 18:03:48 -0700 Subject: [PATCH 029/384] Correct issue report guide link in issue template chooser Contributor are presented with an issue template chooser page at the start of the issue creation process. In addition to the issue report templates, some "contact links" provide information and links to other communication channels. In order to encourage high quality issues, a link to the "issue report guide" is included on this page. Previously that link pointed to an incorrect URL, resulting in a 404 error for those who visited it. The URL is hereby corrected. --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index e87427856..7c038ddf4 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -9,7 +9,7 @@ contact_links: url: https://forum.arduino.cc/ about: We can help you out on the Arduino Forum! - name: Issue report guide - url: https://github.com/arduino/arduino-ide/blob/main/docs/issues.md#issue-report-guide + url: https://github.com/arduino/arduino-ide/blob/main/docs/contributor-guide/issues.md#issue-report-guide about: Learn about submitting issue reports to this repository. - name: Contributor guide url: https://github.com/arduino/arduino-ide/blob/main/docs/CONTRIBUTING.md#contributor-guide From 5eb2926407b5071d91bd5d614de9d80681dd9c55 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sat, 24 Sep 2022 23:49:50 -0700 Subject: [PATCH 030/384] Add a dedicated translator guide document Translation of the strings of the Arduino IDE UI is a valuable contribution which helps to make Arduino accessible to everyone around the world. Localization of the Arduino-specific strings of the IDE is done in the "Arduino IDE 2.0" project on Transifex. Previously, the "Translation" row in the contribution methods summary table in the contributor guide entry page simply linked to that project. Arduino IDE also uses localized strings from several other sources: - VS Code language packs - Arduino CLI Users may notice unlocalized strings or errors or areas for improvement in the existing translations and wish to contribute translations. For this reason, it is important to also provide instructions for contributing to those other localization data sources. The contribution methods summary table can not effectively accommodate that additional content so a dedicated document is added for the purpose. This will also allow linking directly to that document from related documentation or conversations. --- docs/CONTRIBUTING.md | 4 ++-- docs/contributor-guide/translation.md | 33 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 docs/contributor-guide/translation.md diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 72e6a6e36..a1ca9e0c8 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -11,14 +11,14 @@ There are several ways you can get involved: | - Support
- Question
- Discussion | Post on the [**Arduino Forum**][forum] | | - Bug report
- Feature request | Issue report (see the guide [**here**][issues]) | | Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) | -| Translation | [Transifex project][translate] | +| Translation | See the guide [**here**][translate] | | - Bug fix
- Enhancement | Pull request (see the guide [**here**][prs]) | | Monetary | - [Donate][donate]
- [Sponsor][sponsor]
- [Buy official products][store] | [forum]: https://forum.arduino.cc [issues]: contributor-guide/issues.md#issue-report-guide [beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide -[translate]: https://www.transifex.com/arduino-1/ide2/dashboard/ +[translate]: contributor-guide/translation.md#translator-guide [prs]: contributor-guide/pull-requests.md#pull-request-guide [donate]: https://www.arduino.cc/en/donate/ [sponsor]: https://github.com/sponsors/arduino diff --git a/docs/contributor-guide/translation.md b/docs/contributor-guide/translation.md new file mode 100644 index 000000000..4b8b82400 --- /dev/null +++ b/docs/contributor-guide/translation.md @@ -0,0 +1,33 @@ +# Translator Guide + +The text of the Arduino IDE interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users). + +Translating text and improving on existing translations is a valuable contribution to the project, helping make Arduino accessible to everyone. + +The translations for the text found in the Arduino IDE come from several sources: + +## Arduino IDE Text + +Translations of Arduino IDE's text is done in the "**Arduino IDE 2.0**" project on the **Transifex** localization platform: + +https://explore.transifex.com/arduino-1/ide2/ + +## Base Application Text + +Arduino IDE leverages the localization data available for the [**VS Code**](https://code.visualstudio.com/) editor to localize shared UI text. This reduces the translation work required to add a new language to the text specific to the Arduino IDE project. + +For this reason, some of Arduino IDE's text is not found in the **Transifex** project. Suggestions for corrections or improvement to this text are made by submitting an issue to the `microsoft/vscode-loc` GitHub repository. + +Before submitting an issue, please check the existing issues to make sure it wasn't already reported:
+https://github.com/microsoft/vscode-loc/issues + +After that, submit an issue here:
+https://github.com/microsoft/vscode-loc/issues/new + +## Arduino CLI Text + +The [**Arduino CLI**](https://arduino.github.io/arduino-cli/latest/) tool handles non-GUI operations for the Arduino IDE. Some of the text printed in the "**Output**" panel and in notifications originates from **Arduino CLI**. + +Translations of Arduino CLI's text is done in the "**Arduino CLI**" Transifex project: + +https://explore.transifex.com/arduino-1/arduino-cli/ From 8380c8202824fc7b673c0b8ac20503cc7eb0efe2 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 25 Sep 2022 00:02:00 -0700 Subject: [PATCH 031/384] Add readme for localization data Arduino IDE has been translated to several languages. The localization process follows the following steps: 1. An English language source string is defined in the Arduino IDE codebase 2. The source string is pushed to Transifex 3. Community translators localize the string 4. The localization data is pulled into the Arduino IDE repository 5. The localization data is incorporated into the Arduino IDE distribution Experience with maintenance of Arduino's localized projects indicates that the data files generated at step (4) can appear to be the appropriate place to make edits for casual contributors not familiar with the project's sophisticated internationalization infrastructure. Since those files are generated by automated systems, any edits made there would only be overwritten, so it is important to clearly communicate the correct way to make enhancements or corrections to these strings. This is accomplished by a local readme file most likely to be seen by those working in the folder containing these files, which supplements the existing information about translation in the project's translation guide. --- i18n/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 i18n/README.md diff --git a/i18n/README.md b/i18n/README.md new file mode 100644 index 000000000..b169b3dde --- /dev/null +++ b/i18n/README.md @@ -0,0 +1,11 @@ +# Localization Data + +This folder contains the [localization](https://en.wikipedia.org/wiki/Internationalization_and_localization) data for Arduino IDE. + +❗ These files are automatically generated and so can not be edited directly. If you wish to modify the contents, do it at the source: + +- **en.json** - edit the string in [the source code](../arduino-ide-extension/src) +- **All other files** - the localization is done on **Transifex**:
+ https://explore.transifex.com/arduino-1/ide2/ + +For more information on translating Arduino IDE, see [the **Translator Guide**](../docs/contributor-guide/translation.md). From 96cf09d5948f60849b6aba61301a65f66a6a772f Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Mon, 26 Sep 2022 17:39:19 +0200 Subject: [PATCH 032/384] Initialise the IDE updater even when 'checkForUpdates' preference is false (#1490) --- .../browser/contributions/check-for-ide-updates.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts index 14ba623bf..ab5f62ac2 100644 --- a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts +++ b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts @@ -37,16 +37,17 @@ export class CheckForIDEUpdates extends Contribution { } override onReady(): void { - const checkForUpdates = this.preferences['arduino.checkForUpdates']; - if (!checkForUpdates) { - return; - } this.updater .init( this.preferences.get('arduino.ide.updateChannel'), this.preferences.get('arduino.ide.updateBaseUrl') ) - .then(() => this.updater.checkForUpdates(true)) + .then(() => { + if (!this.preferences['arduino.checkForUpdates']) { + return; + } + return this.updater.checkForUpdates(true); + }) .then(async (updateInfo) => { if (!updateInfo) return; const versionToSkip = await this.localStorage.getData( From 9ac2638335a2a54e6191bf4e9847743e5d6d8074 Mon Sep 17 00:00:00 2001 From: r3inbowari Date: Wed, 21 Sep 2022 23:05:59 +0800 Subject: [PATCH 033/384] Avoid intellisense widgets being covered by the bottom panel --- arduino-ide-extension/src/browser/style/main.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 40cae2a31..659c3ea38 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -2,6 +2,12 @@ background: var(--theia-editorGroupHeader-tabsBackground); } +/* Negative values to lower the priority in order to avoid the problem that +   the Intellisense widget may be cover by the bottom panel partially. */ +#theia-bottom-content-panel { + z-index: -1; +} + .p-TabBar-toolbar .item.arduino-tool-item { margin-left: 0; } From d6cb23f78242a59a544ee8e65e22f545f488aa43 Mon Sep 17 00:00:00 2001 From: r3inbowari Date: Thu, 22 Sep 2022 18:43:08 +0800 Subject: [PATCH 034/384] fix splitHandle above widget --- arduino-ide-extension/src/browser/style/main.css | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 659c3ea38..ede6c726c 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -2,10 +2,14 @@ background: var(--theia-editorGroupHeader-tabsBackground); } -/* Negative values to lower the priority in order to avoid the problem that -   the Intellisense widget may be cover by the bottom panel partially. */ -#theia-bottom-content-panel { - z-index: -1; +/* Avoid the Intellisense widget may be cover by the bottom panel partially. + TODO: This issue may be resolved after monaco-editor upgrade */ +#theia-main-content-panel { + z-index: auto +} + +#theia-main-content-panel div[id^="code-editor-opener"] { + z-index: auto; } .p-TabBar-toolbar .item.arduino-tool-item { From 6f077173693cdfd1ed2a65a5754f05b4fcca8ac6 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 29 Sep 2022 15:16:28 +0200 Subject: [PATCH 035/384] Dialog focus (#1472) * focus on dialog controls when is open * fix "Configure and Upload" label * fix focus on user fields --- .../src/browser/boards/boards-service-provider.ts | 4 ++-- .../src/browser/contributions/upload-sketch.ts | 2 +- .../src/browser/contributions/user-fields.ts | 11 +++++------ .../certificate-uploader-dialog.tsx | 3 +++ .../firmware-uploader/firmware-uploader-dialog.tsx | 2 ++ .../dialogs/user-fields/user-fields-component.tsx | 8 ++++++-- .../dialogs/user-fields/user-fields-dialog.tsx | 4 ++-- i18n/en.json | 2 +- 8 files changed, 22 insertions(+), 14 deletions(-) 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 8097e45c6..7f5f6b923 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -600,7 +600,7 @@ export class BoardsServiceProvider boardsConfig.selectedBoard && availableBoards.every(({ selected }) => !selected) ) { - let port = boardsConfig.selectedPort + 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. @@ -611,7 +611,7 @@ export class BoardsServiceProvider // 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 + port = availableBoards[found].port; availableBoards.splice(found, 1); } availableBoards.push({ diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index f337fb1d7..2868d341c 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -229,7 +229,7 @@ export namespace UploadSketch { id: 'arduino-upload-with-configuration-sketch', label: nls.localize( 'arduino/sketch/configureAndUpload', - 'Configure And Upload' + 'Configure and Upload' ), category: 'Arduino', }; diff --git a/arduino-ide-extension/src/browser/contributions/user-fields.ts b/arduino-ide-extension/src/browser/contributions/user-fields.ts index c73ead9e6..445fdc480 100644 --- a/arduino-ide-extension/src/browser/contributions/user-fields.ts +++ b/arduino-ide-extension/src/browser/contributions/user-fields.ts @@ -58,7 +58,7 @@ export class UserFields extends Contribution { } } - private selectedFqbnAddress(): string | undefined { + private selectedFqbnAddress(): string | undefined { const { boardsConfig } = this.boardsServiceProvider; const fqbn = boardsConfig.selectedBoard?.fqbn; if (!fqbn) { @@ -78,7 +78,9 @@ export class UserFields extends Contribution { ): Promise { const cached = this.cachedUserFields.get(key); // Deep clone the array of board fields to avoid editing the cached ones - this.userFieldsDialog.value = cached ? cached.slice() : await this.boardsServiceProvider.selectedBoardUserFields(); + this.userFieldsDialog.value = cached + ? cached.slice() + : await this.boardsServiceProvider.selectedBoardUserFields(); const result = await this.userFieldsDialog.open(); if (!result) { return; @@ -140,10 +142,7 @@ export class UserFields extends Contribution { } notifyFailedWithError(e: Error): void { - if ( - this.boardRequiresUserFields && - CoreError.UploadFailed.is(e) - ) { + if (this.boardRequiresUserFields && CoreError.UploadFailed.is(e)) { this.userFieldsSet = false; } } diff --git a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx index 336a7b657..fa18fb6f2 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 @@ -171,6 +171,9 @@ export class UploadCertificateDialog extends AbstractDialog { Widget.detach(this.widget); } Widget.attach(this.widget, this.contentNode); + const firstButton = this.widget.node.querySelector('button'); + firstButton?.focus(); + this.widget.busyCallback = this.busyCallback.bind(this); super.onAfterAttach(msg); this.update(); diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx index 6273d321f..448bbf0e4 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx @@ -115,6 +115,8 @@ export class UploadFirmwareDialog extends AbstractDialog { Widget.detach(this.widget); } Widget.attach(this.widget, this.contentNode); + const firstButton = this.widget.node.querySelector('button'); + firstButton?.focus(); this.widget.busyCallback = this.busyCallback.bind(this); super.onAfterAttach(msg); this.update(); diff --git a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx index ae8797fca..f9d75e3e3 100644 --- a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx @@ -16,9 +16,9 @@ export const UserFieldsComponent = ({ const [boardUserFields, setBoardUserFields] = React.useState< BoardUserField[] >(initialBoardUserFields); - const [uploadButtonDisabled, setUploadButtonDisabled] = React.useState(true); + const firstInputElement = React.useRef(null); React.useEffect(() => { setBoardUserFields(initialBoardUserFields); @@ -48,7 +48,10 @@ export const UserFieldsComponent = ({ React.useEffect(() => { updateUserFields(boardUserFields); setUploadButtonDisabled(!allFieldsHaveValues(boardUserFields)); - }, [boardUserFields]); + if (firstInputElement.current) { + firstInputElement.current.focus(); + } + }, [boardUserFields, updateUserFields]); return (
@@ -71,6 +74,7 @@ export const UserFieldsComponent = ({ field.label )} onChange={updateUserField(index)} + ref={index === 0 ? firstInputElement : undefined} />
diff --git a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx index 8835fd355..b95ef21cf 100644 --- a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx @@ -13,7 +13,7 @@ import { BoardUserField } from '../../../common/protocol'; @injectable() export class UserFieldsDialogWidget extends ReactWidget { - protected _currentUserFields: BoardUserField[] = []; + private _currentUserFields: BoardUserField[] = []; constructor(private cancel: () => void, private accept: () => Promise) { super(); @@ -34,7 +34,7 @@ export class UserFieldsDialogWidget extends ReactWidget { }); } - protected setUserFields(userFields: BoardUserField[]): void { + private setUserFields(userFields: BoardUserField[]): void { this._currentUserFields = userFields; } diff --git a/i18n/en.json b/i18n/en.json index 4db465ba8..3602c0d87 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -376,7 +376,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", From 32b70efd5ca1379bd65ee4fc8f01ee77db2342b0 Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 30 Sep 2022 02:28:09 -0700 Subject: [PATCH 036/384] Correct text of "INSTALLED" label in Library/Boards Manager An "INSTALLED" label is shown on the items in the Library Manager and Boards Manager views that are currently installed on the user's system. During some work to add missing internationalization to the UI strings, this text was changed to "INSTALL". That text is not appropriate for what this label is intended to communicate. The regression is hereby corrected, while retaining the internationalization of the string. --- .../src/browser/widgets/component-list/list-item-renderer.tsx | 2 +- i18n/en.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 ea9e257ec..2999cc05a 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 @@ -59,7 +59,7 @@ export class ListItemRenderer { className="installed" onClick={onClickUninstall} {...{ - install: nls.localize('arduino/component/install', 'INSTALL'), + install: nls.localize('arduino/component/installed', 'INSTALLED'), uninstall: nls.localize('arduino/component/uninstall', 'Uninstall'), }} /> diff --git a/i18n/en.json b/i18n/en.json index 3602c0d87..c2dfd1e07 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -145,6 +145,7 @@ "by": "by", "filterSearch": "Filter your search...", "install": "INSTALL", + "installed": "INSTALLED", "moreInfo": "More info", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", From da22f1ed11826f4a153c8b638f453bc0fc93cb30 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 16 Aug 2022 13:37:31 +0200 Subject: [PATCH 037/384] Refresh menus when opening example/recent fails. Closes #53 Signed-off-by: Akos Kitta --- .../src/browser/contributions/examples.ts | 90 ++++- .../src/browser/contributions/new-sketch.ts | 9 - .../contributions/open-recent-sketch.ts | 40 ++- .../src/browser/contributions/open-sketch.ts | 151 +++----- .../src/browser/contributions/save-sketch.ts | 10 - .../src/browser/contributions/sketchbook.ts | 51 +-- .../src/browser/theia/core/about-dialog.ts | 2 - .../src/common/protocol/core-service.ts | 4 + .../src/common/protocol/sketches-service.ts | 57 ++- .../src/node/arduino-ide-backend-module.ts | 1 + .../src/node/config-service-impl.ts | 2 - .../src/node/core-client-provider.ts | 9 + .../src/node/examples-service-impl.ts | 13 +- .../src/node/sketches-service-impl.ts | 332 ++++++++++-------- 14 files changed, 390 insertions(+), 381 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index d7185178b..1f818a217 100644 --- a/arduino-ide-extension/src/browser/contributions/examples.ts +++ b/arduino-ide-extension/src/browser/contributions/examples.ts @@ -21,16 +21,23 @@ import { MenuModelRegistry, } from './contribution'; import { NotificationCenter } from '../notification-center'; -import { Board, SketchRef, SketchContainer } from '../../common/protocol'; +import { + Board, + SketchRef, + SketchContainer, + SketchesError, + Sketch, + CoreService, +} from '../../common/protocol'; import { nls } from '@theia/core/lib/common'; @injectable() export abstract class Examples extends SketchContribution { @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; + private readonly commandRegistry: CommandRegistry; @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; + private readonly menuRegistry: MenuModelRegistry; @inject(MainMenuManager) protected readonly menuManager: MainMenuManager; @@ -38,6 +45,9 @@ export abstract class Examples extends SketchContribution { @inject(ExamplesService) protected readonly examplesService: ExamplesService; + @inject(CoreService) + protected readonly coreService: CoreService; + @inject(BoardsServiceProvider) protected readonly boardsServiceClient: BoardsServiceProvider; @@ -50,10 +60,16 @@ export abstract class Examples extends SketchContribution { ); } + // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars protected handleBoardChanged(board: Board | undefined): void { // NOOP } + protected abstract update(options?: { + board?: Board | 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. @@ -149,23 +165,54 @@ export abstract class Examples extends SketchContribution { protected createHandler(uri: string): CommandHandler { return { execute: async () => { - const sketch = await this.sketchService.cloneExample(uri); - return this.commandService.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch - ); + const sketch = await this.clone(uri); + if (sketch) { + try { + return this.commandService.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + sketch + ); + } catch (err) { + if (SketchesError.NotFound.is(err)) { + // Do not toast the error message. It's handled by the `Open Sketch` command. + this.update({ + board: this.boardsServiceClient.boardsConfig.selectedBoard, + forceRefresh: true, + }); + } else { + throw err; + } + } + } }, }; } + + private async clone(uri: string): Promise { + try { + const sketch = await this.sketchService.cloneExample(uri); + return sketch; + } catch (err) { + if (SketchesError.NotFound.is(err)) { + this.messageService.error(err.message); + this.update({ + board: this.boardsServiceClient.boardsConfig.selectedBoard, + forceRefresh: true, + }); + } else { + throw err; + } + } + } } @injectable() export class BuiltInExamples extends Examples { override async onReady(): Promise { - this.register(); // no `await` + this.update(); // no `await` } - protected async register(): Promise { + protected override async update(): Promise { let sketchContainers: SketchContainer[] | undefined; try { sketchContainers = await this.examplesService.builtIns(); @@ -197,29 +244,34 @@ export class BuiltInExamples extends Examples { @injectable() export class LibraryExamples extends Examples { @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly notificationCenter: NotificationCenter; - protected readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); + private readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); override onStart(): void { - this.notificationCenter.onLibraryDidInstall(() => this.register()); - this.notificationCenter.onLibraryDidUninstall(() => this.register()); + this.notificationCenter.onLibraryDidInstall(() => this.update()); + this.notificationCenter.onLibraryDidUninstall(() => this.update()); } override async onReady(): Promise { - this.register(); // no `await` + this.update(); // no `await` } protected override handleBoardChanged(board: Board | undefined): void { - this.register(board); + this.update({ board }); } - protected async register( - board: Board | undefined = this.boardsServiceClient.boardsConfig - .selectedBoard + protected override async update( + options: { board?: Board; forceRefresh?: boolean } = { + board: this.boardsServiceClient.boardsConfig.selectedBoard, + } ): Promise { + const { board, forceRefresh } = options; return this.queue.add(async () => { this.toDispose.dispose(); + if (forceRefresh) { + await this.coreService.refresh(); + } const fqbn = board?.fqbn; const name = board?.name; // Shows all examples when no board is selected, or the platform of the currently selected board is not installed. diff --git a/arduino-ide-extension/src/browser/contributions/new-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-sketch.ts index c43e15505..bebc67767 100644 --- a/arduino-ide-extension/src/browser/contributions/new-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/new-sketch.ts @@ -1,7 +1,6 @@ import { nls } from '@theia/core/lib/common'; import { injectable } from '@theia/core/shared/inversify'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { SketchContribution, URI, @@ -17,11 +16,6 @@ export class NewSketch extends SketchContribution { registry.registerCommand(NewSketch.Commands.NEW_SKETCH, { execute: () => this.newSketch(), }); - registry.registerCommand(NewSketch.Commands.NEW_SKETCH__TOOLBAR, { - isVisible: (widget) => - ArduinoToolbar.is(widget) && widget.side === 'left', - execute: () => registry.executeCommand(NewSketch.Commands.NEW_SKETCH.id), - }); } override registerMenus(registry: MenuModelRegistry): void { @@ -54,8 +48,5 @@ export namespace NewSketch { export const NEW_SKETCH: Command = { id: 'arduino-new-sketch', }; - export const NEW_SKETCH__TOOLBAR: Command = { - id: 'arduino-new-sketch--toolbar', - }; } } diff --git a/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts index 1c1f384ac..21232f055 100644 --- a/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-recent-sketch.ts @@ -15,6 +15,7 @@ import { MainMenuManager } from '../../common/main-menu-manager'; import { OpenSketch } from './open-sketch'; import { NotificationCenter } from '../notification-center'; import { nls } from '@theia/core/lib/common'; +import { SketchesError } from '../../common/protocol'; @injectable() export class OpenRecentSketch extends SketchContribution { @@ -33,7 +34,7 @@ export class OpenRecentSketch extends SketchContribution { @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; - protected toDisposeBeforeRegister = new Map(); + protected toDispose = new DisposableCollection(); override onStart(): void { this.notificationCenter.onRecentSketchesDidChange(({ sketches }) => @@ -42,8 +43,12 @@ export class OpenRecentSketch extends SketchContribution { } override async onReady(): Promise { + this.update(); + } + + private update(forceUpdate?: boolean): void { this.sketchService - .recentlyOpenedSketches() + .recentlyOpenedSketches(forceUpdate) .then((sketches) => this.refreshMenu(sketches)); } @@ -62,19 +67,25 @@ export class OpenRecentSketch extends SketchContribution { protected register(sketches: Sketch[]): void { const order = 0; + this.toDispose.dispose(); for (const sketch of sketches) { const { uri } = sketch; - const toDispose = this.toDisposeBeforeRegister.get(uri); - if (toDispose) { - toDispose.dispose(); - } const command = { id: `arduino-open-recent--${uri}` }; const handler = { - execute: () => - this.commandRegistry.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch - ), + execute: async () => { + try { + await this.commandRegistry.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + sketch + ); + } catch (err) { + if (SketchesError.NotFound.is(err)) { + this.update(true); + } else { + throw err; + } + } + }, }; this.commandRegistry.registerCommand(command, handler); this.menuRegistry.registerMenuAction( @@ -85,8 +96,7 @@ export class OpenRecentSketch extends SketchContribution { order: String(order), } ); - this.toDisposeBeforeRegister.set( - sketch.uri, + this.toDispose.pushAll([ new DisposableCollection( Disposable.create(() => this.commandRegistry.unregisterCommand(command) @@ -94,8 +104,8 @@ export class OpenRecentSketch extends SketchContribution { Disposable.create(() => this.menuRegistry.unregisterMenuAction(command) ) - ) - ); + ), + ]); } } } diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-sketch.ts index 063b86a1e..5f50daae5 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch.ts @@ -1,115 +1,44 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { MaybePromise } from '@theia/core/lib/common/types'; -import { Widget, ContextMenuRenderer } from '@theia/core/lib/browser'; -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; +import { SketchesError, SketchRef } from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { - SketchContribution, - Sketch, - URI, Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, + Sketch, + SketchContribution, + URI, } from './contribution'; -import { ExamplesService } from '../../common/protocol/examples-service'; -import { BuiltInExamples } from './examples'; -import { Sketchbook } from './sketchbook'; -import { SketchContainer } from '../../common/protocol'; -import { nls } from '@theia/core/lib/common'; + +export type SketchLocation = string | URI | SketchRef; +export namespace SketchLocation { + export function toUri(location: SketchLocation): URI { + if (typeof location === 'string') { + return new URI(location); + } else if (SketchRef.is(location)) { + return toUri(location.uri); + } else { + return location; + } + } + export function is(arg: unknown): arg is SketchLocation { + return typeof arg === 'string' || arg instanceof URI || SketchRef.is(arg); + } +} @injectable() export class OpenSketch extends SketchContribution { - @inject(MenuModelRegistry) - private readonly menuRegistry: MenuModelRegistry; - - @inject(ContextMenuRenderer) - private readonly contextMenuRenderer: ContextMenuRenderer; - - @inject(BuiltInExamples) - private readonly builtInExamples: BuiltInExamples; - - @inject(ExamplesService) - private readonly examplesService: ExamplesService; - - @inject(Sketchbook) - private readonly sketchbook: Sketchbook; - - private readonly toDispose = new DisposableCollection(); - override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketch.Commands.OPEN_SKETCH, { - execute: (arg) => - Sketch.is(arg) ? this.openSketch(arg) : this.openSketch(), - }); - registry.registerCommand(OpenSketch.Commands.OPEN_SKETCH__TOOLBAR, { - isVisible: (widget) => - ArduinoToolbar.is(widget) && widget.side === 'left', - execute: async (_: Widget, target: EventTarget) => { - const container = await this.sketchService.getSketches({ - exclude: ['**/hardware/**'], - }); - if (SketchContainer.isEmpty(container)) { - this.openSketch(); - } else { - this.toDispose.dispose(); - if (!(target instanceof HTMLElement)) { - return; - } - const { parentElement } = target; - if (!parentElement) { - return; - } - - this.menuRegistry.registerMenuAction( - ArduinoMenus.OPEN_SKETCH__CONTEXT__OPEN_GROUP, - { - commandId: OpenSketch.Commands.OPEN_SKETCH.id, - label: nls.localize( - 'vscode/workspaceActions/openFileFolder', - 'Open...' - ), - } - ); - this.toDispose.push( - Disposable.create(() => - this.menuRegistry.unregisterMenuAction( - OpenSketch.Commands.OPEN_SKETCH - ) - ) - ); - this.sketchbook.registerRecursively( - [...container.children, ...container.sketches], - ArduinoMenus.OPEN_SKETCH__CONTEXT__RECENT_GROUP, - this.toDispose - ); - try { - const containers = await this.examplesService.builtIns(); - for (const container of containers) { - this.builtInExamples.registerRecursively( - container, - ArduinoMenus.OPEN_SKETCH__CONTEXT__EXAMPLES_GROUP, - this.toDispose - ); - } - } catch (e) { - console.error('Error when collecting built-in examples.', e); - } - const options = { - menuPath: ArduinoMenus.OPEN_SKETCH__CONTEXT, - anchor: { - x: parentElement.getBoundingClientRect().left, - y: - parentElement.getBoundingClientRect().top + - parentElement.offsetHeight, - }, - }; - this.contextMenuRenderer.render(options); + execute: async (arg) => { + const toOpen = !SketchLocation.is(arg) + ? await this.selectSketch() + : arg; + if (toOpen) { + return this.openSketch(toOpen); } }, }); @@ -130,13 +59,20 @@ export class OpenSketch extends SketchContribution { }); } - private async openSketch( - toOpen: MaybePromise = this.selectSketch() - ): Promise { - const sketch = await toOpen; - if (sketch) { - this.workspaceService.open(new URI(sketch.uri)); + private async openSketch(toOpen: SketchLocation | undefined): Promise { + if (!toOpen) { + return; } + const uri = SketchLocation.toUri(toOpen); + try { + await this.sketchService.loadSketch(uri.toString()); + } catch (err) { + if (SketchesError.NotFound.is(err)) { + this.messageService.error(err.message); + } + throw err; + } + this.workspaceService.open(uri); } private async selectSketch(): Promise { @@ -220,8 +156,5 @@ export namespace OpenSketch { export const OPEN_SKETCH: Command = { id: 'arduino-open-sketch', }; - export const OPEN_SKETCH__TOOLBAR: Command = { - id: 'arduino-open-sketch--toolbar', - }; } } diff --git a/arduino-ide-extension/src/browser/contributions/save-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-sketch.ts index dce6405c3..62a6b0f86 100644 --- a/arduino-ide-extension/src/browser/contributions/save-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-sketch.ts @@ -1,7 +1,6 @@ import { injectable } from '@theia/core/shared/inversify'; import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { SaveAsSketch } from './save-as-sketch'; import { SketchContribution, @@ -19,12 +18,6 @@ export class SaveSketch extends SketchContribution { registry.registerCommand(SaveSketch.Commands.SAVE_SKETCH, { execute: () => this.saveSketch(), }); - registry.registerCommand(SaveSketch.Commands.SAVE_SKETCH__TOOLBAR, { - isVisible: (widget) => - ArduinoToolbar.is(widget) && widget.side === 'left', - execute: () => - registry.executeCommand(SaveSketch.Commands.SAVE_SKETCH.id), - }); } override registerMenus(registry: MenuModelRegistry): void { @@ -68,8 +61,5 @@ export namespace SaveSketch { export const SAVE_SKETCH: Command = { id: 'arduino-save-sketch', }; - export const SAVE_SKETCH__TOOLBAR: Command = { - id: 'arduino-save-sketch--toolbar', - }; } } diff --git a/arduino-ide-extension/src/browser/contributions/sketchbook.ts b/arduino-ide-extension/src/browser/contributions/sketchbook.ts index fdac918b7..8c01cd46a 100644 --- a/arduino-ide-extension/src/browser/contributions/sketchbook.ts +++ b/arduino-ide-extension/src/browser/contributions/sketchbook.ts @@ -1,32 +1,14 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +import { injectable } from '@theia/core/shared/inversify'; import { CommandHandler } from '@theia/core/lib/common/command'; -import { CommandRegistry, MenuModelRegistry } from './contribution'; +import { MenuModelRegistry } from './contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { MainMenuManager } from '../../common/main-menu-manager'; -import { NotificationCenter } from '../notification-center'; import { Examples } from './examples'; -import { - SketchContainer, - SketchesError, - SketchRef, -} from '../../common/protocol'; +import { SketchContainer, SketchesError } from '../../common/protocol'; import { OpenSketch } from './open-sketch'; -import { nls } from '@theia/core/lib/common'; +import { nls } from '@theia/core/lib/common/nls'; @injectable() export class Sketchbook extends Examples { - @inject(CommandRegistry) - protected override readonly commandRegistry: CommandRegistry; - - @inject(MenuModelRegistry) - protected override readonly menuRegistry: MenuModelRegistry; - - @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; - - @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; - override onStart(): void { this.sketchServiceClient.onSketchbookDidChange(() => this.update()); } @@ -35,10 +17,10 @@ export class Sketchbook extends Examples { this.update(); } - private update() { + protected override update(): void { this.sketchService.getSketches({}).then((container) => { this.register(container); - this.mainMenuManager.update(); + this.menuManager.update(); }); } @@ -50,7 +32,7 @@ export class Sketchbook extends Examples { ); } - protected register(container: SketchContainer): void { + private register(container: SketchContainer): void { this.toDispose.dispose(); this.registerRecursively( [...container.children, ...container.sketches], @@ -62,24 +44,19 @@ export class Sketchbook extends Examples { protected override createHandler(uri: string): CommandHandler { return { execute: async () => { - let sketch: SketchRef | undefined = undefined; try { - sketch = await this.sketchService.loadSketch(uri); + await this.commandService.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + uri + ); } catch (err) { if (SketchesError.NotFound.is(err)) { - // To handle the following: - // Open IDE2, delete a sketch from sketchbook, click on File > Sketchbook > the deleted sketch. - // Filesystem watcher misses out delete events on macOS; hence IDE2 has no chance to update the menu items. - this.messageService.error(err.message); + // Force update the menu items to remove the absent sketch. this.update(); + } else { + throw err; } } - if (sketch) { - await this.commandService.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch - ); - } }, }; } diff --git a/arduino-ide-extension/src/browser/theia/core/about-dialog.ts b/arduino-ide-extension/src/browser/theia/core/about-dialog.ts index 3e89c5105..d2b1ad0a9 100644 --- a/arduino-ide-extension/src/browser/theia/core/about-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/core/about-dialog.ts @@ -1,8 +1,6 @@ import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog'; -import { duration } from '../../../common/decorators'; export class AboutDialog extends TheiaAboutDialog { - @duration({ name: 'theia-about#init' }) protected override async init(): Promise { // NOOP // IDE2 has a custom about dialog, so it does not make sense to collect Theia extensions at startup time. diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index a4b63a604..81e5212a9 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -108,6 +108,10 @@ export interface CoreService { compile(options: CoreService.Options.Compile): Promise; upload(options: CoreService.Options.Upload): Promise; burnBootloader(options: CoreService.Options.Bootloader): Promise; + /** + * Refreshes the underling core gRPC client for the Arduino CLI. + */ + refresh(): Promise; } export namespace CoreService { diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index dbb7c2654..f1b8f7675 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -21,16 +21,9 @@ export const SketchesService = Symbol('SketchesService'); export interface SketchesService { /** * Resolves to a sketch container representing the hierarchical structure of the sketches. - * If `uri` is not given, `directories.user` will be user instead. Specify `exclude` global patterns to filter folders from the sketch container. - * If `exclude` is not set `['**\/libraries\/**', '**\/hardware\/**']` will be used instead. + * If `uri` is not given, `directories.user` will be user instead. */ - getSketches({ - uri, - exclude, - }: { - uri?: string; - exclude?: string[]; - }): Promise; + getSketches({ uri }: { uri?: string }): Promise; /** * This is the TS implementation of `SketchLoad` from the CLI and should be replaced with a gRPC call eventually. @@ -71,7 +64,7 @@ export interface SketchesService { copy(sketch: Sketch, options: { destinationUri: string }): Promise; /** - * Returns with the container sketch for the input `uri`. If the `uri` is not in a sketch folder, resolved `undefined`. + * Returns with the container sketch for the input `uri`. If the `uri` is not in a sketch folder, the promise resolves to `undefined`. */ getSketchFolder(uri: string): Promise; @@ -82,8 +75,10 @@ export interface SketchesService { /** * Resolves to an array of sketches in inverse chronological order. The newest is the first. + * If `forceUpdate` is `true`, the array of recently opened sketches will be recalculated. + * Invalid and missing sketches will be removed from the list. It's `false` by default. */ - recentlyOpenedSketches(): Promise; + recentlyOpenedSketches(forceUpdate?: boolean): Promise; /** * Archives the sketch, resolves to the archive URI. @@ -114,6 +109,19 @@ export namespace SketchRef { uri: typeof uriLike === 'string' ? uriLike : uriLike.toString(), }; } + export function is(arg: unknown): arg is SketchRef { + if (typeof arg === 'object') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const object = arg as any; + return ( + 'name' in object && + typeof object['name'] === 'string' && + 'uri' in object && + typeof object['name'] === 'string' + ); + } + return false; + } } export interface Sketch extends SketchRef { readonly mainFileUri: string; // `MainFile` @@ -122,14 +130,25 @@ export interface Sketch extends SketchRef { readonly rootFolderFileUris: string[]; // `RootFolderFiles` (does not include the main sketch file) } export namespace Sketch { - export function is(arg: any): arg is Sketch { - return ( - !!arg && - 'name' in arg && - 'uri' in arg && - typeof arg.name === 'string' && - typeof arg.uri === 'string' - ); + export function is(arg: unknown): arg is Sketch { + if (!SketchRef.is(arg)) { + return false; + } + if (typeof arg === 'object') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const object = arg as any; + return ( + 'mainFileUri' in object && + typeof object['mainFileUri'] === 'string' && + 'otherSketchFileUris' in object && + Array.isArray(object['otherSketchFileUris']) && + 'additionalFileUris' in object && + Array.isArray(object['additionalFileUris']) && + 'rootFolderFileUris' in object && + Array.isArray(object['rootFolderFileUris']) + ); + } + return false; } export namespace Extensions { export const MAIN = ['.ino', '.pde']; 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 b2486e478..33d21c0ff 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -332,6 +332,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { 'fwuploader', // Arduino Firmware uploader 'discovery-log', // Boards discovery 'config', // Logger for the CLI config reading and manipulation + 'sketches-service', // For creating, loading, and cloning sketches MonitorManagerName, // Logger for the monitor manager and its services MonitorServiceName, ].forEach((name) => bindChildLogger(bind, name)); diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index 904be5882..fa2e259c3 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -26,7 +26,6 @@ import { DefaultCliConfig, CLI_CONFIG } from './cli-config'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { deepClone } from '@theia/core'; -import { duration } from '../common/decorators'; const deepmerge = require('deepmerge'); @@ -129,7 +128,6 @@ export class ConfigServiceImpl return this.daemon.getVersion(); } - @duration() protected async loadCliConfig( initializeIfAbsent = true ): Promise { diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 9c2395de9..0bfd9766b 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -94,6 +94,11 @@ export class CoreClientProvider { return this.onClientDidRefreshEmitter.event; } + async refresh(): Promise { + const client = await this.client; + await this.initInstance(client); + } + /** * Encapsulates both the gRPC core client creation (`CreateRequest`) and initialization (`InitRequest`). */ @@ -415,6 +420,10 @@ export abstract class CoreClientAware { protected get onClientDidRefresh(): Event { return this.coreClientProvider.onClientDidRefresh; } + + refresh(): Promise { + return this.coreClientProvider.refresh(); + } } class IndexUpdateRequiredBeforeInitError extends Error { diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index 0028791a6..1bf43c470 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -11,14 +11,10 @@ import { SketchContainer, } from '../common/protocol/sketches-service'; import { ExamplesService } from '../common/protocol/examples-service'; -import { - LibraryLocation, - LibraryPackage, - LibraryService, -} from '../common/protocol'; -import { duration } from '../common/decorators'; +import { LibraryLocation, LibraryPackage } from '../common/protocol'; import { URI } from '@theia/core/lib/common/uri'; import { Path } from '@theia/core/lib/common/path'; +import { LibraryServiceImpl } from './library-service-impl'; interface BuiltInSketchRef { readonly name: string; @@ -84,8 +80,8 @@ export class BuiltInExamplesServiceImpl { @injectable() export class ExamplesServiceImpl implements ExamplesService { - @inject(LibraryService) - private readonly libraryService: LibraryService; + @inject(LibraryServiceImpl) + private readonly libraryService: LibraryServiceImpl; @inject(BuiltInExamplesServiceImpl) private readonly builtInExamplesService: BuiltInExamplesServiceImpl; @@ -94,7 +90,6 @@ export class ExamplesServiceImpl implements ExamplesService { return this.builtInExamplesService.builtIns(); } - @duration() async installed({ fqbn }: { fqbn?: string }): Promise<{ user: SketchContainer[]; current: SketchContainer[]; diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 0912d4733..06c7931b6 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -1,14 +1,15 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import * as fs from 'fs'; +import { injectable, inject, named } from '@theia/core/shared/inversify'; +import { promises as fs, realpath, lstat, Stats, constants, rm } 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 { ncp } from 'ncp'; -import { promisify } from 'util'; import URI from '@theia/core/lib/common/uri'; -import { FileUri } from '@theia/core/lib/node'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { FileUri } from '@theia/core/lib/node/file-uri'; import { ConfigServiceImpl } from './config-service-impl'; import { SketchesService, @@ -24,8 +25,6 @@ import { ArchiveSketchRequest, LoadSketchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; -import { duration } from '../common/decorators'; -import * as glob from 'glob'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { ServiceError } from './service-error'; import { @@ -34,6 +33,8 @@ import { TempSketchPrefix, } from './is-temp-sketch'; +const RecentSketches = 'recent-sketches.json'; + @injectable() export class SketchesServiceImpl extends CoreClientAware @@ -41,6 +42,15 @@ export class SketchesServiceImpl { private sketchSuffixIndex = 1; private lastSketchBaseName: string; + private recentSketches: SketchWithDetails[] | undefined; + private readonly markAsRecentSketchQueue = new PQueue({ + autoStart: true, + concurrency: 1, + }); + + @inject(ILogger) + @named('sketches-service') + private readonly logger: ILogger; @inject(ConfigServiceImpl) private readonly configService: ConfigServiceImpl; @@ -54,28 +64,7 @@ export class SketchesServiceImpl @inject(IsTempSketch) private readonly isTempSketch: IsTempSketch; - async getSketches({ - uri, - exclude, - }: { - uri?: string; - exclude?: string[]; - }): Promise { - const [/*old,*/ _new] = await Promise.all([ - // this.getSketchesOld({ uri, exclude }), - this.getSketchesNew({ uri, exclude }), - ]); - return _new; - } - - @duration() - async getSketchesNew({ - uri, - exclude, - }: { - uri?: string; - exclude?: string[]; - }): Promise { + async getSketches({ uri }: { uri?: string }): Promise { const root = await this.root(uri); const pathToAllSketchFiles = await new Promise( (resolve, reject) => { @@ -138,7 +127,7 @@ export class SketchesServiceImpl for (const pathToSketchFile of pathToAllSketchFiles) { const relative = path.relative(root, pathToSketchFile); if (!relative) { - console.warn( + this.logger.warn( `Could not determine relative sketch path from the root <${root}> to the sketch <${pathToSketchFile}>. Skipping. Relative path was: ${relative}` ); continue; @@ -146,7 +135,7 @@ export class SketchesServiceImpl const segments = relative.split(path.sep); if (segments.length < 2) { // folder name, and sketch name. - console.warn( + this.logger.warn( `Expected at least one segment relative path from the root <${root}> to the sketch <${pathToSketchFile}>. Skipping. Segments were: ${segments}.` ); continue; @@ -160,7 +149,7 @@ export class SketchesServiceImpl '' ); if (sketchFileExtension !== '.ino' && sketchFileExtension !== '.pde') { - console.warn( + this.logger.warn( `Mismatching sketch file <${sketchFilename}> and sketch folder name <${sketchName}>. Skipping` ); continue; @@ -169,7 +158,7 @@ export class SketchesServiceImpl if (child) { child.sketches.push({ name: sketchName, - uri: FileUri.create(pathToSketchFile).toString(), + uri: FileUri.create(path.dirname(pathToSketchFile)).toString(), }); } } @@ -191,8 +180,8 @@ export class SketchesServiceImpl const requestSketchPath = FileUri.fsPath(uri); req.setSketchPath(requestSketchPath); req.setInstance(instance); - const stat = new Deferred(); - fs.lstat(requestSketchPath, (err, result) => + const stat = new Deferred(); + lstat(requestSketchPath, (err, result) => err ? stat.resolve(err) : stat.resolve(result) ); const sketch = await new Promise((resolve, reject) => { @@ -200,27 +189,20 @@ export class SketchesServiceImpl if (err) { reject( isNotFoundError(err) - ? SketchesError.NotFound( - fixErrorMessage( - err, - requestSketchPath, - this.configService.cliConfiguration?.directories.user - ), - uri - ) + ? SketchesError.NotFound(err.details, uri) : err ); return; } const responseSketchPath = maybeNormalizeDrive(resp.getLocationPath()); if (requestSketchPath !== responseSketchPath) { - console.warn( + this.logger.warn( `Warning! The request sketch path was different than the response sketch path from the CLI. This could be a potential bug. Request: <${requestSketchPath}>, response: <${responseSketchPath}>.` ); } const resolvedStat = await stat.promise; if (resolvedStat instanceof Error) { - console.error( + this.logger.error( `The CLI could load the sketch from ${requestSketchPath}, but stating the folder has failed.` ); reject(resolvedStat); @@ -254,89 +236,160 @@ export class SketchesServiceImpl private get recentSketchesFsPath(): Promise { return this.envVariableServer .getConfigDirUri() - .then((uri) => path.join(FileUri.fsPath(uri), 'recent-sketches.json')); + .then((uri) => path.join(FileUri.fsPath(uri), RecentSketches)); } - private async loadRecentSketches( - fsPath: string - ): Promise> { + private async loadRecentSketches(): Promise> { + this.logger.debug(`>>> Loading recently opened sketches data.`); + const fsPath = await this.recentSketchesFsPath; let data: Record = {}; try { - const raw = await promisify(fs.readFile)(fsPath, { + const raw = await fs.readFile(fsPath, { encoding: 'utf8', }); - data = JSON.parse(raw); - } catch {} + try { + data = JSON.parse(raw); + } catch (err) { + this.logger.error( + `Could not parse recently opened sketches. Raw input was: ${raw}` + ); + } + } catch (err) { + if ('code' in err && err.code === 'ENOENT') { + this.logger.debug( + `<<< '${RecentSketches}' does not exist yet. This is normal behavior. Falling back to empty data.` + ); + return {}; + } + throw err; + } + this.logger.debug( + `<<< Successfully loaded recently opened sketches data: ${JSON.stringify( + data + )}` + ); return data; } + private async saveRecentSketches( + data: Record + ): Promise { + this.logger.debug( + `>>> Saving recently opened sketches data: ${JSON.stringify(data)}` + ); + const fsPath = await this.recentSketchesFsPath; + await fs.writeFile(fsPath, JSON.stringify(data, null, 2)); + this.logger.debug('<<< Successfully saved recently opened sketches data.'); + } + async markAsRecentlyOpened(uri: string): Promise { - let sketch: Sketch | undefined = undefined; - try { - sketch = await this.loadSketch(uri); - } catch { - return; - } - if (await this.isTemp(sketch)) { - return; - } + return this.markAsRecentSketchQueue.add(async () => { + this.logger.debug(`Marking sketch at '${uri}' as recently opened.`); + if (this.isTempSketch.is(FileUri.fsPath(uri))) { + this.logger.debug( + `Sketch at '${uri}' is pointing to a temp location. Not marking as recently opened.` + ); + return; + } - const fsPath = await this.recentSketchesFsPath; - const data = await this.loadRecentSketches(fsPath); - const now = Date.now(); - data[sketch.uri] = now; - - let toDeleteUri: string | undefined = undefined; - if (Object.keys(data).length > 10) { - let min = Number.MAX_SAFE_INTEGER; - for (const uri of Object.keys(data)) { - if (min > data[uri]) { - min = data[uri]; - toDeleteUri = uri; + let sketch: Sketch | undefined = undefined; + try { + sketch = await this.loadSketch(uri); + this.logger.debug( + `Loaded sketch ${JSON.stringify( + sketch + )} before marking it as recently opened.` + ); + } catch (err) { + if (SketchesError.NotFound.is(err)) { + this.logger.debug( + `Could not load sketch from '${uri}'. Not marking as recently opened.` + ); + return; } + this.logger.error( + `Unexpected error occurred while loading sketch from '${uri}'.`, + err + ); + throw err; } - } - if (toDeleteUri) { - delete data[toDeleteUri]; - } + const data = await this.loadRecentSketches(); + const now = Date.now(); + this.logger.debug( + `Marking sketch '${uri}' as recently opened with timestamp: '${now}'.` + ); + data[sketch.uri] = now; + + let toDelete: [string, number] | undefined = undefined; + if (Object.keys(data).length > 10) { + let min = Number.MAX_SAFE_INTEGER; + for (const [uri, timestamp] of Object.entries(data)) { + if (min > timestamp) { + min = data[uri]; + toDelete = [uri, timestamp]; + } + } + } - await promisify(fs.writeFile)(fsPath, JSON.stringify(data, null, 2)); - this.recentlyOpenedSketches().then((sketches) => - this.notificationService.notifyRecentSketchesDidChange({ sketches }) - ); - } + if (toDelete) { + const [toDeleteUri] = toDelete; + delete data[toDeleteUri]; + this.logger.debug( + `Deleted sketch entry ${JSON.stringify( + toDelete + )} from recently opened.` + ); + } - async recentlyOpenedSketches(): Promise { - const configDirUri = await this.envVariableServer.getConfigDirUri(); - const fsPath = path.join( - FileUri.fsPath(configDirUri), - 'recent-sketches.json' - ); - let data: Record = {}; - try { - const raw = await promisify(fs.readFile)(fsPath, { - encoding: 'utf8', - }); - data = JSON.parse(raw); - } catch {} + await this.saveRecentSketches(data); + this.logger.debug(`Marked sketch '${uri}' as recently opened.`); + const sketches = await this.recentlyOpenedSketches(data); + this.notificationService.notifyRecentSketchesDidChange({ sketches }); + }); + } - const sketches: SketchWithDetails[] = []; - for (const uri of Object.keys(data).sort( - (left, right) => data[right] - data[left] - )) { - try { - const sketch = await this.loadSketch(uri); - sketches.push(sketch); - } catch {} + async recentlyOpenedSketches( + forceUpdate?: Record | boolean + ): Promise { + if (!this.recentSketches || forceUpdate) { + const data = + forceUpdate && typeof forceUpdate === 'object' + ? forceUpdate + : await this.loadRecentSketches(); + const sketches: SketchWithDetails[] = []; + let needsUpdate = false; + for (const uri of Object.keys(data).sort( + (left, right) => data[right] - data[left] + )) { + let sketch: SketchWithDetails | undefined = undefined; + try { + sketch = await this.loadSketch(uri); + } catch {} + if (!sketch) { + needsUpdate = true; + } else { + sketches.push(sketch); + } + } + if (needsUpdate) { + const data = sketches.reduce((acc, curr) => { + acc[curr.uri] = curr.mtimeMs; + return acc; + }, {} as Record); + await this.saveRecentSketches(data); + this.notificationService.notifyRecentSketchesDidChange({ sketches }); + } + this.recentSketches = sketches; } - - return sketches; + return this.recentSketches; } async cloneExample(uri: string): Promise { - const sketch = await this.loadSketch(uri); - const parentPath = await this.createTempFolder(); + const [sketch, parentPath] = await Promise.all([ + this.loadSketch(uri), + this.createTempFolder(), + ]); const destinationUri = FileUri.create( path.join(parentPath, sketch.name) ).toString(); @@ -377,7 +430,7 @@ export class SketchesServiceImpl this.sketchSuffixIndex++ )}`; // Note: we check the future destination folder (`directories.user`) for name collision and not the temp folder! - const sketchExists = await promisify(fs.exists)( + const sketchExists = await this.exists( path.join(sketchbookPath, sketchNameCandidate) ); if (!sketchExists) { @@ -393,8 +446,8 @@ export class SketchesServiceImpl const sketchDir = path.join(parentPath, sketchName); const sketchFile = path.join(sketchDir, `${sketchName}.ino`); - await promisify(fs.mkdir)(sketchDir, { recursive: true }); - await promisify(fs.writeFile)( + await fs.mkdir(sketchDir, { recursive: true }); + await fs.writeFile( sketchFile, `void setup() { // put your setup code here, to run once: @@ -424,7 +477,7 @@ void loop() { reject(createError); return; } - fs.realpath.native(dirPath, (resolveError, resolvedDirPath) => { + realpath.native(dirPath, (resolveError, resolvedDirPath) => { if (resolveError) { reject(resolveError); return; @@ -478,7 +531,7 @@ void loop() { { destinationUri }: { destinationUri: string } ): Promise { const source = FileUri.fsPath(sketch.uri); - const exists = await promisify(fs.exists)(source); + const exists = await this.exists(source); if (!exists) { throw new Error(`Sketch does not exist: ${sketch}`); } @@ -503,7 +556,7 @@ void loop() { ); const newPath = path.join(destinationPath, `${newName}.ino`); if (oldPath !== newPath) { - await promisify(fs.rename)(oldPath, newPath); + await fs.rename(oldPath, newPath); } await this.loadSketch(FileUri.create(destinationPath).toString()); // Sanity check. resolve(); @@ -520,7 +573,7 @@ void loop() { const destination = FileUri.fsPath(destinationUri); let tempDestination = await this.createTempFolder(); tempDestination = path.join(tempDestination, sketch.name); - await fs.promises.mkdir(tempDestination, { recursive: true }); + await fs.mkdir(tempDestination, { recursive: true }); await copy(source, tempDestination); await copy(tempDestination, destination); return FileUri.create(destination).toString(); @@ -531,8 +584,8 @@ void loop() { const { client } = await this.coreClient; const archivePath = FileUri.fsPath(destinationUri); // The CLI cannot override existing archives, so we have to wipe it manually: https://github.com/arduino/arduino-cli/issues/1160 - if (await promisify(fs.exists)(archivePath)) { - await promisify(fs.unlink)(archivePath); + if (await this.exists(archivePath)) { + await fs.unlink(archivePath); } const req = new ArchiveSketchRequest(); req.setSketchPath(FileUri.fsPath(sketch.uri)); @@ -556,7 +609,7 @@ void loop() { async getIdeTempFolderPath(sketch: Sketch): Promise { const sketchPath = FileUri.fsPath(sketch.uri); - await fs.promises.readdir(sketchPath); // Validates the sketch folder and rejects if not accessible. + await fs.readdir(sketchPath); // Validates the sketch folder and rejects if not accessible. const suffix = crypto.createHash('md5').update(sketchPath).digest('hex'); return path.join(os.tmpdir(), `arduino-ide2-${suffix}`); } @@ -564,53 +617,32 @@ void loop() { async deleteSketch(sketch: Sketch): Promise { return new Promise((resolve, reject) => { const sketchPath = FileUri.fsPath(sketch.uri); - fs.rm(sketchPath, { recursive: true, maxRetries: 5 }, (error) => { + rm(sketchPath, { recursive: true, maxRetries: 5 }, (error) => { if (error) { - console.error(`Failed to delete sketch at ${sketchPath}.`, error); + this.logger.error(`Failed to delete sketch at ${sketchPath}.`, error); reject(error); } else { - console.log(`Successfully deleted sketch at ${sketchPath}.`); + this.logger.info(`Successfully deleted sketch at ${sketchPath}.`); resolve(); } }); }); } + + private async exists(pathLike: string): Promise { + try { + await fs.access(pathLike, constants.R_OK | constants.W_OK); + return true; + } catch { + return false; + } + } } interface SketchWithDetails extends Sketch { readonly mtimeMs: number; } -// https://github.com/arduino/arduino-cli/issues/1797 -function fixErrorMessage( - err: ServiceError, - sketchPath: string, - sketchbookPath: string | undefined -): string { - if (!sketchbookPath) { - return err.details; // No way to repair the error message. The current sketchbook path is not available. - } - // Original: `Can't open sketch: no valid sketch found in /Users/a.kitta/Documents/Arduino: missing /Users/a.kitta/Documents/Arduino/Arduino.ino` - // Fixed: `Can't open sketch: no valid sketch found in /Users/a.kitta/Documents/Arduino: missing $sketchPath` - const message = err.details; - const incorrectMessageSuffix = path.join(sketchbookPath, 'Arduino.ino'); - if ( - message.startsWith("Can't open sketch: no valid sketch found in") && - message.endsWith(`${incorrectMessageSuffix}`) - ) { - const sketchName = path.basename(sketchPath); - const correctMessagePrefix = message.substring( - 0, - message.length - incorrectMessageSuffix.length - ); - return `${correctMessagePrefix}${path.join( - sketchPath, - `${sketchName}.ino` - )}`; - } - return err.details; -} - function isNotFoundError(err: unknown): err is ServiceError { return ServiceError.is(err) && err.code === 5; // `NOT_FOUND` https://grpc.github.io/grpc/core/md_doc_statuscodes.html } From 40807db65ef20639d72ebb202a4c5c56d112beaa Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 3 Oct 2022 00:00:14 -0700 Subject: [PATCH 038/384] Bump arduino-serial-plotter-webapp dependency to 0.2.0 --- arduino-ide-extension/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 90f97bfa0..39041d141 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -56,7 +56,7 @@ "@types/temp": "^0.8.34", "@types/which": "^1.3.1", "ajv": "^6.5.3", - "arduino-serial-plotter-webapp": "0.1.0", + "arduino-serial-plotter-webapp": "0.2.0", "async-mutex": "^0.3.0", "atob": "^2.1.2", "auth0-js": "^9.14.0", diff --git a/yarn.lock b/yarn.lock index 84393eeff..f023cda96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4267,10 +4267,10 @@ archive-type@^4.0.0: dependencies: file-type "^4.2.0" -arduino-serial-plotter-webapp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/arduino-serial-plotter-webapp/-/arduino-serial-plotter-webapp-0.1.0.tgz#fa631483a93a12acd89d7bbe0487a3c0e57fac9f" - integrity sha512-0gHDGDz6guIC7Y8JXHaUad0RoueG2A+ykKNY1yo59+hWGbkM37hdRy4GKLsOkn0NMqU1TjnWmQHaSmYJjD1cAQ== +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== are-we-there-yet@^2.0.0: version "2.0.0" From ae7643294464c1d06ffc94d755e740a02ad58f65 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 2 Oct 2022 04:55:27 -0700 Subject: [PATCH 039/384] Update library dependency installation dialog response indexes Arduino libraries may specify dependencies on other libraries in their metadata. The installation of these dependencies is offered by the Arduino IDE when the user installs the dependent library using the Library Manager widget. The order of the buttons in the dialog that offers the dependencies installation was recently rearranged. The dialog response interpretation code was not updated to reflect the changes to the button indexes at that time. This caused the "CANCEL" button to trigger the behavior expected from the "INSTALL ALL" button, and vice versa. The library dependencies installation dialog response interpretation code is hereby updated to use the new button indexes. --- .../src/browser/library/library-list-widget.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 9e8eba64c..cd2b196df 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -139,12 +139,12 @@ export class LibraryListWidget extends ListWidget< if (result) { const { response } = result; - if (response === 0) { - // All - installDependencies = true; - } else if (response === 1) { + if (response === 1) { // Current only installDependencies = false; + } else if (response === 2) { + // All + installDependencies = true; } } } else { From 945a8f48412ddfd398192e5997b14f71534b09d6 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 3 Oct 2022 23:45:13 -0700 Subject: [PATCH 040/384] Bump built-in example sketches version to 1.10.0 The Arduino IDE installation includes a collection of example sketches demonstrating fundamental concepts. These examples are hosted in a dedicated repository, which is a dependency of this project. A new release has been made in that `arduino/arduino-examples` repository. This release updates the formatting of the examples to be compliant with the code style of the Arduino IDE 2.x "Auto Format" feature. --- arduino-ide-extension/scripts/download-examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index c7bcf9865..6d2d3debd 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -1,7 +1,7 @@ // @ts-check // The version to use. -const version = '1.9.1'; +const version = '1.10.0'; (async () => { const os = require('os'); From 0c20ae0e288f9dd477bd6f27a3ed4cf986e8d0c5 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 9 Sep 2022 18:49:28 +0200 Subject: [PATCH 041/384] Various library/platform index update fixes - IDE2 can start if the package index download fails. Closes #1084 - Split the lib and platform index update. Closes #1156 Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 6 +- .../browser/arduino-ide-frontend-module.ts | 2 + .../src/browser/boards/boards-config.tsx | 2 +- .../contributions/indexes-update-progress.ts | 4 +- .../browser/contributions/update-indexes.ts | 193 +++++ .../src/browser/notification-center.ts | 65 +- .../widgets/component-list/list-widget.tsx | 2 +- .../src/common/protocol/core-service.ts | 28 + .../common/protocol/notification-service.ts | 53 +- .../src/node/board-discovery.ts | 10 +- .../arduino/cli/commands/v1/commands_pb.d.ts | 4 + .../cc/arduino/cli/commands/v1/commands_pb.js | 32 +- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 116 ++- .../cc/arduino/cli/commands/v1/common_pb.js | 707 ++++++++++++++++-- .../src/node/core-client-provider.ts | 275 ++++--- .../src/node/grpc-progressible.ts | 219 +++--- .../src/node/notification-service-server.ts | 25 +- i18n/en.json | 5 + 18 files changed, 1410 insertions(+), 338 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/update-indexes.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 39041d141..e9bcb6a0d 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -158,7 +158,11 @@ ], "arduino": { "cli": { - "version": "0.27.1" + "version": { + "owner": "cmaglie", + "repo": "arduino-cli", + "commitish": "download_progress_refactor" + } }, "fwuploader": { "version": "2.2.0" 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 0a6df55ff..afa5eb5ec 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -332,6 +332,7 @@ import { OutputEditorFactory } from './theia/output/output-editor-factory'; import { StartupTaskProvider } from '../electron-common/startup-task'; import { DeleteSketch } from './contributions/delete-sketch'; import { UserFields } from './contributions/user-fields'; +import { UpdateIndexes } from './contributions/update-indexes'; const registerArduinoThemes = () => { const themes: MonacoThemeJson[] = [ @@ -744,6 +745,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, CheckForUpdates); Contribution.configure(bind, UserFields); Contribution.configure(bind, DeleteSketch); + Contribution.configure(bind, UpdateIndexes); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index df5ed5a33..a4533fdf2 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -132,7 +132,7 @@ export class BoardsConfig extends React.Component< this.props.notificationCenter.onPlatformDidUninstall(() => this.updateBoards(this.state.query) ), - this.props.notificationCenter.onIndexDidUpdate(() => + this.props.notificationCenter.onIndexUpdateDidComplete(() => this.updateBoards(this.state.query) ), this.props.notificationCenter.onDaemonDidStart(() => diff --git a/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts b/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts index d8762b841..a2c87fee0 100644 --- a/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts +++ b/arduino-ide-extension/src/browser/contributions/indexes-update-progress.ts @@ -16,7 +16,7 @@ export class IndexesUpdateProgress extends Contribution { | undefined; override onStart(): void { - this.notificationCenter.onIndexWillUpdate((progressId) => + this.notificationCenter.onIndexUpdateWillStart(({ progressId }) => this.getOrCreateProgress(progressId) ); this.notificationCenter.onIndexUpdateDidProgress((progress) => { @@ -24,7 +24,7 @@ export class IndexesUpdateProgress extends Contribution { delegate.report(progress) ); }); - this.notificationCenter.onIndexDidUpdate((progressId) => { + this.notificationCenter.onIndexUpdateDidComplete(({ progressId }) => { this.cancelProgress(progressId); }); this.notificationCenter.onIndexUpdateDidFail(({ progressId, message }) => { diff --git a/arduino-ide-extension/src/browser/contributions/update-indexes.ts b/arduino-ide-extension/src/browser/contributions/update-indexes.ts new file mode 100644 index 000000000..fc4e6d078 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/update-indexes.ts @@ -0,0 +1,193 @@ +import { LocalStorageService } from '@theia/core/lib/browser/storage-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CoreService, IndexType } from '../../common/protocol'; +import { NotificationCenter } from '../notification-center'; +import { WindowServiceExt } from '../theia/core/window-service-ext'; +import { Command, CommandRegistry, Contribution } from './contribution'; + +@injectable() +export class UpdateIndexes extends Contribution { + @inject(WindowServiceExt) + private readonly windowService: WindowServiceExt; + @inject(LocalStorageService) + private readonly localStorage: LocalStorageService; + @inject(CoreService) + private readonly coreService: CoreService; + @inject(NotificationCenter) + private readonly notificationCenter: NotificationCenter; + + protected override init(): void { + super.init(); + this.notificationCenter.onIndexUpdateDidComplete(({ summary }) => + Promise.all( + Object.entries(summary).map(([type, updatedAt]) => + this.setLastUpdateDateTime(type as IndexType, updatedAt) + ) + ) + ); + } + + override onReady(): void { + this.checkForUpdates(); + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(UpdateIndexes.Commands.UPDATE_INDEXES, { + execute: () => this.updateIndexes(IndexType.All, true), + }); + registry.registerCommand(UpdateIndexes.Commands.UPDATE_PLATFORM_INDEX, { + execute: () => this.updateIndexes(['platform'], true), + }); + registry.registerCommand(UpdateIndexes.Commands.UPDATE_LIBRARY_INDEX, { + execute: () => this.updateIndexes(['library'], true), + }); + } + + private async checkForUpdates(): Promise { + const checkForUpdates = this.preferences['arduino.checkForUpdates']; + if (!checkForUpdates) { + console.debug( + '[update-indexes]: `arduino.checkForUpdates` is `false`. Skipping updating the indexes.' + ); + return; + } + + if (await this.windowService.isFirstWindow()) { + const summary = await this.coreService.indexUpdateSummaryBeforeInit(); + if (summary.message) { + this.messageService.error(summary.message); + } + const typesToCheck = IndexType.All.filter((type) => !(type in summary)); + if (Object.keys(summary).length) { + console.debug( + `[update-indexes]: Detected an index update summary before the core gRPC client initialization. Updating local storage with ${JSON.stringify( + summary + )}` + ); + } else { + console.debug( + '[update-indexes]: No index update summary was available before the core gRPC client initialization. Checking the status of the all the index types.' + ); + } + await Promise.allSettled([ + ...Object.entries(summary).map(([type, updatedAt]) => + this.setLastUpdateDateTime(type as IndexType, updatedAt) + ), + this.updateIndexes(typesToCheck), + ]); + } + } + + private async updateIndexes( + types: IndexType[], + force = false + ): Promise { + const updatedAt = new Date().toISOString(); + return Promise.all( + types.map((type) => this.needsIndexUpdate(type, updatedAt, force)) + ).then((needsIndexUpdateResults) => { + const typesToUpdate = needsIndexUpdateResults.filter(IndexType.is); + if (typesToUpdate.length) { + console.debug( + `[update-indexes]: Requesting the index update of type: ${JSON.stringify( + typesToUpdate + )} with date time: ${updatedAt}.` + ); + return this.coreService.updateIndex({ types: typesToUpdate }); + } + }); + } + + private async needsIndexUpdate( + type: IndexType, + now: string, + force = false + ): Promise { + if (force) { + console.debug( + `[update-indexes]: Update for index type: '${type}' was forcefully requested.` + ); + return type; + } + const lastUpdateIsoDateTime = await this.getLastUpdateDateTime(type); + if (!lastUpdateIsoDateTime) { + console.debug( + `[update-indexes]: No last update date time was persisted for index type: '${type}'. Index update is required.` + ); + return type; + } + const lastUpdateDateTime = Date.parse(lastUpdateIsoDateTime); + if (Number.isNaN(lastUpdateDateTime)) { + console.debug( + `[update-indexes]: Invalid last update date time was persisted for index type: '${type}'. Last update date time was: ${lastUpdateDateTime}. Index update is required.` + ); + return type; + } + const diff = new Date(now).getTime() - lastUpdateDateTime; + const needsIndexUpdate = diff >= this.threshold; + console.debug( + `[update-indexes]: Update for index type '${type}' is ${ + needsIndexUpdate ? '' : 'not ' + }required. Now: ${now}, Last index update date time: ${new Date( + lastUpdateDateTime + ).toISOString()}, diff: ${diff} ms, threshold: ${this.threshold} ms.` + ); + return needsIndexUpdate ? type : false; + } + + private async getLastUpdateDateTime( + type: IndexType + ): Promise { + const key = this.storageKeyOf(type); + return this.localStorage.getData(key); + } + + private async setLastUpdateDateTime( + type: IndexType, + updatedAt: string + ): Promise { + const key = this.storageKeyOf(type); + return this.localStorage.setData(key, updatedAt).finally(() => { + console.debug( + `[update-indexes]: Updated the last index update date time of '${type}' to ${updatedAt}.` + ); + }); + } + + private storageKeyOf(type: IndexType): string { + return `index-last-update-time--${type}`; + } + + private get threshold(): number { + return 4 * 60 * 60 * 1_000; // four hours in millis + } +} +export namespace UpdateIndexes { + export namespace Commands { + export const UPDATE_INDEXES: Command & { label: string } = { + id: 'arduino-update-indexes', + label: nls.localize( + 'arduino/updateIndexes/updateIndexes', + 'Update Indexes' + ), + category: 'Arduino', + }; + export const UPDATE_PLATFORM_INDEX: Command & { label: string } = { + id: 'arduino-update-package-index', + label: nls.localize( + 'arduino/updateIndexes/updatePackageIndex', + 'Update Package Index' + ), + category: 'Arduino', + }; + export const UPDATE_LIBRARY_INDEX: Command & { label: string } = { + id: 'arduino-update-library-index', + label: nls.localize( + 'arduino/updateIndexes/updateLibraryIndex', + 'Update Library Index' + ), + category: 'Arduino', + }; + } +} diff --git a/arduino-ide-extension/src/browser/notification-center.ts b/arduino-ide-extension/src/browser/notification-center.ts index b17853d0a..091ad8cdb 100644 --- a/arduino-ide-extension/src/browser/notification-center.ts +++ b/arduino-ide-extension/src/browser/notification-center.ts @@ -8,6 +8,9 @@ import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; import { + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, + IndexUpdateWillStartParams, NotificationServiceClient, NotificationServiceServer, } from '../common/protocol/notification-service'; @@ -29,48 +32,48 @@ export class NotificationCenter implements NotificationServiceClient, FrontendApplicationContribution { @inject(NotificationServiceServer) - protected readonly server: JsonRpcProxy; + private readonly server: JsonRpcProxy; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; - protected readonly indexDidUpdateEmitter = new Emitter(); - protected readonly indexWillUpdateEmitter = new Emitter(); - protected readonly indexUpdateDidProgressEmitter = + private readonly indexUpdateDidCompleteEmitter = + new Emitter(); + private readonly indexUpdateWillStartEmitter = + new Emitter(); + private readonly indexUpdateDidProgressEmitter = new Emitter(); - protected readonly indexUpdateDidFailEmitter = new Emitter<{ - progressId: string; - message: string; - }>(); - protected readonly daemonDidStartEmitter = new Emitter(); - protected readonly daemonDidStopEmitter = new Emitter(); - protected readonly configDidChangeEmitter = new Emitter<{ + private readonly indexUpdateDidFailEmitter = + new Emitter(); + private readonly daemonDidStartEmitter = new Emitter(); + private readonly daemonDidStopEmitter = new Emitter(); + private readonly configDidChangeEmitter = new Emitter<{ config: Config | undefined; }>(); - protected readonly platformDidInstallEmitter = new Emitter<{ + private readonly platformDidInstallEmitter = new Emitter<{ item: BoardsPackage; }>(); - protected readonly platformDidUninstallEmitter = new Emitter<{ + private readonly platformDidUninstallEmitter = new Emitter<{ item: BoardsPackage; }>(); - protected readonly libraryDidInstallEmitter = new Emitter<{ + private readonly libraryDidInstallEmitter = new Emitter<{ item: LibraryPackage; }>(); - protected readonly libraryDidUninstallEmitter = new Emitter<{ + private readonly libraryDidUninstallEmitter = new Emitter<{ item: LibraryPackage; }>(); - protected readonly attachedBoardsDidChangeEmitter = + private readonly attachedBoardsDidChangeEmitter = new Emitter(); - protected readonly recentSketchesChangedEmitter = new Emitter<{ + private readonly recentSketchesChangedEmitter = new Emitter<{ sketches: Sketch[]; }>(); private readonly onAppStateDidChangeEmitter = new Emitter(); - protected readonly toDispose = new DisposableCollection( - this.indexWillUpdateEmitter, + private readonly toDispose = new DisposableCollection( + this.indexUpdateWillStartEmitter, this.indexUpdateDidProgressEmitter, - this.indexDidUpdateEmitter, + this.indexUpdateDidCompleteEmitter, this.indexUpdateDidFailEmitter, this.daemonDidStartEmitter, this.daemonDidStopEmitter, @@ -82,8 +85,8 @@ export class NotificationCenter this.attachedBoardsDidChangeEmitter ); - readonly onIndexDidUpdate = this.indexDidUpdateEmitter.event; - readonly onIndexWillUpdate = this.indexDidUpdateEmitter.event; + readonly onIndexUpdateDidComplete = this.indexUpdateDidCompleteEmitter.event; + readonly onIndexUpdateWillStart = this.indexUpdateWillStartEmitter.event; readonly onIndexUpdateDidProgress = this.indexUpdateDidProgressEmitter.event; readonly onIndexUpdateDidFail = this.indexUpdateDidFailEmitter.event; readonly onDaemonDidStart = this.daemonDidStartEmitter.event; @@ -112,26 +115,20 @@ export class NotificationCenter this.toDispose.dispose(); } - notifyIndexWillUpdate(progressId: string): void { - this.indexWillUpdateEmitter.fire(progressId); + notifyIndexUpdateWillStart(params: IndexUpdateWillStartParams): void { + this.indexUpdateWillStartEmitter.fire(params); } notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void { this.indexUpdateDidProgressEmitter.fire(progressMessage); } - notifyIndexDidUpdate(progressId: string): void { - this.indexDidUpdateEmitter.fire(progressId); + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void { + this.indexUpdateDidCompleteEmitter.fire(params); } - notifyIndexUpdateDidFail({ - progressId, - message, - }: { - progressId: string; - message: string; - }): void { - this.indexUpdateDidFailEmitter.fire({ progressId, message }); + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void { + this.indexUpdateDidFailEmitter.fire(params); } notifyDaemonDidStart(port: string): void { diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index 3e388cce2..7e81c9b40 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 @@ -68,7 +68,7 @@ export abstract class ListWidget< @postConstruct() protected init(): void { this.toDispose.pushAll([ - this.notificationCenter.onIndexDidUpdate(() => this.refresh(undefined)), + this.notificationCenter.onIndexUpdateDidComplete(() => this.refresh(undefined)), this.notificationCenter.onDaemonDidStart(() => this.refresh(undefined)), this.notificationCenter.onDaemonDidStop(() => this.refresh(undefined)), ]); diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 81e5212a9..809f3a7c6 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -11,6 +11,7 @@ import type { } from '../../common/protocol/boards-service'; import type { Programmer } from './boards-service'; import type { Sketch } from './sketches-service'; +import { IndexUpdateSummary } from './notification-service'; export const CompilerWarningLiterals = [ 'None', @@ -112,6 +113,33 @@ export interface CoreService { * Refreshes the underling core gRPC client for the Arduino CLI. */ refresh(): Promise; + /** + * Updates the index of the given index types and refreshes (`init`) the underlying core gRPC client. + * If `types` is empty, only the refresh part will be executed. + */ + updateIndex({ types }: { types: IndexType[] }): Promise; + /** + * If the IDE2 detects invalid or missing indexes on core client init, + * IDE2 tries to update the indexes before the first frontend connects. + * Use this method to determine whether the backend has already updated + * the indexes before updating them. + * + * If yes, the connected frontend can update the local storage with the most + * recent index update date-time for a particular index type, + * and IDE2 can avoid the double indexes update. + */ + indexUpdateSummaryBeforeInit(): Promise>; +} + +export const IndexTypeLiterals = ['platform', 'library'] as const; +export type IndexType = typeof IndexTypeLiterals[number]; +export namespace IndexType { + export function is(arg: unknown): arg is IndexType { + return ( + typeof arg === 'string' && IndexTypeLiterals.includes(arg as IndexType) + ); + } + export const All: IndexType[] = IndexTypeLiterals.filter(is); } export namespace CoreService { diff --git a/arduino-ide-extension/src/common/protocol/notification-service.ts b/arduino-ide-extension/src/common/protocol/notification-service.ts index e1b192ece..cbea74b60 100644 --- a/arduino-ide-extension/src/common/protocol/notification-service.ts +++ b/arduino-ide-extension/src/common/protocol/notification-service.ts @@ -5,27 +5,62 @@ import type { Config, ProgressMessage, Sketch, + IndexType, } from '../protocol'; import type { LibraryPackage } from './library-service'; +/** + * Values are [ISO 8601](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) + * strings representing the date-time when the update of the index has been completed. + */ +export type IndexUpdateSummary = { + [T in IndexType]: string; +} & { message?: string }; +export interface IndexUpdateParams { + /** + * Application unique ID of the progress. + */ + readonly progressId: string; + /** + * The type of the index is which is being updated. + */ + readonly types: IndexType[]; +} +export type IndexUpdateWillStartParams = IndexUpdateParams; +export interface IndexUpdateDidCompleteParams + extends Omit { + readonly summary: IndexUpdateSummary; +} +export interface IndexUpdateDidFailParams extends IndexUpdateParams { + /** + * Describes the reason of the index update failure. + */ + readonly message: string; +} + export interface NotificationServiceClient { - notifyIndexWillUpdate(progressId: string): void; + // Index + notifyIndexUpdateWillStart(params: IndexUpdateWillStartParams): void; notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void; - notifyIndexDidUpdate(progressId: string): void; - notifyIndexUpdateDidFail({ - progressId, - message, - }: { - progressId: string; - message: string; - }): void; + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void; + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void; + + // Daemon notifyDaemonDidStart(port: string): void; notifyDaemonDidStop(): void; + + // CLI config notifyConfigDidChange(event: { config: Config | undefined }): void; + + // Platforms notifyPlatformDidInstall(event: { item: BoardsPackage }): void; notifyPlatformDidUninstall(event: { item: BoardsPackage }): void; + + // Libraries notifyLibraryDidInstall(event: { item: LibraryPackage }): void; notifyLibraryDidUninstall(event: { item: LibraryPackage }): void; + + // Boards discovery notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void; notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void; } diff --git a/arduino-ide-extension/src/node/board-discovery.ts b/arduino-ide-extension/src/node/board-discovery.ts index 84ac101b6..bce8a36d0 100644 --- a/arduino-ide-extension/src/node/board-discovery.ts +++ b/arduino-ide-extension/src/node/board-discovery.ts @@ -6,7 +6,7 @@ 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 { inject, injectable, named } from '@theia/core/shared/inversify'; -import { Disposable } from '@theia/core/shared/vscode-languageserver-protocol'; +import { Disposable } from '@theia/core/lib/common/disposable'; import { v4 } from 'uuid'; import { Unknown } from '../common/nls'; import { @@ -78,14 +78,6 @@ export class BoardDiscovery onStart(): void { this.start(); - this.onClientDidRefresh(() => this.restart()); - } - - private async restart(): Promise { - this.logger.info('restarting before stop'); - await this.stop(); - this.logger.info('restarting after stop'); - return this.start(); } onStop(): void { diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts index a15ce4719..ff43f4ea0 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 @@ -220,6 +220,9 @@ export class UpdateIndexRequest extends jspb.Message { 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; @@ -234,6 +237,7 @@ export class UpdateIndexRequest extends jspb.Message { export namespace UpdateIndexRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + ignoreCustomPackageIndexes: boolean, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js index 820634067..350a37d8e 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 @@ -1811,7 +1811,8 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.toObject = functio */ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + ignoreCustomPackageIndexes: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -1853,6 +1854,10 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.deserializeBinaryFromReader reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); msg.setInstance(value); break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIgnoreCustomPackageIndexes(value); + break; default: reader.skipField(); break; @@ -1890,6 +1895,13 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.serializeBinaryToWriter = fu cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } + f = message.getIgnoreCustomPackageIndexes(); + if (f) { + writer.writeBool( + 2, + f + ); + } }; @@ -1930,6 +1942,24 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.hasInstance = func }; +/** + * optional bool ignore_custom_package_indexes = 2; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.getIgnoreCustomPackageIndexes = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.setIgnoreCustomPackageIndexes = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts index f79eb14c0..de19321dc 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 @@ -28,21 +28,26 @@ export namespace Instance { } export class DownloadProgress extends jspb.Message { - getUrl(): string; - setUrl(value: string): DownloadProgress; - getFile(): string; - setFile(value: string): DownloadProgress; + hasStart(): boolean; + clearStart(): void; + getStart(): DownloadProgressStart | undefined; + setStart(value?: DownloadProgressStart): DownloadProgress; - getTotalSize(): number; - setTotalSize(value: number): DownloadProgress; - getDownloaded(): number; - setDownloaded(value: number): DownloadProgress; + hasUpdate(): boolean; + clearUpdate(): void; + getUpdate(): DownloadProgressUpdate | undefined; + setUpdate(value?: DownloadProgressUpdate): DownloadProgress; - getCompleted(): boolean; - setCompleted(value: boolean): DownloadProgress; + hasEnd(): boolean; + clearEnd(): void; + getEnd(): DownloadProgressEnd | undefined; + setEnd(value?: DownloadProgressEnd): DownloadProgress; + + + getMessageCase(): DownloadProgress.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DownloadProgress.AsObject; @@ -55,12 +60,97 @@ export class DownloadProgress extends jspb.Message { } export namespace DownloadProgress { + export type AsObject = { + start?: DownloadProgressStart.AsObject, + update?: DownloadProgressUpdate.AsObject, + end?: DownloadProgressEnd.AsObject, + } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + + START = 1, + + UPDATE = 2, + + END = 3, + + } + +} + +export class DownloadProgressStart extends jspb.Message { + getUrl(): string; + setUrl(value: string): DownloadProgressStart; + + getLabel(): string; + setLabel(value: string): DownloadProgressStart; + + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DownloadProgressStart.AsObject; + static toObject(includeInstance: boolean, msg: DownloadProgressStart): DownloadProgressStart.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DownloadProgressStart, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DownloadProgressStart; + static deserializeBinaryFromReader(message: DownloadProgressStart, reader: jspb.BinaryReader): DownloadProgressStart; +} + +export namespace DownloadProgressStart { export type AsObject = { url: string, - file: string, - totalSize: number, + label: string, + } +} + +export class DownloadProgressUpdate extends jspb.Message { + getDownloaded(): number; + setDownloaded(value: number): DownloadProgressUpdate; + + getTotalSize(): number; + setTotalSize(value: number): DownloadProgressUpdate; + + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DownloadProgressUpdate.AsObject; + static toObject(includeInstance: boolean, msg: DownloadProgressUpdate): DownloadProgressUpdate.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DownloadProgressUpdate, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DownloadProgressUpdate; + static deserializeBinaryFromReader(message: DownloadProgressUpdate, reader: jspb.BinaryReader): DownloadProgressUpdate; +} + +export namespace DownloadProgressUpdate { + export type AsObject = { downloaded: number, - completed: boolean, + totalSize: number, + } +} + +export class DownloadProgressEnd extends jspb.Message { + getSuccess(): boolean; + setSuccess(value: boolean): DownloadProgressEnd; + + getMessage(): string; + setMessage(value: string): DownloadProgressEnd; + + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DownloadProgressEnd.AsObject; + static toObject(includeInstance: boolean, msg: DownloadProgressEnd): DownloadProgressEnd.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DownloadProgressEnd, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DownloadProgressEnd; + static deserializeBinaryFromReader(message: DownloadProgressEnd, reader: jspb.BinaryReader): DownloadProgressEnd; +} + +export namespace DownloadProgressEnd { + export type AsObject = { + success: boolean, + message: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js index 4ffbe5d22..7b7a4bcd3 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 @@ -17,6 +17,10 @@ var global = Function('return this')(); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Board', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgress', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressEnd', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressStart', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledPlatformReference', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Instance', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); @@ -55,7 +59,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.DownloadProgress = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgress, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -65,6 +69,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.DownloadProgress.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgress'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressStart = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgressStart, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DownloadProgressStart.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgressStart'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DownloadProgressEnd, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.displayName = 'proto.cc.arduino.cli.commands.v1.DownloadProgressEnd'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -322,6 +389,33 @@ proto.cc.arduino.cli.commands.v1.Instance.prototype.setId = function(value) { +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase = { + MESSAGE_NOT_SET: 0, + START: 1, + UPDATE: 2, + END: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -353,11 +447,9 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.toObject = function( */ proto.cc.arduino.cli.commands.v1.DownloadProgress.toObject = function(includeInstance, msg) { var f, obj = { - url: jspb.Message.getFieldWithDefault(msg, 1, ""), - file: jspb.Message.getFieldWithDefault(msg, 2, ""), - totalSize: jspb.Message.getFieldWithDefault(msg, 3, 0), - downloaded: jspb.Message.getFieldWithDefault(msg, 4, 0), - completed: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + start: (f = msg.getStart()) && proto.cc.arduino.cli.commands.v1.DownloadProgressStart.toObject(includeInstance, f), + update: (f = msg.getUpdate()) && proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.toObject(includeInstance, f), + end: (f = msg.getEnd()) && proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.toObject(includeInstance, f) }; if (includeInstance) { @@ -395,24 +487,19 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setUrl(value); + var value = new proto.cc.arduino.cli.commands.v1.DownloadProgressStart; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DownloadProgressStart.deserializeBinaryFromReader); + msg.setStart(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setFile(value); + var value = new proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinaryFromReader); + msg.setUpdate(value); break; case 3: - var value = /** @type {number} */ (reader.readInt64()); - msg.setTotalSize(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt64()); - msg.setDownloaded(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setCompleted(value); + var value = new proto.cc.arduino.cli.commands.v1.DownloadProgressEnd; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinaryFromReader); + msg.setEnd(value); break; default: reader.skipField(); @@ -443,38 +530,262 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.serializeBinary = fu */ proto.cc.arduino.cli.commands.v1.DownloadProgress.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getUrl(); - if (f.length > 0) { - writer.writeString( + f = message.getStart(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.cc.arduino.cli.commands.v1.DownloadProgressStart.serializeBinaryToWriter ); } - f = message.getFile(); - if (f.length > 0) { - writer.writeString( + f = message.getUpdate(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.serializeBinaryToWriter ); } - f = message.getTotalSize(); - if (f !== 0) { - writer.writeInt64( + f = message.getEnd(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.serializeBinaryToWriter ); } - f = message.getDownloaded(); - if (f !== 0) { - writer.writeInt64( - 4, +}; + + +/** + * optional DownloadProgressStart start = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgressStart} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getStart = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgressStart} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DownloadProgressStart, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgressStart|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this +*/ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setStart = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.clearStart = function() { + return this.setStart(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.hasStart = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional DownloadProgressUpdate update = 2; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getUpdate = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this +*/ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setUpdate = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.clearUpdate = function() { + return this.setUpdate(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.hasUpdate = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional DownloadProgressEnd end = 3; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getEnd = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DownloadProgressEnd, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgressEnd|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this +*/ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setEnd = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.DownloadProgress.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.clearEnd = function() { + return this.setEnd(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.hasEnd = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + + + +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.DownloadProgressStart.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DownloadProgressStart.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.DownloadProgressStart} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.toObject = function(includeInstance, msg) { + var f, obj = { + url: jspb.Message.getFieldWithDefault(msg, 1, ""), + label: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DownloadProgressStart; + return proto.cc.arduino.cli.commands.v1.DownloadProgressStart.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.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.setUrl(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setLabel(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.DownloadProgressStart.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DownloadProgressStart.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.DownloadProgressStart} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUrl(); + if (f.length > 0) { + writer.writeString( + 1, f ); } - f = message.getCompleted(); - if (f) { - writer.writeBool( - 5, + f = message.getLabel(); + if (f.length > 0) { + writer.writeString( + 2, f ); } @@ -485,89 +796,355 @@ proto.cc.arduino.cli.commands.v1.DownloadProgress.serializeBinaryToWriter = func * optional string url = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getUrl = function() { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.getUrl = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setUrl = function(value) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.setUrl = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string file = 2; + * optional string label = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getFile = function() { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.getLabel = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressStart} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setFile = function(value) { +proto.cc.arduino.cli.commands.v1.DownloadProgressStart.prototype.setLabel = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * 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.DownloadProgressUpdate.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.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.DownloadProgressUpdate} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.toObject = function(includeInstance, msg) { + var f, obj = { + downloaded: jspb.Message.getFieldWithDefault(msg, 1, 0), + totalSize: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + /** - * optional int64 total_size = 3; + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate; + return proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt64()); + msg.setDownloaded(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt64()); + msg.setTotalSize(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDownloaded(); + if (f !== 0) { + writer.writeInt64( + 1, + f + ); + } + f = message.getTotalSize(); + if (f !== 0) { + writer.writeInt64( + 2, + f + ); + } +}; + + +/** + * optional int64 downloaded = 1; * @return {number} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getTotalSize = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.getDownloaded = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setTotalSize = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.setDownloaded = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional int64 downloaded = 4; + * optional int64 total_size = 2; * @return {number} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getDownloaded = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.getTotalSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate.prototype.setTotalSize = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.toObject = function(includeInstance, msg) { + var f, obj = { + success: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), + message: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DownloadProgressEnd; + return proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSuccess(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setDownloaded = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * optional bool completed = 5; + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSuccess(); + if (f) { + writer.writeBool( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional bool success = 1; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.getCompleted = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.getSuccess = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgress} returns this + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} returns this */ -proto.cc.arduino.cli.commands.v1.DownloadProgress.prototype.setCompleted = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.setSuccess = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DownloadProgressEnd} returns this + */ +proto.cc.arduino.cli.commands.v1.DownloadProgressEnd.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 0bfd9766b..1686be1be 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -5,7 +5,7 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { Emitter, Event } from '@theia/core/lib/common/event'; +import { Emitter } from '@theia/core/lib/common/event'; import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { @@ -19,8 +19,15 @@ import { UpdateLibrariesIndexResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; import * as commandsGrpcPb from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; -import { NotificationServiceServer } from '../common/protocol'; -import { Deferred, retry } from '@theia/core/lib/common/promise-util'; +import { + IndexType, + IndexUpdateDidCompleteParams, + IndexUpdateSummary, + IndexUpdateDidFailParams, + IndexUpdateWillStartParams, + NotificationServiceServer, +} from '../common/protocol'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { Status as RpcStatus, Status, @@ -32,6 +39,7 @@ import { Disposable } from '@theia/core/shared/vscode-languageserver-protocol'; import { IndexesUpdateProgressHandler, ExecuteWithProgress, + DownloadResult, } from './grpc-progressible'; import type { DefaultCliConfig } from './cli-config'; import { ServiceError } from './service-error'; @@ -45,16 +53,19 @@ export class CoreClientProvider { @inject(NotificationServiceServer) private readonly notificationService: NotificationServiceServer; - private ready = new Deferred(); - private pending: Deferred | undefined; - private _client: CoreClientProvider.Client | undefined; - private readonly toDisposeBeforeCreate = new DisposableCollection(); + /** + * See `CoreService#indexUpdateSummaryBeforeInit`. + */ + private readonly beforeInitSummary = {} as IndexUpdateSummary; + private readonly toDisposeOnCloseClient = new DisposableCollection(); private readonly toDisposeAfterDidCreate = new DisposableCollection(); private readonly onClientReadyEmitter = new Emitter(); private readonly onClientReady = this.onClientReadyEmitter.event; - private readonly onClientDidRefreshEmitter = - new Emitter(); + + private ready = new Deferred(); + private pending: Deferred | undefined; + private _client: CoreClientProvider.Client | undefined; @postConstruct() protected init(): void { @@ -65,7 +76,9 @@ export class CoreClientProvider { }); this.daemon.onDaemonStarted((port) => this.create(port)); this.daemon.onDaemonStopped(() => this.closeClient()); - this.configService.onConfigChange(() => this.refreshIndexes()); + this.configService.onConfigChange( + () => this.client.then((client) => this.updateIndex(client, ['platform'])) // Assuming 3rd party URL changes. No library index update is required. + ); } get tryGetClient(): CoreClientProvider.Client | undefined { @@ -80,7 +93,7 @@ export class CoreClientProvider { if (!this.pending) { this.pending = new Deferred(); this.toDisposeAfterDidCreate.pushAll([ - Disposable.create(() => (this.pending = undefined)), + Disposable.create(() => (this.pending = undefined)), // TODO: reject all pending requests before unsetting the ref? this.onClientReady((client) => { this.pending?.resolve(client); this.toDisposeAfterDidCreate.dispose(); @@ -90,10 +103,6 @@ export class CoreClientProvider { return this.pending.promise; } - get onClientDidRefresh(): Event { - return this.onClientDidRefreshEmitter.event; - } - async refresh(): Promise { const client = await this.client; await this.initInstance(client); @@ -106,7 +115,7 @@ export class CoreClientProvider { this.closeClient(); const address = this.address(port); const client = await this.createClient(address); - this.toDisposeBeforeCreate.pushAll([ + this.toDisposeOnCloseClient.pushAll([ Disposable.create(() => client.client.close()), Disposable.create(() => { this.ready.reject( @@ -118,7 +127,6 @@ export class CoreClientProvider { }), ]); await this.initInstanceWithFallback(client); - setTimeout(async () => this.refreshIndexes(), 10_000); // Update the indexes asynchronously return this.useClient(client); } @@ -141,12 +149,17 @@ export class CoreClientProvider { try { await this.initInstance(client); } catch (err) { - if (err instanceof IndexUpdateRequiredBeforeInitError) { + if (err instanceof MustUpdateIndexesBeforeInitError) { console.error( 'The primary packages indexes are missing. Running indexes update before initializing the core gRPC client', err.message ); - await this.updateIndexes(client); // TODO: this should run without the 3rd party URLs + await this.updateIndex(client, Array.from(err.indexTypesToUpdate)); + const updatedAt = new Date().toISOString(); + // Clients will ask for it after they connect. + err.indexTypesToUpdate.forEach( + (type) => (this.beforeInitSummary[type] = updatedAt) + ); await this.initInstance(client); console.info( `Downloaded the primary package indexes, and successfully initialized the core gRPC client.` @@ -170,7 +183,7 @@ export class CoreClientProvider { } private closeClient(): void { - return this.toDisposeBeforeCreate.dispose(); + return this.toDisposeOnCloseClient.dispose(); } private async createClient( @@ -253,45 +266,66 @@ export class CoreClientProvider { } /** - * Updates all indexes and runs an init to [reload the indexes](https://github.com/arduino/arduino-cli/pull/1274#issue-866154638). + * `update3rdPartyPlatforms` has not effect if `types` is `['library']`. */ - private async refreshIndexes(): Promise { - const client = this._client; - if (client) { - const progressHandler = this.createProgressHandler(); - try { - await this.updateIndexes(client, progressHandler); + async updateIndex( + client: CoreClientProvider.Client, + types: IndexType[] + ): Promise { + let error: unknown | undefined = undefined; + const progressHandler = this.createProgressHandler(types); + try { + const updates: Promise[] = []; + if (types.includes('platform')) { + updates.push(this.updatePlatformIndex(client, progressHandler)); + } + if (types.includes('library')) { + updates.push(this.updateLibraryIndex(client, progressHandler)); + } + await Promise.all(updates); + } catch (err) { + // This is suboptimal but the core client must be re-initialized even if the index update has failed and the request was rejected. + error = err; + } finally { + // IDE2 reloads the index only and if only at least one download success is available. + if ( + progressHandler.results.some( + (result) => !DownloadResult.isError(result) + ) + ) { await this.initInstance(client); // notify clients about the index update only after the client has been "re-initialized" and the new content is available. progressHandler.reportEnd(); - this.onClientDidRefreshEmitter.fire(client); - } catch (err) { - console.error('Failed to update indexes', err); - progressHandler.reportError( - ServiceError.is(err) ? err.details : String(err) - ); + } + if (error) { + console.error(`Failed to update ${types.join(', ')} indexes.`, error); + const downloadErrors = progressHandler.results + .filter(DownloadResult.isError) + .map(({ url, message }) => `${message}: ${url}`) + .join(' '); + const message = ServiceError.is(error) + ? `${error.details}${downloadErrors ? ` ${downloadErrors}` : ''}` + : String(error); + // IDE2 keeps only the most recent error message. Previous errors might have been fixed with the fallback initialization. + this.beforeInitSummary.message = message; + // Toast the error message, so tha the user has chance to fix it if it was a client error (HTTP 4xx). + progressHandler.reportError(message); } } } - private async updateIndexes( - client: CoreClientProvider.Client, - progressHandler?: IndexesUpdateProgressHandler - ): Promise { - await Promise.all([ - this.updateIndex(client, progressHandler), - this.updateLibraryIndex(client, progressHandler), - ]); + get indexUpdateSummaryBeforeInit(): IndexUpdateSummary { + return { ...this.beforeInitSummary }; } - private async updateIndex( + private async updatePlatformIndex( client: CoreClientProvider.Client, progressHandler?: IndexesUpdateProgressHandler ): Promise { return this.doUpdateIndex( () => client.client.updateIndex( - new UpdateIndexRequest().setInstance(client.instance) + new UpdateIndexRequest().setInstance(client.instance) // Always updates both the primary and the 3rd party package indexes. ), progressHandler, 'platform-index' @@ -323,50 +357,45 @@ export class CoreClientProvider { task?: string ): Promise { const progressId = progressHandler?.progressId; - return retry( - () => - new Promise((resolve, reject) => { - responseProvider() - .on( - 'data', - ExecuteWithProgress.createDataCallback({ - responseService: { - appendToOutput: ({ chunk: message }) => { - console.log( - `core-client-provider${task ? ` [${task}]` : ''}`, - message - ); - progressHandler?.reportProgress(message); - }, - }, - progressId, - }) - ) - .on('error', reject) - .on('end', resolve); - }), - 50, - 3 - ); + return new Promise((resolve, reject) => { + responseProvider() + .on( + 'data', + ExecuteWithProgress.createDataCallback({ + responseService: { + appendToOutput: ({ chunk: message }) => { + console.log( + `core-client-provider${task ? ` [${task}]` : ''}`, + message + ); + progressHandler?.reportProgress(message); + }, + reportResult: (result) => progressHandler?.reportResult(result), + }, + progressId, + }) + ) + .on('error', reject) + .on('end', resolve); + }); } - private createProgressHandler(): IndexesUpdateProgressHandler { + private createProgressHandler( + types: IndexType[] + ): IndexesUpdateProgressHandler { const additionalUrlsCount = this.configService.cliConfiguration?.board_manager?.additional_urls ?.length ?? 0; - return new IndexesUpdateProgressHandler( - additionalUrlsCount, - (progressMessage) => + return new IndexesUpdateProgressHandler(types, additionalUrlsCount, { + onProgress: (progressMessage) => this.notificationService.notifyIndexUpdateDidProgress(progressMessage), - ({ progressId, message }) => - this.notificationService.notifyIndexUpdateDidFail({ - progressId, - message, - }), - (progressId) => - this.notificationService.notifyIndexWillUpdate(progressId), - (progressId) => this.notificationService.notifyIndexDidUpdate(progressId) - ); + onError: (params: IndexUpdateDidFailParams) => + this.notificationService.notifyIndexUpdateDidFail(params), + onStart: (params: IndexUpdateWillStartParams) => + this.notificationService.notifyIndexUpdateWillStart(params), + onComplete: (params: IndexUpdateDidCompleteParams) => + this.notificationService.notifyIndexUpdateDidComplete(params), + }); } private address(port: string): string { @@ -410,6 +439,7 @@ export namespace CoreClientProvider { export abstract class CoreClientAware { @inject(CoreClientProvider) private readonly coreClientProvider: CoreClientProvider; + /** * Returns with a promise that resolves when the core client is initialized and ready. */ @@ -417,8 +447,17 @@ export abstract class CoreClientAware { return this.coreClientProvider.client; } - protected get onClientDidRefresh(): Event { - return this.coreClientProvider.onClientDidRefresh; + /** + * Updates the index of the given `type` and returns with a promise which resolves when the core gPRC client has been reinitialized. + */ + async updateIndex({ types }: { types: IndexType[] }): Promise { + const client = await this.coreClient; + return this.coreClientProvider.updateIndex(client, types); + } + + async indexUpdateSummaryBeforeInit(): Promise { + await this.coreClient; + return this.coreClientProvider.indexUpdateSummaryBeforeInit; } refresh(): Promise { @@ -426,15 +465,20 @@ export abstract class CoreClientAware { } } -class IndexUpdateRequiredBeforeInitError extends Error { - constructor(causes: RpcStatus.AsObject[]) { +class MustUpdateIndexesBeforeInitError extends Error { + readonly indexTypesToUpdate: Set; + constructor(causes: [RpcStatus.AsObject, IndexType][]) { super(`The index of the cores and libraries must be updated before initializing the core gRPC client. The following problems were detected during the gRPC client initialization: ${causes - .map(({ code, message }) => ` - code: ${code}, message: ${message}`) + .map( + ([{ code, message }, type]) => + `[${type}-index] - code: ${code}, message: ${message}` + ) .join('\n')} `); - Object.setPrototypeOf(this, IndexUpdateRequiredBeforeInitError.prototype); + Object.setPrototypeOf(this, MustUpdateIndexesBeforeInitError.prototype); + this.indexTypesToUpdate = new Set(causes.map(([, type]) => type)); if (!causes.length) { throw new Error(`expected non-empty 'causes'`); } @@ -444,41 +488,66 @@ ${causes function isIndexUpdateRequiredBeforeInit( status: RpcStatus[], cliConfig: DefaultCliConfig -): IndexUpdateRequiredBeforeInitError | undefined { - const causes = status - .filter((s) => - IndexUpdateRequiredBeforeInit.map((predicate) => - predicate(s, cliConfig) - ).some(Boolean) - ) - .map((s) => RpcStatus.toObject(false, s)); +): MustUpdateIndexesBeforeInitError | undefined { + const causes = status.reduce((acc, curr) => { + for (const [predicate, type] of IndexUpdateRequiredPredicates) { + if (predicate(curr, cliConfig)) { + acc.push([curr.toObject(false), type]); + return acc; + } + } + return acc; + }, [] as [RpcStatus.AsObject, IndexType][]); return causes.length - ? new IndexUpdateRequiredBeforeInitError(causes) + ? new MustUpdateIndexesBeforeInitError(causes) : undefined; } -const IndexUpdateRequiredBeforeInit = [ - isPackageIndexMissingStatus, - isDiscoveryNotFoundStatus, +interface Predicate { + ( + status: RpcStatus, + { + directories: { data }, + }: DefaultCliConfig + ): boolean; +} +const IndexUpdateRequiredPredicates: [Predicate, IndexType][] = [ + [isPrimaryPackageIndexMissingStatus, 'platform'], + [isDiscoveryNotFoundStatus, 'platform'], + [isLibraryIndexMissingStatus, 'library'], ]; -function isPackageIndexMissingStatus( +// Loading index file: loading json index file /path/to/package_index.json: open /path/to/package_index.json: no such file or directory +function isPrimaryPackageIndexMissingStatus( status: RpcStatus, { directories: { data } }: DefaultCliConfig ): boolean { const predicate = ({ message }: RpcStatus.AsObject) => message.includes('loading json index file') && - (message.includes(join(data, 'package_index.json')) || - message.includes(join(data, 'library_index.json'))); + message.includes(join(data, 'package_index.json')); // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/package_manager.go#L247 return evaluate(status, predicate); } +// Error loading hardware platform: discovery $TOOL_NAME not found function isDiscoveryNotFoundStatus(status: RpcStatus): boolean { const predicate = ({ message }: RpcStatus.AsObject) => message.includes('discovery') && - (message.includes('not found') || message.includes('not installed')); + (message.includes('not found') || + message.includes('loading hardware platform')); // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/loader.go#L740 // https://github.com/arduino/arduino-cli/blob/f0245bc2da6a56fccea7b2c9ea09e85fdcc52cb8/arduino/cores/packagemanager/loader.go#L744 return evaluate(status, predicate); } +// Loading index file: reading library_index.json: open /path/to/library_index.json: no such file or directory +function isLibraryIndexMissingStatus( + status: RpcStatus, + { directories: { data } }: DefaultCliConfig +): boolean { + const predicate = ({ message }: RpcStatus.AsObject) => + message.includes('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); +} function evaluate( subject: RpcStatus, predicate: (error: RpcStatus.AsObject) => boolean diff --git a/arduino-ide-extension/src/node/grpc-progressible.ts b/arduino-ide-extension/src/node/grpc-progressible.ts index c9b93183d..edd04cd85 100644 --- a/arduino-ide-extension/src/node/grpc-progressible.ts +++ b/arduino-ide-extension/src/node/grpc-progressible.ts @@ -1,4 +1,11 @@ import { v4 } from 'uuid'; +import { + IndexType, + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, + IndexUpdateSummary, + IndexUpdateWillStartParams, +} from '../common/protocol'; import { ProgressMessage, ResponseService, @@ -11,6 +18,9 @@ import { import { DownloadProgress, TaskProgress, + DownloadProgressStart, + DownloadProgressUpdate, + DownloadProgressEnd, } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CompileResponse } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; import { @@ -81,7 +91,9 @@ namespace IndexProgressResponse { ); } export function workUnit(response: IndexProgressResponse): UnitOfWork { - return { download: response.getDownloadProgress() }; + return { + download: response.getDownloadProgress(), + }; } } /** @@ -151,7 +163,9 @@ export namespace ExecuteWithProgress { * _unknown_ progress if falsy. */ readonly progressId?: string; - readonly responseService: Partial; + readonly responseService: Partial< + ResponseService & { reportResult: (result: DownloadResult) => void } + >; } export function createDataCallback({ @@ -159,19 +173,21 @@ export namespace ExecuteWithProgress { progressId, }: ExecuteWithProgress.Options): (response: R) => void { const uuid = v4(); - let localFile = ''; - let localTotalSize = Number.NaN; + let message = ''; + let url = ''; return (response: R) => { if (DEBUG) { const json = toJson(response); if (json) { - console.log(`Progress response [${uuid}]: ${json}`); + console.debug(`[gRPC progress] Progress response [${uuid}]: ${json}`); } } const unitOfWork = resolve(response); const { task, download } = unitOfWork; if (!download && !task) { - // report a fake unknown progress. + // Report a fake unknown progress if progress ID is available. + // When a progress ID is available, a connected client is setting the progress ID. + // Hence, it's listening to progress updates. if (unitOfWork === UnitOfWork.Unknown && progressId) { if (progressId) { responseService.reportProgress?.({ @@ -187,7 +203,7 @@ export namespace ExecuteWithProgress { // Technically, it does not cause an error, but could mess up the progress reporting. // See an example of an empty object `{}` repose here: https://github.com/arduino/arduino-ide/issues/906#issuecomment-1171145630. console.warn( - "Implementation error. Neither 'download' nor 'task' is available." + `Implementation error. None of the following properties were available on the response: 'task', 'download'` ); } return; @@ -219,43 +235,32 @@ export namespace ExecuteWithProgress { } } } else if (download) { - if (download.getFile() && !localFile) { - localFile = download.getFile(); - } - if (download.getTotalSize() > 0 && Number.isNaN(localTotalSize)) { - localTotalSize = download.getTotalSize(); - } - - // This happens only once per file download. - if (download.getTotalSize() && localFile) { - responseService.appendToOutput?.({ chunk: `${localFile}\n` }); - } - - if (progressId && localFile) { - let work: ProgressMessage.Work | undefined = undefined; - if (download.getDownloaded() > 0 && !Number.isNaN(localTotalSize)) { - work = { - total: localTotalSize, - done: download.getDownloaded(), - }; - } - responseService.reportProgress?.({ - progressId, - message: `Downloading ${localFile}`, - work, - }); - } - if (download.getCompleted()) { - // Discard local state. - if (progressId && !Number.isNaN(localTotalSize)) { + const phase = phaseOf(download); + if (phase instanceof DownloadProgressStart) { + message = phase.getLabel(); + url = phase.getUrl(); + responseService.appendToOutput?.({ chunk: `${message}\n` }); + } else if (phase instanceof DownloadProgressUpdate) { + if (progressId && message) { responseService.reportProgress?.({ progressId, - message: '', - work: { done: Number.NaN, total: Number.NaN }, + message, + work: { + total: phase.getTotalSize(), + done: phase.getDownloaded(), + }, + }); + } + } else if (phase instanceof DownloadProgressEnd) { + if (url) { + responseService.reportResult?.({ + url, + message: phase.getMessage(), + success: phase.getSuccess(), }); } - localFile = ''; - localTotalSize = Number.NaN; + message = ''; + url = ''; } } }; @@ -274,31 +279,40 @@ export namespace ExecuteWithProgress { return {}; } function toJson(response: ProgressResponse): string | undefined { - let object: Record | undefined = undefined; - if (response instanceof LibraryInstallResponse) { - object = LibraryInstallResponse.toObject(false, response); - } else if (response instanceof LibraryUninstallResponse) { - object = LibraryUninstallResponse.toObject(false, response); - } else if (response instanceof ZipLibraryInstallResponse) { - object = ZipLibraryInstallResponse.toObject(false, response); - } else if (response instanceof PlatformInstallResponse) { - object = PlatformInstallResponse.toObject(false, response); - } else if (response instanceof PlatformUninstallResponse) { - object = PlatformUninstallResponse.toObject(false, response); - } else if (response instanceof UpdateIndexResponse) { - object = UpdateIndexResponse.toObject(false, response); - } else if (response instanceof UpdateLibrariesIndexResponse) { - object = UpdateLibrariesIndexResponse.toObject(false, response); - } else if (response instanceof UpdateCoreLibrariesIndexResponse) { - object = UpdateCoreLibrariesIndexResponse.toObject(false, response); - } else if (response instanceof CompileResponse) { - object = CompileResponse.toObject(false, response); + return JSON.stringify(response.toObject(false)); + } + function phaseOf( + download: DownloadProgress + ): DownloadProgressStart | DownloadProgressUpdate | DownloadProgressEnd { + let start: undefined | DownloadProgressStart = undefined; + let update: undefined | DownloadProgressUpdate = undefined; + let end: undefined | DownloadProgressEnd = undefined; + if (download.hasStart()) { + start = download.getStart(); + } else if (download.hasUpdate()) { + update = download.getUpdate(); + } else if (download.hasEnd()) { + end = download.getEnd(); + } else { + throw new Error( + `Download progress does not have a 'start', 'update', and 'end'. ${JSON.stringify( + download.toObject(false) + )}` + ); } - if (!object) { - console.warn('Unhandled gRPC response', response); - return undefined; + if (start) { + return start; + } else if (update) { + return update; + } else if (end) { + return end; + } else { + throw new Error( + `Download progress does not have a 'start', 'update', and 'end'. ${JSON.stringify( + download.toObject(false) + )}` + ); } - return JSON.stringify(object); } } @@ -306,33 +320,39 @@ export class IndexesUpdateProgressHandler { private done = 0; private readonly total: number; readonly progressId: string; + readonly results: DownloadResult[]; constructor( + private types: IndexType[], additionalUrlsCount: number, - private readonly onProgress: (progressMessage: ProgressMessage) => void, - private readonly onError?: ({ - progressId, - message, - }: { - progressId: string; - message: string; - }) => void, - private readonly onStart?: (progressId: string) => void, - private readonly onEnd?: (progressId: string) => void + private readonly options: { + onProgress: (progressMessage: ProgressMessage) => void; + onError?: (params: IndexUpdateDidFailParams) => void; + onStart?: (params: IndexUpdateWillStartParams) => void; + onComplete?: (params: IndexUpdateDidCompleteParams) => void; + } ) { this.progressId = v4(); - this.total = IndexesUpdateProgressHandler.total(additionalUrlsCount); + this.results = []; + this.total = IndexesUpdateProgressHandler.total(types, additionalUrlsCount); // Note: at this point, the IDE2 backend might not have any connected clients, so this notification is not delivered to anywhere - // Hence, clients must handle gracefully when no `willUpdate` is received before any `didProgress`. - this.onStart?.(this.progressId); + // Hence, clients must handle gracefully when no `willStart` event is received before any `didProgress`. + this.options.onStart?.({ progressId: this.progressId, types }); } reportEnd(): void { - this.onEnd?.(this.progressId); + const updatedAt = new Date().toISOString(); + this.options.onComplete?.({ + progressId: this.progressId, + summary: this.types.reduce((summary, type) => { + summary[type] = updatedAt; + return summary; + }, {} as IndexUpdateSummary), + }); } reportProgress(message: string): void { - this.onProgress({ + this.options.onProgress({ message, progressId: this.progressId, work: { total: this.total, done: ++this.done }, @@ -340,15 +360,44 @@ export class IndexesUpdateProgressHandler { } reportError(message: string): void { - this.onError?.({ progressId: this.progressId, message }); + this.options.onError?.({ + progressId: this.progressId, + message, + types: this.types, + }); } - private static total(additionalUrlsCount: number): number { - // +1 for the `package_index.tar.bz2` when updating the platform index. - const totalPlatformIndexCount = additionalUrlsCount + 1; - // The `library_index.json.gz` and `library_index.json.sig` when running the library index update. - const totalLibraryIndexCount = 2; + reportResult(result: DownloadResult): void { + this.results.push(result); + } + + private static total( + types: IndexType[], + additionalUrlsCount: number + ): number { + let total = 0; + if (types.includes('library')) { + // The `library_index.json.gz` and `library_index.json.sig` when running the library index update. + total += 2; + } + if (types.includes('platform')) { + // +1 for the `package_index.tar.bz2` when updating the platform index. + total += additionalUrlsCount + 1; + } // +1 for the `initInstance` call after the index update (`reportEnd`) - return totalPlatformIndexCount + totalLibraryIndexCount + 1; + return total + 1; + } +} + +export interface DownloadResult { + readonly url: string; + readonly success: boolean; + readonly message?: string; +} +export namespace DownloadResult { + export function isError( + arg: DownloadResult + ): arg is DownloadResult & { message: string } { + return !!arg.message && !arg.success; } } diff --git a/arduino-ide-extension/src/node/notification-service-server.ts b/arduino-ide-extension/src/node/notification-service-server.ts index 733edb336..3dc3280d7 100644 --- a/arduino-ide-extension/src/node/notification-service-server.ts +++ b/arduino-ide-extension/src/node/notification-service-server.ts @@ -8,6 +8,9 @@ import type { Config, Sketch, ProgressMessage, + IndexUpdateWillStartParams, + IndexUpdateDidCompleteParams, + IndexUpdateDidFailParams, } from '../common/protocol'; @injectable() @@ -16,8 +19,8 @@ export class NotificationServiceServerImpl { private readonly clients: NotificationServiceClient[] = []; - notifyIndexWillUpdate(progressId: string): void { - this.clients.forEach((client) => client.notifyIndexWillUpdate(progressId)); + notifyIndexUpdateWillStart(params: IndexUpdateWillStartParams): void { + this.clients.forEach((client) => client.notifyIndexUpdateWillStart(params)); } notifyIndexUpdateDidProgress(progressMessage: ProgressMessage): void { @@ -26,22 +29,16 @@ export class NotificationServiceServerImpl ); } - notifyIndexDidUpdate(progressId: string): void { - this.clients.forEach((client) => client.notifyIndexDidUpdate(progressId)); - } - - notifyIndexUpdateDidFail({ - progressId, - message, - }: { - progressId: string; - message: string; - }): void { + notifyIndexUpdateDidComplete(params: IndexUpdateDidCompleteParams): void { this.clients.forEach((client) => - client.notifyIndexUpdateDidFail({ progressId, message }) + client.notifyIndexUpdateDidComplete(params) ); } + notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void { + this.clients.forEach((client) => client.notifyIndexUpdateDidFail(params)); + } + notifyDaemonDidStart(port: string): void { this.clients.forEach((client) => client.notifyDaemonDidStart(port)); } diff --git a/i18n/en.json b/i18n/en.json index c2dfd1e07..3480a2215 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -408,6 +408,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} error: {1}" }, From 61a11a0857dd03c6057a558604fba810ac5955c0 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 5 Oct 2022 11:31:31 +0200 Subject: [PATCH 042/384] Removed `real_name` of the libraries. It has been removed from the gRPC API: arduino/arduino-cli#1890 This PR switches from `real_name` to `name` in the UI, as the `name` is the canonical form provided by the CLI. Closes #1525 Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 4 +-- .../src/common/protocol/library-service.ts | 6 ---- .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 4 --- .../cc/arduino/cli/commands/v1/lib_pb.js | 30 ------------------- .../src/node/examples-service-impl.ts | 4 +-- .../src/node/library-service-impl.ts | 4 +-- 6 files changed, 5 insertions(+), 47 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index e9bcb6a0d..a51e42af1 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -159,9 +159,9 @@ "arduino": { "cli": { "version": { - "owner": "cmaglie", + "owner": "arduino", "repo": "arduino-cli", - "commitish": "download_progress_refactor" + "commitish": "c8ff042" } }, "fwuploader": { diff --git a/arduino-ide-extension/src/common/protocol/library-service.ts b/arduino-ide-extension/src/common/protocol/library-service.ts index bd7d2bfd7..fb01356d2 100644 --- a/arduino-ide-extension/src/common/protocol/library-service.ts +++ b/arduino-ide-extension/src/common/protocol/library-service.ts @@ -162,12 +162,6 @@ export enum LibraryLocation { } export interface LibraryPackage extends ArduinoComponent { - /** - * Same as [`Library#real_name`](https://arduino.github.io/arduino-cli/latest/rpc/commands/#library). - * Should be used for the UI, and `name` is used to uniquely identify a library. It does not have an ID. - */ - readonly label: string; - /** * An array of string that should be included into the `ino` file if this library is used. * For example, including `SD` will prepend `#include ` to the `ino` file. While including `Bridge` diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts index 1437d3e0a..93c23d8f3 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 @@ -765,9 +765,6 @@ export class Library extends jspb.Message { getContainerPlatform(): string; setContainerPlatform(value: string): Library; - getRealName(): string; - setRealName(value: string): Library; - getDotALinkage(): boolean; setDotALinkage(value: boolean): Library; @@ -836,7 +833,6 @@ export namespace Library { sourceDir: string, utilityDir: string, containerPlatform: string, - realName: string, dotALinkage: boolean, precompiled: boolean, ldFlags: string, diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js index 6c9c870f1..4b3c39af4 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 @@ -5447,7 +5447,6 @@ proto.cc.arduino.cli.commands.v1.Library.toObject = function(includeInstance, ms sourceDir: jspb.Message.getFieldWithDefault(msg, 11, ""), utilityDir: jspb.Message.getFieldWithDefault(msg, 12, ""), containerPlatform: jspb.Message.getFieldWithDefault(msg, 14, ""), - realName: jspb.Message.getFieldWithDefault(msg, 16, ""), dotALinkage: jspb.Message.getBooleanFieldWithDefault(msg, 17, false), precompiled: jspb.Message.getBooleanFieldWithDefault(msg, 18, false), ldFlags: jspb.Message.getFieldWithDefault(msg, 19, ""), @@ -5548,10 +5547,6 @@ proto.cc.arduino.cli.commands.v1.Library.deserializeBinaryFromReader = function( var value = /** @type {string} */ (reader.readString()); msg.setContainerPlatform(value); break; - case 16: - var value = /** @type {string} */ (reader.readString()); - msg.setRealName(value); - break; case 17: var value = /** @type {boolean} */ (reader.readBool()); msg.setDotALinkage(value); @@ -5724,13 +5719,6 @@ proto.cc.arduino.cli.commands.v1.Library.serializeBinaryToWriter = function(mess f ); } - f = message.getRealName(); - if (f.length > 0) { - writer.writeString( - 16, - f - ); - } f = message.getDotALinkage(); if (f) { writer.writeBool( @@ -6084,24 +6072,6 @@ proto.cc.arduino.cli.commands.v1.Library.prototype.setContainerPlatform = functi }; -/** - * optional string real_name = 16; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Library.prototype.getRealName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 16, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Library} returns this - */ -proto.cc.arduino.cli.commands.v1.Library.prototype.setRealName = function(value) { - return jspb.Message.setProto3StringField(this, 16, value); -}; - - /** * optional bool dot_a_linkage = 17; * @return {boolean} diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index 1bf43c470..63860c555 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -124,11 +124,11 @@ export class ExamplesServiceImpl implements ExamplesService { * location of the examples. Otherwise it creates the example container from the direct examples FS paths. */ private async tryGroupExamples({ - label, + name, exampleUris, installDirUri, }: LibraryPackage): Promise { - const container = SketchContainer.create(label); + const container = SketchContainer.create(name); if (!installDirUri || !exampleUris.length) { return container; } diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index c7f1c28b4..bdd9631f1 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -66,7 +66,7 @@ export class LibraryServiceImpl if (installedLib.hasLibrary()) { const lib = installedLib.getLibrary(); if (lib) { - installedLibsIdx.set(lib.getRealName(), installedLib); + installedLibsIdx.set(lib.getName(), installedLib); } } } @@ -210,7 +210,6 @@ export class LibraryServiceImpl return toLibrary( { name: library.getName(), - label: library.getRealName(), installedVersion, installable: true, description: library.getSentence(), @@ -443,7 +442,6 @@ function toLibrary( ): LibraryPackage { return { name: '', - label: '', exampleUris: [], installable: false, deprecated: false, From aa0807ca3f6a92a3cdaca9bb7e59cf9be1fa0975 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 6 Oct 2022 17:37:26 +0200 Subject: [PATCH 043/384] Limit interface scale (#1502) * limit interface scale * debounce interface scale updates * limit font-size + refactor * remove excessive settings duplicate * remove useless async * fix interface scale step * change mainMenuManager visibility to private * fix menu registration * update menu actions when autoScaleInterface changes --- .../browser/arduino-ide-frontend-module.ts | 2 + .../contributions/edit-contributions.ts | 56 ----- .../browser/contributions/interface-scale.ts | 228 ++++++++++++++++++ .../dialogs/settings/settings-component.tsx | 25 +- 4 files changed, 246 insertions(+), 65 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/interface-scale.ts 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 afa5eb5ec..380c2c9ab 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -333,6 +333,7 @@ import { StartupTaskProvider } from '../electron-common/startup-task'; import { DeleteSketch } from './contributions/delete-sketch'; import { UserFields } from './contributions/user-fields'; import { UpdateIndexes } from './contributions/update-indexes'; +import { InterfaceScale } from './contributions/interface-scale'; const registerArduinoThemes = () => { const themes: MonacoThemeJson[] = [ @@ -746,6 +747,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, UserFields); Contribution.configure(bind, DeleteSketch); Contribution.configure(bind, UpdateIndexes); + Contribution.configure(bind, InterfaceScale); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window diff --git a/arduino-ide-extension/src/browser/contributions/edit-contributions.ts b/arduino-ide-extension/src/browser/contributions/edit-contributions.ts index 7c75c7225..cc1451ec3 100644 --- a/arduino-ide-extension/src/browser/contributions/edit-contributions.ts +++ b/arduino-ide-extension/src/browser/contributions/edit-contributions.ts @@ -49,30 +49,6 @@ export class EditContributions extends Contribution { registry.registerCommand(EditContributions.Commands.USE_FOR_FIND, { execute: () => this.run('editor.action.previousSelectionMatchFindAction'), }); - registry.registerCommand(EditContributions.Commands.INCREASE_FONT_SIZE, { - execute: async () => { - const settings = await this.settingsService.settings(); - if (settings.autoScaleInterface) { - settings.interfaceScale = settings.interfaceScale + 1; - } else { - settings.editorFontSize = settings.editorFontSize + 1; - } - await this.settingsService.update(settings); - await this.settingsService.save(); - }, - }); - registry.registerCommand(EditContributions.Commands.DECREASE_FONT_SIZE, { - execute: async () => { - const settings = await this.settingsService.settings(); - if (settings.autoScaleInterface) { - settings.interfaceScale = settings.interfaceScale - 1; - } else { - settings.editorFontSize = settings.editorFontSize - 1; - } - await this.settingsService.update(settings); - await this.settingsService.save(); - }, - }); /* Tools */ registry.registerCommand( EditContributions.Commands.AUTO_FORMAT, { execute: () => this.run('editor.action.formatDocument') } @@ -147,23 +123,6 @@ ${value} order: '3', }); - registry.registerMenuAction(ArduinoMenus.EDIT__FONT_CONTROL_GROUP, { - commandId: EditContributions.Commands.INCREASE_FONT_SIZE.id, - label: nls.localize( - 'arduino/editor/increaseFontSize', - 'Increase Font Size' - ), - order: '0', - }); - registry.registerMenuAction(ArduinoMenus.EDIT__FONT_CONTROL_GROUP, { - commandId: EditContributions.Commands.DECREASE_FONT_SIZE.id, - label: nls.localize( - 'arduino/editor/decreaseFontSize', - 'Decrease Font Size' - ), - order: '1', - }); - registry.registerMenuAction(ArduinoMenus.EDIT__FIND_GROUP, { commandId: EditContributions.Commands.FIND.id, label: nls.localize('vscode/findController/startFindAction', 'Find'), @@ -220,15 +179,6 @@ ${value} when: 'editorFocus', }); - registry.registerKeybinding({ - command: EditContributions.Commands.INCREASE_FONT_SIZE.id, - keybinding: 'CtrlCmd+=', - }); - registry.registerKeybinding({ - command: EditContributions.Commands.DECREASE_FONT_SIZE.id, - keybinding: 'CtrlCmd+-', - }); - registry.registerKeybinding({ command: EditContributions.Commands.FIND.id, keybinding: 'CtrlCmd+F', @@ -315,12 +265,6 @@ export namespace EditContributions { export const USE_FOR_FIND: Command = { id: 'arduino-for-find', }; - export const INCREASE_FONT_SIZE: Command = { - id: 'arduino-increase-font-size', - }; - export const DECREASE_FONT_SIZE: Command = { - id: 'arduino-decrease-font-size', - }; export const AUTO_FORMAT: Command = { id: 'arduino-auto-format', // `Auto Format` should belong to `Tool`. }; diff --git a/arduino-ide-extension/src/browser/contributions/interface-scale.ts b/arduino-ide-extension/src/browser/contributions/interface-scale.ts new file mode 100644 index 000000000..eefd1ab6e --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/interface-scale.ts @@ -0,0 +1,228 @@ +import { inject, injectable } from '@theia/core/shared/inversify'; +import { + Contribution, + Command, + MenuModelRegistry, + KeybindingRegistry, +} from './contribution'; +import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; +import { + CommandRegistry, + DisposableCollection, + MaybePromise, + nls, +} from '@theia/core/lib/common'; + +import { Settings } from '../dialogs/settings/settings'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import debounce = require('lodash.debounce'); + +@injectable() +export class InterfaceScale extends Contribution { + @inject(MenuModelRegistry) + private readonly menuRegistry: MenuModelRegistry; + + @inject(MainMenuManager) + private readonly mainMenuManager: MainMenuManager; + + private readonly menuActionsDisposables = new DisposableCollection(); + private fontScalingEnabled: InterfaceScale.FontScalingEnabled = { + increase: true, + decrease: true, + }; + + private currentSettings: Settings; + private updateSettingsDebounced = debounce( + async () => { + await this.settingsService.update(this.currentSettings); + await this.settingsService.save(); + }, + 100, + { maxWait: 200 } + ); + + override onStart(): MaybePromise { + const updateCurrent = (settings: Settings) => { + this.currentSettings = settings; + this.updateFontScalingEnabled(); + }; + this.settingsService.onDidChange((settings) => updateCurrent(settings)); + this.settingsService.settings().then((settings) => updateCurrent(settings)); + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(InterfaceScale.Commands.INCREASE_FONT_SIZE, { + execute: () => this.updateFontSize('increase'), + isEnabled: () => this.fontScalingEnabled.increase, + }); + registry.registerCommand(InterfaceScale.Commands.DECREASE_FONT_SIZE, { + execute: () => this.updateFontSize('decrease'), + isEnabled: () => this.fontScalingEnabled.decrease, + }); + } + + override registerMenus(registry: MenuModelRegistry): void { + this.menuActionsDisposables.dispose(); + const increaseFontSizeMenuAction = { + commandId: InterfaceScale.Commands.INCREASE_FONT_SIZE.id, + label: nls.localize( + 'arduino/editor/increaseFontSize', + 'Increase Font Size' + ), + order: '0', + }; + const decreaseFontSizeMenuAction = { + commandId: InterfaceScale.Commands.DECREASE_FONT_SIZE.id, + label: nls.localize( + 'arduino/editor/decreaseFontSize', + 'Decrease Font Size' + ), + order: '1', + }; + + if (this.fontScalingEnabled.increase) { + this.menuActionsDisposables.push( + registry.registerMenuAction( + ArduinoMenus.EDIT__FONT_CONTROL_GROUP, + increaseFontSizeMenuAction + ) + ); + } else { + this.menuActionsDisposables.push( + registry.registerMenuNode( + ArduinoMenus.EDIT__FONT_CONTROL_GROUP, + new PlaceholderMenuNode( + ArduinoMenus.EDIT__FONT_CONTROL_GROUP, + increaseFontSizeMenuAction.label, + { order: increaseFontSizeMenuAction.order } + ) + ) + ); + } + if (this.fontScalingEnabled.decrease) { + this.menuActionsDisposables.push( + this.menuRegistry.registerMenuAction( + ArduinoMenus.EDIT__FONT_CONTROL_GROUP, + decreaseFontSizeMenuAction + ) + ); + } else { + this.menuActionsDisposables.push( + this.menuRegistry.registerMenuNode( + ArduinoMenus.EDIT__FONT_CONTROL_GROUP, + new PlaceholderMenuNode( + ArduinoMenus.EDIT__FONT_CONTROL_GROUP, + decreaseFontSizeMenuAction.label, + { order: decreaseFontSizeMenuAction.order } + ) + ) + ); + } + this.mainMenuManager.update(); + } + + private updateFontScalingEnabled(): void { + let fontScalingEnabled = { + increase: true, + decrease: true, + }; + + if (this.currentSettings.autoScaleInterface) { + fontScalingEnabled = { + increase: + this.currentSettings.interfaceScale + InterfaceScale.ZoomLevel.STEP <= + InterfaceScale.ZoomLevel.MAX, + decrease: + this.currentSettings.interfaceScale - InterfaceScale.ZoomLevel.STEP >= + InterfaceScale.ZoomLevel.MIN, + }; + } else { + fontScalingEnabled = { + increase: + this.currentSettings.editorFontSize + InterfaceScale.FontSize.STEP <= + InterfaceScale.FontSize.MAX, + decrease: + this.currentSettings.editorFontSize - InterfaceScale.FontSize.STEP >= + InterfaceScale.FontSize.MIN, + }; + } + + const isChanged = Object.keys(fontScalingEnabled).some( + (key: keyof InterfaceScale.FontScalingEnabled) => + fontScalingEnabled[key] !== this.fontScalingEnabled[key] + ); + if (isChanged) { + this.fontScalingEnabled = fontScalingEnabled; + this.registerMenus(this.menuRegistry); + } + } + + private updateFontSize(mode: 'increase' | 'decrease'): void { + if (this.currentSettings.autoScaleInterface) { + mode === 'increase' + ? (this.currentSettings.interfaceScale += InterfaceScale.ZoomLevel.STEP) + : (this.currentSettings.interfaceScale -= + InterfaceScale.ZoomLevel.STEP); + } else { + mode === 'increase' + ? (this.currentSettings.editorFontSize += InterfaceScale.FontSize.STEP) + : (this.currentSettings.editorFontSize -= InterfaceScale.FontSize.STEP); + } + this.updateFontScalingEnabled(); + this.updateSettingsDebounced(); + } + + override registerKeybindings(registry: KeybindingRegistry): void { + registry.registerKeybinding({ + command: InterfaceScale.Commands.INCREASE_FONT_SIZE.id, + keybinding: 'CtrlCmd+=', + }); + registry.registerKeybinding({ + command: InterfaceScale.Commands.DECREASE_FONT_SIZE.id, + keybinding: 'CtrlCmd+-', + }); + } +} + +export namespace InterfaceScale { + export namespace Commands { + export const INCREASE_FONT_SIZE: Command = { + id: 'arduino-increase-font-size', + }; + export const DECREASE_FONT_SIZE: Command = { + id: 'arduino-decrease-font-size', + }; + } + + export namespace ZoomLevel { + export const MIN = -8; + export const MAX = 9; + export const STEP = 1; + + export function toPercentage(scale: number): number { + return scale * 20 + 100; + } + export function fromPercentage(percentage: number): number { + return (percentage - 100) / 20; + } + export namespace Step { + export function toPercentage(step: number): number { + return step * 20; + } + export function fromPercentage(percentage: number): number { + return percentage / 20; + } + } + } + + export namespace FontSize { + export const MIN = 8; + export const MAX = 72; + export const STEP = 2; + } + + export interface FontScalingEnabled { + increase: boolean; + decrease: boolean; + } +} diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index dac80d61c..bbc73b8c3 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -23,14 +23,22 @@ import { LanguageInfo, } from '@theia/core/lib/common/i18n/localization'; import SettingsStepInput from './settings-step-input'; +import { InterfaceScale } from '../../contributions/interface-scale'; + +const maxScale = InterfaceScale.ZoomLevel.toPercentage( + InterfaceScale.ZoomLevel.MAX +); +const minScale = InterfaceScale.ZoomLevel.toPercentage( + InterfaceScale.ZoomLevel.MIN +); +const scaleStep = InterfaceScale.ZoomLevel.Step.toPercentage( + InterfaceScale.ZoomLevel.STEP +); + +const maxFontSize = InterfaceScale.FontSize.MAX; +const minFontSize = InterfaceScale.FontSize.MIN; +const fontSizeStep = InterfaceScale.FontSize.STEP; -const maxScale = 280; -const minScale = -60; -const scaleStep = 20; - -const maxFontSize = 72; -const minFontSize = 0; -const fontSizeStep = 2; export class SettingsComponent extends React.Component< SettingsComponent.Props, SettingsComponent.State @@ -554,8 +562,7 @@ export class SettingsComponent extends React.Component< }; private setInterfaceScale = (percentage: number) => { - const interfaceScale = (percentage - 100) / 20; - + const interfaceScale = InterfaceScale.ZoomLevel.fromPercentage(percentage); this.setState({ interfaceScale }); }; From 019b2d5588b917c1d486c89e41d42399b66ff153 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 5 Oct 2022 15:27:29 +0200 Subject: [PATCH 044/384] Avoid using `reportResult` if installing lib/core Closes #1529 Signed-off-by: Akos Kitta --- .../src/node/core-client-provider.ts | 2 +- arduino-ide-extension/src/node/grpc-progressible.ts | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 1686be1be..bb1251103 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -370,8 +370,8 @@ export class CoreClientProvider { ); progressHandler?.reportProgress(message); }, - reportResult: (result) => progressHandler?.reportResult(result), }, + reportResult: (result) => progressHandler?.reportResult(result), progressId, }) ) diff --git a/arduino-ide-extension/src/node/grpc-progressible.ts b/arduino-ide-extension/src/node/grpc-progressible.ts index edd04cd85..7b131f0f2 100644 --- a/arduino-ide-extension/src/node/grpc-progressible.ts +++ b/arduino-ide-extension/src/node/grpc-progressible.ts @@ -163,14 +163,17 @@ export namespace ExecuteWithProgress { * _unknown_ progress if falsy. */ readonly progressId?: string; - readonly responseService: Partial< - ResponseService & { reportResult: (result: DownloadResult) => void } - >; + readonly responseService: Partial; + /** + * It's only relevant for index updates to build a summary of possible client (4xx) and server (5xx) errors when downloading the files during the index update. It's missing for lib/platform installations. + */ + readonly reportResult?: (result: DownloadResult) => void; } export function createDataCallback({ responseService, progressId, + reportResult, }: ExecuteWithProgress.Options): (response: R) => void { const uuid = v4(); let message = ''; @@ -252,8 +255,8 @@ export namespace ExecuteWithProgress { }); } } else if (phase instanceof DownloadProgressEnd) { - if (url) { - responseService.reportResult?.({ + if (url && reportResult) { + reportResult({ url, message: phase.getMessage(), success: phase.getSuccess(), From 0c49709f26c20ae68d0f708394d9227a6292b082 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 21 Sep 2022 18:41:46 +0200 Subject: [PATCH 045/384] Link resolved for lib/boards manager. Closes #1442 Signed-off-by: Akos Kitta --- .../browser/arduino-ide-frontend-module.ts | 3 + .../boards-widget-frontend-contribution.ts | 18 ++- .../library-widget-frontend-contribution.ts | 36 +++-- .../list-widget-frontend-contribution.ts | 53 ++++++- .../src/common/protocol/boards-service.ts | 50 ++++++- .../src/common/protocol/library-service.ts | 68 ++++++++- .../src/common/protocol/searchable.ts | 22 +++ .../src/test/common/searchable.test.ts | 136 ++++++++++++++++++ 8 files changed, 359 insertions(+), 27 deletions(-) create mode 100644 arduino-ide-extension/src/test/common/searchable.test.ts 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 380c2c9ab..5e87af4fc 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -334,6 +334,7 @@ import { DeleteSketch } from './contributions/delete-sketch'; import { UserFields } from './contributions/user-fields'; import { UpdateIndexes } from './contributions/update-indexes'; import { InterfaceScale } from './contributions/interface-scale'; +import { OpenHandler } from '@theia/core/lib/browser/opener-service'; const registerArduinoThemes = () => { const themes: MonacoThemeJson[] = [ @@ -398,6 +399,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(FrontendApplicationContribution).toService( LibraryListWidgetFrontendContribution ); + bind(OpenHandler).toService(LibraryListWidgetFrontendContribution); // Sketch list service bind(SketchesService) @@ -464,6 +466,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(FrontendApplicationContribution).toService( BoardsListWidgetFrontendContribution ); + bind(OpenHandler).toService(BoardsListWidgetFrontendContribution); // Board select dialog bind(BoardsConfigDialogWidget).toSelf().inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts index a6e535d6f..c64d08690 100644 --- a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts @@ -1,10 +1,11 @@ import { injectable } from '@theia/core/shared/inversify'; -import { BoardsListWidget } from './boards-list-widget'; -import type { +import { BoardSearch, BoardsPackage, } from '../../common/protocol/boards-service'; +import { URI } from '../contributions/contribution'; import { ListWidgetFrontendContribution } from '../widgets/component-list/list-widget-frontend-contribution'; +import { BoardsListWidget } from './boards-list-widget'; @injectable() export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendContribution< @@ -24,7 +25,16 @@ export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendCont }); } - override async initializeLayout(): Promise { - this.openView(); + protected canParse(uri: URI): boolean { + try { + BoardSearch.UriParser.parse(uri); + return true; + } catch { + return false; + } + } + + protected parse(uri: URI): BoardSearch | undefined { + return BoardSearch.UriParser.parse(uri); } } diff --git a/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts index 37a3b0679..74d5de4a4 100644 --- a/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts @@ -1,16 +1,17 @@ +import { nls } from '@theia/core/lib/common'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { injectable } from '@theia/core/shared/inversify'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; -import { MenuModelRegistry } from '@theia/core'; -import { LibraryListWidget } from './library-list-widget'; +import { LibraryPackage, LibrarySearch } from '../../common/protocol'; +import { URI } from '../contributions/contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { nls } from '@theia/core/lib/common'; +import { ListWidgetFrontendContribution } from '../widgets/component-list/list-widget-frontend-contribution'; +import { LibraryListWidget } from './library-list-widget'; @injectable() -export class LibraryListWidgetFrontendContribution - extends AbstractViewContribution - implements FrontendApplicationContribution -{ +export class LibraryListWidgetFrontendContribution extends ListWidgetFrontendContribution< + LibraryPackage, + LibrarySearch +> { constructor() { super({ widgetId: LibraryListWidget.WIDGET_ID, @@ -24,10 +25,6 @@ export class LibraryListWidgetFrontendContribution }); } - async initializeLayout(): Promise { - this.openView(); - } - override registerMenus(menus: MenuModelRegistry): void { if (this.toggleCommand) { menus.registerMenuAction(ArduinoMenus.TOOLS__MAIN_GROUP, { @@ -40,4 +37,17 @@ export class LibraryListWidgetFrontendContribution }); } } + + protected canParse(uri: URI): boolean { + try { + LibrarySearch.UriParser.parse(uri); + return true; + } catch { + return false; + } + } + + protected parse(uri: URI): LibrarySearch | undefined { + return LibrarySearch.UriParser.parse(uri); + } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts index 6ec22ddfd..56dec744d 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts @@ -1,9 +1,15 @@ -import { injectable } from '@theia/core/shared/inversify'; import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { + OpenerOptions, + OpenHandler, +} from '@theia/core/lib/browser/opener-service'; import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { URI } from '@theia/core/lib/common/uri'; +import { injectable } from '@theia/core/shared/inversify'; +import { Searchable } from '../../../common/protocol'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { ListWidget } from './list-widget'; -import { Searchable } from '../../../common/protocol'; @injectable() export abstract class ListWidgetFrontendContribution< @@ -11,14 +17,49 @@ export abstract class ListWidgetFrontendContribution< S extends Searchable.Options > extends AbstractViewContribution> - implements FrontendApplicationContribution + implements FrontendApplicationContribution, OpenHandler { + readonly id: string = `http-opener-${this.viewId}`; + async initializeLayout(): Promise { - // TS requires at least one method from `FrontendApplicationContribution`. - // Expected to be empty. + this.openView(); } - override registerMenus(): void { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + override registerMenus(_: MenuModelRegistry): void { // NOOP } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + canHandle(uri: URI, _?: OpenerOptions): number { + // `500` is the default HTTP opener in Theia. IDE2 has higher priority. + // https://github.com/eclipse-theia/theia/blob/b75b6144b0ffea06a549294903c374fa642135e4/packages/core/src/browser/http-open-handler.ts#L39 + return this.canParse(uri) ? 501 : 0; + } + + async open( + uri: URI, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _?: OpenerOptions | undefined + ): Promise { + const searchOptions = this.parse(uri); + if (!searchOptions) { + console.warn( + `Failed to parse URI into a search options. URI: ${uri.toString()}` + ); + return; + } + const widget = await this.openView({ + activate: true, + reveal: true, + }); + if (!widget) { + console.warn(`Failed to open view for URI: ${uri.toString()}`); + return; + } + widget.refresh(searchOptions); + } + + protected abstract canParse(uri: URI): boolean; + protected abstract parse(uri: URI): S | undefined; } diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index 763fc9bd6..f8c1b085f 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -3,7 +3,14 @@ import { Searchable } from './searchable'; import { Installable } from './installable'; import { ArduinoComponent } from './arduino-component'; import { nls } from '@theia/core/lib/common/nls'; -import { All, Contributed, Partner, Type, Updatable } from '../nls'; +import { + All, + Contributed, + Partner, + Type as TypeLabel, + Updatable, +} from '../nls'; +import URI from '@theia/core/lib/common/uri'; export type AvailablePorts = Record]>; export namespace AvailablePorts { @@ -151,6 +158,7 @@ export interface BoardSearch extends Searchable.Options { readonly type?: BoardSearch.Type; } export namespace BoardSearch { + export const Default: BoardSearch = { type: 'All' }; export const TypeLiterals = [ 'All', 'Updatable', @@ -161,6 +169,11 @@ export namespace BoardSearch { 'Arduino@Heart', ] as const; export type Type = typeof TypeLiterals[number]; + export namespace Type { + export function is(arg: unknown): arg is Type { + return typeof arg === 'string' && TypeLiterals.includes(arg as Type); + } + } export const TypeLabels: Record = { All: All, Updatable: Updatable, @@ -177,8 +190,41 @@ export namespace BoardSearch { keyof Omit, string > = { - type: Type, + type: TypeLabel, }; + export namespace UriParser { + export const authority = 'boardsmanager'; + export function parse(uri: URI): BoardSearch | undefined { + if (uri.scheme !== 'http') { + throw new Error( + `Invalid 'scheme'. Expected 'http'. URI was: ${uri.toString()}.` + ); + } + if (uri.authority !== authority) { + throw new Error( + `Invalid 'authority'. Expected: '${authority}'. URI was: ${uri.toString()}.` + ); + } + const segments = Searchable.UriParser.normalizedSegmentsOf(uri); + if (segments.length !== 1) { + return undefined; + } + let searchOptions: BoardSearch | undefined = undefined; + const [type] = segments; + if (!type) { + searchOptions = BoardSearch.Default; + } else if (BoardSearch.Type.is(type)) { + searchOptions = { type }; + } + if (searchOptions) { + return { + ...searchOptions, + ...Searchable.UriParser.parseQuery(uri), + }; + } + return undefined; + } + } } export interface Port { diff --git a/arduino-ide-extension/src/common/protocol/library-service.ts b/arduino-ide-extension/src/common/protocol/library-service.ts index fb01356d2..4a20aae21 100644 --- a/arduino-ide-extension/src/common/protocol/library-service.ts +++ b/arduino-ide-extension/src/common/protocol/library-service.ts @@ -8,9 +8,10 @@ import { Partner, Recommended, Retired, - Type, + Type as TypeLabel, Updatable, } from '../nls'; +import URI from '@theia/core/lib/common/uri'; export const LibraryServicePath = '/services/library-service'; export const LibraryService = Symbol('LibraryService'); @@ -55,6 +56,7 @@ export interface LibrarySearch extends Searchable.Options { readonly topic?: LibrarySearch.Topic; } export namespace LibrarySearch { + export const Default: LibrarySearch = { type: 'All', topic: 'All' }; export const TypeLiterals = [ 'All', 'Updatable', @@ -66,6 +68,11 @@ export namespace LibrarySearch { 'Retired', ] as const; export type Type = typeof TypeLiterals[number]; + export namespace Type { + export function is(arg: unknown): arg is Type { + return typeof arg === 'string' && TypeLiterals.includes(arg as Type); + } + } export const TypeLabels: Record = { All: All, Updatable: Updatable, @@ -90,6 +97,11 @@ export namespace LibrarySearch { 'Uncategorized', ] as const; export type Topic = typeof TopicLiterals[number]; + export namespace Topic { + export function is(arg: unknown): arg is Topic { + return typeof arg === 'string' && TopicLiterals.includes(arg as Topic); + } + } export const TopicLabels: Record = { All: All, Communication: nls.localize( @@ -126,8 +138,60 @@ export namespace LibrarySearch { string > = { topic: nls.localize('arduino/librarySearchProperty/topic', 'Topic'), - type: Type, + type: TypeLabel, }; + export namespace UriParser { + export const authority = 'librarymanager'; + export function parse(uri: URI): LibrarySearch | undefined { + if (uri.scheme !== 'http') { + throw new Error( + `Invalid 'scheme'. Expected 'http'. URI was: ${uri.toString()}.` + ); + } + if (uri.authority !== authority) { + throw new Error( + `Invalid 'authority'. Expected: '${authority}'. URI was: ${uri.toString()}.` + ); + } + const segments = Searchable.UriParser.normalizedSegmentsOf(uri); + // Special magic handling for `Signal Input/Output`. + // TODO: IDE2 deserves a better lib/boards URL spec. + // https://github.com/arduino/arduino-ide/issues/1442#issuecomment-1252136377 + if (segments.length === 3) { + const [type, topicHead, topicTail] = segments; + const maybeTopic = `${topicHead}/${topicTail}`; + if ( + LibrarySearch.Topic.is(maybeTopic) && + maybeTopic === 'Signal Input/Output' && + LibrarySearch.Type.is(type) + ) { + return { + type, + topic: maybeTopic, + ...Searchable.UriParser.parseQuery(uri), + }; + } + } + let searchOptions: LibrarySearch | undefined = undefined; + const [type, topic] = segments; + if (!type && !topic) { + searchOptions = LibrarySearch.Default; + } else if (LibrarySearch.Type.is(type)) { + if (!topic) { + searchOptions = { ...LibrarySearch.Default, type }; + } else if (LibrarySearch.Topic.is(topic)) { + searchOptions = { type, topic }; + } + } + if (searchOptions) { + return { + ...searchOptions, + ...Searchable.UriParser.parseQuery(uri), + }; + } + return undefined; + } + } } export namespace LibraryService { diff --git a/arduino-ide-extension/src/common/protocol/searchable.ts b/arduino-ide-extension/src/common/protocol/searchable.ts index af6a2c02e..30d3cd2dd 100644 --- a/arduino-ide-extension/src/common/protocol/searchable.ts +++ b/arduino-ide-extension/src/common/protocol/searchable.ts @@ -1,3 +1,5 @@ +import URI from '@theia/core/lib/common/uri'; + export interface Searchable { search(options: O): Promise; } @@ -8,4 +10,24 @@ export namespace Searchable { */ readonly query?: string; } + export namespace UriParser { + /** + * Parses the `URI#fragment` into a query term. + */ + export function parseQuery(uri: URI): { query: string } { + return { query: uri.fragment }; + } + /** + * Splits the `URI#path#toString` on the `/` POSIX separator into decoded segments. The first, empty segment representing the root is omitted. + * Examples: + * - `/` -> `['']` + * - `/All` -> `['All']` + * - `/All/Device%20Control` -> `['All', 'Device Control']` + * - `/All/Display` -> `['All', 'Display']` + * - `/Updatable/Signal%20Input%2FOutput` -> `['Updatable', 'Signal Input', 'Output']` (**caveat**!) + */ + export function normalizedSegmentsOf(uri: URI): string[] { + return uri.path.toString().split('/').slice(1).map(decodeURIComponent); + } + } } diff --git a/arduino-ide-extension/src/test/common/searchable.test.ts b/arduino-ide-extension/src/test/common/searchable.test.ts new file mode 100644 index 000000000..e302d574d --- /dev/null +++ b/arduino-ide-extension/src/test/common/searchable.test.ts @@ -0,0 +1,136 @@ +import URI from '@theia/core/lib/common/uri'; +import { expect } from 'chai'; +import { BoardSearch, LibrarySearch, Searchable } from '../../common/protocol'; + +interface Expectation { + readonly uri: string; + readonly expected: S | undefined | string; +} + +describe('searchable', () => { + describe('parse', () => { + describe(BoardSearch.UriParser.authority, () => { + ( + [ + { + uri: 'http://boardsmanager#SAMD', + expected: { query: 'SAMD', type: 'All' }, + }, + { + uri: 'http://boardsmanager/Arduino%40Heart#littleBits', + expected: { query: 'littleBits', type: 'Arduino@Heart' }, + }, + { + uri: 'http://boardsmanager/too/many/segments#invalidPath', + expected: undefined, + }, + { + uri: 'http://boardsmanager/random#invalidPath', + expected: undefined, + }, + { + uri: 'https://boardsmanager/#invalidScheme', + expected: `Invalid 'scheme'. Expected 'http'. URI was: https://boardsmanager/#invalidScheme.`, + }, + { + uri: 'http://librarymanager/#invalidAuthority', + expected: `Invalid 'authority'. Expected: 'boardsmanager'. URI was: http://librarymanager/#invalidAuthority.`, + }, + ] as Expectation[] + ).map((expectation) => toIt(expectation, BoardSearch.UriParser.parse)); + }); + describe(LibrarySearch.UriParser.authority, () => { + ( + [ + { + uri: 'http://librarymanager#WiFiNINA', + expected: { query: 'WiFiNINA', type: 'All', topic: 'All' }, + }, + { + uri: 'http://librarymanager/All/Device%20Control#Servo', + expected: { + query: 'Servo', + type: 'All', + topic: 'Device Control', + }, + }, + { + uri: 'http://librarymanager/All/Display#SparkFun', + expected: { + query: 'SparkFun', + type: 'All', + topic: 'Display', + }, + }, + { + uri: 'http://librarymanager/Updatable/Display#SparkFun', + expected: { + query: 'SparkFun', + type: 'Updatable', + topic: 'Display', + }, + }, + { + uri: 'http://librarymanager/All/Signal%20Input%2FOutput#debouncer', + expected: { + query: 'debouncer', + type: 'All', + topic: 'Signal Input/Output', + }, + }, + { + uri: 'http://librarymanager/too/many/segments#invalidPath', + expected: undefined, + }, + { + uri: 'http://librarymanager/absent/invalid#invalidPath', + expected: undefined, + }, + { + uri: 'https://librarymanager/#invalidScheme', + expected: `Invalid 'scheme'. Expected 'http'. URI was: https://librarymanager/#invalidScheme.`, + }, + { + uri: 'http://boardsmanager/#invalidAuthority', + expected: `Invalid 'authority'. Expected: 'librarymanager'. URI was: http://boardsmanager/#invalidAuthority.`, + }, + ] as Expectation[] + ).map((expectation) => toIt(expectation, LibrarySearch.UriParser.parse)); + }); + }); +}); + +function toIt( + { uri, expected }: Expectation, + run: (uri: URI) => Searchable.Options | undefined +): Mocha.Test { + return it(`should ${ + typeof expected === 'string' + ? `fail to parse '${uri}'` + : !expected + ? `not parse '${uri}'` + : `parse '${uri}' to ${JSON.stringify(expected)}` + }`, () => { + if (typeof expected === 'string') { + try { + run(new URI(uri)); + expect.fail( + `Expected an error with message '${expected}' when parsing URI: ${uri}.` + ); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal(expected); + } + } else { + const actual = run(new URI(uri)); + if (!expected) { + expect(actual).to.be.undefined; + } else { + expect(actual).to.be.deep.equal( + expected, + `Was: ${JSON.stringify(actual)}` + ); + } + } + }); +} From 1e269ac83dd5437229677a6ea5d1f65e95727eeb Mon Sep 17 00:00:00 2001 From: r3inbowari Date: Fri, 7 Oct 2022 16:43:45 +0800 Subject: [PATCH 046/384] Fix status bar clipped in minimal state (#1517) --- arduino-ide-extension/src/browser/style/index.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index a308deebc..7fb70f166 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -55,7 +55,8 @@ /* Makes the sidepanel a bit wider when opening the widget */ .p-DockPanel-widget { min-width: 200px; - min-height: 200px; + min-height: 20px; + height: 200px; } /* Overrule the default Theia CSS button styles. */ From 2d2be1f6d0346323083dca5a43651f12e6df886e Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 5 Oct 2022 14:28:15 +0200 Subject: [PATCH 047/384] Ensure exact match when installing Arduino_BuiltIn on the first IDE2 startup. Closes #1526 Signed-off-by: Akos Kitta --- .../src/browser/contributions/first-startup-installer.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts b/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts index f564bec2d..f55c4fe1e 100644 --- a/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts +++ b/arduino-ide-extension/src/browser/contributions/first-startup-installer.ts @@ -7,6 +7,8 @@ import { } from '../../common/protocol'; import { Contribution } from './contribution'; +const Arduino_BuiltIn = 'Arduino_BuiltIn'; + @injectable() export class FirstStartupInstaller extends Contribution { @inject(LocalStorageService) @@ -25,8 +27,8 @@ export class FirstStartupInstaller extends Contribution { id: 'arduino:avr', }); const builtInLibrary = ( - await this.libraryService.search({ query: 'Arduino_BuiltIn' }) - )[0]; + await this.libraryService.search({ query: Arduino_BuiltIn }) + ).find(({ name }) => name === Arduino_BuiltIn); // Filter by `name` to ensure "exact match". See: https://github.com/arduino/arduino-ide/issues/1526. let avrPackageError: Error | undefined; let builtInLibraryError: Error | undefined; @@ -84,7 +86,7 @@ export class FirstStartupInstaller extends Contribution { } if (builtInLibraryError) { this.messageService.error( - `Could not install ${builtInLibrary.name} library: ${builtInLibraryError}` + `Could not install ${Arduino_BuiltIn} library: ${builtInLibraryError}` ); } From 5444395f34cc4c33e6e09835ba98107b8b31d284 Mon Sep 17 00:00:00 2001 From: dankeboy36 Date: Tue, 27 Sep 2022 22:32:10 +0200 Subject: [PATCH 048/384] Better tooltips. fixes #1503 Signed-off-by: dankeboy36 --- arduino-ide-extension/src/browser/style/main.css | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index ede6c726c..4ebda8c43 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -11,7 +11,7 @@ #theia-main-content-panel div[id^="code-editor-opener"] { z-index: auto; } - + .p-TabBar-toolbar .item.arduino-tool-item { margin-left: 0; } @@ -97,8 +97,7 @@ display: flex; justify-content: center; align-items: center; - background-color: var(--theia-titleBar-activeBackground); - + background-color: var(--theia-titleBar-activeBackground); } #arduino-toolbar-container { @@ -253,3 +252,10 @@ outline: 1px solid var(--theia-contrastBorder); outline-offset: -1px; } + +.monaco-hover p { + margin: 8px 0; +} +.monaco-hover .monaco-tokenized-source { + margin-top: 8px; +} From bc264d1adfd525778c45a0fc1414efc51d8eccff Mon Sep 17 00:00:00 2001 From: dankeboy36 Date: Thu, 6 Oct 2022 20:52:40 +0200 Subject: [PATCH 049/384] Apply margin adjustments to the first hover row Signed-off-by: dankeboy36 --- arduino-ide-extension/src/browser/style/main.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 4ebda8c43..438277dee 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -253,9 +253,9 @@ outline-offset: -1px; } -.monaco-hover p { - margin: 8px 0; +.monaco-hover .hover-row.markdown-hover:first-child p { + margin-top: 8px; } -.monaco-hover .monaco-tokenized-source { +.monaco-hover .hover-row.markdown-hover:first-child .monaco-tokenized-source { margin-top: 8px; } From f3ef95cfe24f11612dc2029fbd9b71a48125f0dc Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:05:29 +0200 Subject: [PATCH 050/384] Retain installation interface using version menu (#1471) --- arduino-ide-extension/src/browser/style/list-widget.css | 4 ++-- .../widgets/component-list/component-list-item.tsx | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index 843be61f9..d14d31004 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -133,7 +133,7 @@ flex-direction: column-reverse; } -.component-list-item:hover .footer > * { +.component-list-item .footer > * { display: inline-block; margin: 5px 0px 0px 10px; } @@ -162,4 +162,4 @@ .hc-black.hc-theia.theia-hc .component-list-item .header .installed:before { border: 1px solid var(--theia-button-border); -} \ No newline at end of file +} diff --git a/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx b/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx index 950df64bd..2024d48a7 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 @@ -15,6 +15,7 @@ export class ComponentListItem< this.state = { selectedVersion: version, focus: false, + versionUpdate: false, }; } } @@ -33,7 +34,9 @@ export class ComponentListItem< return (
this.setState({ focus: true })} - onMouseLeave={() => this.setState({ focus: false })} + onMouseLeave={() => { + if (!this.state.versionUpdate) this.setState({ focus: false }); + }} > {itemRenderer.renderItem( Object.assign(this.state, { item }), @@ -52,6 +55,7 @@ export class ComponentListItem< )[0]; this.setState({ selectedVersion: version, + versionUpdate: false, }); try { await this.props.install(item, toInstall); @@ -67,7 +71,7 @@ export class ComponentListItem< } private onVersionChange(version: Installable.Version): void { - this.setState({ selectedVersion: version }); + this.setState({ selectedVersion: version, versionUpdate: true }); } } @@ -83,5 +87,6 @@ export namespace ComponentListItem { export interface State { selectedVersion?: Installable.Version; focus: boolean; + versionUpdate: boolean; } } From e577de4e8e8a3682ea4422fdb38658eb30628375 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:07:54 +0200 Subject: [PATCH 051/384] Put Arduino libs and platforms on top of the Library/Boards Manager (#1541) --- .../filterable-list-container.tsx | 19 ++------- .../widgets/component-list/list-widget.tsx | 42 ++++++++++++++++++- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index 20b5f317f..3702d092c 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 @@ -111,19 +111,7 @@ export class FilterableListContainer< const { searchable } = this.props; searchable .search(searchOptions) - .then((items) => this.setState({ items: this.sort(items) })); - } - - protected sort(items: T[]): T[] { - const { itemLabel, itemDeprecated } = this.props; - return items.sort((left, right) => { - // always put deprecated items at the bottom of the list - if (itemDeprecated(left)) { - return 1; - } - - return itemLabel(left).localeCompare(itemLabel(right)); - }); + .then((items) => this.setState({ items: this.props.sort(items) })); } protected async install( @@ -139,7 +127,7 @@ export class FilterableListContainer< run: ({ progressId }) => install({ item, progressId, version }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items: this.sort(items) }); + this.setState({ items: this.props.sort(items) }); } protected async uninstall(item: T): Promise { @@ -167,7 +155,7 @@ export class FilterableListContainer< run: ({ progressId }) => uninstall({ item, progressId }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items: this.sort(items) }); + this.setState({ items: this.props.sort(items) }); } } @@ -204,6 +192,7 @@ export namespace FilterableListContainer { progressId: string; }) => Promise; readonly commandService: CommandService; + readonly sort: (items: T[]) => T[]; } export interface State { 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 7e81c9b40..a27fa3cdc 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 @@ -51,9 +51,11 @@ export abstract class ListWidget< */ protected firstActivate = true; + protected readonly defaultSortComparator: (left: T, right: T) => number; + constructor(protected options: ListWidget.Options) { super(); - const { id, label, iconClass } = options; + const { id, label, iconClass, itemDeprecated, itemLabel } = options; this.id = id; this.title.label = label; this.title.caption = label; @@ -63,12 +65,23 @@ export abstract class ListWidget< this.node.tabIndex = 0; // To be able to set the focus on the widget. this.scrollOptions = undefined; this.toDispose.push(this.searchOptionsChangeEmitter); + + this.defaultSortComparator = (left, right): number => { + // always put deprecated items at the bottom of the list + if (itemDeprecated(left)) { + return 1; + } + + return itemLabel(left).localeCompare(itemLabel(right)); + }; } @postConstruct() protected init(): void { this.toDispose.pushAll([ - this.notificationCenter.onIndexUpdateDidComplete(() => this.refresh(undefined)), + this.notificationCenter.onIndexUpdateDidComplete(() => + this.refresh(undefined) + ), this.notificationCenter.onDaemonDidStart(() => this.refresh(undefined)), this.notificationCenter.onDaemonDidStop(() => this.refresh(undefined)), ]); @@ -128,6 +141,30 @@ export abstract class ListWidget< return this.options.installable.uninstall({ item, progressId }); } + protected filterableListSort = (items: T[]): T[] => { + const isArduinoTypeComparator = (left: T, right: T) => { + const aIsArduinoType = left.types.includes('Arduino'); + const bIsArduinoType = right.types.includes('Arduino'); + + if (aIsArduinoType && !bIsArduinoType && !left.deprecated) { + return -1; + } + + if (!aIsArduinoType && bIsArduinoType && !right.deprecated) { + return 1; + } + + return 0; + }; + + return items.sort((left, right) => { + return ( + isArduinoTypeComparator(left, right) || + this.defaultSortComparator(left, right) + ); + }); + }; + render(): React.ReactNode { return ( @@ -145,6 +182,7 @@ export abstract class ListWidget< messageService={this.messageService} commandService={this.commandService} responseService={this.responseService} + sort={this.filterableListSort} /> ); } From 960a2d0634d22d5db53b69ecbc1d97d91a1dcf20 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Mon, 17 Oct 2022 10:03:41 +0200 Subject: [PATCH 052/384] Fix boards listing (#1520) * Fix boards listing * use arduio-cli sorting fix * re-use code to handle board list response * change `handleListBoards` visibility to `private` * pad menu items order with leading zeros to fix alphanumeric order --- .../boards/boards-data-menu-updater.ts | 2 +- .../browser/contributions/board-selection.ts | 33 +++++++++++-------- .../browser/contributions/sketch-control.ts | 2 +- .../src/common/protocol/boards-service.ts | 1 + .../src/node/boards-service-impl.ts | 24 +++++++++++++- 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts index 5f1c42e51..192c32d78 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts @@ -111,7 +111,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { const { label } = commands.get(commandId)!; this.menuRegistry.registerMenuAction(menuPath, { commandId, - order: `${i}`, + order: String(i).padStart(4), label, }); return Disposable.create(() => diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 037587d99..0b468144d 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -199,14 +199,15 @@ PID: ${PID}`; }); // Installed boards - for (const board of installedBoards) { + installedBoards.forEach((board, index) => { const { packageId, packageName, fqbn, name, manuallyInstalled } = board; const packageLabel = packageName + - `${manuallyInstalled - ? nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)') - : '' + `${ + manuallyInstalled + ? nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)') + : '' }`; // Platform submenu const platformMenuPath = [...boardsPackagesGroup, packageId]; @@ -239,14 +240,18 @@ PID: ${PID}`; }; // Board menu - const menuAction = { commandId: id, label: name }; + 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 const registerPorts = ( @@ -282,11 +287,13 @@ PID: ${PID}`; // First we show addresses with recognized boards connected, // then all the rest. - const sortedIDs = Object.keys(ports).sort((left: string, right: string): number => { - const [, leftBoards] = ports[left]; - const [, rightBoards] = ports[right]; - return rightBoards.length - leftBoards.length; - }); + 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]; @@ -322,7 +329,7 @@ PID: ${PID}`; const menuAction = { commandId: id, label, - order: `${protocolOrder + i + 1}`, + order: String(protocolOrder + i + 1).padStart(4), }; this.commandRegistry.registerCommand(command, handler); this.toDisposeBeforeMenuRebuild.push( @@ -354,7 +361,7 @@ PID: ${PID}`; } protected async installedBoards(): Promise { - const allBoards = await this.boardsService.searchBoards({}); + const allBoards = await this.boardsService.getInstalledBoards(); return allBoards.filter(InstalledBoardWithPackage.is); } } diff --git a/arduino-ide-extension/src/browser/contributions/sketch-control.ts b/arduino-ide-extension/src/browser/contributions/sketch-control.ts index f5cc85334..62f2d8ce8 100644 --- a/arduino-ide-extension/src/browser/contributions/sketch-control.ts +++ b/arduino-ide-extension/src/browser/contributions/sketch-control.ts @@ -176,7 +176,7 @@ export class SketchControl extends SketchContribution { { commandId: command.id, label: this.labelProvider.getName(uri), - order: `${i}`, + order: String(i).padStart(4), } ); this.toDisposeBeforeCreateNewContextMenu.push( diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index f8c1b085f..146d53c06 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -148,6 +148,7 @@ export interface BoardsService fqbn: string; }): Promise; searchBoards({ query }: { query?: string }): Promise; + getInstalledBoards(): Promise; getBoardUserFields(options: { fqbn: string; protocol: string; diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 12c3fe354..523b3513f 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -32,6 +32,8 @@ import { CoreClientAware } from './core-client-provider'; import { BoardDetailsRequest, BoardDetailsResponse, + BoardListAllRequest, + BoardListAllResponse, BoardSearchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; import { @@ -199,8 +201,28 @@ export class BoardsServiceImpl const req = new BoardSearchRequest(); req.setSearchArgs(query || ''); req.setInstance(instance); + return this.handleListBoards(client.boardSearch.bind(client), req); + } + + async getInstalledBoards(): Promise { + const { instance, client } = await this.coreClient; + const req = new BoardListAllRequest(); + req.setInstance(instance); + return this.handleListBoards(client.boardListAll.bind(client), req); + } + + private async handleListBoards( + getBoards: ( + request: BoardListAllRequest | BoardSearchRequest, + callback: ( + error: ServiceError | null, + response: BoardListAllResponse + ) => void + ) => void, + request: BoardListAllRequest | BoardSearchRequest + ): Promise { const boards = await new Promise((resolve, reject) => { - client.boardSearch(req, (error, resp) => { + getBoards(request, (error, resp) => { if (error) { reject(error); return; From 99b10942bb944d3916819aac41a5ede94c93fead Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 7 Oct 2022 14:33:38 +0200 Subject: [PATCH 053/384] Listen on the client's port change event If the board select dialog is listening on the backend's event, the frontend might miss the event when it comes up, although boards are connected and ports are discovered. Closes #573 Signed-off-by: Akos Kitta --- .../src/browser/boards/boards-config.tsx | 14 ++++++++------ .../browser/boards/boards-service-provider.ts | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index a4533fdf2..91cae2e29 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -6,7 +6,6 @@ import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Board, Port, - AttachedBoardsChangeEvent, BoardWithPackage, } from '../../common/protocol/boards-service'; import { NotificationCenter } from '../notification-center'; @@ -113,11 +112,14 @@ export class BoardsConfig extends React.Component< ); } }), - this.props.notificationCenter.onAttachedBoardsDidChange((event) => - this.updatePorts( - event.newState.ports, - AttachedBoardsChangeEvent.diff(event).detached.ports - ) + 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 }) => { 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 7f5f6b923..e1951962e 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -63,7 +63,10 @@ export class BoardsServiceProvider protected readonly onAvailableBoardsChangedEmitter = new Emitter< AvailableBoard[] >(); - protected readonly onAvailablePortsChangedEmitter = new Emitter(); + protected readonly onAvailablePortsChangedEmitter = new Emitter<{ + newState: Port[]; + oldState: Port[]; + }>(); private readonly inheritedConfig = new Deferred(); /** @@ -120,8 +123,12 @@ export class BoardsServiceProvider const { boards: attachedBoards, ports: availablePorts } = AvailablePorts.split(state); this._attachedBoards = attachedBoards; + const oldState = this._availablePorts.slice(); this._availablePorts = availablePorts; - this.onAvailablePortsChangedEmitter.fire(this._availablePorts); + this.onAvailablePortsChangedEmitter.fire({ + newState: this._availablePorts.slice(), + oldState, + }); await this.reconcileAvailableBoards(); @@ -229,8 +236,12 @@ export class BoardsServiceProvider } this._attachedBoards = event.newState.boards; + const oldState = this._availablePorts.slice(); this._availablePorts = event.newState.ports; - this.onAvailablePortsChangedEmitter.fire(this._availablePorts); + this.onAvailablePortsChangedEmitter.fire({ + newState: this._availablePorts.slice(), + oldState, + }); this.reconcileAvailableBoards().then(() => { const { uploadInProgress } = event; // avoid attempting "auto-selection" while an From 87ebcbe77e38d3ce435758c6836d9ca07f86acd0 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 4 Oct 2022 13:48:55 +0200 Subject: [PATCH 054/384] Let CSS do the uppercase transformation. Expose no implementation details to translation files. Signed-off-by: Akos Kitta --- arduino-ide-extension/src/browser/style/index.css | 3 +++ arduino-ide-extension/src/browser/style/list-widget.css | 2 -- .../cloud-sketchbook/cloud-sketchbook-tree-widget.tsx | 4 ++-- .../browser/widgets/component-list/list-item-renderer.tsx | 8 ++++---- i18n/en.json | 8 +++----- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index 7fb70f166..9feeed7db 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -137,6 +137,9 @@ button.secondary[disabled], .theia-button.secondary[disabled] { font-size: 14px; } +.uppercase { + text-transform: uppercase; +} /* High Contrast Theme rules */ /* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index d14d31004..c77820d6f 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -112,14 +112,12 @@ max-height: calc(1em + 4px); color: var(--theia-button-foreground); content: attr(install); - text-transform: uppercase; } .component-list-item .header .installed:hover:before { background-color: var(--theia-button-foreground); color: var(--theia-button-background); content: attr(uninstall); - text-transform: uppercase; } .component-list-item[min-width~="170px"] .footer { diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx index 043dfea86..7bb0abc73 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx @@ -61,10 +61,10 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget {
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 2999cc05a..ff5b469b9 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 @@ -56,10 +56,10 @@ export class ListItemRenderer { )} @@ -77,10 +77,10 @@ export class ListItemRenderer { const onClickInstall = () => install(item); const installButton = item.installable && ( ); diff --git a/i18n/en.json b/i18n/en.json index 3480a2215..77cbfc24c 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -90,6 +90,7 @@ "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.", @@ -144,8 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "by", "filterSearch": "Filter your search...", - "install": "INSTALL", - "installed": "INSTALLED", + "install": "Install", + "installed": "Installed", "moreInfo": "More info", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", @@ -422,9 +423,6 @@ "upload": "Upload" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", From 93291b68119cf46974491a727cb342ec53fcb3d4 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Thu, 20 Oct 2022 12:40:40 +0200 Subject: [PATCH 055/384] Adjust library installation dialog buttons style (#1401) Closes #1314. --- .../browser/library/library-list-widget.ts | 24 +++++++++---------- .../src/browser/style/index.css | 7 ++++++ i18n/en.json | 6 ++--- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index cd2b196df..c1ca83b35 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -119,30 +119,26 @@ export class LibraryListWidget extends ListWidget< message.appendChild(question); const result = await new MessageBoxDialog({ title: nls.localize( - 'arduino/library/dependenciesForLibrary', - 'Dependencies for library {0}:{1}', - item.name, - version + 'arduino/library/installLibraryDependencies', + 'Install library dependencies' ), message, buttons: [ - nls.localize('vscode/issueMainService/cancel', 'Cancel'), nls.localize( - 'arduino/library/installOnly', - 'Install {0} only', - item.name + 'arduino/library/installWithoutDependencies', + 'Install without dependencies' ), - nls.localize('arduino/library/installAll', 'Install all'), + nls.localize('arduino/library/installAll', 'Install All'), ], maxWidth: 740, // Aligned with `settings-dialog.css`. }).open(); if (result) { const { response } = result; - if (response === 1) { + if (response === 0) { // Current only installDependencies = false; - } else if (response === 2) { + } else if (response === 1) { // All installDependencies = true; } @@ -203,7 +199,11 @@ class MessageBoxDialog extends AbstractDialog { const button = this.createButton(text); const isPrimaryButton = index === (options.buttons ? options.buttons.length - 1 : 0); - button.classList.add(isPrimaryButton ? 'main' : 'secondary'); + button.title = text; + button.classList.add( + isPrimaryButton ? 'main' : 'secondary', + 'message-box-dialog-button' + ); this.controlPanel.appendChild(button); this.toDisposeOnDetach.push( addEventListener(button, 'click', () => { diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index 9feeed7db..e46cdcdd7 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -109,6 +109,13 @@ button.secondary[disabled], .theia-button.secondary[disabled] { background-color: var(--theia-secondaryButton-background); } +button.theia-button.message-box-dialog-button { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; +} + /* To make the progress-bar slightly thicker, and use the color from the status bar */ .theia-progress-bar-container { width: 100%; diff --git a/i18n/en.json b/i18n/en.json index 77cbfc24c..ea6db769a 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -254,12 +254,12 @@ "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", From b8bf1eefa2bb0a14d49040056765fab9d6642bcc Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 17 Oct 2022 17:56:50 -0700 Subject: [PATCH 056/384] Allow uploads without port selection It is common for a "port" to be used in some way during the process of uploading to a board. However, the array of Arduino boards is very diverse. Some of these do not produce a port and their upload method has no need for one. For this reason, the IDE must allow the upload process to be initiated regardless of whether a port happens to be selected. During the addition of support for user provided fields, an unwarranted assumption was made that all boards require a port selection for upload and this resulted in a regression that broke uploading for these boards. This regression was especially user unfriendly in that there was no response whatsoever from the IDE when the user attempted to initiate an upload under these conditions. The bug is hereby fixed. The upload process will always be initiated by the IDE regardless of whether a port is selected. In cases where a port is required, the resulting error message returned by Arduino CLI or the upload tool will communicate the problem to the user. --- .../src/browser/boards/boards-service-provider.ts | 6 ++++-- .../src/browser/contributions/user-fields.ts | 6 ++---- 2 files changed, 6 insertions(+), 6 deletions(-) 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 e1951962e..65842eca3 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -409,14 +409,16 @@ export class BoardsServiceProvider } async selectedBoardUserFields(): Promise { - if (!this._boardsConfig.selectedBoard || !this._boardsConfig.selectedPort) { + if (!this._boardsConfig.selectedBoard) { return []; } const fqbn = this._boardsConfig.selectedBoard.fqbn; if (!fqbn) { return []; } - const protocol = this._boardsConfig.selectedPort.protocol; + // Protocol must be set to `default` when uploading without a port selected: + // https://arduino.github.io/arduino-cli/dev/platform-specification/#sketch-upload-configuration + const protocol = this._boardsConfig.selectedPort?.protocol || 'default'; return await this.boardsService.getBoardUserFields({ fqbn, protocol }); } diff --git a/arduino-ide-extension/src/browser/contributions/user-fields.ts b/arduino-ide-extension/src/browser/contributions/user-fields.ts index 445fdc480..195ab07da 100644 --- a/arduino-ide-extension/src/browser/contributions/user-fields.ts +++ b/arduino-ide-extension/src/browser/contributions/user-fields.ts @@ -66,10 +66,8 @@ export class UserFields extends Contribution { } const address = boardsConfig.selectedBoard?.port?.address || - boardsConfig.selectedPort?.address; - if (!address) { - return undefined; - } + boardsConfig.selectedPort?.address || + ''; return fqbn + '|' + address; } From 5424dfcf70ffd48ab456307e367351c8161834e3 Mon Sep 17 00:00:00 2001 From: Muhammad Zaheer Date: Thu, 20 Oct 2022 19:56:34 +0530 Subject: [PATCH 057/384] Fix #1566 : Port submenu section heading show at top --- .../src/browser/contributions/board-selection.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 0b468144d..fb3af4d5b 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -276,7 +276,7 @@ PID: ${PID}`; '{0} ports', Port.Protocols.protocolLabel(protocol) ), - { order: protocolOrder.toString() } + { order: protocolOrder.toString().padStart(4) } ); this.menuModelRegistry.registerMenuNode(menuPath, placeholder); this.toDisposeBeforeMenuRebuild.push( From 32d904ca360d1498d78624c9fbad209187d0a908 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Fri, 21 Oct 2022 17:36:19 +0200 Subject: [PATCH 058/384] Let the user edit the font size settings with the keyboard (#1547) * let the user edit the stepper input with keyboard * consider exceptions and fix styling * fix onBlur with empty strings * always set the internal state value * misc fixes Co-authored-by: David Simpson <45690499+davegarthsimpson@users.noreply.github.com> --- .../dialogs/settings/settings-component.tsx | 12 ++- .../dialogs/settings/settings-step-input.tsx | 73 ++++++++++++++----- .../src/browser/style/settings-step-input.css | 16 ++-- 3 files changed, 74 insertions(+), 27 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index bbc73b8c3..3138c7242 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -180,7 +180,8 @@ export class SettingsComponent extends React.Component<
diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx index e6eef4b9c..1470ec192 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx @@ -2,7 +2,7 @@ import * as React from '@theia/core/shared/react'; import classnames from 'classnames'; interface SettingsStepInputProps { - value: number; + initialValue: number; setSettingsStateValue: (value: number) => void; step: number; maxValue: number; @@ -15,7 +15,7 @@ const SettingsStepInput: React.FC = ( props: SettingsStepInputProps ) => { const { - value, + initialValue, setSettingsStateValue, step, maxValue, @@ -24,18 +24,35 @@ const SettingsStepInput: React.FC = ( classNames, } = props; + const [valueState, setValueState] = React.useState<{ + currentValue: number; + isEmptyString: boolean; + }>({ + currentValue: initialValue, + isEmptyString: false, + }); + const { currentValue, isEmptyString } = valueState; + const clamp = (value: number, min: number, max: number): number => { return Math.min(Math.max(value, min), max); }; + const resetToInitialState = (): void => { + setValueState({ + currentValue: initialValue, + isEmptyString: false, + }); + }; + const onStep = ( roundingOperation: 'ceil' | 'floor', stepOperation: (a: number, b: number) => number ): void => { - const valueRoundedToScale = Math[roundingOperation](value / step) * step; + const valueRoundedToScale = + Math[roundingOperation](currentValue / step) * step; const calculatedValue = - valueRoundedToScale === value - ? stepOperation(value, step) + valueRoundedToScale === currentValue + ? stepOperation(currentValue, step) : valueRoundedToScale; const newValue = clamp(calculatedValue, minValue, maxValue); @@ -52,33 +69,53 @@ const SettingsStepInput: React.FC = ( const onUserInput = (event: React.ChangeEvent): void => { const { value: eventValue } = event.target; + setValueState({ + currentValue: Number(eventValue), + isEmptyString: eventValue === '', + }); + }; - if (eventValue === '') { - setSettingsStateValue(0); + /* Prevent the user from entering invalid values */ + const onBlur = (event: React.FocusEvent): void => { + if ( + (currentValue === initialValue && !isEmptyString) || + event.currentTarget.contains(event.relatedTarget as Node) + ) { + return; } - const number = Number(eventValue); - - if (!isNaN(number) && number !== value) { - const newValue = clamp(number, minValue, maxValue); - - setSettingsStateValue(newValue); + const clampedValue = clamp(currentValue, minValue, maxValue); + if (clampedValue === initialValue || isNaN(currentValue) || isEmptyString) { + resetToInitialState(); + return; } + + setSettingsStateValue(clampedValue); }; - const upDisabled = value >= maxValue; - const downDisabled = value <= minValue; + const valueIsNotWithinRange = + currentValue < minValue || currentValue > maxValue; + const isDisabledException = + valueIsNotWithinRange || isEmptyString || isNaN(currentValue); + + const upDisabled = isDisabledException || currentValue >= maxValue; + const downDisabled = isDisabledException || currentValue <= minValue; return ( -
+
-
+
{moreInfo}
- {focus && ( -
- {versions} - {installButton} -
- )} +
+ {versions} + {installButton} +
); } From 0773c3915ccf8938259a6d82198aa14410c9cb38 Mon Sep 17 00:00:00 2001 From: Nick B Date: Wed, 26 Oct 2022 08:08:22 -0400 Subject: [PATCH 066/384] Added an optional user modifiable default sketch file when creating a new project. (#1559) * Added a modifiable default sketch for new project * Removed unused file * WiP : Now nothing's working... :( * yarn i18n:generate for the settings * Updated the desription for markdown description. * Lintered the code * Remove undesirable whitespaces * Applied kittaakos suggestions * Removed extra whitespaces * Fixed default `.ino` for the missings empty lines. --- .../src/browser/arduino-preferences.ts | 9 ++ .../src/node/sketches-service-impl.ts | 87 +++++++++++++++---- i18n/en.json | 3 + 3 files changed, 84 insertions(+), 15 deletions(-) diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index 5fef59072..ecd45735d 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -249,6 +249,14 @@ export const ArduinoConfigSchema: PreferenceSchema = { ), 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, + }, }, }; @@ -278,6 +286,7 @@ export interface ArduinoConfiguration { 'arduino.auth.registerUri': string; 'arduino.survey.notification': boolean; 'arduino.cli.daemon.debug': boolean; + 'arduino.sketch.inoBlueprint': string; 'arduino.checkForUpdates': boolean; } diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 06c7931b6..e6793e39a 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -32,8 +32,19 @@ import { maybeNormalizeDrive, TempSketchPrefix, } from './is-temp-sketch'; +import { join } from 'path'; const RecentSketches = 'recent-sketches.json'; +const DefaultIno = `void setup() { + // put your setup code here, to run once: + +} + +void loop() { + // put your main code here, to run repeatedly: + +} +`; @injectable() export class SketchesServiceImpl @@ -47,6 +58,7 @@ export class SketchesServiceImpl autoStart: true, concurrency: 1, }); + private inoContent: Deferred | undefined; @inject(ILogger) @named('sketches-service') @@ -446,21 +458,11 @@ export class SketchesServiceImpl const sketchDir = path.join(parentPath, sketchName); const sketchFile = path.join(sketchDir, `${sketchName}.ino`); - await fs.mkdir(sketchDir, { recursive: true }); - await fs.writeFile( - sketchFile, - `void setup() { - // put your setup code here, to run once: - -} - -void loop() { - // put your main code here, to run repeatedly: - -} -`, - { encoding: 'utf8' } - ); + const [inoContent] = await Promise.all([ + this.loadInoContent(), + fs.mkdir(sketchDir, { recursive: true }), + ]); + await fs.writeFile(sketchFile, inoContent, { encoding: 'utf8' }); return this.loadSketch(FileUri.create(sketchDir).toString()); } @@ -637,6 +639,61 @@ void loop() { return false; } } + + // Returns the default.ino from the settings or from default folder. + private async readSettings(): Promise | undefined> { + const configDirUri = await this.envVariableServer.getConfigDirUri(); + const configDirPath = FileUri.fsPath(configDirUri); + + try { + const raw = await fs.readFile(join(configDirPath, 'settings.json'), { + encoding: 'utf8', + }); + + return this.tryParse(raw); + } catch (err) { + if ('code' in err && err.code === 'ENOENT') { + return undefined; + } + throw err; + } + } + + private tryParse(raw: string): Record | undefined { + try { + return JSON.parse(raw); + } catch { + return undefined; + } + } + + // Returns the default.ino from the settings or from default folder. + private async loadInoContent(): Promise { + if (!this.inoContent) { + this.inoContent = new Deferred(); + const settings = await this.readSettings(); + if (settings) { + const inoBlueprintPath = settings['arduino.sketch.inoBlueprint']; + if (inoBlueprintPath && typeof inoBlueprintPath === 'string') { + try { + const inoContent = await fs.readFile(inoBlueprintPath, { + encoding: 'utf8', + }); + this.inoContent.resolve(inoContent); + } catch (err) { + if ('code' in err && err.code === 'ENOENT') { + // Ignored. The custom `.ino` blueprint file is optional. + } else { + throw err; + } + } + } + } + this.inoContent.resolve(DefaultIno); + } + + return this.inoContent.promise; + } } interface SketchWithDetails extends Sketch { diff --git a/i18n/en.json b/i18n/en.json index ea6db769a..3f64fd926 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -349,6 +349,9 @@ "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.", From 2b2463b83436e1ab497d73f236fe7ddcbce29f89 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 17 Oct 2022 18:28:33 +0200 Subject: [PATCH 067/384] fix: Prompt sketch move when opening an invalid outside from IDE2 Log IDE2 version on start. Closes #964 Closes #1484 Co-authored-by: Alberto Iannaccone Co-authored-by: Akos Kitta Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 1 + .../src/browser/contributions/contribution.ts | 2 +- .../contributions/open-sketch-files.ts | 113 ++++++++++++- .../src/browser/contributions/open-sketch.ts | 102 ++++++----- .../theia/workspace/workspace-service.ts | 31 ++++ .../src/common/protocol/sketches-service.ts | 10 ++ .../theia/electron-main-application.ts | 159 ++++++++++++++---- .../src/node/arduino-ide-backend-module.ts | 4 +- .../src/node/sketches-service-impl.ts | 85 +++++++++- yarn.lock | 5 + 10 files changed, 422 insertions(+), 90 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3cac99751..727c77e08 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -45,6 +45,7 @@ "@types/deepmerge": "^2.2.0", "@types/glob": "^7.2.0", "@types/google-protobuf": "^3.7.2", + "@types/is-valid-path": "^0.1.0", "@types/js-yaml": "^3.12.2", "@types/keytar": "^4.4.0", "@types/lodash.debounce": "^4.0.6", diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 920e4dfd9..ba57a8587 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -12,7 +12,6 @@ import { MaybePromise } from '@theia/core/lib/common/types'; import { LabelProvider } from '@theia/core/lib/browser/label-provider'; import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { MessageService } from '@theia/core/lib/common/message-service'; -import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { open, OpenerService } from '@theia/core/lib/browser/opener-service'; import { @@ -61,6 +60,7 @@ import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { BoardsDataStore } from '../boards/boards-data-store'; import { NotificationManager } from '../theia/messages/notifications-manager'; import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { WorkspaceService } from '../theia/workspace/workspace-service'; export { Command, diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts index 63cea8ca4..858719c41 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -1,8 +1,8 @@ import { nls } from '@theia/core/lib/common/nls'; -import { injectable } from '@theia/core/shared/inversify'; +import { inject, injectable } from '@theia/core/shared/inversify'; import type { EditorOpenerOptions } from '@theia/editor/lib/browser/editor-manager'; import { Later } from '../../common/nls'; -import { SketchesError } from '../../common/protocol'; +import { Sketch, SketchesError } from '../../common/protocol'; import { Command, CommandRegistry, @@ -10,9 +10,19 @@ import { URI, } from './contribution'; import { SaveAsSketch } from './save-as-sketch'; +import { promptMoveSketch } from './open-sketch'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import { Deferred, wait } from '@theia/core/lib/common/promise-util'; +import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; +import { ContextKeyService as VSCodeContextKeyService } from '@theia/monaco-editor-core/esm/vs/platform/contextkey/browser/contextKeyService'; @injectable() export class OpenSketchFiles extends SketchContribution { + @inject(VSCodeContextKeyService) + private readonly contextKeyService: VSCodeContextKeyService; + override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketchFiles.Commands.OPEN_SKETCH_FILES, { execute: (uri: URI) => this.openSketchFiles(uri), @@ -55,9 +65,25 @@ export class OpenSketchFiles extends SketchContribution { } }); } + const { workspaceError } = this.workspaceService; + // This happens when the IDE2 has been started (from either a terminal or clicking on an `ino` file) with a /path/to/invalid/sketch. (#964) + if (SketchesError.InvalidName.is(workspaceError)) { + await this.promptMove(workspaceError); + } } catch (err) { + // This happens when the user gracefully closed IDE2, all went well + // but the main sketch file was renamed outside of IDE2 and when the user restarts the IDE2 + // the workspace path still exists, but the sketch path is not valid anymore. (#964) + if (SketchesError.InvalidName.is(err)) { + const movedSketch = await this.promptMove(err); + if (!movedSketch) { + // If user did not accept the move, or move was not possible, force reload with a fallback. + return this.openFallbackSketch(); + } + } + if (SketchesError.NotFound.is(err)) { - this.openFallbackSketch(); + return this.openFallbackSketch(); } else { console.error(err); const message = @@ -71,6 +97,31 @@ export class OpenSketchFiles extends SketchContribution { } } + private async promptMove( + err: ApplicationError< + number, + { + invalidMainSketchUri: string; + } + > + ): Promise { + const { invalidMainSketchUri } = err.data; + requestAnimationFrame(() => this.messageService.error(err.message)); + await wait(10); // let IDE2 toast the error message. + const movedSketch = await promptMoveSketch(invalidMainSketchUri, { + fileService: this.fileService, + sketchService: this.sketchService, + labelProvider: this.labelProvider, + }); + if (movedSketch) { + this.workspaceService.open(new URI(movedSketch.uri), { + preserveWindow: true, + }); + return movedSketch; + } + return undefined; + } + private async openFallbackSketch(): Promise { const sketch = await this.sketchService.createNewSketch(); this.workspaceService.open(new URI(sketch.uri), { preserveWindow: true }); @@ -84,8 +135,48 @@ export class OpenSketchFiles extends SketchContribution { const widget = this.editorManager.all.find( (widget) => widget.editor.uri.toString() === uri ); + const disposables = new DisposableCollection(); if (!widget || forceOpen) { - return this.editorManager.open( + const deferred = new Deferred(); + disposables.push( + this.editorManager.onCreated((editor) => { + if (editor.editor.uri.toString() === uri) { + if (editor.isVisible) { + disposables.dispose(); + deferred.resolve(editor); + } else { + // In Theia, the promise resolves after opening the editor, but the editor is neither attached to the DOM, nor visible. + // This is a hack to first get an event from monaco after the widget update request, then IDE2 waits for the next monaco context key event. + // Here, the monaco context key event is not used, but this is the first event after the editor is visible in the UI. + disposables.push( + (editor.editor as MonacoEditor).onDidResize((dimension) => { + if (dimension) { + const isKeyOwner = ( + arg: unknown + ): arg is { key: string } => { + if (typeof arg === 'object') { + const object = arg as Record; + return typeof object['key'] === 'string'; + } + return false; + }; + disposables.push( + this.contextKeyService.onDidChangeContext((e) => { + // `commentIsEmpty` is the first context key change event received from monaco after the editor is for real visible in the UI. + if (isKeyOwner(e) && e.key === 'commentIsEmpty') { + deferred.resolve(editor); + disposables.dispose(); + } + }) + ); + } + }) + ); + } + } + }) + ); + this.editorManager.open( new URI(uri), options ?? { mode: 'reveal', @@ -93,6 +184,20 @@ export class OpenSketchFiles extends SketchContribution { counter: 0, } ); + const timeout = 5_000; // number of ms IDE2 waits for the editor to show up in the UI + const result = await Promise.race([ + deferred.promise, + wait(timeout).then(() => { + disposables.dispose(); + return 'timeout'; + }), + ]); + if (result === 'timeout') { + console.warn( + `Timeout after ${timeout} millis. The editor has not shown up in time. URI: ${uri}` + ); + } + return result; } } } diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-sketch.ts index 5f50daae5..e7e3f77de 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch.ts @@ -1,7 +1,13 @@ 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 { SketchesError, SketchRef } from '../../common/protocol'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; +import { + SketchesError, + SketchesService, + SketchRef, +} from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; import { Command, @@ -108,45 +114,11 @@ export class OpenSketch extends SketchContribution { return sketch; } if (Sketch.isSketchFile(sketchFileUri)) { - const name = new URI(sketchFileUri).path.name; - const nameWithExt = this.labelProvider.getName(new URI(sketchFileUri)); - const { response } = await remote.dialog.showMessageBox({ - title: nls.localize('arduino/sketch/moving', 'Moving'), - type: 'question', - buttons: [ - nls.localize('vscode/issueMainService/cancel', 'Cancel'), - nls.localize('vscode/issueMainService/ok', 'OK'), - ], - message: nls.localize( - 'arduino/sketch/movingMsg', - 'The file "{0}" needs to be inside a sketch folder named "{1}".\nCreate this folder, move the file, and continue?', - nameWithExt, - name - ), + return promptMoveSketch(sketchFileUri, { + fileService: this.fileService, + sketchService: this.sketchService, + labelProvider: this.labelProvider, }); - if (response === 1) { - // OK - const newSketchUri = new URI(sketchFileUri).parent.resolve(name); - const exists = await this.fileService.exists(newSketchUri); - if (exists) { - await remote.dialog.showMessageBox({ - type: 'error', - title: nls.localize('vscode/dialog/dialogErrorMessage', 'Error'), - message: nls.localize( - 'arduino/sketch/cantOpen', - 'A folder named "{0}" already exists. Can\'t open sketch.', - name - ), - }); - return undefined; - } - await this.fileService.createFolder(newSketchUri); - await this.fileService.move( - new URI(sketchFileUri), - new URI(newSketchUri.resolve(nameWithExt).toString()) - ); - return this.sketchService.getSketchFolder(newSketchUri.toString()); - } } } } @@ -158,3 +130,55 @@ export namespace OpenSketch { }; } } + +export async function promptMoveSketch( + sketchFileUri: string | URI, + options: { + fileService: FileService; + sketchService: SketchesService; + labelProvider: LabelProvider; + } +): Promise { + const { fileService, sketchService, labelProvider } = 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({ + title: nls.localize('arduino/sketch/moving', 'Moving'), + type: 'question', + buttons: [ + nls.localize('vscode/issueMainService/cancel', 'Cancel'), + nls.localize('vscode/issueMainService/ok', 'OK'), + ], + message: nls.localize( + 'arduino/sketch/movingMsg', + 'The file "{0}" needs to be inside a sketch folder named "{1}".\nCreate this folder, move the file, and continue?', + nameWithExt, + name + ), + }); + if (response === 1) { + // OK + const newSketchUri = uri.parent.resolve(name); + const exists = await fileService.exists(newSketchUri); + if (exists) { + await remote.dialog.showMessageBox({ + type: 'error', + title: nls.localize('vscode/dialog/dialogErrorMessage', 'Error'), + message: nls.localize( + 'arduino/sketch/cantOpen', + 'A folder named "{0}" already exists. Can\'t open sketch.', + name + ), + }); + return undefined; + } + await fileService.createFolder(newSketchUri); + await fileService.move( + uri, + new URI(newSketchUri.resolve(nameWithExt).toString()) + ); + return sketchService.getSketchFolder(newSketchUri.toString()); + } +} diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts index e9d1e1e69..22c74728d 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts @@ -16,6 +16,7 @@ import { import { SketchesService, Sketch, + SketchesError, } from '../../../common/protocol/sketches-service'; import { FileStat } from '@theia/filesystem/lib/common/files'; import { @@ -38,6 +39,7 @@ export class WorkspaceService extends TheiaWorkspaceService { private readonly providers: ContributionProvider; private version?: string; + private _workspaceError: Error | undefined; async onStart(application: FrontendApplication): Promise { const info = await this.applicationServer.getApplicationInfo(); @@ -51,6 +53,10 @@ export class WorkspaceService extends TheiaWorkspaceService { this.onCurrentWidgetChange({ newValue, oldValue: null }); } + get workspaceError(): Error | undefined { + return this._workspaceError; + } + protected override async toFileStat( uri: string | URI | undefined ): Promise { @@ -59,6 +65,31 @@ export class WorkspaceService extends TheiaWorkspaceService { const newSketchUri = await this.sketchService.createNewSketch(); return this.toFileStat(newSketchUri.uri); } + // When opening a file instead of a directory, IDE2 (and Theia) expects a workspace JSON file. + // Nothing will work if the workspace file is invalid. Users tend to start (see #964) IDE2 from the `.ino` files, + // so here, IDE2 tries to load the sketch via the CLI from the main sketch file URI. + // If loading the sketch is OK, IDE2 starts and uses the sketch folder as the workspace root instead of the sketch file. + // If loading fails due to invalid name error, IDE2 loads a temp sketch and preserves the startup error, and offers the sketch move to the user later. + // If loading the sketch fails, create a fallback sketch and open the new temp sketch folder as the workspace root. + if (stat.isFile && stat.resource.path.ext === '.ino') { + try { + const sketch = await this.sketchService.loadSketch( + stat.resource.toString() + ); + return this.toFileStat(sketch.uri); + } catch (err) { + if (SketchesError.InvalidName.is(err)) { + this._workspaceError = err; + const newSketchUri = await this.sketchService.createNewSketch(); + return this.toFileStat(newSketchUri.uri); + } else if (SketchesError.NotFound.is(err)) { + this._workspaceError = err; + const newSketchUri = await this.sketchService.createNewSketch(); + return this.toFileStat(newSketchUri.uri); + } + throw err; + } + } return stat; } diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index f1b8f7675..ed93d9fb7 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -4,6 +4,7 @@ import URI from '@theia/core/lib/common/uri'; export namespace SketchesError { export const Codes = { NotFound: 5001, + InvalidName: 5002, }; export const NotFound = ApplicationError.declare( Codes.NotFound, @@ -14,6 +15,15 @@ export namespace SketchesError { }; } ); + export const InvalidName = ApplicationError.declare( + Codes.InvalidName, + (message: string, invalidMainSketchUri: string) => { + return { + message, + data: { invalidMainSketchUri }, + }; + } + ); } export const SketchesServicePath = '/services/sketches-service'; 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 bb85405b3..335899d70 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 @@ -8,8 +8,8 @@ import { } from '@theia/core/electron-shared/electron'; import { fork } from 'child_process'; import { AddressInfo } from 'net'; -import { join, dirname } from 'path'; -import * as fs from 'fs-extra'; +import { join, isAbsolute, resolve } from 'path'; +import { promises as fs, Stats } from 'fs'; import { MaybePromise } 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'; @@ -27,6 +27,7 @@ import { CLOSE_PLOTTER_WINDOW, SHOW_PLOTTER_WINDOW, } from '../../common/ipc-communication'; +import isValidPath = require('is-valid-path'); app.commandLine.appendSwitch('disable-http-cache'); @@ -69,8 +70,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { // Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit") // See: https://github.com/electron-userland/electron-builder/issues/2468 // Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701 + console.log(`${config.applicationName} ${app.getVersion()}`); app.on('ready', () => app.setName(config.applicationName)); - this.attachFileAssociations(); + const cwd = process.cwd(); + this.attachFileAssociations(cwd); this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native'; this._config = config; this.hookApplicationEvents(); @@ -84,7 +87,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { return this.launch({ secondInstance: false, argv: this.processArgv.getProcessArgvWithoutBin(process.argv), - cwd: process.cwd(), + cwd, }); } @@ -119,7 +122,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { let traceFile: string | undefined; if (appPath) { const tracesPath = join(appPath, 'traces'); - await fs.promises.mkdir(tracesPath, { recursive: true }); + await fs.mkdir(tracesPath, { recursive: true }); traceFile = join(tracesPath, `trace-${new Date().toISOString()}.trace`); } console.log('>>> Content tracing has started...'); @@ -135,14 +138,18 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { })(); } - private attachFileAssociations(): void { + private attachFileAssociations(cwd: string): void { // OSX: register open-file event if (os.isOSX) { - app.on('open-file', async (event, uri) => { + app.on('open-file', async (event, path) => { event.preventDefault(); - if (uri.endsWith('.ino') && (await fs.pathExists(uri))) { - this.openFilePromise.reject(); - await this.openSketch(dirname(uri)); + const resolvedPath = await this.resolvePath(path, cwd); + if (resolvedPath) { + const sketchFolderPath = await this.isValidSketchPath(resolvedPath); + if (sketchFolderPath) { + this.openFilePromise.reject(new InterruptWorkspaceRestoreError()); + await this.openSketch(sketchFolderPath); + } } }); setTimeout(() => this.openFilePromise.resolve(), 500); @@ -151,8 +158,68 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } } - private async isValidSketchPath(uri: string): Promise { - return typeof uri === 'string' && (await fs.pathExists(uri)); + /** + * The `path` argument is valid, if accessible and either pointing to a `.ino` file, + * or it's a directory, and one of the files in the directory is an `.ino` file. + * + * If `undefined`, `path` was pointing to neither an accessible sketch file nor a sketch folder. + * + * The sketch folder name and sketch file name can be different. This method is not sketch folder name compliant. + * The `path` must be an absolute, resolved path. + */ + private async isValidSketchPath(path: string): Promise { + let stats: Stats | undefined = undefined; + try { + stats = await fs.stat(path); + } catch (err) { + if ('code' in err && err.code === 'ENOENT') { + return undefined; + } + throw err; + } + if (!stats) { + return undefined; + } + if (stats.isFile() && path.endsWith('.ino')) { + return path; + } + try { + const entries = await fs.readdir(path, { withFileTypes: true }); + const sketchFilename = entries + .filter((entry) => entry.isFile() && entry.name.endsWith('.ino')) + .map(({ name }) => name) + .sort((left, right) => left.localeCompare(right))[0]; + if (sketchFilename) { + return join(path, sketchFilename); + } + // If no sketches found in the folder, but the folder exists, + // return with the path of the empty folder and let IDE2's frontend + // figure out the workspace root. + return path; + } catch (err) { + throw err; + } + } + + private async resolvePath( + maybePath: string, + cwd: string + ): Promise { + if (!isValidPath(maybePath)) { + return undefined; + } + if (isAbsolute(maybePath)) { + return maybePath; + } + try { + const resolved = await fs.realpath(resolve(cwd, maybePath)); + return resolved; + } catch (err) { + if ('code' in err && err.code === 'ENOENT') { + return undefined; + } + throw err; + } } protected override async launch( @@ -163,12 +230,15 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { // 1. The `open-file` command has been received by the app, rejecting the promise // 2. A short timeout resolves the promise automatically, falling back to the usual app launch await this.openFilePromise.promise; - } catch { - // Application has received the `open-file` event and will skip the default application launch - return; + } catch (err) { + if (err instanceof InterruptWorkspaceRestoreError) { + // Application has received the `open-file` event and will skip the default application launch + return; + } + throw err; } - if (!os.isOSX && (await this.launchFromArgs(params))) { + if (await this.launchFromArgs(params)) { // Application has received a file in its arguments and will skip the default application launch return; } @@ -182,7 +252,13 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { `Restoring workspace roots: ${workspaces.map(({ file }) => file)}` ); for (const workspace of workspaces) { - if (await this.isValidSketchPath(workspace.file)) { + const resolvedPath = await this.resolvePath(workspace.file, params.cwd); + if (!resolvedPath) { + continue; + } + const sketchFolderPath = await this.isValidSketchPath(resolvedPath); + if (sketchFolderPath) { + workspace.file = sketchFolderPath; if (this.isTempSketch.is(workspace.file)) { console.info( `Skipped opening sketch. The sketch was detected as temporary. Workspace path: ${workspace.file}.` @@ -205,38 +281,40 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { ): Promise { // Copy to prevent manipulation of original array const argCopy = [...params.argv]; - let uri: string | undefined; - for (const possibleUri of argCopy) { - if ( - possibleUri.endsWith('.ino') && - (await this.isValidSketchPath(possibleUri)) - ) { - uri = possibleUri; + let path: string | undefined; + for (const maybePath of argCopy) { + const resolvedPath = await this.resolvePath(maybePath, params.cwd); + if (!resolvedPath) { + continue; + } + const sketchFolderPath = await this.isValidSketchPath(resolvedPath); + if (sketchFolderPath) { + path = sketchFolderPath; break; } } - if (uri) { - await this.openSketch(dirname(uri)); + if (path) { + await this.openSketch(path); return true; } return false; } private async openSketch( - workspace: WorkspaceOptions | string + workspaceOrPath: WorkspaceOptions | string ): Promise { const options = await this.getLastWindowOptions(); let file: string; - if (typeof workspace === 'object') { - options.x = workspace.x; - options.y = workspace.y; - options.width = workspace.width; - options.height = workspace.height; - options.isMaximized = workspace.isMaximized; - options.isFullScreen = workspace.isFullScreen; - file = workspace.file; + if (typeof workspaceOrPath === 'object') { + options.x = workspaceOrPath.x; + options.y = workspaceOrPath.y; + options.width = workspaceOrPath.width; + options.height = workspaceOrPath.height; + options.isMaximized = workspaceOrPath.isMaximized; + options.isFullScreen = workspaceOrPath.isFullScreen; + file = workspaceOrPath.file; } else { - file = workspace; + file = workspaceOrPath; } const [uri, electronWindow] = await Promise.all([ this.createWindowUri(), @@ -486,3 +564,12 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { return this._firstWindowId; } } + +class InterruptWorkspaceRestoreError extends Error { + constructor() { + super( + "Received 'open-file' event. Interrupting the default launch workflow." + ); + Object.setPrototypeOf(this, InterruptWorkspaceRestoreError.prototype); + } +} 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 33d21c0ff..0106f6f49 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -4,7 +4,6 @@ import { ArduinoFirmwareUploader, ArduinoFirmwareUploaderPath, } from '../common/protocol/arduino-firmware-uploader'; - import { ILogger } from '@theia/core/lib/common/logger'; import { BackendApplicationContribution, @@ -26,7 +25,7 @@ import { ConnectionContainerModule } from '@theia/core/lib/node/messaging/connec import { CoreClientProvider } from './core-client-provider'; import { ConnectionHandler, JsonRpcConnectionHandler } from '@theia/core'; import { DefaultWorkspaceServer } from './theia/workspace/default-workspace-server'; -import { WorkspaceServer as TheiaWorkspaceServer } from '@theia/workspace/lib/common'; +import { WorkspaceServer as TheiaWorkspaceServer } from '@theia/workspace/lib/common/workspace-protocol'; import { SketchesServiceImpl } from './sketches-service-impl'; import { SketchesService, @@ -40,7 +39,6 @@ import { ArduinoDaemon, ArduinoDaemonPath, } from '../common/protocol/arduino-daemon'; - import { ConfigServiceImpl } from './config-service-impl'; import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { EnvVariablesServer } from './theia/env-variables/env-variables-server'; diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index e6793e39a..9cbee96c4 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -199,11 +199,22 @@ export class SketchesServiceImpl const sketch = await new Promise((resolve, reject) => { client.loadSketch(req, async (err, resp) => { if (err) { - reject( - isNotFoundError(err) - ? SketchesError.NotFound(err.details, uri) - : err - ); + let rejectWith: unknown = err; + if (isNotFoundError(err)) { + const invalidMainSketchFilePath = await isInvalidSketchNameError( + err, + requestSketchPath + ); + if (invalidMainSketchFilePath) { + rejectWith = SketchesError.InvalidName( + err.details, + FileUri.create(invalidMainSketchFilePath).toString() + ); + } else { + rejectWith = SketchesError.NotFound(err.details, uri); + } + } + reject(rejectWith); return; } const responseSketchPath = maybeNormalizeDrive(resp.getLocationPath()); @@ -313,7 +324,10 @@ export class SketchesServiceImpl )} before marking it as recently opened.` ); } catch (err) { - if (SketchesError.NotFound.is(err)) { + if ( + SketchesError.NotFound.is(err) || + SketchesError.InvalidName.is(err) + ) { this.logger.debug( `Could not load sketch from '${uri}'. Not marking as recently opened.` ); @@ -517,7 +531,7 @@ export class SketchesServiceImpl const sketch = await this.loadSketch(uri); return sketch; } catch (err) { - if (SketchesError.NotFound.is(err)) { + if (SketchesError.NotFound.is(err) || SketchesError.InvalidName.is(err)) { return undefined; } throw err; @@ -704,6 +718,63 @@ function isNotFoundError(err: unknown): err is ServiceError { return ServiceError.is(err) && err.code === 5; // `NOT_FOUND` https://grpc.github.io/grpc/core/md_doc_statuscodes.html } +/** + * Tries to detect whether the error was caused by an invalid main sketch file name. + * IDE2 should handle gracefully when there is an invalid sketch folder name. See the [spec](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-root-folder) for details. + * The CLI does not have error codes (https://github.com/arduino/arduino-cli/issues/1762), so IDE2 parses the error message and tries to guess it. + * Nothing guarantees that the invalid existing main sketch file still exits by the time client performs the sketch move. + */ +async function isInvalidSketchNameError( + cliErr: unknown, + requestSketchPath: string +): Promise { + if (isNotFoundError(cliErr)) { + const ino = requestSketchPath.endsWith('.ino'); + if (ino) { + const sketchFolderPath = path.dirname(requestSketchPath); + const sketchName = path.basename(sketchFolderPath); + const pattern = `${invalidSketchNameErrorRegExpPrefix}${path.join( + sketchFolderPath, + `${sketchName}.ino` + )}`.replace(/\\/g, '\\\\'); // make windows path separator with \\ to have a valid regexp. + if (new RegExp(pattern, 'i').test(cliErr.details)) { + try { + await fs.access(requestSketchPath); + return requestSketchPath; + } catch { + return undefined; + } + } + } else { + try { + const resources = await fs.readdir(requestSketchPath, { + withFileTypes: true, + }); + return ( + resources + .filter((resource) => resource.isFile()) + .filter((resource) => resource.name.endsWith('.ino')) + // A folder might contain multiple sketches. It's OK to ick the first one as IDE2 cannot do much, + // but ensure a deterministic behavior as `readdir(3)` does not guarantee an order. Sort them. + .sort(({ name: left }, { name: right }) => + left.localeCompare(right) + ) + .map(({ name }) => name) + .map((name) => path.join(requestSketchPath, name))[0] + ); + } catch (err) { + if ('code' in err && err.code === 'ENOTDIR') { + return undefined; + } + throw err; + } + } + } + return undefined; +} +const invalidSketchNameErrorRegExpPrefix = + '.*: main file missing from sketch: '; + /* * When a new sketch is created, add a suffix to distinguish it * from other new sketches I created today. diff --git a/yarn.lock b/yarn.lock index f023cda96..3a7fcb5ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3139,6 +3139,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/is-valid-path@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@types/is-valid-path/-/is-valid-path-0.1.0.tgz#d5c6e96801303112c9626d44268c6fabc72d272f" + integrity sha512-2ontWtpN8O2nf5S7EjDDJ0DwrRa2t7wmS3Wmo322yWYG6yFBYC1QCaLhz4Iz+mzJy8Kf4zP5yVyEd1ANPDmOFQ== + "@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" From f93f78039ba13c595674565fab1bb8362f6709ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 27 Oct 2022 12:40:56 +0200 Subject: [PATCH 068/384] Updated translation files (#1496) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 48 ++++- i18n/ar.json | 46 ++++- i18n/az.json | 48 ++++- i18n/bg.json | 48 ++++- i18n/ca_ES.json | 48 ++++- i18n/cs.json | 46 ++++- i18n/de.json | 102 +++++++---- i18n/el.json | 48 ++++- i18n/es.json | 46 ++++- i18n/eu.json | 48 ++++- i18n/fa.json | 46 ++++- i18n/fil.json | 48 ++++- i18n/fr.json | 48 ++++- i18n/he.json | 46 ++++- i18n/hu.json | 48 ++++- i18n/id.json | 455 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/it.json | 44 ++++- i18n/ja.json | 44 ++++- i18n/ko.json | 60 ++++-- i18n/my_MM.json | 286 ++++++++++++++++------------- i18n/ne.json | 48 ++++- i18n/nl.json | 46 ++++- i18n/pl.json | 46 ++++- i18n/pt.json | 46 ++++- i18n/ro.json | 48 ++++- i18n/ru.json | 46 ++++- i18n/sr.json | 48 ++++- i18n/tr.json | 44 ++++- i18n/uk.json | 455 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/vi.json | 48 ++++- i18n/zh-Hant.json | 455 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/zh.json | 50 ++++- i18n/zh_TW.json | 162 ++++++++++------- 33 files changed, 2730 insertions(+), 465 deletions(-) create mode 100644 i18n/id.json create mode 100644 i18n/uk.json create mode 100644 i18n/zh-Hant.json diff --git a/i18n/af.json b/i18n/af.json index 946ca2ffc..4a029242d 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -8,6 +8,7 @@ "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?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No ports selected for board: '{0}'.", @@ -24,6 +26,7 @@ "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", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "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", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Boards Manager", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Done pushing ‘{0}’.", "embed": "Embed:", "emptySketchbook": "Jou Sketsboek is leeg", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Skakel:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "by", "filterSearch": "Filter your search...", - "install": "INSTALLEER", + "install": "Install", + "installed": "Installed", "moreInfo": "Meer inligting", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Add File", "fileAdded": "Een lêer by skets gevoeg", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Vervang" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Netwerk", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "Die OAuth2 gehoor.", @@ -320,6 +342,12 @@ "network": "Netwerk", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Wys ontfoutings uitset tydens", "sketchbook.location": "Sketsboek ligging", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} error: {1}" }, @@ -390,9 +423,6 @@ "upload": "Upload" } }, - "cloud": { - "GoToCloud": "GAAN NA WOLK" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/ar.json b/i18n/ar.json index 890daab04..f3dc44662 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -8,6 +8,7 @@ "board": "اللوحة {0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "معلومات اللوحة", + "boards": "boards", "configDialog1": "اختر لوحة و منفذ معا اذا اردت ان ترفع السكتش", "configDialog2": "اذا قمت باختيار لوحة فقط ستسطيع ان تترجم لكن بدون ان ترفع المشروع", "couldNotFindPreviouslySelected": "تعذر ايجاد اللوحة '{0}' المختارة مسبقا في المنصة المثبتة '{1}' . الرجاء اعادة اختيار اللوحة التي تريد استعمالها يدويا . هل تريد باعادة الاختيار الان؟", @@ -15,6 +16,7 @@ "getBoardInfo": "الحصول على معلومات اللوحة", "inSketchbook": "(داخل ملف المشاريع)", "installNow": "نواة \"{0} {1}\" يجب تثبيتها للوحة \"{2}\" التي تم اختيارها . هل تريد تثبيتها الان ؟", + "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "FQBN غير متاح للوحة المختارة \"{0}\" . هل قمت بتثبيت النواة المعنية ؟", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "لا يوجد اية منافذ متاحة للوحة '{0}'", @@ -24,6 +26,7 @@ "pleasePickBoard": "من فضلك اختر لوحة متصلة على المنفذ الذي اخترته", "port": "المنفذ {0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "المبرمجة", "reselectLater": "اعد الاختيار لاحقا", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "الرجاء اختيار لوحة من احل الحصول على معلومات اللوحة", "selectPortForInfo": "الرجاء اختيار منفذ من اجل الحصول على معلومات اللوحة", "showAllAvailablePorts": "يظهر كل المنافذ المتاحة عند تفعيله", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "تم تثبيت المنصة {0}:{1} بنجاح", - "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح" + "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح", + "typeOfPorts": "{0} ports" }, "boardsManager": "مدير اللوحة", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "تم الدفع بنجاح '{0}'", "embed": "تضمين:", "emptySketchbook": "ملف المشاريع الخاص بك فارغ", + "goToCloud": "Go to Cloud", "learnMore": "تعرف على المزيد", "link": "الرابط:", "notYetPulled": "تعذر الدفع الى Cloud . انها لم تسحب الى الان", @@ -140,6 +146,7 @@ "by": "بواسطة", "filterSearch": "ترشيح بحثك...", "install": "تنصيب", + "installed": "Installed", "moreInfo": "عرض المزيد", "uninstall": "الغاء التثبيت", "uninstallMsg": "هل تريد الغاء تثبيت {0}؟", @@ -148,8 +155,19 @@ "contributions": { "addFile": "اضف ملف...", "fileAdded": "تمت اضافة ملف واحد الى المشروع", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "استبدال" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "نسخ رسالة الخطأ", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "اضف مكتبة .ZIP ...", "arduinoLibraries": "مكتبات Arduino", "contributedLibraries": "المكتبات التي سوهم بها", - "dependenciesForLibrary": "تبعيات المكتبة {0}:{1}", "include": "ضمّن مكتبة", - "installAll": "تثبيت الكل", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "هل تريد تثبيت التبعيات المفقودة؟", "installOneMissingDependency": "هل تريد تثبيت التبعية المفقودة ؟", - "installOnly": "تثبيت {0} فقط", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "تم تثبيت المكتبة {0}:{1} بنجاح", "libraryAlreadyExists": "المكتبة موجودة مسبقا . هل تريد الكتابة فوقها ؟", "manageLibraries": "ادارة المكتبات", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "تعذر اغلاق مقبس الويب", "unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب" }, + "portProtocol": { + "network": "شبكة", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "مدير اللوحات الاضافية", "auth.audience": "جمهور OAuth2", @@ -320,6 +342,12 @@ "network": "شبكة", "newSketchbookLocation": "اختر مكان المشروع الجديد", "noProxy": "لا يوجد وكيل", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "اظهر خرج مطوّل خلال", "sketchbook.location": "موقع ملف المشاريع", "sketchbook.showAllFiles": "True لعرض كل مجلدات مشاريع داخل المشروع . False افتراضيا", @@ -350,7 +378,7 @@ "cantOpen": "المجلد المسمى \"{0}\" موجود مسبقا. لا يمكن فتح الشيفرة البرمجية", "close": "هل انت متاكد بانك تريد اغلاق المشروع ؟", "compile": "Compiling sketch...", - "configureAndUpload": "تهيئة و رفع", + "configureAndUpload": "Configure and Upload", "createdArchive": "تم انشاء ارشيف '{0}'", "doneCompiling": "تمت الترجمة بنجاح.", "doneUploading": "تم الرفع بنجاح.", @@ -381,6 +409,11 @@ "dismissSurvey": "لا تظهر مرة اخرى", "surveyMessage": "يرجى ان تساعدنا لنحسن ادائنا من خلال الاجابة على هذا الاستبيان القصير جدا . نحن نحترم المجتمع الخاص بنا و نريد ان نتعرف بشكل افضل على داعمينا " }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "خطا {0} : {1}" }, @@ -390,9 +423,6 @@ "upload": "رفع" } }, - "cloud": { - "GoToCloud": "الانتقال الى السحابة" - }, "theia": { "core": { "cannotConnectBackend": "تعذر الاتصال بالخلفية", diff --git a/i18n/az.json b/i18n/az.json index 3d7e313cc..4c181e3e4 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -8,6 +8,7 @@ "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?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No ports selected for board: '{0}'.", @@ -24,6 +26,7 @@ "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ç", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "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", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Uğurla Silindi\nPlatforma 1{0}:2{1}" + "succesfullyUninstalledPlatform": "Uğurla Silindi\nPlatforma 1{0}:2{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Boards Manager", "boardsType": { @@ -85,6 +90,7 @@ "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.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "by", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Yüklə", + "installed": "Installed", "moreInfo": "More info", "uninstall": "Sil", "uninstallMsg": "Do you want to uninstall {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Fayl Əlavə Et", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Yükləmə Uğursuz.Yenidən Sınayın" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": ".ZİP Kitabxana Daxil Edin", "arduinoLibraries": "Ardunio Kitabxanalar", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Kitabxana Daxil Edin", - "installAll": "Hamısını Yüklə", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Kitabxana Uğurla Yükləndi {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Kitabxanaları İdarə Et", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -320,6 +342,12 @@ "network": "Network", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "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.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} error: {1}" }, @@ -390,9 +423,6 @@ "upload": "Upload" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/bg.json b/i18n/bg.json index aabf8bdaa..0c4a1fec7 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -8,6 +8,7 @@ "board": "Платка{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Информация за платка", + "boards": "boards", "configDialog1": "Изберете както платка, така и порт, ако искате да качите скица.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Не можа да се намери по-рано избрана платка „{0}“ в инсталираната платформа „{1}“. Моля, изберете отново ръчно платката, която искате да използвате. Искате ли да я изберете отново сега?", @@ -15,6 +16,7 @@ "getBoardInfo": "Вземи информация за платката", "inSketchbook": "(в Скицника)", "installNow": "Ядрото „{0} {1}“ трябва да бъде инсталирано за текущо избраната платка „{2}“. Искате ли да го инсталирате сега?", + "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "FQBN не е наличен за избраната платка „{0}“. Имате ли инсталирано съответното ядро?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Няма избрани портове за платка: „{0}“.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Моля, изберете платка, свързана към порта, който сте избрали.", "port": "Порт{0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Програматор", "reselectLater": "Изберете отново по-късно", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Моля, изберете платка, за да получите информация за нея.", "selectPortForInfo": "Моля, изберете порт, за да получите информация за платката.", "showAllAvailablePorts": "Показва всички налични портове, когато е активиран", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Успешно инсталирана платформа {0}:{1}", - "succesfullyUninstalledPlatform": "Успешно деинсталирана платформа {0}:{1}" + "succesfullyUninstalledPlatform": "Успешно деинсталирана платформа {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Мениджър на платки", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Изпращането на „{0}“ приключи.", "embed": "Вграждане:", "emptySketchbook": "Вашият Скицник е празен", + "goToCloud": "Go to Cloud", "learnMore": "Научете повече", "link": "Връзка:", "notYetPulled": "Не може да се изпрати към облака. Още не е изтеглен.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "от", "filterSearch": "Филтрирайте търсенето си...", - "install": "ИНСТАЛИРАЙ", + "install": "Инсталирай", + "installed": "Installed", "moreInfo": "Повече информация", "uninstall": "Деинсталиране", "uninstallMsg": "Искате ли да деинсталирате {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Добави файл", "fileAdded": "Към скицата е добавен един файл.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Замени" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Добавяне на .ZIP библиотека...", "arduinoLibraries": "Arduino библиотеки", "contributedLibraries": "Допринесени библиотеки", - "dependenciesForLibrary": "Зависимости за библиотека {0}:{1}", "include": "Включи библиотека", - "installAll": "Инсталирай всички", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Искате ли да инсталирате всички липсващи зависимости?", "installOneMissingDependency": "Искате ли да инсталирате липсващата зависимост?", - "installOnly": "Инсталирайте само {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Успешно инсталирана библиотека {0}:{1}", "libraryAlreadyExists": "Библиотека вече съществува. Искате ли да я презапишете?", "manageLibraries": "Управление на библиотеки...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Мрежа", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Допълнителни URL адреси на мениджър на платки", "auth.audience": "OAuth2 аудиторията.", @@ -320,6 +342,12 @@ "network": "Мрежа", "newSketchbookLocation": "Изберете местоположение за новата скицниката", "noProxy": "Без прокси", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Показване на подробен изход по време на", "sketchbook.location": "Местоположение на скицника", "sketchbook.showAllFiles": "True , за да се покажат всички файлове вътре в скицата. По подразбиране е false.", @@ -350,7 +378,7 @@ "cantOpen": "Папка с име „{0}“ вече съществува. Не може да се отвори скица.", "close": "Наистина ли искате да затворите скицата?", "compile": "Compiling sketch...", - "configureAndUpload": "Конфигуриране и качване", + "configureAndUpload": "Configure and Upload", "createdArchive": "Създаден е архив „{0}“.", "doneCompiling": "Готово е компилирането.", "doneUploading": "Качването приключи.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} грешка: {1}" }, @@ -390,9 +423,6 @@ "upload": "Качване" } }, - "cloud": { - "GoToCloud": "КЪМ ОБЛАКА" - }, "theia": { "core": { "cannotConnectBackend": "Не може да се свърже с бекенда.", diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index d19c9976a..97d0715e0 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -8,6 +8,7 @@ "board": "Tarja{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Informació de la Tarja", + "boards": "boards", "configDialog1": "Seleccioneu una Tarja i un port si voleu carregar un programa.", "configDialog2": "Si només seleccioneu una Tarja, podreu compilar, però no carregar el vostre programa.", "couldNotFindPreviouslySelected": "No s'ha pogut trobar la Tarja seleccionada anteriorment '{0}' a la plataforma instal·lada '{1}'. Torneu a seleccionar manualment la tarja que voleu utilitzar. Vols tornar a seleccionar-la ara?", @@ -15,6 +16,7 @@ "getBoardInfo": "Obtenir informació de la Tarja", "inSketchbook": "(al quadern de programes)", "installNow": "El nucli de \"{0} {1}\" s'ha d'instal·lar per a la Tarja \"{2}\" seleccionada actualment. Vols instal·lar-lo ara?", + "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "El FQBN no està disponible per la Tarja seleccionada \"{0}\". Tens instal·lat el nucli corresponent?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No hi ha cap port seleccionat per a la tarja: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Si us plau, trieu una tarja connectada al port que heu seleccionat.", "port": "Port {0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programador", "reselectLater": "Torneu a seleccionar més tard", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Seleccioneu una tarja per obtenir informació sobre ella.", "selectPortForInfo": "Seleccioneu un port per obtenir la informació de la tarja.", "showAllAvailablePorts": "Mostra tots els ports disponibles quan estiguin habilitats", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Plataforma instal·lada correctament {0}:{1}", - "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}" + "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Gestor de Targetes", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "S'ha acabat de enviar '{0}'.", "embed": "Incrustar:", "emptySketchbook": "El teu quadern de programes està buit", + "goToCloud": "Go to Cloud", "learnMore": "Aprèn més", "link": "Enllaç:", "notYetPulled": "No es pot enviar cap als núvol. Encara no ha estat baixat", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "per", "filterSearch": "Filtra la teva cerca...", - "install": "INSTAL·LA", + "install": "Instal·lar", + "installed": "Installed", "moreInfo": "Més informació", "uninstall": "Desinstal·la", "uninstallMsg": "Vols desinstal·lar {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Afegeix un fitxer", "fileAdded": "S'ha afegit un fitxer al programa.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Substitueix" }, + "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." @@ -236,12 +254,12 @@ "addZip": "Afegeix llibreria .ZIP...", "arduinoLibraries": "Llibreries Arduino", "contributedLibraries": "Llibreriess aportades", - "dependenciesForLibrary": "Dependències de la llibreria {0}:{1}", "include": "Inclou llibreria", - "installAll": "Instal·leu-ho tot", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Voleu instal·lar totes les dependències que falten?", "installOneMissingDependency": "Voleu instal·lar la dependència que falta?", - "installOnly": "Instal·leu {0} només", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Llibreria instal·lada correctament {0}:{1}", "libraryAlreadyExists": "Ja existeix una llibreria. Voleu sobreescriure-la?", "manageLibraries": "Gestiona les Llibreries...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Xarxa", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "URL addicionals del gestor de targetes", "auth.audience": "L'audiència d'OAuth2.", @@ -320,6 +342,12 @@ "network": "Xarxa", "newSketchbookLocation": "Seleccioneu una ubicació nova del quadern de programes", "noProxy": "Sense proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Mostra la sortida detallada durant", "sketchbook.location": "Ubicació del quadern de programes", "sketchbook.showAllFiles": "True per mostrar tots els fitxers del programa dins del programa. És fals per defecte.", @@ -350,7 +378,7 @@ "cantOpen": "Ja existeix una carpeta anomenada \"{0}\". No es pot obrir el programa.", "close": "Esteu segur que voleu tancar el programa?", "compile": "Compiling sketch...", - "configureAndUpload": "Configura i puja", + "configureAndUpload": "Configure and Upload", "createdArchive": "S'ha creat l'arxiu '{0}'.", "doneCompiling": "S'ha fet la compilació.", "doneUploading": "S'ha acabat de carregar.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} error: {1}" }, @@ -390,9 +423,6 @@ "upload": "Carrega" } }, - "cloud": { - "GoToCloud": "VES AL NÚVOL" - }, "theia": { "core": { "cannotConnectBackend": "No es pot connectar al backend.", diff --git a/i18n/cs.json b/i18n/cs.json index 69410774f..0fcc2b11a 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -8,6 +8,7 @@ "board": "Deska {0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Info o desce", + "boards": "boards", "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í? ", @@ -15,6 +16,7 @@ "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": "No boards found for \"{0}\"", "noFQBN": "FQBN není dostupné pro zvolenou desku \"{0}\". Máte nainstalované příslušné jádro? ", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Nebyl zvolen port pro desku '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ", "port": "Port {0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programátor", "reselectLater": "Zvolit později", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Prosím zvolte desku pro získání informací o desce.", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", "showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.", - "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována." + "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.", + "typeOfPorts": "{0} ports" }, "boardsManager": "Manažér desek", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Odesílání dokončeno ‘{0}’.", "embed": "Vložit: ", "emptySketchbook": "Umístění projektů je prázdné", + "goToCloud": "Go to Cloud", "learnMore": "Zjistit více", "link": "Adresa: ", "notYetPulled": "Nemohu odeslat do cloudu jelikož z něj ještě nebylo staženo.", @@ -140,6 +146,7 @@ "by": "od", "filterSearch": "Filtrovat vyhledávání... ", "install": "Instalovat", + "installed": "Installed", "moreInfo": "Více informací", "uninstall": "Odinstalovat", "uninstallMsg": "Chcete odinstalovat {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Přidat soubor", "fileAdded": "Soubor byl přidán do sketche.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Vyměnit" }, + "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." @@ -236,12 +254,12 @@ "addZip": "Přidat .ZIP knihovnu...", "arduinoLibraries": "Arduino knihovny", "contributedLibraries": "Přispěné knihovny", - "dependenciesForLibrary": "Závislosti pro knihovny {0}:{1}", "include": "Zahrnout knihovnu", - "installAll": "Instalovat vše", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Chcete nainstalovat všechny chybějící závislosti? ", "installOneMissingDependency": "Chcete nainstalovat chybějící závislost? ", - "installOnly": "Instalovat pouze {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Knihovna {0}:{1}byla úspěšně nainstalována", "libraryAlreadyExists": "Knihovna již existuje. Chcete jí přepsat?", "manageLibraries": "Spravovat knihovny...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Síť", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Další URL pro manager desek", "auth.audience": "OAuth2 audience", @@ -320,6 +342,12 @@ "network": "Síť", "newSketchbookLocation": "Zvolit nové umístění projektů", "noProxy": "Bez proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Zobrazit podrobný výstup během", "sketchbook.location": "Umístění sketche", "sketchbook.showAllFiles": "Ano pro zobrazení všech souborů sketche. Ne je výchozí hodnota. ", @@ -350,7 +378,7 @@ "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": "Nastavit a nahrát", + "configureAndUpload": "Configure and Upload", "createdArchive": "Vytvořen archív '{0}'.", "doneCompiling": "Ověřování dokončeno.", "doneUploading": "Nahrávání dokončeno. ", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0}chyba: {1}" }, @@ -390,9 +423,6 @@ "upload": "Nahrát" } }, - "cloud": { - "GoToCloud": "Přejdi do Cloudu" - }, "theia": { "core": { "cannotConnectBackend": "Nebylo možné se připojit k backendu. ", diff --git a/i18n/de.json b/i18n/de.json index f778b3ffb..6d250e9e5 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -8,13 +8,15 @@ "board": "Board{0}", "boardConfigDialogTitle": "Anderes Boards und Ports wählen", "boardInfo": "Board-Informationen", + "boards": "Boards", "configDialog1": "Wählen Sie ein Board und einen Port, wenn Sie den Sketch hochladen möchten.", "configDialog2": "Wenn Sie nur ein Board auswählen, werden Sie den Sketch nur kompilieren können, jedoch nicht hochladen.", - "couldNotFindPreviouslySelected": "Zuvor gewähltes Board '{0}' wurde nicht in der installierten Plaftform '{1}' gefunden. Bitte Board erneut auswählen. Jetzt auswählen?", + "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", "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?", "noPortsDiscovered": "Keine Ports gefunden", "noPortsSelected": "Kein Port für das Board : '{0}' ausgewählt.", @@ -24,6 +26,7 @@ "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", "searchBoard": "Board suchen", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Wähle ein Board für die Board-Informationen.", "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", "showAllAvailablePorts": "Zeige alle verfügbaren Ports, wenn aktiviert.", + "showAllPorts": "Zeige alle Ports", "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", - "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}" + "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", + "typeOfPorts": "{0} Ports" }, "boardsManager": "Board-Verwaltung", "boardsType": { @@ -40,11 +45,11 @@ }, "bootloader": { "burnBootloader": "Bootloader brennen", - "burningBootloader": "Brenne Bootloader...", + "burningBootloader": "Bootloader überschreiben...", "doneBurningBootloader": "Bootloader erfolgreich gebrannt." }, "burnBootloader": { - "error": "Fehler beim Brennen des Bootloaders: {0}" + "error": "Fehler beim Überschreiben des Bootloaders: {0}" }, "certificate": { "addNew": "Neu hinzufügen", @@ -67,8 +72,8 @@ "checkForUpdates": "Nach Arduino Updates suchen", "installAll": "Alle installieren", "noUpdates": "Es sind keine aktuellen Updates verfügbar.", - "promptUpdateBoards": "Es sind Updates für einige ihrer Boards verfügbar.", - "promptUpdateLibraries": "Es sind Updates für einige ihrer Blibliotheken verfügbar.", + "promptUpdateBoards": "Es sind Updates für einige Ihrer Boards verfügbar.", + "promptUpdateLibraries": "Es sind Updates für einige Ihrer Blibliotheken verfügbar.", "updatingBoards": "Boards werden aktualisiert...", "updatingLibraries": "Bibliotheken werden aktualisiert..." }, @@ -85,6 +90,7 @@ "donePushing": "Hochladen von '{0}' erfolgreich.", "embed": "Einbetten:", "emptySketchbook": "Dein Sketchbook ist leer", + "goToCloud": "Zur Cloud gehen", "learnMore": "Mehr erfahren", "link": "Link:", "notYetPulled": "Kann nicht in die Cloud geschoben werden. Es ist noch nicht heruntergeladen.", @@ -140,24 +146,36 @@ "by": "von", "filterSearch": "Filtern Sie Ihre Suche...", "install": "Installieren", + "installed": "Installiert", "moreInfo": "Mehr Information", - "uninstall": "deinstalieren", + "uninstall": "Deinstallieren", "uninstallMsg": "Möchten Sie {0} deinstallieren?", "version": "Version {0}" }, "contributions": { "addFile": "Datei hinzufügen...", "fileAdded": "Eine Datei wurde zum Sketch hinzugefügt.", - "replaceTitle": "Ersetzten" + "plotter": { + "couldNotOpen": "Konnte den seriellen Plotter nicht öffnen" + }, + "replaceTitle": "Ersetzen" + }, + "core": { + "compilerWarnings": { + "all": "Alle", + "default": "Standard", + "more": "Mehr", + "none": "Kein/e/r" + } }, "coreContribution": { "copyError": "Fehlermeldungen kopieren", "noBoardSelected": "Kein Board ausgewählt. Bitte Arduino Board im Menü wählen mit Werkzeuge > Board" }, "daemon": { - "restart": "Dämon neu starten", - "start": "Dämon starten", - "stop": "Dämon stoppen" + "restart": "Daemon neustarten", + "start": "Daemon starten", + "stop": "Stoppe Daemon" }, "debug": { "debugWithMessage": "Debug - {0}", @@ -181,7 +199,7 @@ "revealError": "Fehler zeigen" }, "electron": { - "couldNotSave": "Der Sketch konnte nicht gesichert werden. Bitte kopiere deine ungesicherte Arbeit in deinen bevorzugten Texteditor und starte die IDE neu.", + "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": { @@ -193,7 +211,7 @@ "menu": "Beispiele" }, "firmware": { - "checkUpdates": "Nach Updates Suchen", + "checkUpdates": "Nach Updates suchen", "failedInstall": "Installation fehlgeschlagen. Bitte versuche es erneut ", "install": "Installieren", "installingFirmware": "Firmware wird installiert.", @@ -236,12 +254,12 @@ "addZip": ".ZIP-Bibliothek hinzufügen...", "arduinoLibraries": "Arduino Bibliotheken", "contributedLibraries": "Bibliotheken, zu denen beigetragen wurde", - "dependenciesForLibrary": "Abhängigkeiten für die Bibliothek {0}:{1}", "include": "Bibliothek einbinden", "installAll": "Alle installieren", + "installLibraryDependencies": "Bibliotheksabhängigkeiten installieren", "installMissingDependencies": "Möchten Sie alle fehlenden Ressourcen installieren?", "installOneMissingDependency": "Möchten Sie die fehlende Ressource installieren?", - "installOnly": "Nur {0} installieren", + "installWithoutDependencies": "Ohne Abhängigkeiten installieren", "installedSuccessfully": "Bibliothek {0}:{1} erfolgreich installiert", "libraryAlreadyExists": "Eine Bibliothek existiert bereits. Möchten sie diese überschreiben?", "manageLibraries": "Bibliotheken verwalten...", @@ -267,7 +285,7 @@ "sensors": "Sensoren", "signalInputOutput": "Signal Ein-/Ausgang", "timing": "Timing", - "uncategorized": "Nicht kategoriesiert" + "uncategorized": "Nicht kategorisiert" }, "libraryType": { "installed": "Installiert" @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Websocket wurde nicht geschlossen", "unableToConnectToWebSocket": "Websocket wurde nicht verbunden" }, + "portProtocol": { + "network": "Netzwerk", + "serial": "Seriell" + }, "preferences": { "additionalManagerURLs": "Zusätzliche Boardverwalter-URLs", "auth.audience": "Das The OAuth2 Audience.", @@ -301,34 +323,40 @@ "compile": "Kompilieren", "compile.experimental": "Aktivieren, wenn die IDE mehrere Fehler des Compiler behandeln soll. Standardmäßig ausgeschaltet.", "compile.revealRange": "Legt fest, wie Compilerfehler im Editor nach einer fehlgeschlagenen Überprüfung/einem fehlgeschlagenen Upload angezeigt werden. Mögliche Werte: 'auto': bei Bedarf vertikal scrollen, um die Zeile anzuzeigen. 'center': bei Bedarf vertikal scrollen und die Zeile zentriert anzeigen. 'top': bei Bedarf vertikal scrollen und die Zeile nahe am oberen Ende des Darstellungsbereichs anzeigen. Optimiert für das Betrachten einer Codedefinition. 'centerIfOutsideViewport': bei Bedarf vertikal scrollen und die Zeile nur anzeigen, wenn sie außerhalb des Anzeigebereichs liegt. Der Standardwert ist '{0}'.", - "compile.verbose": "Wahr für ausführliche Compilerausgaben. Standardmäßig Falsch", - "compile.warnings": "Einstellung des Warnlevels für den GCC. Standardeinstellung ist 'None'.", - "compilerWarnings": "Warnungen des Übersetzers", + "compile.verbose": "Aktivieren Sie diese Option, wenn ausführliche Compiler-Meldungen angezeigt werden sollen. Standardgemäß deaktiviert.", + "compile.warnings": "Einstellung der Compiler-Warnungen für den GCC. Standardeinstellung ist 'Keine'. ", + "compilerWarnings": "Compiler-Meldungen", "editorFontSize": "Editor Schriftgröße", "editorQuickSuggestions": "Schnelle Editor Vorschläge", "enterAdditionalURLs": "Füge zusätzliche URLs hinzu, jede Reihe einzeln", "files.inside.sketches": "Dateien im Sketch zeigen", - "ide.updateBaseUrl": "Die URL wovon Updates heruntergeladen werden. Standardmäßig bei 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Von welchem Kannal die Updates kommen sollen. 'stabil' ist die stabile Version, 'nächtlich' ist die neueste Entwicklerversion", - "interfaceScale": "Fenster Skalierung", - "invalid.editorFontSize": "Ungültige Editor Schriftgröße. Sie muss eine positive, ganze Zahl sein.", + "ide.updateBaseUrl": "URL für den Download von Updates. Standard-URL: \"https://downloads.arduino.cc/arduino-ide\"", + "ide.updateChannel": "Release-Channel, von dem Updates bezogen werden sollen. 'stable' für stabile und getestete Updates. 'nightly' für allerneuste Updates, welche jedoch noch nicht ausreichend getestet wurden.", + "interfaceScale": "Größe der Benutzeroberfläche", + "invalid.editorFontSize": "Ungültige Editor-Schriftgröße. Wert muss eine Ganzzahl größer 0 (Null) sein.", "invalid.sketchbook.location": "Ungültiger Sketchbook Speicherort: {0}", "invalid.theme": "Ungültiges Erscheinungsbild", - "language.log": "Wahr, wenn der Arduino Language Server Logfiles in den Sketch-Ordner schreiben soll. Sonst falsch. Standardeinstellung ist falsch.\n ", + "language.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", "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", "noProxy": "Kein Proxy", - "showVerbose": "Debug Informationen während", + "proxySettings": { + "hostname": "Hostname", + "password": "Passwort", + "port": "Portnummer", + "username": "Benutzername" + }, + "showVerbose": "Compiler-Meldungen anzeigen beim", "sketchbook.location": "Dateipfad des Sketchbooks", - "sketchbook.showAllFiles": "Wahr, um alle Dateien im Sketch anzuzeigen. Standardmäßig Falsch.", - "survey.notification": "Wahr, wenn Benutzer benachrichtigt werden sollen, wenn eine Umfrage verfügbar ist. Standardeinstellung ist wahr.", + "sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardgemäß deaktiviert. ", + "survey.notification": "Wenn aktiviert, werden Nutzer benachrichtigt, wenn eine Umfrage verfügbar ist. Standardgemäß aktiviert.", "unofficialBoardSupport": "Klicke hier für eine Liste von inoffiziell unterstützten Boards", "upload": "Hochladen", - "upload.verbose": "Wahr für ausführliche Ausgaben während dem Hochladen. Standardmäßig Falsch.", + "upload.verbose": "Wenn aktiviert, werden ausführliche Compiler-Meldungen angezeigt. Standardgemäß deaktiviert.", "verifyAfterUpload": "Code nach Hochladen überprüfen ", - "window.autoScale": "Ist wahr, wenn die Benutzeroberfläche automatisch mit der Schriftgröße skaliert wird.", + "window.autoScale": "Wenn aktiviert: Benutzeroberfläche soll mit Schriftgröße skalieren.", "window.zoomLevel": "Stelle die Zoomstufe des Fensters ein. Der Standardwert ist 0, jede Vergrößerung (z.B.: 1) oder Verringerung (z.B.: -1) um eins steht für 20% Vergrößerung bzw. Verkleinerung des Fensters. Du kannst auch Kommazahlen eingeben, um die Zoomstufe feiner einzustellen.\n " }, "replaceMsg": "Existierende Version von {0} ersetzen?", @@ -350,7 +378,7 @@ "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", + "configureAndUpload": "Konfigurieren und Hochladen", "createdArchive": "Archiv '{0}' erstellt.", "doneCompiling": "Kompilieren erfolgreich!", "doneUploading": "Hochladen erfolgreich! ", @@ -381,22 +409,24 @@ "dismissSurvey": "Nicht erneut anzeigen", "surveyMessage": "Helfen Sie uns, uns zu verbessern, indem Sie diese kurze Umfrage ausfüllen. Wir wissen unsere Community wertzuschätzen und möchten unsere Unterstützer gerne ein wenig besser kennenlernen." }, + "updateIndexes": { + "updateIndexes": "Indizes aktualisieren", + "updateLibraryIndex": "Bibliotheksverzeichnis aktualisieren", + "updatePackageIndex": "Paketindex aktualisieren" + }, "upload": { "error": "{0} Fehler: {1}" }, "userFields": { - "cancel": "abbrechen", + "cancel": "Abbrechen", "enterField": "Eingabe {0}", "upload": "Hochladen" } }, - "cloud": { - "GoToCloud": "Zur Cloud gehen" - }, "theia": { "core": { - "cannotConnectBackend": "Keine Verbindung zum Backend.", - "cannotConnectDaemon": "Keine Verbindung zum CLI Daemon.", + "cannotConnectBackend": "Verbindung zum Backend kann nicht hergestellt werden.", + "cannotConnectDaemon": "Verbindung zum CLI Daemon kann nicht hergestellt werden.", "couldNotSave": "Der Sketch konnte nicht gesichert werden. Bitte kopiere deine ungesicherte Arbeit in deinen bevorzugten Texteditor und starte die IDE neu.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", diff --git a/i18n/el.json b/i18n/el.json index b0e3c8797..6856f0d5e 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -8,6 +8,7 @@ "board": "Πλακέτα{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Πληροφορίες Πλακέτας", + "boards": "boards", "configDialog1": "Επίλεξε και Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα σχέδιο.", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Δεν έγινε εντοπισμός της προηγουμένως επιλεγμένης πλακέτας '{0}' στην εγκατεστημένη πλατφόρμα '{1}'. Παρακαλώ επίλεξε πάλι χειροκίνητα την πλακέτα που θέλεις να χρησιμοποιήσεις. Θέλεις να την επιλέξεις τώρα;", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Δεν επιλέχθηκε θύρα για την πλακέτα: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Πσρακαλώ επίλεξε μια πλακέτα που συνδέθηκε στην θύρα που έχεις επιλέξει.", "port": "Θύρα{0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Προγραμματιστής", "reselectLater": "Επιλογή αργότερα", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Παρακαλώ επίλεξε μια πλακέτα για εμφάνιση πληροφοριών πλακέτας.", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", "showAllAvailablePorts": "Εμφανίζει όλες τις διαθέσιμες θύρες όταν είναι ενεργοποιημένο.", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Επιτυχής εγκατάσταση πλατφόρμας {0}:{1}", - "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}" + "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Διαχειριστής Πλακετών", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Done pushing ‘{0}’.", "embed": "Ενσωμάτωση:", "emptySketchbook": "Τα Σχέδια σου είναι άδεια.", + "goToCloud": "Go to Cloud", "learnMore": "Μάθε περισσότερα", "link": "Σύνδεσμος:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "από", "filterSearch": "Filter your search...", - "install": "ΕΓΚΑΤΑΣΤΑΣΗ", + "install": "Εγκατάσταση", + "installed": "Installed", "moreInfo": "Περισσότερες πληροφορίες", "uninstall": "Απεγκατάσταση", "uninstallMsg": "Do you want to uninstall {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Προσθήκη αρχείου", "fileAdded": "Ένα αρχείο προστέθηκε στον κώδικα.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Αντικατάσταση" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Προσθέστε μια βιβλιοθήκη μορφής .ZIP", "arduinoLibraries": "Βιβλιοθήκες Arduino", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Συμπεριλάβετε βιβλιοθήκη", - "installAll": "Εγκατάσταση όλων", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Εγκατάσταση {0} μόνο", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "Μια βιβλιοθήκη υπάρχει ήδη. Θέλετε να την αντικαταστήσετε;", "manageLibraries": "Διαχείριση βιβλιοθηκών...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Δίκτυο", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Πρόσθετοι Σύνδεσμοι Διαχειριστή Πλακετών", "auth.audience": "The OAuth2 audience.", @@ -320,6 +342,12 @@ "network": "Δίκτυο", "newSketchbookLocation": "Επιλογή νέας τοποθεσίας σχεδίων", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Εμφάνιση λεπτομερούς εξόδου κατά τη διάρκεια", "sketchbook.location": "Τοποθεσία σχεδίων", "sketchbook.showAllFiles": "Αληθές για εμφάνιση όλων των αρχείων σχεδίου μεσα στο σχέδιο. Είναι ψευδές απο προεπιλογή.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Ολοκλήρωση ανεβάσματος", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} σφάλμα: {1}" }, @@ -390,9 +423,6 @@ "upload": "Ανέβασμα" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/es.json b/i18n/es.json index 486363970..0b0ae0035 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -8,6 +8,7 @@ "board": "Placa{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Información de la placa", + "boards": "boards", "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?", @@ -15,6 +16,7 @@ "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 boards found for \"{0}\"", "noFQBN": "El FQBN no está disponible para la placa seleccionada \"{0}\". ¿Tienes instalado el núcleo correspondiente?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No se han seleccionado puertos para la placa: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Por favor, elija una placa conectada al puerto que haya seleccionado.", "port": "Puerto {0}", "portLabel": "Puerto: {0}", + "ports": "ports", "programmer": "Programador", "reselectLater": "Vuelve a seleccionar más tarde", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Por favor, seleccione una placa para obtener información sobre ella.", "selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.", "showAllAvailablePorts": "Muestra todos los puertos disponibles cuando está activado", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente", - "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente" + "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente", + "typeOfPorts": "{0} ports" }, "boardsManager": "Gestor de placas", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Envío a '{0}' realizado.", "embed": "Incrustado:", "emptySketchbook": "Tu Sketchbook está vacío", + "goToCloud": "Go to Cloud", "learnMore": "Aprender más", "link": "Enlace:", "notYetPulled": "No se puede cargar a las nube. Todavía no ha sido descargado", @@ -140,6 +146,7 @@ "by": "de", "filterSearch": "Filtre su búsqueda...", "install": "Instalar", + "installed": "Installed", "moreInfo": "Más información", "uninstall": "Desinstalar", "uninstallMsg": "¿Quieres desinstalar {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Añadir fichero...", "fileAdded": "Un archivo añadido al sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Reemplazar" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copiar mensajes de error", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Añadir biblioteca .ZIP...", "arduinoLibraries": "Bibliotecas de Arduino", "contributedLibraries": "Bibliotecas aportadas", - "dependenciesForLibrary": "Dependencias para la biblioteca {0}:{1}", "include": "Incluir biblioteca", - "installAll": "Instalar todo", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "¿Quieres instalar todas las dependencias faltantes?", "installOneMissingDependency": "¿Quieres instalar la dependencia faltante?", - "installOnly": "Instalar {0} solamente", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Biblioteca {0}:{1} instalada correctamente", "libraryAlreadyExists": "Ya existe una biblioteca. ¿Quieres sobrescribirla?", "manageLibraries": "Gestionar bibliotecas...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": " No se puede cerrar websocket", "unableToConnectToWebSocket": " No se puede conectar al websocket" }, + "portProtocol": { + "network": "Red", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "URLs adicionales de gestor de placas", "auth.audience": "El público de OAuth2.", @@ -320,6 +342,12 @@ "network": "Red", "newSketchbookLocation": "Selecciona la nueva ruta del sketchbook", "noProxy": "Sin Proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Mostrar salida verbosa durante", "sketchbook.location": "Ruta del Sketchbook", "sketchbook.showAllFiles": "Verdadero para mostrar todos los archivos de bocetos dentro del boceto. Por defecto es falso.", @@ -350,7 +378,7 @@ "cantOpen": "Ya existe una carpeta con el nombre \"{0}\". No se puede abrir.", "close": "¿Estás seguro de que quieres cerrar el sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configurar y subir", + "configureAndUpload": "Configure and Upload", "createdArchive": "Archivo '{0}' creado.", "doneCompiling": "Compilación completada.", "doneUploading": "Carga completada.", @@ -381,6 +409,11 @@ "dismissSurvey": "No volver a mostrar", "surveyMessage": "Por favor ayudenos mejorar completando esta breve encuesta. Valoramos nuestra comunidad y nos gustaría conocer algo mejor a los que nos apoyan." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "1{0} error: 2{1}" }, @@ -390,9 +423,6 @@ "upload": "Cargar" } }, - "cloud": { - "GoToCloud": "IR AL CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "No se puede conectar al backend.", diff --git a/i18n/eu.json b/i18n/eu.json index c2151934d..95e5cfa63 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -8,6 +8,7 @@ "board": "{0} plaka", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Plakaren informazioa", + "boards": "boards", "configDialog1": "Hautatu plaka bat eta ataka bat programa bat kargatu nahi baduzu.", "configDialog2": "Plaka bakarrik hautatzen baduzu, programa konpilatu ahal izango duzu, baina ez kargatu.", "couldNotFindPreviouslySelected": "Ezin izan da aurkitu aurrez hautatutako '{0}' plaka instalatutako '{1}' plataforman. Hautatu berriz eskuz erabili nahi duzun plaka. Orain berriz hautatu nahi duzu?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Ez da atakarik hautatu plakarentzat: '{0}'", @@ -24,6 +26,7 @@ "pleasePickBoard": "Aukeratu hautatu duzun atakara konektatutako plaka bat.", "port": "{0} ataka", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programatzailea", "reselectLater": "Hautatu berriz geroago", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Hautatu plaka bat plakaren informazioa eskuratzeko.", "selectPortForInfo": "Hautatu ataka bat plakaren informazioa eskuratzeko.", "showAllAvailablePorts": "Gaituta dagoenean erabilgarri dauden ataka guztiak erakusten ditu", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "{0}:{1} plataforma behar bezala instalatu da", - "succesfullyUninstalledPlatform": "{0}:{1} plataforma behar bezala desinstalatu da" + "succesfullyUninstalledPlatform": "{0}:{1} plataforma behar bezala desinstalatu da", + "typeOfPorts": "{0} ports" }, "boardsManager": "Plaka kudeatzailea", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Hodeian gordetzea burututa: '{0}'.", "embed": "Kapsulatu:", "emptySketchbook": "Zure programa bilduma hutsik dago", + "goToCloud": "Go to Cloud", "learnMore": "Ikasi gehiago", "link": "Esteka:", "notYetPulled": "Ezin da Hodeian gorde. Ez da Hodeitik kargatu oraindik.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "Egilea:", "filterSearch": "Iragazi zure bilaketa...", - "install": "INSTALATU", + "install": "Instalatu", + "installed": "Installed", "moreInfo": "Informazio gehiago", "uninstall": "Desinstalatu", "uninstallMsg": "{0} desinstalatu nahi duzu?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Gehitu fitxategia", "fileAdded": "Fitxategi bat gehitu da programara.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Ordezkatu" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Gehitu .ZIP liburutegia...", "arduinoLibraries": "Arduino liburutegiak", "contributedLibraries": "Hirugarrengoen liburutegiak", - "dependenciesForLibrary": "{0} liburutegiaren mendekotasunak: {1}", "include": "Hartu barne liburutegia", - "installAll": "Instalatu guztiak", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Falta diren mendekotasun guztiak instalatu nahi dituzu?", "installOneMissingDependency": "Falta den mendekotasuna instalatu nahi duzu?", - "installOnly": "Instalatu {0} bakarrik", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "{0}:{1} liburutegia behar bezala instalatu da", "libraryAlreadyExists": "Liburutegi bat badago dagoeneko. Gainidatzi nahi duzu?", "manageLibraries": "Kudeatu liburutegiak...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Sarea", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Plaka kudeatzaile gehigarrien URLak:", "auth.audience": "OAuth2 audientzia.", @@ -320,6 +342,12 @@ "network": "Sarea", "newSketchbookLocation": "Hautatu programa bilduma berriaren kokalekua", "noProxy": "Proxyrik ez", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Erakutsi irteera xehatua honetan zehar:", "sketchbook.location": "Programa bildumaren kokalekua", "sketchbook.showAllFiles": "Egia programaren barruko programa-fitxategi guztiak erakusteko. Lehenetsia gezurra da.", @@ -350,7 +378,7 @@ "cantOpen": "\"{0}\" izeneko karpeta badago dagoeneko. Ezin da programa ireki.", "close": "Ziur zaude programa itxi nahi duzula?", "compile": "Compiling sketch...", - "configureAndUpload": "Konfiguratu eta kargatu", + "configureAndUpload": "Configure and Upload", "createdArchive": "'{0}' artxiboa sortu da.", "doneCompiling": "Konpilazioa burutu da.", "doneUploading": "Karga burutu da.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} errorea: {1}" }, @@ -390,9 +423,6 @@ "upload": "Kargatu" } }, - "cloud": { - "GoToCloud": "JOAN HODEIRA" - }, "theia": { "core": { "cannotConnectBackend": "Ezin izan da atzeko aldera konektatu.", diff --git a/i18n/fa.json b/i18n/fa.json index 324806b0a..317c87da3 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -8,6 +8,7 @@ "board": "بورد {0}", "boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر", "boardInfo": "مشخصات برد", + "boards": "boards", "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", "configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.", "couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟", @@ -15,6 +16,7 @@ "getBoardInfo": "دریافت راهنمای برد", "inSketchbook": "(در منبع طرح ها)", "installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟", + "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "FQBN برای برد انتخاب شده \"{0}\" موجود نیست. آیا هسته مربوطه را نصب کرده اید؟", "noPortsDiscovered": "هیچ پورتی پیدا نشد", "noPortsSelected": "هیچ پورتی برای برد انتخاب نشده است.{0}", @@ -24,6 +26,7 @@ "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", "portLabel": "پورت: {0}", + "ports": "ports", "programmer": "برنامه ریز", "reselectLater": "بعدا انتخاب کنید", "searchBoard": "جستجوی بورد", @@ -31,8 +34,10 @@ "selectBoardForInfo": "لطفاً یک برد را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "showAllAvailablePorts": "نمایش تمام پورت های موجود در صورت فعال بودن", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}", - "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}" + "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "مدیریت برد ها", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "پایان ارسال {0}", "embed": "قرار دادن:", "emptySketchbook": "طرح شما خالی است", + "goToCloud": "Go to Cloud", "learnMore": "یادگیری بیشتر", "link": "لینک:", "notYetPulled": "نمی توان به ابر ارسال کرد. هنوز دریافت نشده است.", @@ -140,6 +146,7 @@ "by": "توسط", "filterSearch": "محدود کردن جستجوی شما ...", "install": "نصب", + "installed": "Installed", "moreInfo": "اطلاعات بیشتر", "uninstall": "لغو نصب", "uninstallMsg": "آیا شما می خواهید {0} را لغو نصب کنید؟", @@ -148,8 +155,19 @@ "contributions": { "addFile": "فایل اظافه کن", "fileAdded": "یک فایل به طرح افزوده شد.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "جایگذاری" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "اضافه کتابخانه ی .zip شده", "arduinoLibraries": "کتابخانه های آردوینو", "contributedLibraries": "کتابخانه های اشتراکی", - "dependenciesForLibrary": "وابستگی های کتابخانه {0}:{1}", "include": "اضافه کتابخانه", - "installAll": "نصب همه", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "آیا می خواهید تمام وابستگی های از دست رفته را نصب کنید؟", "installOneMissingDependency": "آیا می خواهید وابستگی از دست رفته را نصب کنید؟", - "installOnly": "فقط {0} را نصب کن", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "نصب کتابخانه {0}:{1} موفقیت آمیز بود.", "libraryAlreadyExists": "یک کتابخانه از قبل وجود دارد. آیا میخواهید آن را بازنویسی کنید؟", "manageLibraries": "مدیریت کتابخانه ها...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "نتورک", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "نشانی‌های اینترنتی مدیر تابلوهای افزوده", "auth.audience": "حضار OAuth2(احراز هویت اینترنتی).", @@ -320,6 +342,12 @@ "network": "نتورک", "newSketchbookLocation": "مکان جدید منبع طرح ها را مشخص کنید", "noProxy": "بدون پروکسی", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "نمایش خروجی پرمخاطب در طول", "sketchbook.location": "مکان منبع طرح ها", "sketchbook.showAllFiles": "همه فایل‌های طرح را در داخل طرح نشان دهد درست است. به طور پیش فرض نادرست است.", @@ -350,7 +378,7 @@ "cantOpen": "پوشه ای با نام \"{0}\" از قبل وجود دارد. طرح را نمی توان باز کرد", "close": "آیا شما می خواهید این طرح را ببندید؟", "compile": "Compiling sketch...", - "configureAndUpload": "پیکربندی و بارگذاری", + "configureAndUpload": "Configure and Upload", "createdArchive": "آرشیو {0} ایجاد شد.", "doneCompiling": "پایان کامپایل کردن", "doneUploading": "پایان بارگذاری", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "خطا {0} : {1}" }, @@ -390,9 +423,6 @@ "upload": "بارگذاری" } }, - "cloud": { - "GoToCloud": "برو به ابر" - }, "theia": { "core": { "cannotConnectBackend": "اتصال به سرور ناموفق بود.", diff --git a/i18n/fil.json b/i18n/fil.json index 8c0d4b790..a06b95ae1 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -8,6 +8,7 @@ "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?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No ports selected for board: '{0}'.", @@ -24,6 +26,7 @@ "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", @@ -31,8 +34,10 @@ "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", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Boards Manager", "boardsType": { @@ -85,6 +90,7 @@ "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.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "by", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Install", + "installed": "Installed", "moreInfo": "More info", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", @@ -148,8 +155,19 @@ "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." @@ -236,12 +254,12 @@ "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -320,6 +342,12 @@ "network": "Network", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True para ipakita lahat ng sketch files sa loob ng isang sketch. Ito ay false by default.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} error: {1}" }, @@ -390,9 +423,6 @@ "upload": "Upload" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/fr.json b/i18n/fr.json index b40f4c396..200239265 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -8,6 +8,7 @@ "board": "Carte{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Information de la carte", + "boards": "boards", "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 ?", @@ -15,6 +16,7 @@ "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 ?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Aucun porte sélectionné pour la carte : '{0}'", @@ -24,6 +26,7 @@ "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", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Merci de choisir une carte pour obtenir ses informations.", "selectPortForInfo": "Merci de choisir un port pour obtenir des informations sur la carte.", "showAllAvailablePorts": "Affiche les ports disponibles quand activer.", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Plateforme installé avec succès {0}:{1}", - "succesfullyUninstalledPlatform": "Plateforme désinstallée avec succès {0}:{1}" + "succesfullyUninstalledPlatform": "Plateforme désinstallée avec succès {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Gestionnaire de carte", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Téléchargement terminé pour '{0}'", "embed": "Embarqué : ", "emptySketchbook": "Votre carnet de croquis est vide", + "goToCloud": "Go to Cloud", "learnMore": "En savoir plus", "link": "Lien :", "notYetPulled": "Impossible de push sur le Cloud. Rien n'a été pull jusque la.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "par", "filterSearch": "Filtrez votre recherche...", - "install": "INSTALLER", + "install": "Installer", + "installed": "Installed", "moreInfo": "Plus d'information", "uninstall": "Désinstaller", "uninstallMsg": "Voulez vous désinstaller {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Ajouter un fichier", "fileAdded": "Un fichier a été ajouté au croquis", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Remplacer" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copier les messages d'erreur", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Ajouter la bibliothèque .ZIP...", "arduinoLibraries": "Bibliothèques Arduino", "contributedLibraries": "Bibliothèques tierce-partie", - "dependenciesForLibrary": "Ressources liées pour la libraire {0}:{1}", "include": "Importer une bibliothèque", - "installAll": "Tout installer", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Souhaitez vous installer toutes les ressources liées manquantes ?", "installOneMissingDependency": "Souhaitez-vous installer la ressource liée manquante?", - "installOnly": "Installer {0} seulement", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Librairie installée avec succès {0}:{1}", "libraryAlreadyExists": "Cette librairie existe déjà. Souhaitez-vous l'écraser ?", "manageLibraries": "Gérer les bibliothèques...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Impossible de fermer le web socket", "unableToConnectToWebSocket": "Impossible de se connecter au web socket" }, + "portProtocol": { + "network": "Réseau", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "URL de gestionnaire de cartes supplémentaires", "auth.audience": "L'audience OAuth2.", @@ -320,6 +342,12 @@ "network": "Réseau", "newSketchbookLocation": "Sélectionner la localisation du nouveau croquis.", "noProxy": "Aucun proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Afficher la sortie de débogage verbeuse pendant", "sketchbook.location": "Localisation du croquis.", "sketchbook.showAllFiles": "Vrai pour montrer tous les fichiers croquis à l'intérieur du croquis. La valeur par défaut est faux.", @@ -350,7 +378,7 @@ "cantOpen": "Un dossier nommé « {0} » existe déjà. Impossible d''ouvrir le croquis.", "close": "Êtes-vous sûr de vouloir fermer ce croquis ?", "compile": "Compilation du programme...", - "configureAndUpload": "Configurer et téléverser", + "configureAndUpload": "Configure and Upload", "createdArchive": "Archive créer '{0}'", "doneCompiling": "Compilation terminée.", "doneUploading": "Téléversement fait.", @@ -381,6 +409,11 @@ "dismissSurvey": "Ne pas montrer de nouveau", "surveyMessage": "Aide-nous à nous améliorer en répondant à cette enquête très courte. Nous apprécions notre communauté et nous aimerions connaître un peu mieux nos supporters." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} erreur : {1}" }, @@ -390,9 +423,6 @@ "upload": "Téléverser" } }, - "cloud": { - "GoToCloud": "ALLER AU CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Impossible de se connecter au backend.", diff --git a/i18n/he.json b/i18n/he.json index d26a3b539..4f61c1a45 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -8,6 +8,7 @@ "board": "לוח{0}", "boardConfigDialogTitle": "יש לבחור לוח ופורט אחר", "boardInfo": "פרטי הלוח", + "boards": "boards", "configDialog1": "נא לבחור סוג לוח ופורט כדי להעלות את הסקיצה.", "configDialog2": "אם נבחר לוח ניתן יהיה לקמפל, אבל לא להעלות את הסקיצה.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", @@ -15,6 +16,7 @@ "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}\". האם הותקן הליבה המתאימה?", "noPortsDiscovered": "לא נמצאו פורטים", "noPortsSelected": "לא נבחרו פורטים ללוחות '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "יש לבחור את הלוח המחובר לפורט הנבחר.", "port": "פורט{0}", "portLabel": "פורט: {0}", + "ports": "ports", "programmer": "תכנת", "reselectLater": "בחר מחדש מאוחר יותר", "searchBoard": "חפש לוח", @@ -31,8 +34,10 @@ "selectBoardForInfo": "אנא בחר לוח לקבל מידע אודותיו.", "selectPortForInfo": "אנא בחר פורט לקבלת מידע אודותיו.", "showAllAvailablePorts": "הצג את כל הפורטים הזמינים כשמופעל", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "פלטפורמה הותקנה בהצלחה {0}:{1}", - "succesfullyUninstalledPlatform": "פלטפורמה הוסרה בהצלחה {0}:{1}" + "succesfullyUninstalledPlatform": "פלטפורמה הוסרה בהצלחה {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "מנהל לוחות", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "סיים לדחוף '{0}'.", "embed": "הטמע:", "emptySketchbook": "הסקיצה ריקה.", + "goToCloud": "Go to Cloud", "learnMore": "למדו עוד", "link": "קישור:", "notYetPulled": "לא ניתן לדחוף לענן. עדיין לא נמשך.", @@ -140,6 +146,7 @@ "by": "על ידי", "filterSearch": "סנן את החיפוש...", "install": "התקן", + "installed": "Installed", "moreInfo": "מידע נוסף", "uninstall": "הסרה", "uninstallMsg": "האם ברצונך להסיר את {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "הוסף קובץ", "fileAdded": "קובץ אחד נוסף לסקיצה.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "החלף" }, + "core": { + "compilerWarnings": { + "all": "הכל", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "העתקת הודעת שגיאה", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "הוספת ספריית .zip", "arduinoLibraries": "ספריות ארדואינו", "contributedLibraries": "ספריות שנתרמו", - "dependenciesForLibrary": "תלויות בספריה {0}:{1}", "include": "השתמש בספריה", - "installAll": "התקן הכל", + "installAll": "להתקין הכל", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "התקן רק את {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "ספריה הותקנה בהצלחה {0}:{1}", "libraryAlreadyExists": "הספריה כבר קיימת. האם תרצ.י להחליץ אותה?", "manageLibraries": "נהל ספריות...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "רשת", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -320,6 +342,12 @@ "network": "רשת", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "ללא פרוקסי", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "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.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "בטוח.ה שתרצה.י לסגור את הסקיצה?", "compile": "מקמפל סקיצה...", - "configureAndUpload": "הגדר והעלה ", + "configureAndUpload": "Configure and Upload", "createdArchive": "ארכיון ׳{0}׳ נוצר.", "doneCompiling": "קומפילציה הסתיימה.", "doneUploading": "העלאה הסתיימה.", @@ -381,6 +409,11 @@ "dismissSurvey": "אל תראה שוב.", "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} שגיאה: {1}" }, @@ -390,9 +423,6 @@ "upload": "העלאה" } }, - "cloud": { - "GoToCloud": "לך לענן" - }, "theia": { "core": { "cannotConnectBackend": "אינו יכול להתחבר לצד שרת.", diff --git a/i18n/hu.json b/i18n/hu.json index 6da748c43..ae5521ba7 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -8,6 +8,7 @@ "board": "Alaplap {0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Alaplapi információk", + "boards": "boards", "configDialog1": "Válassz ki egy alaplapot és egy portot is - csak ekkor lehetséges a feltöltés. ", "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", "couldNotFindPreviouslySelected": "Nem található a korábban kiválasztott '{0}' alaplap a/az '{1}' telepített platformon. Válaszd ki újra a használni kívánt alaplapot. Szeretnéd most újra megadni?", @@ -15,6 +16,7 @@ "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? ", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Nincsen port kiválasztva a alaplaphoz: '{0}'. ", @@ -24,6 +26,7 @@ "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", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Válassz egy alaplapot az információinak megtekintéséhez. ", "selectPortForInfo": "Válassz egy portot az alaplap információinak megtekintéséhez. ", "showAllAvailablePorts": "Elérhető portok mutatása - ha engedélyezett", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Sikeresen telepített platform {0}:{1}", - "succesfullyUninstalledPlatform": "A platform sikeresen eltávolítva: {0}:{1} " + "succesfullyUninstalledPlatform": "A platform sikeresen eltávolítva: {0}:{1} ", + "typeOfPorts": "{0} ports" }, "boardsManager": "Alaplap-kezelő", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Feltöltés kész: '{0}'.", "embed": "Beágyazva:", "emptySketchbook": "A vázlatfüzeted/Sketchbook-od üres ", + "goToCloud": "Go to Cloud", "learnMore": "Tudj meg többet", "link": "Link:", "notYetPulled": "Nem küldhető a felhőbe. Még nem lett letöltve. ", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "által", "filterSearch": "Keresési eredmény szűrése... ", - "install": "TELEPÍTÉS", + "install": "Telepítés", + "installed": "Installed", "moreInfo": "Több info", "uninstall": "Eltávolítás", "uninstallMsg": "El szeretnéd távolítani a következőt: {0}? ", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Fájl hozzáadása", "fileAdded": "Egy fájl hozzáadása megtörtént a vázlathoz/sketch-hez. ", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Csere" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "ZIP könyvtár hozzáadása...", "arduinoLibraries": "Arduino könyvtárak", "contributedLibraries": "Közreműködő könyvtárak ", - "dependenciesForLibrary": "A/az {0} könyvtár függőségei: {1}", "include": "Tartalmazza a könyvtárat", - "installAll": "Minden telepítése", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Szeretnéd telepíteni az összes hiányzó függőséget?", "installOneMissingDependency": "Szeretnéd telepíteni a hiányzó függőséget? ", - "installOnly": "Csak {0} telepítése", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Sikeresen telepített könyvtár {0}:{1}", "libraryAlreadyExists": "Már létezik a könyvtár. Felül akarod írni? ", "manageLibraries": "Könyvtárak kezelése... ", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Hálózat", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Kiegészítő alaplapok URL-jei", "auth.audience": "Az OAuth2 közönség/audience. ", @@ -320,6 +342,12 @@ "network": "Hálózat", "newSketchbookLocation": "Új Vázlatfüzet/Sketchbook elérési út", "noProxy": "Nincs proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Részletes kimenet megjelenítése eközben: ", "sketchbook.location": "SketchBook elérési helye ", "sketchbook.showAllFiles": "Kipipálva: az összes vázlatfájl/sketch megjelenítése a vázlaton/sketch-en belül. Alapértelmezés szerint: nincs kipipálva.", @@ -350,7 +378,7 @@ "cantOpen": "Már létezik a/az {0} nevű mappa. A vázlat/sketch nem nyitható meg. ", "close": "Biztosan bezárod a vázlatot/sketch-et? ", "compile": "Compiling sketch...", - "configureAndUpload": "Konfigurálás és feltöltés", + "configureAndUpload": "Configure and Upload", "createdArchive": "Archívum létrehozva: {0}. ", "doneCompiling": "Fordítás kész.", "doneUploading": "Feltöltés kész.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} hiba: {1}" }, @@ -390,9 +423,6 @@ "upload": "Feltöltés" } }, - "cloud": { - "GoToCloud": "UGRÁS A FELHŐHÖZ " - }, "theia": { "core": { "cannotConnectBackend": "Nem lehet csatlakozni a háttérrendszerhez/backend-hez. ", diff --git a/i18n/id.json b/i18n/id.json new file mode 100644 index 000000000..ea6db769a --- /dev/null +++ b/i18n/id.json @@ -0,0 +1,455 @@ +{ + "arduino": { + "about": { + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "label": "About {0}" + }, + "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?", + "noPortsDiscovered": "No ports discovered", + "noPortsSelected": "No ports selected for board: '{0}'.", + "noneSelected": "No boards selected.", + "openBoardsConfig": "Select other board and port…", + "platformMissing": "The platform for the selected '{0}' board is not installed.", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "Port{0}", + "portLabel": "Port: {0}", + "ports": "ports", + "programmer": "Programmer", + "reselectLater": "Reselect later", + "searchBoard": "Search board", + "selectBoard": "Select Board", + "selectBoardForInfo": "Please select a board to obtain board info.", + "selectPortForInfo": "Please select a port to obtain board info.", + "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", + "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" + }, + "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": { + "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", + "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", + "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": { + "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", + "filterSearch": "Filter your search...", + "install": "Install", + "installed": "Installed", + "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.", + "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." + }, + "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", + "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": { + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "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", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "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 (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.", + "exportBinary": "Export Compiled Binary", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "Upload", + "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", + "userFieldsNotFoundError": "Can't find user fields for connected board", + "verify": "Verify", + "verifyOrCompile": "Verify/Compile" + }, + "survey": { + "answerSurvey": "Answer survey", + "dismissSurvey": "Don't show again", + "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." + }, + "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" + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Cannot connect to the backend.", + "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", + "daemonOffline": "CLI Daemon Offline", + "offline": "Offline", + "quitTitle": "Are you sure you want to quit?" + }, + "debug": { + "start": "Start...", + "startError": "There was an error starting the debug session, check the logs for more details.", + "typeNotSupported": "The debug session type \"{0}\" is not supported." + }, + "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/it.json b/i18n/it.json index a915148f0..9f9d4a79c 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -8,6 +8,7 @@ "board": "Scheda{0}", "boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta", "boardInfo": "Informazioni sulla scheda", + "boards": "boards", "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?", @@ -15,6 +16,7 @@ "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 è stata trovata per \"{0}\"", "noFQBN": "La FQBN non è disponibile per la scheda selezionata\"{0}\". Sei sicuro che il core specifico sia stato installato?", "noPortsDiscovered": "Nessuna porta rilevata", "noPortsSelected": "Nessuna porta selezionata per la scheda: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Scegli la scheda collegata alla porta che hai selezionato.", "port": "Porta{0}", "portLabel": "Porta: {0}", + "ports": "ports", "programmer": "Programmatore", "reselectLater": "Riselezionare più tardi", "searchBoard": "Seleziona la scheda", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Seleziona la scheda per la quale desideri informazioni.", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", "showAllAvailablePorts": "Quando abilitato, mostra tutte le porte disponibili", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Piattaforma installata correttamente {0}:{1}", - "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}" + "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Gestore schede", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Invio terminato ‘{0}’.", "embed": "Includi:", "emptySketchbook": "La raccolta degli sketch è vuota", + "goToCloud": "Go to Cloud", "learnMore": "Più informazioni", "link": "Link:", "notYetPulled": "Sul Cloud non puoi effettuare il push se non hai ancora fatto il pull", @@ -140,6 +146,7 @@ "by": "da", "filterSearch": "Filtra la tua ricerca...", "install": "Installa", + "installed": "Installata", "moreInfo": "Maggiori informazioni", "uninstall": "Disinstalla", "uninstallMsg": "Vuoi veramente disinstallare 1 {0} ?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Aggiungi file...", "fileAdded": "Aggiunto un file allo sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Sostituisci" }, + "core": { + "compilerWarnings": { + "all": "Tutti", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copia messaggi di errore", "noBoardSelected": "Non è stata selezionata alcuna scheda. Selezionare la tua scheda Arduino dal menu Strumenti > Scheda." @@ -236,12 +254,12 @@ "addZip": "Aggiungi libreria da file .ZIP...", "arduinoLibraries": "Librerie Arduino", "contributedLibraries": "Librerie di terze parti", - "dependenciesForLibrary": "Dipendenze per la libreria {0}:{1}", "include": "Includi Libreria", "installAll": "Installa tutto", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Vorresti installare tutte le dipendenze mancanti?", "installOneMissingDependency": "Vorresti installare le dipendenze mancanti?", - "installOnly": "Installa {0} solamente", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Libreria installata correttamente 1{0} : 2{1} ", "libraryAlreadyExists": "Libreria già presente. Vuoi sovrascriverla?", "manageLibraries": "Gestisci Librerie", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Impossibile chiudere il websocket", "unableToConnectToWebSocket": "Impossibile connettersi al websocket" }, + "portProtocol": { + "network": "Rete", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "URL aggiuntive per il Gestore schede", "auth.audience": "Protocollo pubblico OAuth2", @@ -320,6 +342,12 @@ "network": "Rete", "newSketchbookLocation": "Seleziona un percorso per il nuovo sketchbook", "noProxy": "Nessun proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Mostra un output dettagliato durante", "sketchbook.location": "Posizione della raccolta degli sketch", "sketchbook.showAllFiles": "Vero per mostrare tutti i file relativi contenuti all'interno dello sketch. L'opzione predefinita è falso.", @@ -350,7 +378,7 @@ "cantOpen": "Una cartella di nome \"{0}\" esiste già. Impossibile aprire lo sketch.", "close": "Sei sicuro di voler chiudere lo sketch?", "compile": "Compilazione dello sketch in corso...", - "configureAndUpload": "Configurare e caricare", + "configureAndUpload": "Configure and Upload", "createdArchive": "Creato l'archivio '{0}'.", "doneCompiling": "Compilazione completata.", "doneUploading": "Caricamento terminato.", @@ -381,6 +409,11 @@ "dismissSurvey": "Non mostrare più", "surveyMessage": "Aiutaci a migliorare rispondendo a questo brevissimo questionario. Abbiamo a cuore la nostra comunità e vorremmo conoscere meglio chi ci supporta!" }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "1 {0} errore: 2 {1}" }, @@ -390,9 +423,6 @@ "upload": "Carica" } }, - "cloud": { - "GoToCloud": "Vai al Cloud" - }, "theia": { "core": { "cannotConnectBackend": "Non reisco a collegarmi al backend", diff --git a/i18n/ja.json b/i18n/ja.json index f2aea63eb..737db62f0 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -8,6 +8,7 @@ "board": "ボード{0}", "boardConfigDialogTitle": "他のボードとポートを選択", "boardInfo": "ボード情報", + "boards": "ボード", "configDialog1": "スケッチを書き込みたい場合には、ボードとポートの両方を選択してください。", "configDialog2": "ボードのみを選択した場合、コンパイルはできますが、スケッチの書き込みはできません。", "couldNotFindPreviouslySelected": "インストールされているプラットフォーム'{1}'で、以前に選択したボード'{0}'が見つかりませんでした。使用したいボードを手動で選択し直してください。今すぐ選択し直しますか?", @@ -15,6 +16,7 @@ "getBoardInfo": "ボード情報を取得", "inSketchbook": "(スケッチブック内)", "installNow": "現在選択されているボード\"{2}\"用にコア\"{0} {1}\"をインストールする必要があります。今すぐインストールしますか?", + "noBoardsFound": "\"{0}\"のボードが見つかりませんでした", "noFQBN": "選択されたボード\"{0}\"にはFQBNがありません。対応するコアをインストール済みですか?", "noPortsDiscovered": "ポートが見つかりませんでした", "noPortsSelected": "ボード用に選択されたポートがありません: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "選択したポートに接続されているボードを選んでください。", "port": "ポート{0}", "portLabel": "ポート: {0}", + "ports": "ポート", "programmer": "書き込み装置", "reselectLater": "後で選択しなおす", "searchBoard": "ボードを検索", @@ -31,8 +34,10 @@ "selectBoardForInfo": "ボード情報を得るには、ボードを選択してください。", "selectPortForInfo": "ボード情報を得るには、ポートを選択してください。", "showAllAvailablePorts": "有効な場合、利用可能なすべてのポートを表示", + "showAllPorts": "全てのポートを表示", "succesfullyInstalledPlatform": "プラットフォーム{0}:{1}のインストールに成功しました", - "succesfullyUninstalledPlatform": "プラットフォーム{0}:{1}のアンインストールに成功しました" + "succesfullyUninstalledPlatform": "プラットフォーム{0}:{1}のアンインストールに成功しました", + "typeOfPorts": "{0}ポート" }, "boardsManager": "ボードマネージャ", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "‘{0}’のプッシュが完了しました。", "embed": "埋め込み:", "emptySketchbook": "スケッチブックは空です", + "goToCloud": "Go to Cloud", "learnMore": "詳細はこちら", "link": "リンク:", "notYetPulled": "クラウドにプッシュできません。まだプルされていません。", @@ -140,6 +146,7 @@ "by": "by", "filterSearch": "検索をフィルタ…", "install": "インストール", + "installed": "インストール済み", "moreInfo": "詳細情報", "uninstall": "アンインストール", "uninstallMsg": "{0}をアンインストールしますか?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "ファイルを追加...", "fileAdded": "スケッチにファイルが1つ追加されました。", + "plotter": { + "couldNotOpen": "シリアルプロッタを開けませんでした" + }, "replaceTitle": "置換" }, + "core": { + "compilerWarnings": { + "all": "全て", + "default": "デフォルト", + "more": "詳細", + "none": "なし" + } + }, "coreContribution": { "copyError": "エラーメッセージをコピー", "noBoardSelected": "ボードが選択されていません。ツール > ボードメニューからArduinoボードを選択してください。" @@ -236,12 +254,12 @@ "addZip": ".ZIP形式のライブラリをインストール...", "arduinoLibraries": "Arduinoライブラリ", "contributedLibraries": "提供されたライブラリ", - "dependenciesForLibrary": "ライブラリ{0}:{1}の依存関係", "include": "ライブラリをインクルード", "installAll": "全てをインストール", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "不足している全ての依存関係をインストールしますか?", "installOneMissingDependency": "不足している依存関係をインストールしますか?", - "installOnly": "{0}のみインストール", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "ライブラリ{0}:{1}のインストールに成功しました。", "libraryAlreadyExists": "ライブラリはすでに存在しています。上書きしますか?", "manageLibraries": "ライブラリを管理...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "websocketを閉じることができません", "unableToConnectToWebSocket": "websocketに接続することができません" }, + "portProtocol": { + "network": "ネットワーク", + "serial": "シリアル" + }, "preferences": { "additionalManagerURLs": "追加のボードマネージャのURL", "auth.audience": "OAuth2オーディエンス。", @@ -320,6 +342,12 @@ "network": "ネットワーク", "newSketchbookLocation": "新しいスケッチブックの場所を選択", "noProxy": "プロキシなし", + "proxySettings": { + "hostname": "ホスト名", + "password": "パスワード", + "port": "ポート番号", + "username": "ユーザ名" + }, "showVerbose": "より詳細な情報を表示する", "sketchbook.location": "スケッチブックの場所", "sketchbook.showAllFiles": "スケッチ内のすべてのスケッチファイルを表示するにはtrueを指定。デフォルトではfalse。", @@ -336,7 +364,7 @@ "serial": { "autoscroll": "自動スクロール", "carriageReturn": "CRのみ", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "message": "メッセージ('{1}'の{0}にメッセージを送信するにはEnter)", "newLine": "LFのみ", "newLineCarriageReturn": "CRおよびLF", "noLineEndings": "改行なし", @@ -381,6 +409,11 @@ "dismissSurvey": "次回から表示しない", "surveyMessage": "とても簡単なアンケートに答えて、私たちの改善にご協力ください。私たちはコミュニティを大切にしており、サポーターのことをもう少しよく知りたいのです。" }, + "updateIndexes": { + "updateIndexes": "インデックスを更新", + "updateLibraryIndex": "ライブラリのインデックスを更新", + "updatePackageIndex": "パッケージのインデックスを更新" + }, "upload": { "error": "{0} エラー: {1}" }, @@ -390,9 +423,6 @@ "upload": "マイコンボードに書き込む" } }, - "cloud": { - "GoToCloud": "クラウドへ" - }, "theia": { "core": { "cannotConnectBackend": "バックエンドに接続できません。", diff --git a/i18n/ko.json b/i18n/ko.json index 9e5e2b921..f17c9e6b6 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -8,22 +8,25 @@ "board": "보드{0}", "boardConfigDialogTitle": "보드 및 포트 선택", "boardInfo": "보드정보", + "boards": "boards", "configDialog1": "스케치를 업로드할 보드 및 포트를 선택", "configDialog2": "보드를 선택하면 컴파일은 가능하지만, 스케치를 업로드 할 수 없습니다.", "couldNotFindPreviouslySelected": "선택된 보드를 찾을 수 없습니다. '{0}' 설치된 플랫폼에서'{1}'. 수동으로 사용 할 보드를 선택해주세요.\n지금 보드를 다시 선택하시겠습니까?", "disconnected": "연결해제됨", "getBoardInfo": "보드정보 얻기", "inSketchbook": "(스케치북에서)", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", + "installNow": "\"1{0} 2{1}\"버전은 최근에 선택된 \"{2}\"보드를 설치해야 합니다. 지금 설치하시겠습니까?", + "noBoardsFound": "\"{0}\"에 대한 보드를 찾을 수 없습니다.", "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noPortsDiscovered": "포트를 찾을 수 없습니다.", "noPortsSelected": "보드에 맞는 포트가 없습니다: '{0}'.", "noneSelected": "보드가 선택되지 않았습니다.", "openBoardsConfig": "보드 및 포트를 선택하세요.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", + "platformMissing": "선택한 '{0}' 보드의 플랫폼이 설치되지 않았습니다.", "pleasePickBoard": "선택한 포트에 연결할 보드를 선택하십시오", "port": "포트{0}", "portLabel": "포트: {0}", + "ports": "ports", "programmer": "프로그래머", "reselectLater": "나중에 선택", "searchBoard": "보드찾기", @@ -31,8 +34,10 @@ "selectBoardForInfo": "보드 정보를 얻으려면 보드를 선택하십시오.", "selectPortForInfo": "보드 정보를 얻으려면 포트를 선택하십시오.", "showAllAvailablePorts": "활성화된 사용 가능한 모든 포트를 표시합니다.", + "showAllPorts": "모든 포트 보이기", "succesfullyInstalledPlatform": "성공적으로 설치된 플랫폼{0}:{1}", - "succesfullyUninstalledPlatform": "성공적으로 설치된 플랫폼 {0}:{1}" + "succesfullyUninstalledPlatform": "성공적으로 설치된 플랫폼 {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "보드매니저", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "pushing 완료 ‘{0}’.", "embed": "Embed:", "emptySketchbook": "스케치북이 비어 있습니다.", + "goToCloud": "Go to Cloud", "learnMore": "더 배우기", "link": "링크:", "notYetPulled": "클라우드에 push 할수 없습니다. 아직 pull 되지 않았습니다.", @@ -114,7 +120,7 @@ "visitArduinoCloud": "아두이노 클라우드를 방문하여 클라우드 스케치를 만드십시오." }, "common": { - "all": "All", + "all": "전체", "contributed": "Contributed", "installManually": "수동설치", "later": "나중에", @@ -140,6 +146,7 @@ "by": "by", "filterSearch": "Filter your search...", "install": "설치", + "installed": "설치됨", "moreInfo": "더 많은 정보", "uninstall": "설치해제", "uninstallMsg": "설치해제를 원하십니까 {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "파일 추가", "fileAdded": "스케치에 하나의 파일이 추가되었습니다.", + "plotter": { + "couldNotOpen": "시리얼 플로터를 열 수 없습니다" + }, "replaceTitle": "교체" }, + "core": { + "compilerWarnings": { + "all": "전체", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "에러 메시지 복사", "noBoardSelected": "보드가 선택되지 않았습니다. Tools > Board menu 에서 당신의 보드를 선택해주세요." @@ -188,7 +206,7 @@ "builtInExamples": "포함된 예제들", "couldNotInitializeExamples": "내장된 예제를 초기화 할 수 없습니다.", "customLibrary": "사용자 정의 라이브러리의 예", - "for": "Examples for {0}", + "for": "{0} 에 대한 예", "forAny": "모든 보드의 예", "menu": "예제" }, @@ -236,12 +254,12 @@ "addZip": ".ZIP 라이브러리 추가...", "arduinoLibraries": "아두이노 라이브러리", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "라이브러리에 대한 종속성 {0}:{1}", "include": "라이브러리 포함", "installAll": "모두 설치", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "누락된 모든 종속성을 설치하시겠습니까?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "성공적으로 설치된 라이브러리 {0}:{1}", "libraryAlreadyExists": "라이브러리가 이미 존재합니다. 덮어 쓰시겠습니까? ", "manageLibraries": "라이브러리 관리...", @@ -281,13 +299,17 @@ "unableToCloseWebSocket": "웹소켓을 닫을 수 없습니다.", "unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다." }, + "portProtocol": { + "network": "네트워크", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "추가 보드 관리자 URL", "auth.audience": "The OAuth2 audience.", "auth.clientID": "The OAuth2 client ID.", "auth.domain": "The OAuth2 domain.", "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", + "automatic": "자동", "board.certificates": "List of certificates that can be uploaded to boards", "browse": "검색", "checkForUpdate": "IDE, 보드 및 라이브러리에 대한 사용 가능한 업데이트 알림을 받습니다. 변경 후 IDE를 다시 시작해야 합니다. 알림받기가 기본설정입니다.", @@ -310,7 +332,7 @@ "files.inside.sketches": "스케치 내부에 파일 표시", "ide.updateBaseUrl": "업데이트를 다운로드할 기본 URL입니다. 기본값은 \n'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "업데이트를 받을 릴리스 채널입니다. 'stable'은 안정적인 릴리스이고 'nightly'는 최신 개발 빌드입니다.", - "interfaceScale": "Interface scale", + "interfaceScale": "인터페이스 크기조절", "invalid.editorFontSize": "잘못된 에디터 글꼴크기, 반드시 양의 정수를 사용해야합니다.", "invalid.sketchbook.location": "잘못된 스케치북 위치: {0}", "invalid.theme": "잘못된 테마.", @@ -320,6 +342,12 @@ "network": "네트워크", "newSketchbookLocation": "새 스케치북 위치 선택", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "비밀번호", + "port": "포트 번호", + "username": "사용자이름" + }, "showVerbose": "출력 중 자세한 표시", "sketchbook.location": "스케치북 위치", "sketchbook.showAllFiles": "스케치 내부의 모든 스케치 파일을 표시하려면 True입니다. 기본은 false입니다.", @@ -350,7 +378,7 @@ "cantOpen": "이름이 \"{0}\" 인 폴더가 이미 존재합니다. 스케치를 열 수 없습니다.", "close": "스케치를 닫으시겠습니까?", "compile": "스케치 컴파일중...", - "configureAndUpload": "구성 및 업로드", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "컴파일 완료.", "doneUploading": "업로딩 완료.", @@ -372,7 +400,7 @@ "upload": "업로드", "uploadUsingProgrammer": "프로그래머를 사용하여 업로드", "uploading": "업로딩...", - "userFieldsNotFoundError": "Can't find user fields for connected board", + "userFieldsNotFoundError": "연결된 보드에서 사용자 영역을 찾을 수 없습니다", "verify": "확인", "verifyOrCompile": "확인/컴파일" }, @@ -381,6 +409,11 @@ "dismissSurvey": "다시보지 않기", "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} 오류: {1}" }, @@ -390,9 +423,6 @@ "upload": "업로드" } }, - "cloud": { - "GoToCloud": "클라우드로 이동" - }, "theia": { "core": { "cannotConnectBackend": "백엔드에 연결 할 수 없습니다.", @@ -408,7 +438,7 @@ "typeNotSupported": "The debug session type \"{0}\" is not supported." }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "저장되지않음 – 1{0}\n " }, "messages": { "collapse": "Collapse", diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 2e867a6f9..01c7ab7e3 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -6,8 +6,9 @@ }, "board": { "board": "ဘုတ်{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ပါ", "boardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်", + "boards": "ဘုတ်များ", "configDialog1": "ကုတ်ဖိုင်တစ်ခုကို upload တင်လိုပါက ဘုတ်နှင့်အပေါက် နှစ်ခုလုံးကို ရွေးပေးပါ။", "configDialog2": "သင် ဘုတ်တစ်ခုထဲကိုသာ ရွေးချယ်ထားပါက compile ပြုလုပ်နိုင်သော်လည်း ကုဒ်ဖိုင်ကိုတော့ upload မတင်နိုင်ပါ။", "couldNotFindPreviouslySelected": "တပ်ဆင်ထားသည့် ပလက်ဖောင်း '{1}' ထဲမှာ ယခင်ရွေးချယ်ထားသည့်ဘုတ် '{0}' ကို ရှာမတွေ့ပါ။ ကျေးဇူးပြု၍ မိမိအသုံးပြုလိုသည့် ဘုတ်ကို မိမိကိုယ်တိုင် ပြန်လည်ရွေးချယ်ပေးပါ။ သင်အခု ပြန်လည်ရွေးချယ် လိုပါသလား?", @@ -15,8 +16,9 @@ "getBoardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်ရယူမည်", "inSketchbook": " (Sketchbook ဖိုင်တွဲထဲ)", "installNow": "လက်ရှိရွေးချယ်ထားသည့် \"{2}\" ဘုတ်အတွက် \"{0} {1}\" core အား တပ်ဆင်ဖို့လိုပါသည်။ သင်ယခု တပ်ဆင်လိုပါသလား?", + "noBoardsFound": "\"{0}\"အတွက် ဘုတ်ရှာမတွေ့ပါ", "noFQBN": "ရွေးချယ်ထားသည့် ဘုတ် \"{0}\" အတွက် FQBN မရနိုင်သေးပါ။ သင့်မှာ သက်ဆိုင်ရာတပ်ဆင်ထားသည့် core ရှိပါသလား?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "မည်သည့်အပေါက်မှမတွေ့ပါ", "noPortsSelected": "'{0}' ဘုတ် အတွက် မည်သည့်အပေါက်မှ မရွေးချယ်ထားပါ။", "noneSelected": "ဘုတ်မရွေးချယ်ထားပါ။", "openBoardsConfig": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ရန်...", @@ -24,23 +26,26 @@ "pleasePickBoard": "သင်ရွေးချယ်ထားသော အပေါက်နှင့် ချိတ်ဆက်ထားသည့် ဘုတ်ကို ကျေးဇူးပြု၍ ရွေးပေးပါ။", "port": "အပေါက်{0}", "portLabel": "အပေါက် - {0}", + "ports": "အပေါက်များ", "programmer": "ပရိုဂရမ်မာ", "reselectLater": "နောက်မှ ပြန်ရွေးချယ်မည်", - "searchBoard": "Search board", + "searchBoard": "ဘုတ်ရှာမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", "selectBoardForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် ဘုတ်ရွေးချယ်ပါ", "selectPortForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် အပေါက်ကို ရွေးချယ်ပါ။", "showAllAvailablePorts": "အမှန်ခြစ်ထားပါက ရွေးချယ်နိုင်သော အပေါက်များအားလုံးကို ဖော်ပြပေးမည်", + "showAllPorts": "အပေါက်အားလုံးပြ", "succesfullyInstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ တပ်ဆင်ပြီးသည် :{1}", - "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}" + "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}", + "typeOfPorts": "{0} အပေါက်များ" }, "boardsManager": "ဘုတ်မန်နေဂျာ", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "အာဒီနိုအသိမှတ်ပြု" }, "bootloader": { "burnBootloader": "ဘုလုတ်ဒါ ရေးသွင်းမည်", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "ဘုလုတ်ဒါ ရေးသွင်းနေသည်…", "doneBurningBootloader": "ဘုလုတ်ဒါ ရေးသွင်းပြီးပါပြီ။" }, "burnBootloader": { @@ -53,7 +58,7 @@ "certificatesUploaded": "လက်မှတ်များ တင်သွင်းပြီးပါပြီ။", "enterURL": "URLရေးသွင်းပါ", "noSupportedBoardConnected": "ထောက်ပံ့ပေးသည့် ဘုတ်ကို မချိတ်ဆက်ထားပါ", - "openContext": "Open context", + "openContext": "ဆက်စပ်အကြောင်းအရာကြည့်မည်", "remove": "ဖယ်ရှားမည်", "selectBoard": "ဘုတ်တစ်ခုကို ရွေးချယ်ရန်...", "selectCertificateToUpload": "1. အပ်လုတ်တင်ရန် လက်မှတ်ရွေးပါ", @@ -64,13 +69,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": "'ကီးဘုတ်' ရှာမတွေ့ပါ။ '#include ' ကုတ်စာကြောင်းကို သင့်ကုတ်ပုံကြမ်းထဲတွင် ထည့်ရေးထားပါသလား?", @@ -85,6 +90,7 @@ "donePushing": "‘{0}’တွန်းပို့ပြီးပါပြီ။", "embed": "မြှုပ်သွင်းထားသော -", "emptySketchbook": "သင့်ကုတ်ပုံကြမ်းဖိုင်တွဲထဲတွင် ဘာမှမရှိပါ", + "goToCloud": "ကလောက်သို့သွားမည်", "learnMore": "ပိုမိုလေ့လာရန်", "link": "လင့်ခ်-", "notYetPulled": "Cloudသို့တွန်းပို့၍မရသေးပါ။ မဆွဲယူရသေးသောကြောင့်ဖြစ်သည်။", @@ -111,35 +117,36 @@ "signOut": "လက်မှတ်ထိုးထွက်", "sync": "ထပ်တူပြုခြင်း", "syncEditSketches": "သင်၏Arduino Cloud ကုတ်ဖိုင်လ်များကို အင်တာနက်မှတဆင့် အချိန်နှင့်တပြေးညီ ရယူကိုက်ညီစေပြီး တည်းဖြတ်လိုက်ပါ", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." + "visitArduinoCloud": "ကလောက်ကုတ်ဖိုင်ဖန်တီးရန် Arduino Cloudသို့သွားပါ။" }, "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": "အတန်းလိုက်ဆက်သွယ်မှုမော်နီတာ", - "type": "Type", + "type": "အမျိုးအစား", "unknown": "မသိ", - "updateable": "Updatable" + "updateable": "အပ်ဒိတ်တင်၍ရသော" }, "compile": { - "error": "Compilation error: {0}" + "error": "ကုတ်ပေါင်းခြင်းဆိုင်ရာအမှား- {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "ဤပတ်ကေ့တွင်ပါဝင်သောဘုတ်များ-", "by": "မှ", - "filterSearch": "Filter your search...", + "filterSearch": "သင်၏ရှာဖွေမှုရလဒ်ကိုစစ်ထုတ်မည်…", "install": "တပ်ဆင်မည်", + "installed": "တပ်ဆင်ထားပြီး", "moreInfo": "နောက်ထပ်အချက်အလက်များ", "uninstall": "ဖြုတ်ချ", "uninstallMsg": "သင် {0} ကိုဖြုတ်ချချင်ပါသလား?", @@ -148,11 +155,22 @@ "contributions": { "addFile": "ဖိုင်လ်ထည့်မည်", "fileAdded": "ကုတ်ပုံကြမ်းထဲသို့ ဖိုင်တစ်ခု ထည့်လိုက်သည်။", + "plotter": { + "couldNotOpen": "အတန်းလိုက်ပုံဆွဲကိရိယာကိုမဖွင့်နိုင်ခဲ့ပါ" + }, "replaceTitle": "အစားထိုးမည်" }, + "core": { + "compilerWarnings": { + "all": "အားလုံး", + "default": "မူလ", + "more": "နောက်ထပ်", + "none": "မရှိ" + } + }, "coreContribution": { "copyError": "အမှားပြစာများကို ကော်ပီဆွဲသည်", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "မည်သည့်ဘုတ်မှ မရွေးထားပါ။ သင်၏အာဒီနိုဘုတ်ကို ကိရိယာများ>ဘုတ် မီနူးတွင် ရွေးချယ်ပါ။" }, "daemon": { "restart": "Daemon ပြန်စမည်", @@ -178,15 +196,15 @@ "increaseIndent": "အင်တင်းခြင်းတိုးမည်", "nextError": "နောက်ကအမှား", "previousError": "ရှေ့ကအမှား", - "revealError": "Reveal Error" + "revealError": "အမှားဖော်ပြ" }, "electron": { "couldNotSave": "ကုတ်ပုံကြမ်းကို မသိမ်းဆည်းနိုင်ခဲ့ပါ။ ကျေးဇူးပြု၍ သင်၏ မသိမ်းဆည်းရသေးသော ကုတ်များကို သင်နှစ်သက်ရာ စာသားတည်းဖြတ်မှုဆော့ဖ်ဝဲထဲသို့ ကူးယူပြီး IDE ကို ပြန်စတင်ပါ။", - "unsavedChanges": "Any unsaved changes will not be saved." + "unsavedChanges": "မသိမ်းရသေးသောပြောင်းလဲမှုများကိုသိမ်းမည်မဟုတ်ပါ။" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", + "builtInExamples": "နဂိုပါဝင်သောဥပမာများ", + "couldNotInitializeExamples": "နဂိုပါဝင်သောဥပမာများကို မစတင်နိုင်ခဲ့ပါ။", "customLibrary": "စိတ်ကြိုက် Libraries များမှ ဥပမာများ", "for": "{0} အတွက် ဥပမာများ", "forAny": "ဘယ်ဘုတ်ပဲလာလာ အတွက် ဥပမာများ", @@ -197,7 +215,7 @@ "failedInstall": "ထည့်သွင်းခြင်း မအောင်မြင်ပါ။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။", "install": "တပ်ဆင်မည်", "installingFirmware": "ဖမ်းဝဲလ် သွင်းနေသည်။", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "overwriteSketch": "တပ်ဆင်မှုသည် ဘုတ်ပေါ်ရှိကုတ်ဖိုင်လ်ကို ဖျက်ရေးသွားမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", "selectVersion": "ဖမ်းဝဲလ်ဗားရှင်း ရွေးပါ", "successfullyInstalled": "ဖမ်းဝဲလ်ကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။", @@ -216,7 +234,7 @@ "visit": "Arduino.cc ကိုသွားကြည့်မယ်ကွာ" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "အာဒီနိုအိုင်ဒီအီးအပ်ဒိတ်များစစ်မည်", "closeAndInstallButton": "ပိတ်ပြီးသွင်းမယ်", "closeToInstallNotice": "ဆော့ဖ်ဝဲလ်ပိတ်ပြီး အသစ်ကိုသွင်းမယ်။", "downloadButton": "ဒေါင်းလုတ်ဆွဲမယ်", @@ -236,163 +254,175 @@ "addZip": "ကုတ်ကြည့်တိုက် .ZIPထည့်မည်…", "arduinoLibraries": "Arduinoကုတ်ကြည့်တိုက်များ", "contributedLibraries": "ပါဝင်ကူညီပေးထားသော libraries များ", - "dependenciesForLibrary": "library အတွက် dependencies များ {0}:{1}", "include": "Library သွင်းမည်", "installAll": "အားလုံးတပ်ဆင်မည်", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "လိုအပ်နေသော dependencies များအားလုံးကို ထည့်သွင်းလိုပါသလား?", "installOneMissingDependency": "လိုအပ်နေသော dependency ကို ထည့်သွင်းလိုပါသလား?", - "installOnly": "{0}ကိုသာတပ်ဆင်မည်", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "အောင်မြင်စွာ ထည့်သွင်းပြီးပါပြီ library {0}:{1}", "libraryAlreadyExists": "Library ရှိပြီးသားပါ။ ထပ်ရေးလိုပါသလား?", "manageLibraries": "Libraries စီမံခြင်း...", "namedLibraryAlreadyExists": "{0} ခေါ် library ဖိုင်တွဲမှာရှိပြီးသားပါ။ ထပ်ရေးလိုပါသလား?", - "needsMultipleDependencies": "The library {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} needs another dependency currently not installed:", + "needsMultipleDependencies": "ကုတ်ကြည့်တိုက် {0}:{1} သည် မတပ်ဆင်ရသေးသော အခြားကုတ်ကြည့်တိုက်များကို လိုအပ်သည်-", + "needsOneDependency": "ကုတ်ကြည့်တိုက် {0}:{1} သည် မတပ်ဆင်ရသေးသော အခြားကုတ်ကြည့်တိုက်ကို လိုအပ်သည်-", "overwriteExistingLibrary": "ရှိနေပြီးသား library ကို ထပ်ရေးလိုပါသလား?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "successfullyInstalledZipLibrary": "{0} မှ ကုတ်ကြည့်တိုက်ကို အောင်မြင်စွာထည့်သွင်းပြီးပါပြီ", "title": "ကုတ်ကြည့်တိုက်မန်နေဂျာ", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "uninstalledSuccessfully": "အောင်မြင်စွာ ဖြုတ်ချပြီးသော ကုတ်ကြည့်တိုက် {0}:{1}", "zipLibrary": "ကုတ်ကြည့်တိုက်" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "ခေါင်းစဉ်" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "ဆယ်သွယ်ရေး", + "dataProcessing": "ဒေတာခွဲခြားစီမံခြင်း", + "dataStorage": "ဒေတာသိမ်းဆည်းမှု", + "deviceControl": "စက််ထိန်းချုပ်ရေး", + "display": "ရုပ်ပြမှန်ပြင်", + "other": "အခြား", + "sensors": "အာရုံခံစက်များ", + "signalInputOutput": "အချက်ပြ အသွင်း/အထုတ်", + "timing": "အချက်", + "uncategorized": "အမျိုးအစားခွဲမထားသော" }, "libraryType": { - "installed": "Installed" + "installed": "တပ်ဆင်ထားပြီး" }, "menu": { - "advanced": "Advanced", + "advanced": "အဆင့်မြင့်", "sketch": "ကုတ်ဖိုင်လ်ဆိုင်ရာ", "tools": "ကိရိယာများ" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "unableToCloseWebSocket": "ဝက်ဘ်ဆော့ကတ်ကိုမပိတ်နိုင်ပါ", + "unableToConnectToWebSocket": "ဝက်ဘ်ဆော့ကတ်သို့မချိတ်ဆက်နိုင်ပါ" + }, + "portProtocol": { + "network": "ကွန်ရက်", + "serial": "အတန်းလိုက်" }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", + "additionalManagerURLs": "နောက်ထပ်ဘုတ်မန်နေဂျာURLs", + "auth.audience": "OAuth2 ပရိတ်သတ်", + "auth.clientID": "OAuth2အသုံးပြုစက်အိုင်ဒီ", + "auth.domain": "OAuth2ဒိုမိန်း", + "auth.registerUri": "အသုံးပြုသူအသစ် မှတ်ပုံတင်ရန် သုံးသောURI", "automatic": "အလိုအလျောက်", - "board.certificates": "List of certificates that can be uploaded to boards", + "board.certificates": "ဘုတ်သို့အပ်လုတ်တင်နိုင်သောအသိအမှတ်ပြုစာချွန်လွှာစာရင်း", "browse": "လျှောက်ကြည့်မည်", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "အပ်ဒိတ်တင်ရန် အသိပေးချက်များ လက်ခံမည်။ တန်ဖိုးပြောင်းပါက ပရိုဂရမ်ကို ပြန်စတင်ရမည်။ မူရင်းတန်ဖိုး - အမှန်", "choose": "ရွေးချယ်မည်", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "cli.daemonDebug": "ဒီဘက်မှတ်တမ်းတင်ခြင်းဖွင့်မည်။ မူရင်းတန်ဖိုး - အမှား", + "cloud.enabled": "ဆင့် ဖန်ရှင်းများ ဖွင့်မည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.pull.warn": "ကလောက်ကုတ်ဖိုင်လ်ကို စက်ထဲ့သို့ မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.push.warn": "ကလောက်ကုတ်ဖိုင်လ်သို့ ကုတ်ဖိုင်လ် မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.pushpublic.warn": "ကလောက်သို့ အများသုံးကုတ်ဖိုင်လ် မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.sketchSyncEndpoint": "နောက်ကွယ်လုပ်ဆောင်မှုစနစ်မှ ကုတ်ဖိုင်လ် ရယူခြင်း သို့ ပေးပို့ခြင်းလုပ်ရန် အသုံးပြုသော အဆုံးမှတ်။ မူရင်းတန်းဖိုး - အာဒီနိုကလောက်အေပီအိုင်သို့ ညွှန်ပြနေသည်။", "compile": "စက်ဘာသာပြန်", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compile.experimental": "ကုတ်ပေါင်းမှုဆိုင်ရာပြဿနာများအား အိုင်ဒီအီးမှ ကိုင်တွယ်မည်။ မူရင်းတန်ဖိုး - အမှား", + "compile.revealRange": "စစ်ဆေး/အပ်လုတ် မအောင်မြင်ခဲ့လျှင် အယ်ဒီတာတွင် ကုတ်ပေါင်းမှုဆိုင်ရာ အမှားအယွင်းဖော်ပြချက် ချိန်ညှိသည်။ အသုံးပြုနိုင်သော တန်ဖိုးများ - 'auto' - ဒေါင်လိုက်လှိမ့်ဆွဲပြီးစာကြောင်းသို့ သွားမည်။ 'center' - ဒေါင်လိုက်လှိမ့်ဆွဲပြီး စာကြောင်းကို အလယ်တည့်တည့်တွင် ထားမည်။ 'top' - ဒေါင်လိုက်လှိမ့်ဆွဲပြီး စာကြောင်းကို မြင်ကွင်း၏ထိပ်နားတွင် ပြမည်။ 'centerIfOutsideViewport' - စာကြောင်းသည် မြင်ကွင်းအပြင်ရောက်နေပါက ဒေါင်လိုက်လှိမ့်ဆွဲပြီး စာကြောင်းကို အလယ်တည့်တည့်တွင် ထားမည်။ မူရင်းတန်ဖိုး - {0}", + "compile.verbose": "ကုတ်ပေါင်းကိရိယာမှ အသေးစိတ်အချက်အလက်များ ထုတ်ပြမည်။ မူရင်းတန်ဖိုး - အမှား", + "compile.warnings": "အသုံးပြုမည့်gccသတိပေးမှုအဆင့်။ မူရင်းအဆင့် - 'None'", "compilerWarnings": "စက်ဘာသာပြန်ကိရိယာသတိပေးချက်များ", "editorFontSize": "အယ်ဒီတာဖောင့်အရွယ်အစား", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "editorQuickSuggestions": "အယ်ဒီတာအကြံပြုချက်များ", + "enterAdditionalURLs": "နောက်ထပ်URLများကို တစ်ခုလျှင် တစ်တန်းဆီ ရေးသွင်းပါ", + "files.inside.sketches": "ကုတ်ဖိုင်လ်များအတွင်း ဖိုင်လ်များပြမည်", + "ide.updateBaseUrl": "အပ်ဒိတ်များဒေါင်းလုတ်ဆွဲရန်အတွက် URL။ မူရင်းတန်ဖိုး - 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "အပ်ဒိတ်တင်ရန်အတွက် ထုတ်ဝေမှုချန်နယ်။ 'stable'သည် တည်ငြိမ်မှုဦးစားပေးချန်နယ်။ 'nightly'သည် နောက်ဆုံးပေါ်ထုတ်ဝေမှုချန်နယ်။", "interfaceScale": "အင်တာဖေ့စ်စကေး", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", + "invalid.editorFontSize": "အယ်ဒီတာဖောင့်အရွယ်အစားမမှန်ကန်ပါ။ အပေါင်းကိန်းပြည့်ဖြစ်ရပါမည်။", + "invalid.sketchbook.location": "မမှန်ကန်သောကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ-{0}", + "invalid.theme": "မမှန်ကန်သောသင်း", + "language.log": "အမှန်ဖြစ်နေပါက Arduinoဘာသာစကားစစ်ဆေးမှုဆာဗာသည် မှတ်တမ်းဖိုင်လ်များကို ကုတ်ဖိုင်လ်ဖိုလ်ဒါတွင် ထုတ်ပေးမည်။ မူရင်းတန်းဖိုးသည် အမှားဖြစ်သည်။", + "language.realTimeDiagnostics": "အမှန်ခြစ်ထားပါက အယ်ဒီတာတွင် စာရေးသောအခါ ဘာသာစကားစစ်ဆေးမှုဆာဗာသည် အချိန်နှင့်တပြေးညီ စစ်ဆေးပေးမည်။ မူလတန်ဖိုးသည် အမှားဖြစ်သည်။", + "manualProxy": "ကိုယ်တိုင် ကြားခံကွန်ရက်ပြင်ဆင်ခြင်း", "network": "ကွန်ရက်", - "newSketchbookLocation": "Select new sketchbook location", + "newSketchbookLocation": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာအသစ်ရွေးမည်", "noProxy": "ကြားခံကွန်ရက်မရှိ", + "proxySettings": { + "hostname": "အိမ်ရှင်အမည်", + "password": "စကားဝှက်", + "port": "အပေါက်နံပါတ်", + "username": "အသုံးပြုသူအမည်" + }, "showVerbose": "နောက်ပါလုပ်နေစဉ် အချက်အလက်များပိုမိုများပြားစွာပြမည်", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", + "sketchbook.location": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ", + "sketchbook.showAllFiles": "အမှန်ဖြစ်ပါက ကုတ်ဖိုင်လ်အတွင်း ဖိုင်လ်အားလုံးပြမည်။ မူရင်းတန်ဖိုး - အမှား", + "survey.notification": "စစ်တမ်းကောက်ပါက အသုံးပြုသူကို အသိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "unofficialBoardSupport": "တရားမဝင်ဘုတ် ထောက်ပံ့မှုURLစာရင်းအတွက် ကလစ်လိုက်ပါ", "upload": "အပ်လုတ်တင်", - "upload.verbose": "True for verbose upload output. False by default.", + "upload.verbose": "အပ်လုတ်တင်မှုဆိုင်အချက်အလက်များ အသေးစိတ်ဖော်ပြမည်။ မူရင်းတန်ဖိုး - အမှား", "verifyAfterUpload": "အပ်လုတ်တင်ပြီးလျှင်ကုတ်ကိုစစ်ဆေးပါ", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." + "window.autoScale": "အမှန်ဖြစ်နေပါက အသုံးပြုသူအင်တာဖေ့သည် ဖောင့်အရွယ်အစားနှင့်အတူ အလိုလိုချိန်ညှိမည်။", + "window.zoomLevel": "ဝင်းဒိုး၏မြင်ကွင်းချဲ့မှုပမာဏ ပြောင်းလဲမည်။ မူရင်းတန်ဖိုးသည် 0 ဖြစ်၍ (1) သို့မဟုတ် (-1) တိုးခြင်းသည် မြင်ကွင်း 20%ချဲ့ခြင်း သို့ ခြုံ့ခြင်းဖြစ်စေမည်။" }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "replaceMsg": "{0}၏ရှိနှင့်ပြီးဗားရှင်းကို အစားထိုးမည်လား။", + "selectZip": "သင်ထည့်သွင်းချင်သော ကုတ်ကြည့်တိုက်ပါဝင်သည့်ဇစ်ဖိုင်လ်ရွေးပါ", "serial": { "autoscroll": "အလိုအလျောက်လှိမ့်ဆွဲခြင်း", "carriageReturn": "လက်နှိပ်စက်အတံပြန်အက္ခရာ", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "message": "စာတို (စာတိုကို '{0}'သို့ '{1}'တွင် ပို့ရန် ရိုက်နှိပ်ပါ)", "newLine": "စာကြောင်းအသစ်အက္ခရာ", "newLineCarriageReturn": "စာကြောင်းအသစ်နှင့်လက်နှိပ်စက်အတံပြန်အက္ခရာနှစ်ခုလုံး", "noLineEndings": "စာကြောင်းအဆုံးသတ်အက္ခရာမရှိ", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", + "notConnected": "မချိတ်ဆက်ထားပါ။ ဘုတ်နှင့်အပေါက်ကိုရွေးချယ်ပါ", + "openSerialPlotter": "အတန်းလိုက်ဆက်သွယ်မှုပုံဆွဲကိရိယာ", "timestamp": "အချိန်တံဆိပ်ခေါင်း", - "toggleTimestamp": "Toggle Timestamp" + "toggleTimestamp": "အချိန်တံဆိပ်ဖွင့်/ပိတ်" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", + "archiveSketch": "ကုတ်ဖိုင်လ်သိမ်းမည်", + "cantOpen": "\"{0}\" အမည်ဖြင့်ဖိုလ်ဒါရှိနှင့်ပြီးဖြစ်သည်။ ကုတ်ဖိုင်လ်ကို မဖွင့်နိုင်ပါ။", + "close": "ကုတ်ဖိုင်လ်ပိတ်မှာသေချာပါသလား။", + "compile": "ကုတ်ဖိုင်လ်ကို ကုတ်ပေါင်းနေသည်…", + "configureAndUpload": "ပြင်ဆင်၍အပ်လုတ်တင်မည်", + "createdArchive": "ဖန်းတီးပြီးသော သိမ်းဆည်းဖိုင်လ် '{0}'။", + "doneCompiling": "ကုတ်ပေါင်းပြီးပါပြီ။", + "doneUploading": "အပ်လုတ်တင်ပြီးပါပြီ။", + "exportBinary": "ကုတ်ပေါင်းထားသောဘိုင်နရီဖိုင် ထုတ်ပို့မည်", "moving": "ရွှေ့နေသည်", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "movingMsg": "ဖိုင်လ် \"{0}\" သည် ကုတ်ဖိုင်လ်ဖိုလ်ဒါ \"{1}\"အတွင်းရှိရန်လိုသည်။\nဖိုလ်ဒါတည်ဆောက်ပြီးဖိုင်လ်ကိုရွှေ့မည်လား။", "new": "အသစ်", "openFolder": "ဖိုလ်ဒါဖွင့်မည်", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", + "openRecent": "လတ်တလောဖိုင်လ်ဖွင့်မည်", + "openSketchInNewWindow": "ကုတ်ဖိုင်လ်ကို ဝင်းဒိုးအသစ်တွင်ဖွင့်မည်", + "saveFolderAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", + "saveSketch": "သင်၏ကုတ်ဖိုင်လ်ကို နောင်အခါပြန်ကြည့်၍ရရန် မှတ်သားပါ။", + "saveSketchAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", "showFolder": "ကုတ်ပုံကြမ်းဖိုလ်ဒါပြမည်", "sketch": "ကုတ်ပုံကြမ်း", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" + "sketchbook": "ကုတ်ဖိုင်လ်စာအုပ်", + "titleLocalSketchbook": "စက်တွင်းကုတ်ဖိုင်လ်စာအုပ်", + "titleSketchbook": "ကုတ်ဖိုင်လ်စာအုပ်", + "upload": "အပ်လုတ်", + "uploadUsingProgrammer": "ပရိုဂရမ်မာဘုတ်သုံး၍အပ်လုတ်တင်မည်", + "uploading": "အပ်လုတ်တင်နေသည်…", + "userFieldsNotFoundError": "ချိတ်ဆက်ထားသောဘုတ်အတွက်အသုံးပြုသူဆိုင်ရာအချက်အလက်များရှာမတွေ့ပါ", + "verify": "စစ်ဆေး", + "verifyOrCompile": "စစ်ဆေး/ကုတ်ပေါင်း" }, "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." + "answerSurvey": "စစ်တမ်းကိုဖြေဆိုပါ", + "dismissSurvey": "နောက်ထပ်မပြပါနှင့်", + "surveyMessage": "ဤစစ်တမ်းကိုဖြေဆိုခြင်းအားဖြင့် ကျွန်ုပ်တို့အား ကူညီလိုက်ပါ။" + }, + "updateIndexes": { + "updateIndexes": "အပ်ဒိတ်စာရင်းများ", + "updateLibraryIndex": "ကုတ်ကြည့်တိုက်အပ်ဒိတ်စာရင်း", + "updatePackageIndex": "ပတ်ကေ့အပ်ဒိတ်စာရင်း" }, "upload": { - "error": "{0} error: {1}" + "error": "{0} အမှား- {1}" }, "userFields": { "cancel": "ပယ်ဖျက်မည်", - "enterField": "Enter {0}", + "enterField": "{0} ရိုက်သွင်းပါ", "upload": "အပ်လုတ်တင်မည်" } }, - "cloud": { - "GoToCloud": "CLOUDသို့သွားမည်" - }, "theia": { "core": { "cannotConnectBackend": "ကျောရိုးပရိုဂရမ်သို့ ချိတ်ဆက်၍မရခဲ့ပါ။", @@ -400,7 +430,7 @@ "couldNotSave": "ကုတ်ဖိုင်လ်ကိုမသိမ်းဆည်းနိုင်ခဲ့ပါ။ မသိမ်းဆည်းရသေးသော ကုတ်များကို သင်နှစ်သက်ရာစာသားတည်းဖြတ်ပရိုဂရမ်သို့ ကူးယူပြီး အိုင်ဒီအီး ပြန်စတင်ပါ။", "daemonOffline": "CLIနောက်ကွယ်လုပ်ဆောင်ပရိုဂရမ် အော့ဖ်လိုင်းဖြစ်နေသည်", "offline": "အော့ဖ်လိုင်း", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "သင်ထွက်မှာသေချာပါသလား။" }, "debug": { "start": "စတင်မည်…", diff --git a/i18n/ne.json b/i18n/ne.json index a4a593a24..70f0d120e 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -8,6 +8,7 @@ "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?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No ports selected for board: '{0}'.", @@ -24,6 +26,7 @@ "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", @@ -31,8 +34,10 @@ "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", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Boards Manager", "boardsType": { @@ -85,6 +90,7 @@ "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.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "by", "filterSearch": "Filter your search...", - "install": "INSTALL", + "install": "Install", + "installed": "Installed", "moreInfo": "More info", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", @@ -148,8 +155,19 @@ "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." @@ -236,12 +254,12 @@ "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -320,6 +342,12 @@ "network": "Network", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "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.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} error: {1}" }, @@ -390,9 +423,6 @@ "upload": "Upload" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/nl.json b/i18n/nl.json index 6293c79af..e11d0dc5f 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -8,6 +8,7 @@ "board": "Bord{0}", "boardConfigDialogTitle": "Selecteer Ander Bord en Poort", "boardInfo": "Bord Informatie", + "boards": "boards", "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?", @@ -15,6 +16,7 @@ "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": "No boards found for \"{0}\"", "noFQBN": "De FQBN is niet beschikbaar voor het geselecteerde bord \"{0}\". Heeft U de bijhorende kern geïnstalleerd?", "noPortsDiscovered": "Geen poorten gevonden", "noPortsSelected": "Geen poorten geselecteerd voor bord: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Gelieve een bord te selecteren dat verbonden is met de door U gekozen poort.", "port": "Poort{0}", "portLabel": "Poort: {0}", + "ports": "ports", "programmer": "Programmeerapparaat", "reselectLater": "Later opnieuw selecteren", "searchBoard": "Bord zoeken", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Selecteer een bord om bord informatie te bekomen.", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", "showAllAvailablePorts": "Toont alle beschikbare poorten indien ingeschakeld", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Platform {0}:{1} succesvol geïnstalleerd", - "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd" + "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd", + "typeOfPorts": "{0} ports" }, "boardsManager": "Borden Beheerder", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Klaar met pushen van '{0}'.", "embed": "Integreren:", "emptySketchbook": "Je schetsboek is leeg", + "goToCloud": "Go to Cloud", "learnMore": "Leer meer", "link": "Koppeling:", "notYetPulled": "Kan niet pushen naar Cloud. Het is nog niet getrokken.", @@ -139,7 +145,8 @@ "boardsIncluded": "Borden in dit pakket:", "by": "door", "filterSearch": "Filter je zoekopdracht...", - "install": "INSTALLEREN", + "install": "Installeren", + "installed": "Geïnstalleerd", "moreInfo": "Meer informatie", "uninstall": "Verwijderen", "uninstallMsg": "Wil je {0} verwijderen?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Bestand Toevoegen", "fileAdded": "Één bestand toegevoegd aan de schets.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Vervangen" }, + "core": { + "compilerWarnings": { + "all": "Alle", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Foutmeldingen kopiëren", "noBoardSelected": "Geen bord geselecteerd. Selecteer je Arduino-bord in het menu Extra > Board." @@ -236,12 +254,12 @@ "addZip": ".ZIP-bibliotheek toevoegen...", "arduinoLibraries": "Arduino Bibliotheken", "contributedLibraries": "Bijgedragen bibliotheken", - "dependenciesForLibrary": "Afhankelijkheden voor bibliotheek {0}:{1}", "include": "Bibliotheek Gebruiken", "installAll": "Alles installeren", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Wilt u de ontbrekende afhankelijkheid installeren?", "installOneMissingDependency": "Wilt u de ontbrekende afhankelijkheid installeren?", - "installOnly": "Installeer enkel {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Bibliotheek {0}:{1} succesvol geïnstalleerd", "libraryAlreadyExists": "Er bestaat al een bibliotheek. Wil U het overschrijven? ", "manageLibraries": "Bibliotheken Beheren...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Kan websocket niet sluiten", "unableToConnectToWebSocket": "Kan geen verbinding maken met websocket" }, + "portProtocol": { + "network": "Netwerk", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Bijkomende Borden Beheerder URL's", "auth.audience": "Het OAuth2 publiek.", @@ -320,6 +342,12 @@ "network": "Netwerk", "newSketchbookLocation": "Selecteer een nieuwe schetsboeklocatie.", "noProxy": "Geen proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Uitgebreide uitvoer weergeven tijdens", "sketchbook.location": "Schetsboek locatie", "sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.", @@ -350,7 +378,7 @@ "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": "Configureren en uploaden", + "configureAndUpload": "Configure and Upload", "createdArchive": "Archief '{0}' gemaakt.", "doneCompiling": "Klaar met compileren.", "doneUploading": "Klaar met uploaden.", @@ -381,6 +409,11 @@ "dismissSurvey": "Niet meer laten zien", "surveyMessage": "Help ons alsjeblieft te verbeteren door deze super korte enquête te beantwoorden. We waarderen onze gemeenschap en willen onze supporters graag wat beter leren kennen." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} fout: {1}" }, @@ -390,9 +423,6 @@ "upload": "Uploaden" } }, - "cloud": { - "GoToCloud": "GA NAAR CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Kan geen verbinding maken met het backend.", diff --git a/i18n/pl.json b/i18n/pl.json index 41f14afc6..cdc06ab6a 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -8,6 +8,7 @@ "board": "Płytka{0}", "boardConfigDialogTitle": "Wybierz inną płytkę i port", "boardInfo": "Informacje o płytce", + "boards": "Płytki", "configDialog1": "Wybierz płytkę oraz port, aby wgrać szkic.", "configDialog2": "Jeżeli wybierzesz płytkę, ale nie wybierzesz portu to nie będziesz mógł wgrywać szkicy, ale nadal możesz je kompilować.", "couldNotFindPreviouslySelected": "Nie można znaleźć poprzednio wybranej płytki '{0}' na zainstalowanej platformie '{1}'. Wybierz ręcznie ponownie płytkęę, której chcesz użyć. Czy chcesz ją teraz ponownie wybrać?", @@ -15,6 +16,7 @@ "getBoardInfo": "Pobierz informacje o płytce", "inSketchbook": "(w Szkicowniku)", "installNow": "Jądro \" 1{0} 2{1} \" musi zostać zainstalowane dla wybranej płytki \"{2}\". Czy chcesz zainstalować je teraz?", + "noBoardsFound": "Brak Znalezionych Płytek \"1{0}\"", "noFQBN": "FQBN jest niedostępny dla wybranej płytki \" 1{0} \". Sprawdź czy zainstalowane jądro jest prawidłowe.", "noPortsDiscovered": "Nie wykryto portów", "noPortsSelected": "Nie wybrano portu dla płytki: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Wybierz płytkę podłączoną do wybranego portu.", "port": "Port 1{0}", "portLabel": "Port: 1{0}", + "ports": "Porty", "programmer": "Programator", "reselectLater": "Wybierz ponownie później", "searchBoard": "Szukaj płytki", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Wybierz płytkę, aby uzyskać o niej informacje.", "selectPortForInfo": "Wybierz port, aby uzyskać informacje o płytce.", "showAllAvailablePorts": "Po włączeniu pokazuje wszystkie dostępne porty", + "showAllPorts": "Pokaż wszystkie dostępne porty", "succesfullyInstalledPlatform": "Pomyślnie zainstalowano platformę {0}:{1}", - "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}" + "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}", + "typeOfPorts": "1{0} Porty" }, "boardsManager": "Menedżer Płytek", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Gotowe pchanie ‘{0}’.\n ", "embed": "Osadzić:", "emptySketchbook": "Twój Szkicownik jest pusty", + "goToCloud": "Go to Cloud", "learnMore": "Dowiedz się więcej", "link": "Odnośnik:", "notYetPulled": "Nie można wysłać do chmury. Nie jest jeszcze wyciągnięty.", @@ -139,7 +145,8 @@ "boardsIncluded": "Płytka dołączona w pakiecie:", "by": "przez", "filterSearch": "Filtruj przeszukiwanie....", - "install": "ZAINSTALUJ", + "install": "Zainstaluj", + "installed": "Zainstalowane", "moreInfo": "Więcej informacji", "uninstall": "Odinstaluj", "uninstallMsg": "Czy chcesz odinstalować {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Dodaj plik", "fileAdded": "Jeden plik dodany do szkicu.", + "plotter": { + "couldNotOpen": "Błąd otwarcia portu szeregowego" + }, "replaceTitle": "Zamień" }, + "core": { + "compilerWarnings": { + "all": "Wszytko", + "default": "Domyślne", + "more": "Więcej", + "none": "Żadne" + } + }, "coreContribution": { "copyError": "Kopiuj komunikat błędu", "noBoardSelected": "Nie wybrano płytki. Proszę wybierz płytkę z Narzędzia > Lista płytek" @@ -236,12 +254,12 @@ "addZip": "Dodaj bibliotekę .ZIP...", "arduinoLibraries": "Biblioteki Arduino", "contributedLibraries": "Przesłane biblioteki", - "dependenciesForLibrary": "Zależności dla biblioteki {0}:{1}", "include": "Dołącz bibliotekę", "installAll": "Zainstaluj wszystko", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Czy chcesz zainstalować wszystkie brakujące zależności?", "installOneMissingDependency": "Czy chcesz zainstalować brakującą zależność?", - "installOnly": "Zainstaluj tylko {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Pomyślnie zainstalowano bibliotekę {0}:{1}", "libraryAlreadyExists": "Biblioteka już istnieje. Czy chcesz ją nadpisać?", "manageLibraries": "Zarządzaj bibliotekami...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Nie można zamknąć gniazda sieciowego", "unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym" }, + "portProtocol": { + "network": "Sieć", + "serial": "Szaregowy" + }, "preferences": { "additionalManagerURLs": "Dodatkowe adresy URL do menadżera płytek", "auth.audience": "Społeczność OAuth2.", @@ -320,6 +342,12 @@ "network": "Sieć", "newSketchbookLocation": "Wybierz nową lokalizację szkicownika", "noProxy": "Bez proxy", + "proxySettings": { + "hostname": "Nazwa Hosta", + "password": "Hasło", + "port": "Numer Portu", + "username": "Nazwa Użytkownika" + }, "showVerbose": "Pokazuj informacje zwrotne podczas:", "sketchbook.location": "Lokalizacja szkicownika", "sketchbook.showAllFiles": "Prawda, aby wyświetlać wszystkie pliki ze szkicu. Fałsz jest wartością domyślną.", @@ -350,7 +378,7 @@ "cantOpen": "Folder \" 1{0} \" już istnieje. Nie można otworzyć szkicu.", "close": "Jesteś pewien, że chcesz zamknąć szkic?", "compile": "Kompilowanie szkicu...", - "configureAndUpload": "Skonfiguruj u wgraj", + "configureAndUpload": "Skompiluj i wgraj", "createdArchive": "Stwórz archiwum ' 1{0} '.", "doneCompiling": "Kompilacja zakończona.", "doneUploading": "Przesyłanie zakończone.", @@ -381,6 +409,11 @@ "dismissSurvey": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają.", "surveyMessage": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają." }, + "updateIndexes": { + "updateIndexes": "Aktualizuj indeksy", + "updateLibraryIndex": "Aktualizuj indeksy bibliotek", + "updatePackageIndex": "Aktualizuj indeksy pakietów" + }, "upload": { "error": "{0} błąd: {1}" }, @@ -390,9 +423,6 @@ "upload": "Prześlij" } }, - "cloud": { - "GoToCloud": "IDŹ DO CHMURY" - }, "theia": { "core": { "cannotConnectBackend": "Nie można połączyć się z backendem.", diff --git a/i18n/pt.json b/i18n/pt.json index f27afceb3..9eb7932b7 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -8,6 +8,7 @@ "board": "Placa{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Informações da Placa", + "boards": "boards", "configDialog1": "Selecione uma placa e uma porta se quiser fazer o upload de um sketch.", "configDialog2": "Se você selecionar apenas uma Placa, você será capaz de compilar, mas não de carregar o seu sketch.", "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?", @@ -15,6 +16,7 @@ "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": "No boards found for \"{0}\"", "noFQBN": "O FQBN não está disponível para a placa selecionada \"{0}\". Você tem o núcleo correspondente instalado?", "noPortsDiscovered": "Nenhuma porta detectada", "noPortsSelected": "Nenhuma porta selecionada para placa: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Escolha uma placa conectada à porta que você selecionou.", "port": "Porta{0}", "portLabel": "Porta{0}", + "ports": "ports", "programmer": "Programador/Gravador", "reselectLater": "Selecionar novamente mais tarde", "searchBoard": "Procurar placa", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Selecione uma placa para obter informações sobre ela.", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", "showAllAvailablePorts": "Mostrar todas as portas disponíveis quando habilitado", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Plataforma instalada com sucesso {0}: {1}", - "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}" + "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Gerenciador de Placas", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Concluído o envio de ‘{0}’.", "embed": "Embutir:", "emptySketchbook": "O seu Sketchbook está vazio", + "goToCloud": "Go to Cloud", "learnMore": "Saiba mais", "link": "Endereço", "notYetPulled": "Não é possível enviar para a nuvem. Ainda não foi baixado.", @@ -140,6 +146,7 @@ "by": "por", "filterSearch": "Filtrar a sua pesquisa…", "install": "Instalar", + "installed": "Installed", "moreInfo": "Mais informações", "uninstall": "Desinstalar", "uninstallMsg": "Deseja desinstalar {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Adicionar Arquivo", "fileAdded": "Um arquivo adicionado ao sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Substituir" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Mensagem de erro Copiar", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Adicionar biblioteca .ZIP...", "arduinoLibraries": "Bibliotecas Arduino", "contributedLibraries": "Bibliotecas contribuídas", - "dependenciesForLibrary": "Dependências da biblioteca {0}: {1}", "include": "Incluir Biblioteca", - "installAll": "Instalar tudo", + "installAll": "Instalar todas", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Deseja instalar todas as dependências ausentes?", "installOneMissingDependency": "Deseja instalar a dependência ausente?", - "installOnly": "Instalar apenas {0} ", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Biblioteca instalada com sucesso {0}: {1}", "libraryAlreadyExists": "Essa biblioteca já existe. Você deseja sobrescreve-la?", "manageLibraries": "Gerenciar bibliotecas...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Impossível fechar websocket", "unableToConnectToWebSocket": "Impossível conectar ao websocket" }, + "portProtocol": { + "network": "Rede", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "URLs do Gerenciador de Placas Adicionais", "auth.audience": "O OAuth2 publico.", @@ -320,6 +342,12 @@ "network": "Rede", "newSketchbookLocation": "Escolher", "noProxy": "Sem proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Mostrar a saída detalhada durante", "sketchbook.location": "Localização dos Sketchbooks", "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de sketch dentro do sketch. Falso é padrão.", @@ -350,7 +378,7 @@ "cantOpen": "Directoria chamada \"{0}\" já existe. Não é possível abrir o rascunho.", "close": "Tem certeza que deseja fechar o sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configurar e Fazer Envio", + "configureAndUpload": "Configure and Upload", "createdArchive": "Arquivo criado '{0}'.", "doneCompiling": "Compilação concluída.", "doneUploading": "Envio concluído.", @@ -381,6 +409,11 @@ "dismissSurvey": "Não mostrar novamente", "surveyMessage": "Por favor, ajude-nos a melhorar respondendo essa pequena pesquisa. Nós valorizamos nossa comunidade e gostaríamos de conhecer nossos colaboradores um pouco melhor." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} erro: {1}" }, @@ -390,9 +423,6 @@ "upload": "Carregar" } }, - "cloud": { - "GoToCloud": "IR PARA A NUVEM" - }, "theia": { "core": { "cannotConnectBackend": "Não é possível conectar-se ao backend.", diff --git a/i18n/ro.json b/i18n/ro.json index db489e75a..845c3d051 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -8,6 +8,7 @@ "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?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "No ports selected for board: '{0}'.", @@ -24,6 +26,7 @@ "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", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "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", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Boards Manager", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Done pushing ‘{0}’.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Învață mai mult", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "de", "filterSearch": "Filtrează căutarea...", - "install": "INSTALEAZĂ", + "install": "Instalează", + "installed": "Installed", "moreInfo": "Mai multe informații", "uninstall": "Dezinstalează", "uninstallMsg": "Dorești să dezinstalezi {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Adaugă Fișier", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Înlocuiește" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Librăria", - "installAll": "Instalează tot", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Instalează doar {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Gestionare Librării ", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Rețea", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "Audiența OAuth2.", @@ -320,6 +342,12 @@ "network": "Rețea", "newSketchbookLocation": "Select new sketchbook location", "noProxy": "Fără proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Show verbose output during", "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "Adevărat pentru a afișa toate fișierele tip schița din interiorul schiței. Este fals în modul implicit.", @@ -350,7 +378,7 @@ "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", "compile": "Compiling sketch...", - "configureAndUpload": "Configure And Upload", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} eroare :{1}" }, @@ -390,9 +423,6 @@ "upload": "Încarcă" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/ru.json b/i18n/ru.json index 3e0649b10..7dbb9738b 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -8,6 +8,7 @@ "board": "Плата{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Информация о плате", + "boards": "boards", "configDialog1": "Выберите плату и порт, если Вы хотите загрузить скетч в плату.", "configDialog2": "Если вы выбираете только плату, вы сможете компилировать, но не загружать свой скетч.", "couldNotFindPreviouslySelected": "Не удалось найти ранее выбранную плату '{0}' в установленной платформе '{1}'.Пожалуйста, выберите плату которую хотите использовать вручную повторно. Вы хотите повторно выбрать её сейчас?", @@ -15,6 +16,7 @@ "getBoardInfo": "Получить информацию о подключенной плате", "inSketchbook": " (в альбоме).", "installNow": "Необходимо установить ядро «{0} {1}» для выбранной в данный момент «{2}» платы. Вы хотите установить его сейчас?", + "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "FQBN недоступен для выбранной платы \"{0}\". Проверьте наличие необходимого ядра.", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Не выбраны порты для платы: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Пожалуйста, выберите плату, подключенную к выбранному вами порту.", "port": "Порт{0}", "portLabel": "Порт:{0}", + "ports": "ports", "programmer": "Программатор", "reselectLater": "Перевыбрать позже", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Пожалуйста, выберите плату в меню инструментов для получения информации с платы.", "selectPortForInfo": "Пожалуйста, выберите порт в меню инструментов для получения информации с платы.", "showAllAvailablePorts": "Показать все доступные порты при включении", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Платформа установлена успешно {0}:{1}", - "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}" + "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Менеджер плат", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Отправлено ‘{0}’.", "embed": "Встроить:", "emptySketchbook": "Ваш альбом пуст", + "goToCloud": "Go to Cloud", "learnMore": "Узнать больше", "link": "Ссылка:", "notYetPulled": "Не удается отправить в облако. Он еще не вытащен.", @@ -140,6 +146,7 @@ "by": "от", "filterSearch": "Отфильтровать результаты поиска...", "install": "Установка", + "installed": "Installed", "moreInfo": "Дополнительная информация", "uninstall": "Удалить", "uninstallMsg": "Вы хотите удалить {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Добавить файл...", "fileAdded": "Один файл добавлен в скетч.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Заменить" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Скопировать сообщения ошибок", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Добавить .ZIP библиотеку...", "arduinoLibraries": "Библиотеки Arduino", "contributedLibraries": "Сторонние библиотеки", - "dependenciesForLibrary": "Зависимости для библиотеки {0}:{1}", "include": "Подключить библиотеку", - "installAll": "Установить все", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Установить все недостающие зависимости?", "installOneMissingDependency": "Установить недостающую зависимость?", - "installOnly": "Установить только {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Успешно установлена библиотека {0}:{1}", "libraryAlreadyExists": "Библиотека уже существует. Вы хотите ее заменить?", "manageLibraries": "Управление библиотеками...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Не удалось закрыть веб-сокет.", "unableToConnectToWebSocket": "Не удается подключиться к веб-сокету." }, + "portProtocol": { + "network": "Сеть", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Дополнительные ссылки для Менеджера плат", "auth.audience": "Аудитория OAuth2.", @@ -320,6 +342,12 @@ "network": "Сеть", "newSketchbookLocation": "Выбрать новое расположение для альбома со скетчами", "noProxy": "Не использовать прокси-сервер", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Показывать детализированный вывод при", "sketchbook.location": "Путь к альбому со скетчами", "sketchbook.showAllFiles": "True - показывать все файлы внутри скетча. По умолчанию - false.", @@ -350,7 +378,7 @@ "cantOpen": "Папка \"{0}\" уже существует. Невозможно открыть скетч.", "close": "Вы действительно хотите закрыть скетч?", "compile": "Компиляция скетча...", - "configureAndUpload": "Настроить и загрузить", + "configureAndUpload": "Configure and Upload", "createdArchive": "Создать архив '{0}'.", "doneCompiling": "Компиляция завершена.", "doneUploading": "Загрузка завершена.", @@ -381,6 +409,11 @@ "dismissSurvey": "Больше не показывать", "surveyMessage": "Пожалуйста, помоги нам стать лучше, пройдя этот супер-короткий опрос. Мы ценим наше сообщество и хотели бы узнать наших сторонников немного лучше!" }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} ошибка: {1}" }, @@ -390,9 +423,6 @@ "upload": "Загрузка" } }, - "cloud": { - "GoToCloud": "Переход в облако" - }, "theia": { "core": { "cannotConnectBackend": "Невозможно подключиться к бэкенду.", diff --git a/i18n/sr.json b/i18n/sr.json index c37c7f447..bc61a8029 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -8,6 +8,7 @@ "board": "Плоча{0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Информације о плочи", + "boards": "boards", "configDialog1": "Одабери и плочу и порт ако желиш да спустиш рад.", "configDialog2": "Ако одабереш само плочу моћи ћеш само да преведеш, али не и да спустиш рад.", "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Ниједан порт није одабран за плочу: '{0}'.", @@ -24,6 +26,7 @@ "pleasePickBoard": "Одабери плочу повезану са одабраним портом.", "port": "Порт{0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Програмер", "reselectLater": "Одабери поново касније", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Одабери плочу да добијеш информације о њој.", "selectPortForInfo": "Одабери порт да добијеш информације о плочи", "showAllAvailablePorts": "Приказује све доступне портове када је укључено", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Успјешно инсталирана платформа {0}:{1}", - "succesfullyUninstalledPlatform": "Успјешно деинсталирана платформа {0}:{1}" + "succesfullyUninstalledPlatform": "Успјешно деинсталирана платформа {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Управљач плочама", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Done pushing ‘{0}’.", "embed": "Угради:", "emptySketchbook": "Твоја радна свеска је празна", + "goToCloud": "Go to Cloud", "learnMore": "Сазнајте више", "link": "Линк:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "од", "filterSearch": "Филтрирај претрагу...", - "install": "ИНСТАЛИРАЈ", + "install": "Инсталирај", + "installed": "Installed", "moreInfo": "Више информација", "uninstall": "Деинсталирај", "uninstallMsg": "Да ли желиш да деинсталираш {0}? ", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Додај датотеку", "fileAdded": "Датотека је додата у рад.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Замјени" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { "copyError": "Copy error messages", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." @@ -236,12 +254,12 @@ "addZip": "Додај .ZIP библиотеку...", "arduinoLibraries": "Arduino библиотеке", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Зависне библиотеке за библиотеку {0}:{1}", "include": "Укључи библиотеку", - "installAll": "Инсталирај све", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Да ли желиш да инсталираш све зависне библиотеке?", "installOneMissingDependency": "Да ли желиш да инсталираш зависну библиотеку?", - "installOnly": "Инсталирај само {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Успјешно инсталирана библиотека {0}:{1}", "libraryAlreadyExists": "Библиотека већ постоји. Желиш да препишеш преко ње?", "manageLibraries": "Управљај библиотекама...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Мрежа", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "OAuth2 публика.", @@ -320,6 +342,12 @@ "network": "Мрежа", "newSketchbookLocation": "Одабери нову локацију радне свеске", "noProxy": "Без посредника", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Прикажи детаљан испис током", "sketchbook.location": "Локација радне свеске", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", @@ -350,7 +378,7 @@ "cantOpen": "Директоријум \"{0}\" већ постоји. Није могуће отворити рад.", "close": "Да ли желиш да затвориш рад?", "compile": "Compiling sketch...", - "configureAndUpload": "Конфигуриши и спусти", + "configureAndUpload": "Configure and Upload", "createdArchive": "Направљена архива '{0}'.", "doneCompiling": "Превођење завршено.", "doneUploading": "Спуштање завршено.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} грешка: {1}" }, @@ -390,9 +423,6 @@ "upload": "Спусти" } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", diff --git a/i18n/tr.json b/i18n/tr.json index 9363b9d03..274da9d43 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -8,6 +8,7 @@ "board": "Kart{0}", "boardConfigDialogTitle": "Başka Kart ve Port Seç", "boardInfo": "Kart Bilgisi", + "boards": "kartlar", "configDialog1": "Bir eskiz yüklemek istiyorsanız Kart ve Port seçmelisiniz.", "configDialog2": "Sadece Kart seçerseniz eskizinizi derleyebilir, ancak yükleyemezsiniz.", "couldNotFindPreviouslySelected": "Kurulu '{1}' platformunda daha önce seçili kart '{0}' bulunamadı. Lütfen kullanmak istediğiniz kartı elle yeniden seçin. Şimdi tekrar seçmek istiyor musunuz?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "Port bulunamadı", "noPortsSelected": "'{0}' kartı için port seçilmedi", @@ -24,6 +26,7 @@ "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ç", "searchBoard": "Kart ara", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Kart bilgisi almak için lütfen bir kart seçin.", "selectPortForInfo": "Kart bilgisi almak için lütfen bir port seçin.", "showAllAvailablePorts": "Etkinleştirildiğinde tüm mevcut portları görüntüler", + "showAllPorts": "Tüm portları göster", "succesfullyInstalledPlatform": "Platform başarıyla kuruldu {0}:{1}", - "succesfullyUninstalledPlatform": "Platform başarıyla kaldırıldı {0}:{1}" + "succesfullyUninstalledPlatform": "Platform başarıyla kaldırıldı {0}:{1}", + "typeOfPorts": "{0} portlar" }, "boardsManager": "Kart Yöneticisi", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Gönderme bitti: ‘{0}’.", "embed": "Yerleştir:", "emptySketchbook": "Eskiz Defteriniz boş", + "goToCloud": "Buluta Git", "learnMore": "Daha fazlasını öğren", "link": "Bağlantı:", "notYetPulled": "Bulut'a gönderilemedi. Henüz çekilmemiş.", @@ -139,7 +145,8 @@ "boardsIncluded": "Bu pakete dahil kartlar:", "by": "-", "filterSearch": "Aramayı Filtrele...", - "install": "KUR", + "install": "Kur", + "installed": "Kurulu", "moreInfo": "Daha fazla bilgi", "uninstall": "Kaldır", "uninstallMsg": "{0} kaldırılsın mı?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Dosya Ekle", "fileAdded": "Eskize bir dosya eklendi.", + "plotter": { + "couldNotOpen": "Seri Çizici açılamadı" + }, "replaceTitle": "Değiştir" }, + "core": { + "compilerWarnings": { + "all": "Tümü", + "default": "Varsayılan", + "more": "Daha fazla", + "none": "Hiçbiri" + } + }, "coreContribution": { "copyError": "Hata mesajlarını kopyala", "noBoardSelected": "Kart seçili değil. Lütfen Araçlar > Kart menüsünden Arduino kartınızı seçin." @@ -236,12 +254,12 @@ "addZip": ".ZIP Kütüphanesi Ekle...", "arduinoLibraries": "Arduino kütüphaneleri", "contributedLibraries": "Eklenmiş kütüphaneler", - "dependenciesForLibrary": "{0}:{1} kütüphanesi için gereklilikler", "include": "Kütüphane Ekle", "installAll": "Tümünü kur", + "installLibraryDependencies": "Kütüphane gerekliliklerini kur", "installMissingDependencies": "Tüm eksik gereklilikleri kurmak ister misiniz?", "installOneMissingDependency": "Eksik gereklilikleri kurmak istiyor musunuz?", - "installOnly": "Sadece {0}'u kur", + "installWithoutDependencies": "Gereklilikler olmadan kur", "installedSuccessfully": "{0}:{1} kütüphanesi başarıyla kuruldu", "libraryAlreadyExists": "Kütüphane zaten mevcut. Üzerine yazmak istiyor musunuz?", "manageLibraries": "Kütüphaneleri Yönet...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Websocket kapatılamadı ", "unableToConnectToWebSocket": "Websocket'e bağlanılamadı" }, + "portProtocol": { + "network": "Ağ", + "serial": "Seri" + }, "preferences": { "additionalManagerURLs": "Ek Kart Yöneticisi URL'leri", "auth.audience": "OAuth2 audience.", @@ -320,6 +342,12 @@ "network": "Ağ", "newSketchbookLocation": "Yeni eskiz defteri konumu seç", "noProxy": "Vekil yok", + "proxySettings": { + "hostname": "Host adı", + "password": "Parola", + "port": "Port numarası", + "username": "Kullanıcı adı" + }, "showVerbose": "Ayrıntılı çıktıyı görüntüle", "sketchbook.location": "Eskiz Defteri konumu", "sketchbook.showAllFiles": "Tüm eskiz dosyalarını eskiz içinde görüntülemek için açın. Varsayılan: kapalı.", @@ -381,6 +409,11 @@ "dismissSurvey": "Tekrar gösterme", "surveyMessage": "Lütfen bu çok kısa anketi yanıtlayarak gelişmemize yardım edin. Topluluğumuza değer veriyoruz e destekçilerimizi biraz daha iyi tanımak isteriz." }, + "updateIndexes": { + "updateIndexes": "Katalogları Güncelle", + "updateLibraryIndex": "Kütüphane Kataloğunu Güncelle", + "updatePackageIndex": "Paket Kataloğunu Güncelle" + }, "upload": { "error": "{0} hata: {1}" }, @@ -390,9 +423,6 @@ "upload": "Yükle" } }, - "cloud": { - "GoToCloud": "BULUTA GİT" - }, "theia": { "core": { "cannotConnectBackend": "Ana yapıya bağlanılamadı.", diff --git a/i18n/uk.json b/i18n/uk.json new file mode 100644 index 000000000..9163178c5 --- /dev/null +++ b/i18n/uk.json @@ -0,0 +1,455 @@ +{ + "arduino": { + "about": { + "detail": "Версія: {0}\nДата:{1} {2}\nВерсія CLI:{3}{4}[{5}]\n{6}", + "label": "Про {0}" + }, + "board": { + "board": "Плата {0}", + "boardConfigDialogTitle": "Оберіть іншу плату або порт", + "boardInfo": "Інформація про плату", + "boards": "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": "Отримати інформацію про плату", + "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?", + "noPortsDiscovered": "No ports discovered", + "noPortsSelected": "No ports selected for board: '{0}'.", + "noneSelected": "Не обрана плата", + "openBoardsConfig": "Оберіть іншу плату або порт", + "platformMissing": "The platform for the selected '{0}' board is not installed.", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "Port{0}", + "portLabel": "Port: {0}", + "ports": "ports", + "programmer": "Programmer", + "reselectLater": "Reselect later", + "searchBoard": "Search board", + "selectBoard": "Оберіть плату", + "selectBoardForInfo": "Please select a board to obtain board info.", + "selectPortForInfo": "Please select a port to obtain board info.", + "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", + "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" + }, + "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": "Додати Новий", + "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": "Видалити ", + "selectBoard": "Оберіть плату ...", + "selectCertificateToUpload": "1. Select certificate to upload", + "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", + "upload": "Завантажити", + "uploadFailed": "Upload failed. Please try again.", + "uploadRootCertificates": "Upload SSL Root Certificates", + "uploadingCertificates": "Uploading certificates." + }, + "checkForUpdates": { + "checkForUpdates": "Check for Arduino Updates", + "installAll": "Встановити все", + "noUpdates": "There are no recent updates available.", + "promptUpdateBoards": "Updates are available for some of your boards.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." + }, + "cli-error-parser": { + "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" + }, + "cloud": { + "account": "Account", + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "connected": "Connected", + "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", + "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": { + "all": "Все", + "contributed": "Contributed", + "installManually": "Install Manually", + "later": "Пізніше", + "noBoardSelected": "Не обрана плата", + "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": "Монітор порту", + "type": "Тіп", + "unknown": "Unknown", + "updateable": "Updatable" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "filterSearch": "Filter your search...", + "install": "Встановити", + "installed": "Встановлено ", + "moreInfo": "Більше інформації ", + "uninstall": "Видалити", + "uninstallMsg": "Do you want to uninstall {0}?", + "version": "Version {0}" + }, + "contributions": { + "addFile": "Додати Файл", + "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, + "replaceTitle": "Замінити " + }, + "core": { + "compilerWarnings": { + "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." + }, + "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": "Не питати знову" + }, + "editor": { + "autoFormat": "Автофрмат", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Наступна помилка", + "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": "Приклади" + }, + "firmware": { + "checkUpdates": "Перевірити Оновлення", + "failedInstall": "Installation failed. Please try again.", + "install": "Встановити", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "Оберіть плату", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "WiFi101 / WiFiNINA Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Знайти в описі", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Відвідати Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Закрити та Встановити", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "downloadButton": "Завантажити", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Перейти до завантаження ", + "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": "Не зараз", + "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": "Встановити все", + "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": "Бібліотеки " + }, + "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": "Встановлено " + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "portProtocol": { + "network": "Мережа", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Автоматично", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "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": "Мережа", + "newSketchbookLocation": "Select new sketchbook location", + "noProxy": "Нема проксі", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "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.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 (Enter to send message to '{0}' on '{1}')", + "newLine": "Нова лінія", + "newLineCarriageReturn": "Both NL & CR", + "noLineEndings": "No Line Ending", + "notConnected": "Not connected. Select a board and a port to connect automatically.", + "openSerialPlotter": "Serial Plotter", + "timestamp": "Timestamp", + "toggleTimestamp": "Toggle Timestamp" + }, + "sketch": { + "archiveSketch": "Archive Sketch", + "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", + "close": "Are you sure you want to close the sketch?", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "exportBinary": "Export Compiled Binary", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "Новий", + "openFolder": "Відкрити папку", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "Завантажити", + "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", + "userFieldsNotFoundError": "Can't find user fields for connected board", + "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." + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Відміна ", + "enterField": "Enter {0}", + "upload": "Завантажити" + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Cannot connect to the backend.", + "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", + "daemonOffline": "CLI Daemon Offline", + "offline": "Offline", + "quitTitle": "Are you sure you want to quit?" + }, + "debug": { + "start": "Старт...", + "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": "Згорнути ", + "expand": "Розгорнути " + }, + "workspace": { + "deleteCurrentSketch": "Do you want to delete the current sketch?", + "fileNewName": "Ім'я для нового файлу", + "invalidExtension": ".{0} is not a valid extension", + "invalidFilename": "Невірне ім'я файлу", + "newFileName": "Нове ім'я файлу" + } + } +} diff --git a/i18n/vi.json b/i18n/vi.json index 8a1601a6e..882d652f3 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -8,6 +8,7 @@ "board": "Bo mạch {0}", "boardConfigDialogTitle": "Select Other Board and Port", "boardInfo": "Thông tin bo mạch", + "boards": "boards", "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?", @@ -15,6 +16,7 @@ "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?", "noPortsDiscovered": "No ports discovered", "noPortsSelected": "Không có cổng được chọn cho bo mạch: '{0}'.", @@ -24,6 +26,7 @@ "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", "programmer": "Programmer", "reselectLater": "Chọn lại sau", "searchBoard": "Search board", @@ -31,8 +34,10 @@ "selectBoardForInfo": "Hãy chọn một bo mạch để lấy thông tin.", "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", "succesfullyInstalledPlatform": "Hoàn tất cài đặt nền tảng {0}:{1}", - "succesfullyUninstalledPlatform": "Hoàn tất gỡ cài đặt nền tảng {0}:{1}" + "succesfullyUninstalledPlatform": "Hoàn tất gỡ cài đặt nền tảng {0}:{1}", + "typeOfPorts": "{0} ports" }, "boardsManager": "Trình quản lý bo mạch", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "Hoàn tất đẩy lên '{0}'.", "embed": "Nhúng: ", "emptySketchbook": "Sketchbook của bạn đang trống", + "goToCloud": "Go to Cloud", "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.", @@ -139,7 +145,8 @@ "boardsIncluded": "Boards included in this package:", "by": "bởi", "filterSearch": "Lọc kết quả tìm kiếm của bạn...", - "install": "CÀI ĐẶT", + "install": "Cài đặt", + "installed": "Installed", "moreInfo": "Thêm thông tin", "uninstall": "Gỡ cài đặt", "uninstallMsg": "Bạn có muốn gỡ cài đặt {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "Thêm tệp...", "fileAdded": "Một tệp đã được thêm vào sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Thay thế" }, + "core": { + "compilerWarnings": { + "all": "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." @@ -236,12 +254,12 @@ "addZip": "Thêm thư viện đuôi .ZIP...", "arduinoLibraries": "Thư viện Arduino", "contributedLibraries": "Thư viện cộng đồng đóng góp", - "dependenciesForLibrary": "Thư viện bổ trợ cho thư viện {0}:{1}", "include": "Thêm thư viện", - "installAll": "Cài tất cả", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Bạn có muốn cài tất cả các thư viện bổ trợ còn thiếu không?", "installOneMissingDependency": "Bạn có muốn cài thư viện bổ trợ còn thiếu không?", - "installOnly": "Chỉ cài {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Hoàn tất cài đặt thư viện {0}:{1}", "libraryAlreadyExists": "Đã tồn tại một thư viện. Bạn có muốn ghi đè lên nó?", "manageLibraries": "Quản lý thư viện...", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "portProtocol": { + "network": "Mạng", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Địa chỉ URLs của các trình quản lý thêm bo mạch", "auth.audience": "Khán giả OAuth2.", @@ -320,6 +342,12 @@ "network": "Mạng", "newSketchbookLocation": "Chọn địa điểm lưu sketchbook mới", "noProxy": "Không có proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "Hiển thị đầu ra chi tiết trong khi", "sketchbook.location": "Địa điểm chứa sketchbook", "sketchbook.showAllFiles": "'True' để hiển thị tất cả các tệp sketch trong sketch. Mặc định là 'false'.", @@ -350,7 +378,7 @@ "cantOpen": "Một thư mục tên \"{0}\" đã tồn tại. Không thể mở sketch.", "close": "Bạn có chắc muốn đóng sketch này không?", "compile": "Compiling sketch...", - "configureAndUpload": "Cấu hình và nạp", + "configureAndUpload": "Configure and Upload", "createdArchive": "Đã tạo tệp nén '{0]'.", "doneCompiling": "Biên dịch hoàn tất.", "doneUploading": "Nạp hoàn tất.", @@ -381,6 +409,11 @@ "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." }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "Lỗi {0}: {1}" }, @@ -390,9 +423,6 @@ "upload": "Nạp" } }, - "cloud": { - "GoToCloud": "ĐI ĐẾN CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Không thể kết nối đến backend.", diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json new file mode 100644 index 000000000..ea6db769a --- /dev/null +++ b/i18n/zh-Hant.json @@ -0,0 +1,455 @@ +{ + "arduino": { + "about": { + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "label": "About {0}" + }, + "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?", + "noPortsDiscovered": "No ports discovered", + "noPortsSelected": "No ports selected for board: '{0}'.", + "noneSelected": "No boards selected.", + "openBoardsConfig": "Select other board and port…", + "platformMissing": "The platform for the selected '{0}' board is not installed.", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "Port{0}", + "portLabel": "Port: {0}", + "ports": "ports", + "programmer": "Programmer", + "reselectLater": "Reselect later", + "searchBoard": "Search board", + "selectBoard": "Select Board", + "selectBoardForInfo": "Please select a board to obtain board info.", + "selectPortForInfo": "Please select a port to obtain board info.", + "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", + "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports" + }, + "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": { + "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", + "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", + "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": { + "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", + "filterSearch": "Filter your search...", + "install": "Install", + "installed": "Installed", + "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.", + "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." + }, + "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", + "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": { + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "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", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "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 (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.", + "exportBinary": "Export Compiled Binary", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "Upload", + "uploadUsingProgrammer": "Upload Using Programmer", + "uploading": "Uploading...", + "userFieldsNotFoundError": "Can't find user fields for connected board", + "verify": "Verify", + "verifyOrCompile": "Verify/Compile" + }, + "survey": { + "answerSurvey": "Answer survey", + "dismissSurvey": "Don't show again", + "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." + }, + "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" + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Cannot connect to the backend.", + "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", + "daemonOffline": "CLI Daemon Offline", + "offline": "Offline", + "quitTitle": "Are you sure you want to quit?" + }, + "debug": { + "start": "Start...", + "startError": "There was an error starting the debug session, check the logs for more details.", + "typeNotSupported": "The debug session type \"{0}\" is not supported." + }, + "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/zh.json b/i18n/zh.json index a2d28e6b8..22124e370 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -8,6 +8,7 @@ "board": "开发板 {0}", "boardConfigDialogTitle": "选择其他开发板和端口", "boardInfo": "开发板信息", + "boards": "开发板", "configDialog1": "如果要上传项目,请选择开发板和端口。", "configDialog2": "如果你只选择了开发板,你可以编译项目,但不能上传项目。", "couldNotFindPreviouslySelected": "在安装的平台 ‘{1}’ 中找不到以前选择的开发板 ‘{0}’。请手动选择要使用的开发板。你想现在重新选择它吗?", @@ -15,6 +16,7 @@ "getBoardInfo": "获得开发板信息", "inSketchbook": "(在项目文件夹中)", "installNow": "必须为当前选定的 {2} 开发板板安装 “{0}{1}” 内核。你想现在安装吗?", + "noBoardsFound": "没有找到 “{0}” 相关开发板", "noFQBN": "FQBN 不可用于所选开发板 “{0}”。你是否安装了相应的内核?", "noPortsDiscovered": "未发现端口", "noPortsSelected": "没有为开发板选择端口:‘{0}’。", @@ -24,6 +26,7 @@ "pleasePickBoard": "请选择要连接的开发板。", "port": "端口 {0}", "portLabel": "端口:{0}", + "ports": "端口", "programmer": "编程器", "reselectLater": "稍后重新选择", "searchBoard": "搜索开发坂", @@ -31,8 +34,10 @@ "selectBoardForInfo": "请选择一个开发板以获取开发板信息。", "selectPortForInfo": "请选择一个端口以获取开发板信息。", "showAllAvailablePorts": "启用时显示所有可用端口", + "showAllPorts": "显示所有端口", "succesfullyInstalledPlatform": "已成功安装平台 {0}:{1}", - "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}" + "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}", + "typeOfPorts": "{0} 端口" }, "boardsManager": "开发板管理器", "boardsType": { @@ -85,6 +90,7 @@ "donePushing": "已完成推送 ‘{0}’。", "embed": "嵌入:", "emptySketchbook": "你的项目文件夹是空的", + "goToCloud": "Go to Cloud", "learnMore": "查看更多", "link": "链接:", "notYetPulled": "无法推送到 Cloud。未被拉取。", @@ -125,7 +131,7 @@ "partner": "合作伙伴", "processing": "正在处理中", "recommended": "推荐", - "retired": "Retired", + "retired": "不再支持的", "selectedOn": "on {0}", "serialMonitor": "串口监视器", "type": "类型", @@ -140,6 +146,7 @@ "by": "by", "filterSearch": "筛选搜索结果......", "install": "安装", + "installed": "安装", "moreInfo": "更多信息", "uninstall": "卸载", "uninstallMsg": "是否要卸载 {0}?", @@ -148,8 +155,19 @@ "contributions": { "addFile": "添加文件", "fileAdded": "将一个文件添加到项目中。", + "plotter": { + "couldNotOpen": "无法打开串口绘图仪" + }, "replaceTitle": "替换" }, + "core": { + "compilerWarnings": { + "all": "全部", + "default": "默认", + "more": "较多", + "none": "无" + } + }, "coreContribution": { "copyError": "复制错误信息", "noBoardSelected": "未选择开发板。请从工具 > 板菜单中选择您的 Arduino 开发板。" @@ -236,12 +254,12 @@ "addZip": "添加 .ZIP 库...", "arduinoLibraries": "arduino 库", "contributedLibraries": "贡献库", - "dependenciesForLibrary": "{0} 库的依赖:{1}", "include": "包含库", "installAll": "全部安装", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "是否安装所有缺少的依赖?", "installOneMissingDependency": "是否安装缺少的依赖?", - "installOnly": "仅安装 {0}", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "已成功安装 {0} 库:{1}", "libraryAlreadyExists": "库已经存在。是否要覆盖它?", "manageLibraries": "管理库...", @@ -258,7 +276,7 @@ "topic": "话题" }, "libraryTopic": { - "communication": "Communication", + "communication": "交流", "dataProcessing": "数据处理", "dataStorage": "数据存储", "deviceControl": "设备控制", @@ -281,6 +299,10 @@ "unableToCloseWebSocket": "无法关闭 websocket", "unableToConnectToWebSocket": "无法连接 websocket" }, + "portProtocol": { + "network": "网络", + "serial": "串口" + }, "preferences": { "additionalManagerURLs": "其他开发板管理器地址", "auth.audience": "OAuth2 受众。", @@ -320,6 +342,12 @@ "network": "网络", "newSketchbookLocation": "选择新的项目文件夹地址", "noProxy": "无代理", + "proxySettings": { + "hostname": "主机名", + "password": "密码", + "port": "端口号", + "username": "用户名" + }, "showVerbose": "显示详细输出", "sketchbook.location": "项目文件夹地址", "sketchbook.showAllFiles": "True 则显示项目中的所有项目文件。默认情况下为 False。", @@ -336,7 +364,7 @@ "serial": { "autoscroll": "自动滚屏", "carriageReturn": "回车", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "message": "消息(按回车将消息发送到“{1}”上的“{0}”)", "newLine": "换行", "newLineCarriageReturn": "换行 和 回车 两者都是", "noLineEndings": "没有结束符", @@ -350,7 +378,7 @@ "cantOpen": "“{0}” 文件夹已存在。无法打开项目。", "close": "是否确实要关闭项目?", "compile": "正在编译项目。。。", - "configureAndUpload": "配置和上传", + "configureAndUpload": "配置并上传", "createdArchive": "已创建存档 ‘{0}’。", "doneCompiling": "编译完成", "doneUploading": "上传完成", @@ -381,6 +409,11 @@ "dismissSurvey": "不要再显示", "surveyMessage": "请回答这份很短的调查来帮助我们改进。我们重视我们的社区,也希望能够更好地了解我们的支持者。" }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, "upload": { "error": "{0} 错误:{1}" }, @@ -390,9 +423,6 @@ "upload": "上传" } }, - "cloud": { - "GoToCloud": "前往 CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "无法连接后台。", diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index f5a6f667f..d75a1d218 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -6,8 +6,9 @@ }, "board": { "board": "1{0} 開發板", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "選擇其他開發板和埠", "boardInfo": "開發板資訊", + "boards": "boards", "configDialog1": "若要上傳 Sketch 請選擇一片板子及一個埠", "configDialog2": "如果你只有選擇板子你可以編譯,但不能上傳 Sketch", "couldNotFindPreviouslySelected": "在安装的平台{1}中找不到以前選擇的開發板{0}。請手動選擇要使用的開發板。你想現在重新選擇它吗?", @@ -15,8 +16,9 @@ "getBoardInfo": "取得開發板資訊", "inSketchbook": "(在草稿資料夾中)", "installNow": "必須為目前選定的 {2} 開發板安裝 1{0} 2{1} 核心程式,你要現在安裝嗎?", + "noBoardsFound": "未找到開發板 {0}", "noFQBN": "FQBN無法用於所選擇的\"{0}\"開發版。你是否安裝了對應的核心?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "未找到埠", "noPortsSelected": "沒有選到 '{0}' 板的埠", "noneSelected": "沒有選擇電路板", "openBoardsConfig": "選擇其他的電路板或埠...", @@ -24,19 +26,22 @@ "pleasePickBoard": "請選擇要連接的開發版", "port": "1{0} 埠", "portLabel": "端口: {0}", + "ports": "ports", "programmer": "燒錄器", - "reselectLater": "請晚一點再選擇", - "searchBoard": "Search board", + "reselectLater": "請稍後在選擇", + "searchBoard": "搜尋開發板", "selectBoard": "選擇開發版", "selectBoardForInfo": "請選擇電路板以取得板子的資訊", "selectPortForInfo": "請選定一個埠,以便能取得板子的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "平台已成功安裝 1[0]:2[1]", - "succesfullyUninstalledPlatform": "平台已成功移除 1[0]:2[1]" + "succesfullyUninstalledPlatform": "平台已成功移除 1[0]:2[1]", + "typeOfPorts": "{0} ports" }, "boardsManager": "開發板管理器", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino 認證" }, "bootloader": { "burnBootloader": "燒錄 Bootloader", @@ -64,17 +69,17 @@ "uploadingCertificates": "上傳證書" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "檢查 Arduino 更新", + "installAll": "安裝所有", + "noUpdates": "沒有可用的最新更新。", + "promptUpdateBoards": "您的部分開發板有可用更新。", + "promptUpdateLibraries": "您的部分函數庫有可用更新。", + "updatingBoards": "更新開發板中...", + "updatingLibraries": "更新函數庫中..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" + "keyboardError": "找不到 'Keyboard',請檢查項目是否包含 '#include '。", + "mouseError": "找不到 'Mouse',請檢查項目是否包含 '#include '。" }, "cloud": { "account": "帳戶", @@ -85,6 +90,7 @@ "donePushing": "完成更改'{0}'。", "embed": "嵌入:", "emptySketchbook": "您的草稿資料夾是空的", + "goToCloud": "Go to Cloud", "learnMore": "了解更多", "link": "連結:", "notYetPulled": "無法更改至雲端。尚未被讀取。", @@ -102,7 +108,7 @@ "pushSketch": "更改草稿", "pushSketchMsg": "這是一個公開草稿,在更改前,請確認所有敏感資訊都定義在arduino_secrets.h中。可以在分享介面設定為私人草稿。", "remote": "遠端", - "remoteSketchbook": "Remote Sketchbook", + "remoteSketchbook": "遠端資料夾", "share": "分享...", "shareSketch": "分享草稿", "showHideRemoveSketchbook": "顯示/隱藏遠端草稿資料夾", @@ -114,32 +120,33 @@ "visitArduinoCloud": "前往Arduino Cloud建立雲端草稿。" }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "所有", + "contributed": "已貢獻", "installManually": "手動安裝", "later": "稍後再說", "noBoardSelected": "沒有選擇開發版", "notConnected": "[未連接]", "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,是否要轉換至新的 `.ino` 擴充?", - "partner": "Partner", + "partner": "合作夥伴", "processing": "資料處理中", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "推薦", + "retired": "不在支援", "selectedOn": "在 1{0}", "serialMonitor": "序列埠監控", - "type": "Type", + "type": "類型", "unknown": "未知", - "updateable": "Updatable" + "updateable": "可更新" }, "compile": { "error": "1{0} 編譯錯誤" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "包含在此包的開發版:", "by": "by", "filterSearch": "過濾你的搜尋 ...", "install": "安裝", + "installed": "安裝", "moreInfo": "更多資訊", "uninstall": "移除安裝", "uninstallMsg": "你要移除 1{0}?", @@ -148,16 +155,27 @@ "contributions": { "addFile": "加入檔案", "fileAdded": "一個檔案加入到 Sketch", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "替代" }, + "core": { + "compilerWarnings": { + "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." + "copyError": "複製錯誤訊息", + "noBoardSelected": "未選擇開發版。請從 工具 > 開發版 中選擇您的開發版" }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "重啟進程", + "start": "開啟進程", + "stop": "關閉進程" }, "debug": { "debugWithMessage": "除錯 - {0}", @@ -176,9 +194,9 @@ "decreaseIndent": "減少縮排", "increaseFontSize": "加大字體", "increaseIndent": "增加縮排", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "nextError": "下一個錯誤", + "previousError": "上一個錯誤", + "revealError": "顯示錯誤" }, "electron": { "couldNotSave": "無法儲存草稿,請複製你未存檔的工作到你偏好的文字編輯器中並重新啟動 IDE 整合開發環境", @@ -216,7 +234,7 @@ "visit": "造訪 Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "檢查 Arduino IDE 最新版本", "closeAndInstallButton": "關閉並安裝。", "closeToInstallNotice": "關閉軟體並安裝更新。", "downloadButton": "下載", @@ -236,12 +254,12 @@ "addZip": "加入 .zip 函式庫 ...", "arduinoLibraries": "Arduino函式庫", "contributedLibraries": "貢獻函式庫", - "dependenciesForLibrary": "與 1{0}:2{1} 函式庫相依", "include": "含括函式庫", - "installAll": "全部安裝", + "installAll": "安裝所有", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "是否安裝所有缺少的附屬程式?", "installOneMissingDependency": "是否安裝缺少的附屬程式?", - "installOnly": "只安裝 1[0]", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "成功安裝 1{0}:2{1} 函式庫", "libraryAlreadyExists": "函式庫已經存在,你要覆寫它嗎?", "manageLibraries": "管理函式庫", @@ -255,31 +273,35 @@ "zipLibrary": "函式庫" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "主題" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "討論", + "dataProcessing": "資料處理", + "dataStorage": "資料存儲", + "deviceControl": "設備管理", + "display": "顯示", + "other": "其它", + "sensors": "傳感器", + "signalInputOutput": "信號輸入/輸出", + "timing": "定時", + "uncategorized": "未分類" }, "libraryType": { - "installed": "Installed" + "installed": "安裝" }, "menu": { - "advanced": "Advanced", + "advanced": "進階設定", "sketch": "草稿", "tools": "工具" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "unableToCloseWebSocket": "無法關閉 websocket", + "unableToConnectToWebSocket": "無法連接到 websocket" + }, + "portProtocol": { + "network": "網路", + "serial": "Serial" }, "preferences": { "additionalManagerURLs": "其他開發版管理器網址", @@ -290,17 +312,17 @@ "automatic": "自動調整", "board.certificates": "可上傳至開發版的證書列表", "browse": "瀏覽", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "接收有關 IDE、板和庫的可用更新的通知。 更改後需要重新啟動 IDE。 默認開啟。", "choose": "選擇", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "啟用對 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。", "compile": "編譯", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "開啟則 IDE 處理多個編譯器錯誤。 默認關閉", + "compile.revealRange": "調整驗證/上傳失敗後編譯器錯誤在編輯器中的顯示方式。 可能的值:'auto':根據需要垂直滾動並顯示一行。 'center':根據需要垂直滾動並顯示垂直居中的線條。 'top':根據需要垂直滾動並顯示靠近視口頂部的一行,針對查看代碼定義進行了優化。 'centerIfOutsideViewport':根據需要垂直滾動,僅當它位於視口之外時才顯示垂直居中的線。 默認為 '{0}'", "compile.verbose": "True則輸出詳細編譯資訊。預設為False", "compile.warnings": "設定gcc警告等級。預設為'None'", "compilerWarnings": "編譯器警告", @@ -308,7 +330,7 @@ "editorQuickSuggestions": "編輯器快速建議", "enterAdditionalURLs": "輸入其他網址,每行一個", "files.inside.sketches": "顯示草稿中的檔案", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateBaseUrl": "下載更新網址。默認為: 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "前往版本釋出頻道獲取更新。 'stable'表示為穩定的版本, 'nightly' 則是最新的開發版本。", "interfaceScale": "介面比例", "invalid.editorFontSize": "無效的編輯器字體大小。它必須是正整數。", @@ -320,6 +342,12 @@ "network": "網路", "newSketchbookLocation": "選取新的草稿資料夾位置", "noProxy": "無代理", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, "showVerbose": "顯示詳細輸出", "sketchbook.location": "草稿資料夾位置", "sketchbook.showAllFiles": "True則顯示所有草稿中的草稿檔案。預設為false。", @@ -349,8 +377,8 @@ "archiveSketch": "儲存草稿", "cantOpen": "命名為\"{0}\"的資料夾已存在。無法開啟草稿。", "close": "你確定要關閉 Sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "組態配置並上傳", + "compile": "編譯中...", + "configureAndUpload": "Configure and Upload", "createdArchive": "已創建文件{0}。", "doneCompiling": "編譯完成", "doneUploading": "上傳完畢", @@ -362,7 +390,7 @@ "openRecent": "開啟最近的", "openSketchInNewWindow": "在新視窗開啟草稿", "saveFolderAs": "另存 Sketch 資料夾", - "saveSketch": "Save your sketch to open it again later.", + "saveSketch": "保存您的項目,以便以後再次打開它。", "saveSketchAs": "另存 Sketch 資料夾", "showFolder": "顯示 Sketch 資料夾", "sketch": "草稿", @@ -377,22 +405,24 @@ "verifyOrCompile": "驗證/編譯" }, "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", - "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." + "answerSurvey": "回覆問卷", + "dismissSurvey": "不要再顯示", + "surveyMessage": "請通過回答這個超簡短的調查來幫助我們改進。 我們重視我們的社群,並希望更好地了解我們的支持者。" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" }, "upload": { "error": "1 [0] 錯誤:2 [1]" }, "userFields": { "cancel": "取消", - "enterField": "Enter {0}", + "enterField": "輸入 {0}", "upload": "上傳" } }, - "cloud": { - "GoToCloud": "前往雲端" - }, "theia": { "core": { "cannotConnectBackend": "無法連接後端", From 4e882d25d95e222b6fdfb4191ee68e5e3d73dee1 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 27 Oct 2022 14:53:36 +0200 Subject: [PATCH 069/384] bump arduino-fwuploader to `2.2.2` (#1584) --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 727c77e08..167755a91 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -162,7 +162,7 @@ "version": "0.28.0" }, "fwuploader": { - "version": "2.2.0" + "version": "2.2.2" }, "clangd": { "version": "14.0.0" From 0d0550974abd26adffd53a9d3036172705dd5177 Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 27 Oct 2022 20:31:53 -0700 Subject: [PATCH 070/384] Bump version metadata post release On every startup, the Arduino IDE checks for new versions of the IDE. If a newer version is available, a notification/dialog is shown offering an update. "Newer" is determined by comparing the version of the user's IDE to the latest available version on the update channel. This comparison is done according to the Semantic Versioning Specification ("SemVer"). In order to facilitate beta testing, builds are generated of the Arduino IDE at the current stage in development. These builds are given an identifying version of the following form: - -snapshot- - builds generated for every push and pull request that modifies relevant files - -nightly- - daily builds of the tip of the default branch In order to cause these builds to be correctly considered "newer" than the release version, the version metadata must be bumped immediately following each release. This will also serve as the metadata bump for the next release in the event that release is a minor release. In case it is instead a minor or major release, the version metadata will need to be updated once more before the release tag is created. --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 167755a91..7d2c198ce 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.0.1", + "version": "2.0.2", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 1e26d5c74..76fdd43a6 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.0.1", + "version": "2.0.2", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "1.25.0", "@theia/terminal": "1.25.0", "@theia/workspace": "1.25.0", - "arduino-ide-extension": "2.0.1" + "arduino-ide-extension": "2.0.2" }, "devDependencies": { "@theia/cli": "1.25.0", diff --git a/package.json b/package.json index 7e31aaf44..db8e39e80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.0.1", + "version": "2.0.2", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From f6275f9f62e66df091ac6e12bfc78d56f36c2380 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 30 May 2022 15:28:33 +0200 Subject: [PATCH 071/384] feat: build IDE2 on darwin arm64 - Use Node.js 16+, - All workflow files use `.yml` instead of `.yaml`, - Use Arduino LS `0.7.2`, - Updated `electron-builder` to `23.3.3`, - Removed unused `conf-node-gyp.sh`, - Removed unused `THEIA_ELECTRON_SKIP_REPLACE_FFMPEG`, and - Aligned `node-gyp@9.3.0`, `electron-rebuild@3.2.9` to Theia. Co-authored-by: per1234 Co-authored-by: Akos Kitta Signed-off-by: Akos Kitta --- .../{arduino-stats.yaml => arduino-stats.yml} | 0 .github/workflows/build.yml | 4 +- .github/workflows/check-i18n-task.yml | 4 +- ...ngelog.yaml => compose-full-changelog.yml} | 2 +- .../{github-stats.yaml => github-stats.yml} | 0 .github/workflows/i18n-nightly-push.yml | 4 +- .github/workflows/i18n-weekly-pull.yml | 4 +- .github/workflows/themes-weekly-pull.yml | 2 +- arduino-ide-extension/package.json | 2 +- arduino-ide-extension/scripts/download-cli.js | 3 + arduino-ide-extension/scripts/download-ls.js | 6 + docs/development.md | 2 +- docs/internal/Arm.md | 6 +- docs/internal/Ubuntu.md | 6 +- electron/build/template-package.json | 9 +- electron/packager/conf-node-gyp.sh | 11 -- electron/packager/config.js | 3 + electron/packager/index.js | 1 - electron/packager/package.json | 2 +- package.json | 7 +- yarn.lock | 155 ++++-------------- 21 files changed, 75 insertions(+), 158 deletions(-) rename .github/workflows/{arduino-stats.yaml => arduino-stats.yml} (100%) rename .github/workflows/{compose-full-changelog.yaml => compose-full-changelog.yml} (98%) rename .github/workflows/{github-stats.yaml => github-stats.yml} (100%) delete mode 100755 electron/packager/conf-node-gyp.sh diff --git a/.github/workflows/arduino-stats.yaml b/.github/workflows/arduino-stats.yml similarity index 100% rename from .github/workflows/arduino-stats.yaml rename to .github/workflows/arduino-stats.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e88645443..2cc276a5e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,10 +57,10 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Install Node.js 14.x + - name: Install Node.js 16.x uses: actions/setup-node@v1 with: - node-version: '14.x' + node-version: '16.x' registry-url: 'https://registry.npmjs.org' - name: Install Python 3.x diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 36a290ed9..0d0bc8478 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -29,10 +29,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - name: Install Node.js 14.x + - name: Install Node.js 16.x uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: '16.x' registry-url: 'https://registry.npmjs.org' - name: Install Go diff --git a/.github/workflows/compose-full-changelog.yaml b/.github/workflows/compose-full-changelog.yml similarity index 98% rename from .github/workflows/compose-full-changelog.yaml rename to .github/workflows/compose-full-changelog.yml index b3a4ecda0..5ea9bc4f7 100644 --- a/.github/workflows/compose-full-changelog.yaml +++ b/.github/workflows/compose-full-changelog.yml @@ -8,7 +8,7 @@ on: env: CHANGELOG_ARTIFACTS: changelog # See: https://github.com/actions/setup-node/#readme - NODE_VERSION: 14.x + NODE_VERSION: 16.x jobs: create-changelog: diff --git a/.github/workflows/github-stats.yaml b/.github/workflows/github-stats.yml similarity index 100% rename from .github/workflows/github-stats.yaml rename to .github/workflows/github-stats.yml diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 53e552674..80b7ee190 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -16,10 +16,10 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Install Node.js 14.x + - name: Install Node.js 16.x uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: '16.x' registry-url: 'https://registry.npmjs.org' - name: Install Go diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index b91bc2bca..12b049fd9 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -16,10 +16,10 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Install Node.js 14.x + - name: Install Node.js 16.x uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: '16.x' registry-url: 'https://registry.npmjs.org' - name: Install Go diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 41c159ea7..dff11a145 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -9,7 +9,7 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml GO_VERSION: "1.17" - NODE_VERSION: 14.x + NODE_VERSION: 16.x jobs: pull-from-jsonbin: diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 7d2c198ce..2f86e300e 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -168,7 +168,7 @@ "version": "14.0.0" }, "languageServer": { - "version": "0.7.1" + "version": "0.7.2" } } } diff --git a/arduino-ide-extension/scripts/download-cli.js b/arduino-ide-extension/scripts/download-cli.js index 531e22a50..564f80e6a 100755 --- a/arduino-ide-extension/scripts/download-cli.js +++ b/arduino-ide-extension/scripts/download-cli.js @@ -42,6 +42,9 @@ const suffix = (() => { switch (platform) { case 'darwin': + if (arch === 'arm64') { + return 'macOS_ARM64.tar.gz'; + } return 'macOS_64bit.tar.gz'; case 'win32': return 'Windows_64bit.zip'; diff --git a/arduino-ide-extension/scripts/download-ls.js b/arduino-ide-extension/scripts/download-ls.js index a67c65929..991dfb07d 100755 --- a/arduino-ide-extension/scripts/download-ls.js +++ b/arduino-ide-extension/scripts/download-ls.js @@ -76,6 +76,12 @@ lsSuffix = 'macOS_64bit.tar.gz'; clangdSuffix = 'macOS_64bit'; break; + case 'darwin-arm64': + clangdExecutablePath = path.join(build, 'clangd'); + clangFormatExecutablePath = path.join(build, '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'); diff --git a/docs/development.md b/docs/development.md index b3146acae..06ade68ce 100644 --- a/docs/development.md +++ b/docs/development.md @@ -54,7 +54,7 @@ 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 14 must be used instead of the version 12 recommended at the link above. +> **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 diff --git a/docs/internal/Arm.md b/docs/internal/Arm.md index f6f1d52aa..c36e16fb3 100644 --- a/docs/internal/Arm.md +++ b/docs/internal/Arm.md @@ -2,14 +2,14 @@ Building the Pro IDE on Linux `armv7l` (aka `armhf`) and `aarch64` (aka `arm64`): -1. Install Node.js 14.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script): +1. Install Node.js 16.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script): ``` wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash ``` Restart your shell then: ``` - nvm install 14 - nvm use 14 + nvm install 16 + nvm use 16 ``` Verify: ``` diff --git a/docs/internal/Ubuntu.md b/docs/internal/Ubuntu.md index 5c67b516a..de556410c 100644 --- a/docs/internal/Ubuntu.md +++ b/docs/internal/Ubuntu.md @@ -18,9 +18,9 @@ sudo apt update \ build-essential \ && wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash \ && source ~/.bashrc \ -&& nvm install 14 \ -&& nvm use 14 \ -&& nvm alias default 14 \ +&& nvm install 16 \ +&& nvm use 16 \ +&& nvm alias default 16 \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \ && sudo apt update && sudo apt install --no-install-recommends yarn \ diff --git a/electron/build/template-package.json b/electron/build/template-package.json index f934a176f..4a1af4030 100644 --- a/electron/build/template-package.json +++ b/electron/build/template-package.json @@ -11,7 +11,7 @@ "devDependencies": { "@theia/cli": "1.25.0", "cross-env": "^7.0.2", - "electron-builder": "23.0.2", + "electron-builder": "23.3.3", "electron-notarize": "^1.1.1", "is-ci": "^2.0.0", "ncp": "^2.0.0", @@ -26,7 +26,7 @@ "patch": "ncp ./patch/backend/main.js ./src-gen/backend/main.js" }, "engines": { - "node": ">=14.0.0 <15" + "node": ">=16.0.0 <17" }, "repository": { "type": "git", @@ -89,7 +89,10 @@ "hardenedRuntime": true, "gatekeeperAssess": false, "entitlements": "resources/entitlements.mac.plist", - "entitlementsInherit": "resources/entitlements.mac.plist" + "entitlementsInherit": "resources/entitlements.mac.plist", + "target": { + "target": "default" + } }, "linux": { "target": [ diff --git a/electron/packager/conf-node-gyp.sh b/electron/packager/conf-node-gyp.sh deleted file mode 100755 index 994c3cd40..000000000 --- a/electron/packager/conf-node-gyp.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -npm install --global node-gyp@7.0.0 - -if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]; then - npm config set node_gyp "`npm prefix -g`\node_modules\node-gyp\bin\node-gyp.js" -else - npm config set node_gyp "`npm prefix -g`/lib/node_modules/node-gyp/bin/node-gyp.js" -fi - -echo "npm config get node_gyp -> `npm config get node_gyp`" diff --git a/electron/packager/config.js b/electron/packager/config.js index 44af9f323..d460b9c82 100644 --- a/electron/packager/config.js +++ b/electron/packager/config.js @@ -27,6 +27,9 @@ function artifactName() { 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': { diff --git a/electron/packager/index.js b/electron/packager/index.js index d769fecc0..95223dd13 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -6,7 +6,6 @@ const shell = require('shelljs'); const glob = require('glob'); const isCI = require('is-ci'); - shell.env.THEIA_ELECTRON_SKIP_REPLACE_FFMPEG = '1'; // Do not run the ffmpeg validation for the packager. // Note, this will crash on PI if the available memory is less than desired heap size. // https://github.com/shelljs/shelljs/issues/1024#issuecomment-1001552543 shell.env.NODE_OPTIONS = '--max_old_space_size=4096'; // Increase heap size for the CI diff --git a/electron/packager/package.json b/electron/packager/package.json index e1f6c72df..3cf4e4932 100644 --- a/electron/packager/package.json +++ b/electron/packager/package.json @@ -33,7 +33,7 @@ "yargs": "^12.0.5" }, "engines": { - "node": ">=14.0.0 <15" + "node": ">=16.0.0 <17" }, "mocha": { "reporter": "spec", diff --git a/package.json b/package.json index db8e39e80..e88494256 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "license": "AGPL-3.0-or-later", "private": true, "engines": { - "node": ">=14.0.0 <15" + "node": ">=16.0.0 <17" }, "devDependencies": { "@theia/cli": "1.25.0", @@ -26,7 +26,7 @@ "ignore-styles": "^5.0.1", "lerna": "^3.20.2", "lint-staged": "^11.0.0", - "node-gyp": "^9.0.0", + "node-gyp": "^9.3.0", "prettier": "^2.3.1", "reflect-metadata": "^0.1.10", "rimraf": "^2.6.1", @@ -37,7 +37,8 @@ "xhr2": "^0.2.1" }, "resolutions": { - "@types/react": "16.14.25" + "@types/react": "16.14.25", + "electron-rebuild": "3.2.9" }, "scripts": { "prepare": "lerna run prepare && yarn download:plugins", diff --git a/yarn.lock b/yarn.lock index 3a7fcb5ba..54c90a4aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1100,7 +1100,7 @@ unique-filename "^1.1.1" which "^1.3.1" -"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": +"@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== @@ -1919,14 +1919,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - "@npmcli/fs@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109" @@ -1935,14 +1927,6 @@ "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - "@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" @@ -2930,11 +2914,6 @@ dependencies: tippy.js "^6.3.1" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3811,7 +3790,7 @@ abab@^2.0.0, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -3900,7 +3879,7 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: +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== @@ -4934,30 +4913,6 @@ cacache@^12.0.0, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - cacache@^16.1.0: version "16.1.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.0.tgz#87a6bae558a511c9cb2a13768073e240ca76153a" @@ -6307,7 +6262,7 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detect-libc@^2.0.0: +detect-libc@^2.0.0, detect-libc@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== @@ -6488,21 +6443,21 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-rebuild@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.7.tgz#0f56c1cc99a6fec0a5b990532283c2a8c838c19b" - integrity sha512-WvaW1EgRinDQ61khHFZfx30rkPQG5ItaOT0wrI7iJv9A3SbghriQGfZQfHZs25fWLBe6/vkv05LOqg6aDw6Wzw== +electron-rebuild@3.2.9, electron-rebuild@^3.2.7: + version "3.2.9" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.9.tgz#ea372be15f591f8d6d978ee9bca6526dadbcf20f" + integrity sha512-FkEZNFViUem3P0RLYbZkUjC8LUFIK+wKq09GHoOITSJjfDAVQv964hwaNseTTWt58sITQX3/5fHNYcTefqaCWw== dependencies: "@malept/cross-spawn-promise" "^2.0.0" chalk "^4.0.0" debug "^4.1.1" - detect-libc "^1.0.3" + detect-libc "^2.0.1" fs-extra "^10.0.0" got "^11.7.0" lzma-native "^8.0.5" node-abi "^3.0.0" node-api-version "^0.1.4" - node-gyp "^8.4.0" + node-gyp "^9.0.0" ora "^5.1.0" semver "^7.3.5" tar "^6.0.5" @@ -6564,7 +6519,7 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11, encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -8430,15 +8385,6 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -10085,28 +10031,6 @@ make-fetch-happen@^5.0.0: socks-proxy-agent "^4.0.0" ssri "^6.0.0" -make-fetch-happen@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -10638,17 +10562,6 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - minipass-fetch@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8" @@ -10667,7 +10580,7 @@ minipass-flush@^1.0.5: dependencies: minipass "^3.0.0" -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: +minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== @@ -10689,7 +10602,7 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== @@ -10703,7 +10616,7 @@ minizlib@^1.3.3: dependencies: minipass "^2.9.0" -minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -10972,7 +10885,7 @@ ncp@^2.0.0: resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= -negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -11100,15 +11013,15 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" -node-gyp@^8.4.0: - version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" - integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== +node-gyp@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089" + integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw== dependencies: env-paths "^2.2.0" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" + make-fetch-happen "^10.0.3" nopt "^5.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -11116,16 +11029,16 @@ node-gyp@^8.4.0: tar "^6.1.2" which "^2.0.2" -node-gyp@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089" - integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw== +node-gyp@^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== dependencies: env-paths "^2.2.0" glob "^7.1.4" graceful-fs "^4.2.6" make-fetch-happen "^10.0.3" - nopt "^5.0.0" + nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" semver "^7.3.5" @@ -11169,6 +11082,13 @@ nopt@^5.0.0: dependencies: abbrev "1" +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -13682,7 +13602,7 @@ socks-proxy-agent@^4.0.0: agent-base "~4.2.1" socks "~2.3.2" -socks-proxy-agent@^6.0.0, socks-proxy-agent@^6.1.1: +socks-proxy-agent@^6.1.1: version "6.2.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz#f6b5229cc0cbd6f2f202d9695f09d871e951c85e" integrity sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ== @@ -13891,13 +13811,6 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - ssri@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.0.tgz#70ad90e339eb910f1a7ff1dcf4afc268326c4547" @@ -14345,7 +14258,7 @@ tar@^4.0.0, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: safe-buffer "^5.2.1" yallist "^3.1.1" -tar@^6.0.2, tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: +tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== From 7d91f2d8cb53a18a1fe88ced49ec5c824e242b6f Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 30 Oct 2022 17:07:39 -0700 Subject: [PATCH 072/384] Configure Dependabot to check for outdated actions used in workflows Dependabot will periodically check the versions of all actions used in the repository's workflows. If any are found to be outdated, it will submit a pull request to update them. NOTE: Dependabot's PRs will occasionally propose to pin to the patch version of the action (e.g., updating `uses: foo/bar@v1` to `uses: foo/bar@v2.3.4`). When the action author has provided a major version ref, use that instead (e.g., `uses: foo/bar@v2`). Dependabot will automatically close its PR once the workflow has been updated. More information: https://docs.github.com/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot --- .github/dependabot.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..f640b0391 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# See: https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#about-the-dependabotyml-file +version: 2 + +updates: + # Configure check for outdated GitHub Actions actions in workflows. + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/dependabot/README.md + # See: https://docs.github.com/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot + - package-ecosystem: github-actions + directory: / # Check the repository's workflows under /.github/workflows/ + assignees: + - per1234 + schedule: + interval: daily + labels: + - "topic: infrastructure" From c29452a8581cdf5e798ca8077c157f77da39c903 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 20:56:49 +0000 Subject: [PATCH 073/384] Bump carlosperate/download-file-action from 1 to 2 Bumps [carlosperate/download-file-action](https://github.com/carlosperate/download-file-action) from 1 to 2. - [Release notes](https://github.com/carlosperate/download-file-action/releases) - [Commits](https://github.com/carlosperate/download-file-action/compare/v1...v2) --- updated-dependencies: - dependency-name: carlosperate/download-file-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sync-labels.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 0273232ae..12334f0f6 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -31,7 +31,7 @@ jobs: - name: Download JSON schema for labels configuration file id: download-schema - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json location: ${{ runner.temp }}/label-configuration-schema @@ -66,7 +66,7 @@ jobs: steps: - name: Download - uses: carlosperate/download-file-action@v1 + uses: carlosperate/download-file-action@v2 with: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} From 9cd03bec462695eefa64bf742acc5d469b441659 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 30 Oct 2022 16:31:23 -0700 Subject: [PATCH 074/384] Remove broken download stats workflow The "arduino-stats" GitHub Actions workflow was designed to periodically gather download statistics from Arduino CDN and push results to Datadog. The recorded stats from the identical system in the Arduino CLI repository showed a periodic decrease in total download count. Since this is patently impossible, it is clear that something is wrong with the system and that the recorded data is not trustworthy. An investigation into the problem was never done. On 2022-03-14, the runs of the "arduino-stats" GitHub Actions workflow began to fail. Because there had not been any relevant change in the repository between the last successful run and the first failing run, it seems that some external change caused the breakage. The workflow also uses deprecated Node.js 12 runtime-based actions and set-output workflow command, which currently results in warnings printed to the workflow run summary page, but will eventually cause the complete breakage of the workflow. Since the workflow was not ever working successfully and the lack of an investigation about that indicates that the stats are not of immediate importance, the best course of action is to simply remove the broken infrastructure from the repository rather than investing time into fixing something that isn't being used anyway. --- .github/tools/fetch_athena_stats.py | 131 ---------------------------- .github/workflows/arduino-stats.yml | 57 ------------ 2 files changed, 188 deletions(-) delete mode 100644 .github/tools/fetch_athena_stats.py delete mode 100644 .github/workflows/arduino-stats.yml diff --git a/.github/tools/fetch_athena_stats.py b/.github/tools/fetch_athena_stats.py deleted file mode 100644 index 1f3140359..000000000 --- a/.github/tools/fetch_athena_stats.py +++ /dev/null @@ -1,131 +0,0 @@ -import boto3 -import semver -import os -import logging -import uuid -import time - - -# logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) -log = logging.getLogger() -logging.getLogger("boto3").setLevel(logging.CRITICAL) -logging.getLogger("botocore").setLevel(logging.CRITICAL) -logging.getLogger("urllib3").setLevel(logging.CRITICAL) - - -def execute(client, statement, dest_s3_output_location): - log.info("execute query: {} dumping in {}".format(statement, dest_s3_output_location)) - result = client.start_query_execution( - QueryString=statement, - ClientRequestToken=str(uuid.uuid4()), - ResultConfiguration={ - "OutputLocation": dest_s3_output_location, - }, - ) - execution_id = result["QueryExecutionId"] - log.info("wait for query {} completion".format(execution_id)) - wait_for_query_execution_completion(client, execution_id) - log.info("operation successful") - return execution_id - - -def wait_for_query_execution_completion(client, query_execution_id): - query_ended = False - while not query_ended: - query_execution = client.get_query_execution(QueryExecutionId=query_execution_id) - state = query_execution["QueryExecution"]["Status"]["State"] - if state == "SUCCEEDED": - query_ended = True - elif state in ["FAILED", "CANCELLED"]: - raise BaseException( - "query failed or canceled: {}".format(query_execution["QueryExecution"]["Status"]["StateChangeReason"]) - ) - else: - time.sleep(1) - - -def valid(key): - split = key.split("_") - if len(split) < 1: - return False - try: - semver.parse(split[0]) - except ValueError: - return False - return True - - -def get_results(client, execution_id): - results_paginator = client.get_paginator("get_query_results") - results_iter = results_paginator.paginate(QueryExecutionId=execution_id, PaginationConfig={"PageSize": 1000}) - res = {} - for results_page in results_iter: - for row in results_page["ResultSet"]["Rows"][1:]: - # Loop through the JSON objects - key = row["Data"][0]["VarCharValue"] - if valid(key): - res[key] = row["Data"][1]["VarCharValue"] - - return res - - -def convert_data(data): - result = [] - for key, value in data.items(): - # 0.18.0_macOS_64bit.tar.gz - split_key = key.split("_") - if len(split_key) != 3: - continue - (version, os_version, arch) = split_key - arch_split = arch.split(".") - if len(arch_split) < 1: - continue - arch = arch_split[0] - if len(arch) > 10: - # This can't be an architecture really. - # It's an ugly solution but works for now so deal with it. - continue - repo = os.environ["GITHUB_REPOSITORY"].split("/")[1] - result.append( - { - "type": "gauge", - "name": "arduino.downloads.total", - "value": value, - "host": os.environ["GITHUB_REPOSITORY"], - "tags": [ - f"version:{version}", - f"os:{os_version}", - f"arch:{arch}", - "cdn:downloads.arduino.cc", - f"project:{repo}", - ], - } - ) - - return result - - -if __name__ == "__main__": - DEST_S3_OUTPUT = os.environ["AWS_ATHENA_OUTPUT_LOCATION"] - AWS_ATHENA_SOURCE_TABLE = os.environ["AWS_ATHENA_SOURCE_TABLE"] - - session = boto3.session.Session(region_name="us-east-1") - athena_client = session.client("athena") - - # Load all partitions before querying downloads - execute(athena_client, f"MSCK REPAIR TABLE {AWS_ATHENA_SOURCE_TABLE};", DEST_S3_OUTPUT) - - query = f"""SELECT replace(json_extract_scalar(url_decode(url_decode(querystring)), -'$.data.url'), 'https://downloads.arduino.cc/arduino-ide/arduino-ide_', '') -AS flavor, count(json_extract(url_decode(url_decode(querystring)),'$')) AS gauge -FROM {AWS_ATHENA_SOURCE_TABLE} -WHERE json_extract_scalar(url_decode(url_decode(querystring)),'$.data.url') -LIKE 'https://downloads.arduino.cc/arduino-ide/arduino-ide_%' -AND json_extract_scalar(url_decode(url_decode(querystring)),'$.data.url') -NOT LIKE '%latest%' -- exclude latest redirect -group by 1 ;""" - exec_id = execute(athena_client, query, DEST_S3_OUTPUT) - results = get_results(athena_client, exec_id) - result_json = convert_data(results) - - print(f"::set-output name=result::{result_json}") diff --git a/.github/workflows/arduino-stats.yml b/.github/workflows/arduino-stats.yml deleted file mode 100644 index 167ab57a2..000000000 --- a/.github/workflows/arduino-stats.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: arduino-stats - -on: - schedule: - # run every day at 07:00 AM, 03:00 PM and 11:00 PM - - cron: "0 7,15,23 * * *" - workflow_dispatch: - repository_dispatch: - -jobs: - push-stats: - # This workflow is only of value to the arduino/arduino-ide repository and - # would always fail in forks - if: github.repository == 'arduino/arduino-ide' - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - - name: Fetch downloads count form Arduino CDN using AWS Athena - id: fetch - env: - AWS_ACCESS_KEY_ID: ${{ secrets.STATS_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.STATS_AWS_SECRET_ACCESS_KEY }} - AWS_ATHENA_SOURCE_TABLE: ${{ secrets.STATS_AWS_ATHENA_SOURCE_TABLE }} - AWS_ATHENA_OUTPUT_LOCATION: ${{ secrets.STATS_AWS_ATHENA_OUTPUT_LOCATION }} - GITHUB_REPOSITORY: ${{ github.repository }} - run: | - pip install boto3 semver - python .github/tools/fetch_athena_stats.py - - - name: Send metrics - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - # Metrics input expects YAML but JSON will work just right. - metrics: ${{steps.fetch.outputs.result}} - - - name: Report failure - if: failure() - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - events: | - - title: "Arduino IDE stats failing" - text: "Stats collection failed" - alert_type: "error" - host: ${{ github.repository }} - tags: - - "project:arduino-ide" - - "cdn:downloads.arduino.cc" - - "workflow:${{ github.workflow }}" From dbd52e2f34a7228222c6fee9ca079eab9d82af73 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 30 Oct 2022 16:39:33 -0700 Subject: [PATCH 075/384] Remove unused GitHub release download stats workflow The "github-stats" GitHub Actions workflow periodically gathers GitHub release asset download statistics for Arduino CLI and pushes the results to Datadog. There are no known problems with this workflow. However, the companion "arduino-stats" workflow that did the same for the downloads of Arduino IDE from downloads.arduino.cc was broken and thus removed from the repository. The GitHub stats are not very valuable on their own as they only provide an unknown fraction of the total downloads of Arduino IDE. They have also not ended up being used. The workflow also uses deprecated Node.js 12 runtime, which currently results in warnings printed to the workflow run summary page, but will eventually cause the complete breakage of the workflow. Since it doesn't provide any value and represents a maintenance burden, the workflow is hereby removed from the repository. --- .github/workflows/github-stats.yml | 96 ------------------------------ 1 file changed, 96 deletions(-) delete mode 100644 .github/workflows/github-stats.yml diff --git a/.github/workflows/github-stats.yml b/.github/workflows/github-stats.yml deleted file mode 100644 index c7c8a98af..000000000 --- a/.github/workflows/github-stats.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: github-stats - -on: - schedule: - # run every 30 minutes - - cron: "*/30 * * * *" - workflow_dispatch: - repository_dispatch: - -jobs: - push-stats: - # This workflow is only of value to the arduino/arduino-ide repository and - # would always fail in forks - if: github.repository == 'arduino/arduino-ide' - runs-on: ubuntu-latest - - steps: - - name: Fetch downloads count - id: fetch - uses: actions/github-script@v4 - with: - github-token: ${{github.token}} - script: | - let metrics = [] - - // Get a list of releases - const opts = github.repos.listReleases.endpoint.merge({ - ...context.repo - }) - const releases = await github.paginate(opts) - - // Get download stats for every release - for (const rel of releases) { - // Names for assets are like `arduino-ide_2.0.0-beta.12_Linux_64bit.zip`, - // we'll use this later to split the asset file name more easily - const baseName = `arduino-ide_${rel.name}_` - - // Get a list of assets for this release - const opts = github.repos.listReleaseAssets.endpoint.merge({ - ...context.repo, - release_id: rel.id - }) - const assets = await github.paginate(opts) - - for (const asset of assets) { - // Ignore files that are not arduino-ide packages - if (!asset.name.startsWith(baseName)) { - continue - } - - // Strip the base and remove file extension to get `Linux_32bit` - systemArch = asset.name.replace(baseName, "").split(".")[0].split("_") - - // Add a metric object to the list of gathered metrics - metrics.push({ - "type": "gauge", - "name": "arduino.downloads.total", - "value": asset.download_count, - "host": "${{ github.repository }}", - "tags": [ - `version:${rel.name}`, - `os:${systemArch[0]}`, - `arch:${systemArch[1]}`, - "cdn:github.com", - "project:arduino-ide" - ] - }) - } - } - - // The action will put whatever we return from this function in - // `outputs.result`, JSON encoded. So we just return the array - // of objects and GitHub will do the rest. - return metrics - - - name: Send metrics - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - # Metrics input expects YAML but JSON will work just right. - metrics: ${{steps.fetch.outputs.result}} - - - name: Report failure - if: failure() - uses: masci/datadog@v1 - with: - api-key: ${{ secrets.DD_API_KEY }} - events: | - - title: "Arduino IDE stats failing" - text: "Stats collection failed" - alert_type: "error" - host: ${{ github.repository }} - tags: - - "project:arduino-ide" - - "cdn:github.com" - - "workflow:${{ github.workflow }}" From cc310bf1a55b548b61e83c91f58943c3a512dfe0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 20:56:58 +0000 Subject: [PATCH 076/384] Bump actions/download-artifact from 2 to 3 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 6 +++--- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cc276a5e..6887cc1ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -140,7 +140,7 @@ jobs: steps: - name: Download job transfer artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} @@ -199,7 +199,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} @@ -220,7 +220,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 12334f0f6..1ed25b5e9 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -109,7 +109,7 @@ jobs: uses: actions/checkout@v2 - name: Download configuration files artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} path: ${{ env.CONFIGURATIONS_FOLDER }} From 260227e79a05fefeb87ba1400c14215b358cc20c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 20:57:03 +0000 Subject: [PATCH 077/384] Bump peter-evans/create-pull-request from 3 to 4 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3 to 4. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v3...v4) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/i18n-weekly-pull.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 12b049fd9..8238cd00b 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -45,7 +45,7 @@ jobs: TRANSIFEX_API_KEY: ${{ secrets.TRANSIFEX_API_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@v4 with: commit-message: Updated translation files title: Update translation files From 8bfb140e7cd0e64b2cdd9765ef0bff4b0081627a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 21:14:19 +0000 Subject: [PATCH 078/384] Bump actions/setup-python from 2 to 4 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 2 to 4. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v2...v4) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6887cc1ff..4d2733bbe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,7 +64,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install Python 3.x - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: '3.x' From 60df322f0994e9b49a1ff0877d5e36d4e4370db8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 22:31:29 +0000 Subject: [PATCH 079/384] Bump actions/setup-node from 1 to 3 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 1 to 3. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v1...v3) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4d2733bbe..2134c2472 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -58,7 +58,7 @@ jobs: uses: actions/checkout@v2 - name: Install Node.js 16.x - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: '16.x' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 0d0bc8478..5a9c377d8 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@v2 - name: Install Node.js 16.x - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: '16.x' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 80b7ee190..af90fcc8c 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v2 - name: Install Node.js 16.x - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: '16.x' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 8238cd00b..210e708cf 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v2 - name: Install Node.js 16.x - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: '16.x' registry-url: 'https://registry.npmjs.org' From 8454c625f7af5f241fb98c7003e023e0b6147c4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 22:31:34 +0000 Subject: [PATCH 080/384] Bump geekyeggo/delete-artifact from 1 to 2 Bumps [geekyeggo/delete-artifact](https://github.com/geekyeggo/delete-artifact) from 1 to 2. - [Release notes](https://github.com/geekyeggo/delete-artifact/releases) - [Commits](https://github.com/geekyeggo/delete-artifact/compare/v1...v2) --- updated-dependencies: - dependency-name: geekyeggo/delete-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2134c2472..27b49d6b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -263,6 +263,6 @@ jobs: steps: - name: Remove unneeded job transfer artifact - uses: geekyeggo/delete-artifact@v1 + uses: geekyeggo/delete-artifact@v2 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 1ed25b5e9..bcd36238f 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -115,7 +115,7 @@ jobs: path: ${{ env.CONFIGURATIONS_FOLDER }} - name: Remove unneeded artifact - uses: geekyeggo/delete-artifact@v1 + uses: geekyeggo/delete-artifact@v2 with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} From 8fed08003ea14efb9b8e31434fd8d82f21c5613a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 22:31:32 +0000 Subject: [PATCH 081/384] Bump actions/upload-artifact from 2 to 3 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 6 +++--- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 27b49d6b0..190b12950 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -109,7 +109,7 @@ jobs: yarn --cwd ./electron/packager/ package - name: Upload [GitHub Actions] - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: electron/build/dist/build-artifacts/ @@ -146,7 +146,7 @@ jobs: path: ${{ env.JOB_TRANSFER_ARTIFACT }} - name: Upload tester build artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ matrix.artifact.name }} path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} @@ -188,7 +188,7 @@ jobs: - name: Upload Changelog [GitHub Actions] if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: CHANGELOG.txt diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index bcd36238f..8f9cc1dc5 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -71,7 +71,7 @@ jobs: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} - name: Pass configuration files to next job via workflow artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: path: | *.yaml From ddec64c4a5b1be40918f8b648a88c4ec13f005f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 22:31:40 +0000 Subject: [PATCH 082/384] Bump svenstaro/upload-release-action from 2.2.0 to 2.3.0 Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.2.0 to 2.3.0. - [Release notes](https://github.com/svenstaro/upload-release-action/releases) - [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenstaro/upload-release-action/compare/2.2.0...2.3.0) --- updated-dependencies: - dependency-name: svenstaro/upload-release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 190b12950..1ec985f76 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -231,7 +231,7 @@ jobs: echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/} - name: Publish Release [GitHub] - uses: svenstaro/upload-release-action@2.2.0 + uses: svenstaro/upload-release-action@2.3.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} From b998d355246a075180e76ec0a459d97c1f81e88b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 23:04:28 +0000 Subject: [PATCH 083/384] Bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 4 ++-- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/compose-full-changelog.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/sync-labels.yml | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1ec985f76..45bb145f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,7 +55,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Node.js 16.x uses: actions/setup-node@v3 @@ -158,7 +158,7 @@ jobs: BODY: ${{ steps.changelog.outputs.BODY }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 # To fetch all history for all branches and tags. diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 5a9c377d8..45ab9bbf9 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Node.js 16.x uses: actions/setup-node@v3 diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 5ea9bc4f7..5f6bd8e1b 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index af90fcc8c..dceb6df0a 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Node.js 16.x uses: actions/setup-node@v3 diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 210e708cf..31d4ef225 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install Node.js 16.x uses: actions/setup-node@v3 diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 8f9cc1dc5..70085bdef 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Download JSON schema for labels configuration file id: download-schema @@ -106,7 +106,7 @@ jobs: echo "::set-output name=flag::--dry-run" - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Download configuration files artifact uses: actions/download-artifact@v3 From 8a85b5c3d89f8ab2210279910cd3cb5606dc7291 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 30 Oct 2022 17:01:04 -0700 Subject: [PATCH 084/384] Migrate workflows from deprecated `set-output` commands GitHub Actions provides the capability for workflow authors to use the capabilities of the GitHub Actions ToolKit package directly in the `run` keys of workflows via "workflow commands". One such command is `set-output`, which allows data to be passed out of a workflow step as an output. It has been determined that this command has potential to be a security risk in some applications. For this reason, GitHub has deprecated the command and a warning of this is shown in the workflow run summary page of any workflow using it: The `set-output` command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ The identical capability is now provided in a safer form via the GitHub Actions "environment files" system. Migrating the use of the deprecated workflow commands to use the `GITHUB_OUTPUT` environment file instead fixes any potential vulnerabilities in the workflows, resolves the warnings, and avoids the eventual complete breakage of the workflows that would result from GitHub's planned removal of the `set-output` workflow command 2023-05-31. --- .github/workflows/build.yml | 4 ++-- .github/workflows/check-certificates.yml | 2 +- .github/workflows/compose-full-changelog.yml | 2 +- .github/workflows/sync-labels.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45bb145f1..5a185a1ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -183,7 +183,7 @@ jobs: OUTPUT_SAFE_BODY="${BODY//'%'/'%25'}" OUTPUT_SAFE_BODY="${OUTPUT_SAFE_BODY//$'\n'/'%0A'}" OUTPUT_SAFE_BODY="${OUTPUT_SAFE_BODY//$'\r'/'%0D'}" - echo "::set-output name=BODY::$OUTPUT_SAFE_BODY" + echo "BODY=$OUTPUT_SAFE_BODY" >> $GITHUB_OUTPUT echo "$BODY" > CHANGELOG.txt - name: Upload Changelog [GitHub Actions] @@ -228,7 +228,7 @@ jobs: - name: Get Tag id: tag_name run: | - echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/} + echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] uses: svenstaro/upload-release-action@2.3.0 diff --git a/.github/workflows/check-certificates.yml b/.github/workflows/check-certificates.yml index 27e922764..6a8ac5c80 100644 --- a/.github/workflows/check-certificates.yml +++ b/.github/workflows/check-certificates.yml @@ -108,7 +108,7 @@ jobs: echo "Certificate expiration date: $EXPIRATION_DATE" echo "Days remaining before expiration: $DAYS_BEFORE_EXPIRATION" - echo "::set-output name=days::$DAYS_BEFORE_EXPIRATION" + echo "days=$DAYS_BEFORE_EXPIRATION" >> $GITHUB_OUTPUT - name: Check if expiration notification period has been reached id: check-expiration diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 5f6bd8e1b..f45e7bdff 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -27,7 +27,7 @@ jobs: - name: Get Tag id: tag_name run: | - echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/} + echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Create full changelog id: full-changelog diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 70085bdef..6f9c91a91 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -103,7 +103,7 @@ jobs: run: | # Use of this flag in the github-label-sync command will cause it to only check the validity of the # configuration. - echo "::set-output name=flag::--dry-run" + echo "flag=--dry-run" >> $GITHUB_OUTPUT - name: Checkout repository uses: actions/checkout@v3 From 3a7054777089243174cf3cf8df89716e15e14de1 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 3 Nov 2022 17:58:43 +0100 Subject: [PATCH 085/384] fix: do not trim stdout of `clang-format` process Otherwise, it always causes a _no newline at the end of file_ problem. Closes #1487 Signed-off-by: Akos Kitta --- arduino-ide-extension/src/node/exec-util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/node/exec-util.ts b/arduino-ide-extension/src/node/exec-util.ts index 6fa9aa92c..76ba08aed 100644 --- a/arduino-ide-extension/src/node/exec-util.ts +++ b/arduino-ide-extension/src/node/exec-util.ts @@ -62,7 +62,7 @@ export function spawnCommand( }); cp.on('exit', (code, signal) => { if (code === 0) { - const result = Buffer.concat(outBuffers).toString('utf8').trim(); + const result = Buffer.concat(outBuffers).toString('utf8'); resolve(result); return; } From 6984c52b927260e13e23ae6eeb6f0b7488f7e12d Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:11:35 +0100 Subject: [PATCH 086/384] fix: Handle gracefully when trying to detect invalid sketch name error and folder is missing on filesystem (#1616) - feat: generalized Node.js error handling - Gracefully handle when the sketch folder has been deleted - feat: spare detecting invalid sketch name error - The invalid sketch name detection requires at least one extra FS access. Do not try to detect the invalid sketch name error, but use the original `NotFound` from the CLI. - fix: typo Closes #1596 Signed-off-by: Akos Kitta --- .../theia/electron-main-application.ts | 5 +- .../src/node/arduino-daemon-impl.ts | 3 +- .../src/node/config-service-impl.ts | 3 +- .../src/node/sketches-service-impl.ts | 59 +++++++++++-------- .../src/node/utils/errors.ts | 34 +++++++++++ scripts/i18n/transifex-pull.js | 2 +- 6 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 arduino-ide-extension/src/node/utils/errors.ts 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 335899d70..61bb26cc4 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 @@ -28,6 +28,7 @@ import { SHOW_PLOTTER_WINDOW, } from '../../common/ipc-communication'; import isValidPath = require('is-valid-path'); +import { ErrnoException } from '../../node/utils/errors'; app.commandLine.appendSwitch('disable-http-cache'); @@ -172,7 +173,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { try { stats = await fs.stat(path); } catch (err) { - if ('code' in err && err.code === 'ENOENT') { + if (ErrnoException.isENOENT(err)) { return undefined; } throw err; @@ -215,7 +216,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { const resolved = await fs.realpath(resolve(cwd, maybePath)); return resolved; } catch (err) { - if ('code' in err && err.code === 'ENOENT') { + if (ErrnoException.isENOENT(err)) { return undefined; } throw err; diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 4a3ad882c..d4b345c4e 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -16,6 +16,7 @@ import { BackendApplicationContribution } from '@theia/core/lib/node/backend-app import { ArduinoDaemon, NotificationServiceServer } from '../common/protocol'; import { CLI_CONFIG } from './cli-config'; import { getExecPath, spawnCommand } from './exec-util'; +import { ErrnoException } from './utils/errors'; @injectable() export class ArduinoDaemonImpl @@ -184,7 +185,7 @@ export class ArduinoDaemonImpl } return false; } catch (error) { - if ('code' in error && error.code === 'ENOENT') { + if (ErrnoException.isENOENT(error)) { return false; } throw error; diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index fa2e259c3..2efc4e774 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -26,6 +26,7 @@ import { DefaultCliConfig, CLI_CONFIG } from './cli-config'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { deepClone } from '@theia/core'; +import { ErrnoException } from './utils/errors'; const deepmerge = require('deepmerge'); @@ -146,7 +147,7 @@ export class ConfigServiceImpl const fallbackModel = await this.getFallbackCliConfig(); return deepmerge(fallbackModel, model) as DefaultCliConfig; } catch (error) { - if ('code' in error && error.code === 'ENOENT') { + if (ErrnoException.isENOENT(error)) { if (initializeIfAbsent) { await this.initCliConfigTo(dirname(cliConfigPath)); return this.loadCliConfig(false); diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 9cbee96c4..1d1d61221 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -33,6 +33,7 @@ import { TempSketchPrefix, } from './is-temp-sketch'; import { join } from 'path'; +import { ErrnoException } from './utils/errors'; const RecentSketches = 'recent-sketches.json'; const DefaultIno = `void setup() { @@ -187,6 +188,13 @@ export class SketchesServiceImpl } async loadSketch(uri: string): Promise { + return this.doLoadSketch(uri); + } + + private async doLoadSketch( + uri: string, + detectInvalidSketchNameError = true + ): Promise { const { client, instance } = await this.coreClient; const req = new LoadSketchRequest(); const requestSketchPath = FileUri.fsPath(uri); @@ -201,17 +209,19 @@ export class SketchesServiceImpl if (err) { let rejectWith: unknown = err; if (isNotFoundError(err)) { - const invalidMainSketchFilePath = await isInvalidSketchNameError( - err, - requestSketchPath - ); - if (invalidMainSketchFilePath) { - rejectWith = SketchesError.InvalidName( - err.details, - FileUri.create(invalidMainSketchFilePath).toString() + rejectWith = SketchesError.NotFound(err.details, uri); + // detecting the invalid sketch name error is not for free as it requires multiple filesystem access. + if (detectInvalidSketchNameError) { + const invalidMainSketchFilePath = await isInvalidSketchNameError( + err, + requestSketchPath ); - } else { - rejectWith = SketchesError.NotFound(err.details, uri); + if (invalidMainSketchFilePath) { + rejectWith = SketchesError.InvalidName( + err.details, + FileUri.create(invalidMainSketchFilePath).toString() + ); + } } } reject(rejectWith); @@ -278,7 +288,7 @@ export class SketchesServiceImpl ); } } catch (err) { - if ('code' in err && err.code === 'ENOENT') { + if (ErrnoException.isENOENT(err)) { this.logger.debug( `<<< '${RecentSketches}' does not exist yet. This is normal behavior. Falling back to empty data.` ); @@ -317,7 +327,7 @@ export class SketchesServiceImpl let sketch: Sketch | undefined = undefined; try { - sketch = await this.loadSketch(uri); + sketch = await this.doLoadSketch(uri, false); this.logger.debug( `Loaded sketch ${JSON.stringify( sketch @@ -390,7 +400,7 @@ export class SketchesServiceImpl )) { let sketch: SketchWithDetails | undefined = undefined; try { - sketch = await this.loadSketch(uri); + sketch = await this.doLoadSketch(uri, false); } catch {} if (!sketch) { needsUpdate = true; @@ -413,14 +423,14 @@ export class SketchesServiceImpl async cloneExample(uri: string): Promise { const [sketch, parentPath] = await Promise.all([ - this.loadSketch(uri), + this.doLoadSketch(uri, false), this.createTempFolder(), ]); const destinationUri = FileUri.create( path.join(parentPath, sketch.name) ).toString(); const copiedSketchUri = await this.copy(sketch, { destinationUri }); - return this.loadSketch(copiedSketchUri); + return this.doLoadSketch(copiedSketchUri, false); } async createNewSketch(): Promise { @@ -477,7 +487,7 @@ export class SketchesServiceImpl fs.mkdir(sketchDir, { recursive: true }), ]); await fs.writeFile(sketchFile, inoContent, { encoding: 'utf8' }); - return this.loadSketch(FileUri.create(sketchDir).toString()); + return this.doLoadSketch(FileUri.create(sketchDir).toString(), false); } /** @@ -528,7 +538,7 @@ export class SketchesServiceImpl uri: string ): Promise { try { - const sketch = await this.loadSketch(uri); + const sketch = await this.doLoadSketch(uri, false); return sketch; } catch (err) { if (SketchesError.NotFound.is(err) || SketchesError.InvalidName.is(err)) { @@ -553,7 +563,7 @@ export class SketchesServiceImpl } // Nothing to do when source and destination are the same. if (sketch.uri === destinationUri) { - await this.loadSketch(sketch.uri); // Sanity check. + await this.doLoadSketch(sketch.uri, false); // Sanity check. return sketch.uri; } @@ -574,7 +584,10 @@ export class SketchesServiceImpl if (oldPath !== newPath) { await fs.rename(oldPath, newPath); } - await this.loadSketch(FileUri.create(destinationPath).toString()); // Sanity check. + await this.doLoadSketch( + FileUri.create(destinationPath).toString(), + false + ); // Sanity check. resolve(); } catch (e) { reject(e); @@ -596,7 +609,7 @@ export class SketchesServiceImpl } async archive(sketch: Sketch, destinationUri: string): Promise { - await this.loadSketch(sketch.uri); // sanity check + await this.doLoadSketch(sketch.uri, false); // sanity check const { client } = await this.coreClient; const archivePath = FileUri.fsPath(destinationUri); // The CLI cannot override existing archives, so we have to wipe it manually: https://github.com/arduino/arduino-cli/issues/1160 @@ -666,7 +679,7 @@ export class SketchesServiceImpl return this.tryParse(raw); } catch (err) { - if ('code' in err && err.code === 'ENOENT') { + if (ErrnoException.isENOENT(err)) { return undefined; } throw err; @@ -695,7 +708,7 @@ export class SketchesServiceImpl }); this.inoContent.resolve(inoContent); } catch (err) { - if ('code' in err && err.code === 'ENOENT') { + if (ErrnoException.isENOENT(err)) { // Ignored. The custom `.ino` blueprint file is optional. } else { throw err; @@ -763,7 +776,7 @@ async function isInvalidSketchNameError( .map((name) => path.join(requestSketchPath, name))[0] ); } catch (err) { - if ('code' in err && err.code === 'ENOTDIR') { + if (ErrnoException.isENOENT(err) || ErrnoException.isENOTDIR(err)) { return undefined; } throw err; diff --git a/arduino-ide-extension/src/node/utils/errors.ts b/arduino-ide-extension/src/node/utils/errors.ts new file mode 100644 index 000000000..952c43763 --- /dev/null +++ b/arduino-ide-extension/src/node/utils/errors.ts @@ -0,0 +1,34 @@ +export type ErrnoException = Error & { code: string; errno: number }; +export namespace ErrnoException { + export function is(arg: unknown): arg is ErrnoException { + if (arg instanceof Error) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const error = arg as any; + return ( + 'code' in error && + 'errno' in error && + typeof error['code'] === 'string' && + typeof error['errno'] === 'number' + ); + } + return false; + } + + /** + * (No such file or directory): Commonly raised by `fs` operations to indicate that a component of the specified pathname does not exist — no entity (file or directory) could be found by the given path. + */ + export function isENOENT( + arg: unknown + ): arg is ErrnoException & { code: 'ENOENT' } { + return is(arg) && arg.code === 'ENOENT'; + } + + /** + * (Not a directory): A component of the given pathname existed, but was not a directory as expected. Commonly raised by `fs.readdir`. + */ + export function isENOTDIR( + arg: unknown + ): arg is ErrnoException & { code: 'ENOTDIR' } { + return is(arg) && arg.code === 'ENOTDIR'; + } +} diff --git a/scripts/i18n/transifex-pull.js b/scripts/i18n/transifex-pull.js index 4f1f3fcc3..e620e88da 100644 --- a/scripts/i18n/transifex-pull.js +++ b/scripts/i18n/transifex-pull.js @@ -54,7 +54,7 @@ const requestTranslationDownload = async (relationships) => { const getTranslationDownloadStatus = async (language, downloadRequestId) => { // The download request status must be asked from time to time, if it's - // still pending we try again using exponentional backoff starting from 2.5 seconds. + // still pending we try again using exponential backoff starting from 2.5 seconds. let backoffMs = 2500; while (true) { const url = transifex.url( From 7d6a2d5e3340aabc1e635d508509dc92a4000fdc Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 25 Oct 2022 17:13:43 +0200 Subject: [PATCH 087/384] feat: Create remote sketch Closes #1580 Signed-off-by: Akos Kitta --- .../browser/arduino-ide-frontend-module.ts | 8 + .../src/browser/contributions/close.ts | 2 +- .../browser/contributions/new-cloud-sketch.ts | 247 ++++++++++++++++++ .../src/browser/contributions/new-sketch.ts | 2 +- .../src/browser/contributions/open-sketch.ts | 2 +- .../src/browser/contributions/save-sketch.ts | 2 +- .../src/browser/create/create-uri.ts | 4 +- .../local-cache/local-cache-fs-provider.ts | 3 +- .../src/browser/style/dialogs.css | 2 - .../src/browser/style/sketchbook.css | 16 ++ .../cloud-sketchbook-composite-widget.tsx | 100 +++---- .../cloud-sketchbook-tree-model.ts | 115 ++++++-- .../cloud-sketchbook-tree-widget.tsx | 8 +- .../cloud-sketchbook/cloud-sketchbook-tree.ts | 6 +- .../cloud-sketchbook-widget.ts | 7 +- .../browser/widgets/sketchbook/create-new.tsx | 20 ++ .../sketchbook-composite-widget.tsx | 93 +++++++ .../sketchbook/sketchbook-tree-widget.tsx | 1 + .../widgets/sketchbook/sketchbook-widget.tsx | 22 +- .../theia/core/electron-main-menu-factory.ts | 119 ++++++++- i18n/en.json | 15 +- 21 files changed, 683 insertions(+), 111 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts create mode 100644 arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx create mode 100644 arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx 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 5e87af4fc..dfeffb0cb 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -335,6 +335,8 @@ import { UserFields } from './contributions/user-fields'; import { UpdateIndexes } from './contributions/update-indexes'; import { InterfaceScale } from './contributions/interface-scale'; import { OpenHandler } from '@theia/core/lib/browser/opener-service'; +import { NewCloudSketch } from './contributions/new-cloud-sketch'; +import { SketchbookCompositeWidget } from './widgets/sketchbook/sketchbook-composite-widget'; const registerArduinoThemes = () => { const themes: MonacoThemeJson[] = [ @@ -751,6 +753,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, DeleteSketch); Contribution.configure(bind, UpdateIndexes); Contribution.configure(bind, InterfaceScale); + Contribution.configure(bind, NewCloudSketch); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window @@ -905,6 +908,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { id: 'arduino-sketchbook-widget', createWidget: () => container.get(SketchbookWidget), })); + bind(SketchbookCompositeWidget).toSelf(); + bind(WidgetFactory).toDynamicValue((ctx) => ({ + id: 'sketchbook-composite-widget', + createWidget: () => ctx.container.get(SketchbookCompositeWidget), + })); bind(CloudSketchbookWidget).toSelf(); rebind(SketchbookWidget).toService(CloudSketchbookWidget); diff --git a/arduino-ide-extension/src/browser/contributions/close.ts b/arduino-ide-extension/src/browser/contributions/close.ts index 033d02edd..61885d49c 100644 --- a/arduino-ide-extension/src/browser/contributions/close.ts +++ b/arduino-ide-extension/src/browser/contributions/close.ts @@ -65,7 +65,7 @@ export class Close extends SketchContribution { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: Close.Commands.CLOSE.id, label: nls.localize('vscode/editor.contribution/close', 'Close'), - order: '5', + order: '6', }); } diff --git a/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts new file mode 100644 index 000000000..d7fb671bd --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts @@ -0,0 +1,247 @@ +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import { CompositeTreeNode } from '@theia/core/lib/browser/tree'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import type { AuthenticationSession } from '../../node/auth/types'; +import { AuthenticationClientService } from '../auth/authentication-client-service'; +import { CreateApi } from '../create/create-api'; +import { CreateUri } from '../create/create-uri'; +import { Create } from '../create/typings'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { WorkspaceInputDialog } from '../theia/workspace/workspace-input-dialog'; +import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; +import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model'; +import { CloudSketchbookTreeWidget } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-widget'; +import { SketchbookCommands } from '../widgets/sketchbook/sketchbook-commands'; +import { SketchbookWidget } from '../widgets/sketchbook/sketchbook-widget'; +import { SketchbookWidgetContribution } from '../widgets/sketchbook/sketchbook-widget-contribution'; +import { Command, CommandRegistry, Contribution, URI } from './contribution'; + +@injectable() +export class NewCloudSketch extends Contribution { + @inject(CreateApi) + private readonly createApi: CreateApi; + @inject(SketchbookWidgetContribution) + private readonly widgetContribution: SketchbookWidgetContribution; + @inject(AuthenticationClientService) + private readonly authenticationService: AuthenticationClientService; + @inject(MainMenuManager) + private readonly mainMenuManager: MainMenuManager; + + private readonly toDispose = new DisposableCollection(); + private _session: AuthenticationSession | undefined; + private _enabled: boolean; + + override onReady(): void { + this.toDispose.pushAll([ + this.authenticationService.onSessionDidChange((session) => { + const oldSession = this._session; + this._session = session; + if (!!oldSession !== !!this._session) { + this.mainMenuManager.update(); + } + }), + this.preferences.onPreferenceChanged(({ preferenceName, newValue }) => { + if (preferenceName === 'arduino.cloud.enabled') { + const oldEnabled = this._enabled; + this._enabled = Boolean(newValue); + if (this._enabled !== oldEnabled) { + this.mainMenuManager.update(); + } + } + }), + ]); + this._enabled = this.preferences['arduino.cloud.enabled']; + this._session = this.authenticationService.session; + if (this._session) { + this.mainMenuManager.update(); + } + } + + onStop(): void { + this.toDispose.dispose(); + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(NewCloudSketch.Commands.NEW_CLOUD_SKETCH, { + execute: () => this.createNewSketch(), + isEnabled: () => !!this._session, + isVisible: () => this._enabled, + }); + } + + override registerMenus(registry: MenuModelRegistry): void { + registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { + commandId: NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id, + label: nls.localize('arduino/cloudSketch/new', 'New Remote Sketch'), + order: '1', + }); + } + + override registerKeybindings(registry: KeybindingRegistry): void { + registry.registerKeybinding({ + command: NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id, + keybinding: 'CtrlCmd+Alt+N', + }); + } + + private async createNewSketch( + initialValue?: string | undefined + ): Promise { + const widget = await this.widgetContribution.widget; + const treeModel = this.treeModelFrom(widget); + if (!treeModel) { + return undefined; + } + const rootNode = CompositeTreeNode.is(treeModel.root) + ? treeModel.root + : undefined; + if (!rootNode) { + return undefined; + } + + const newSketchName = await this.newSketchName(rootNode, initialValue); + if (!newSketchName) { + return undefined; + } + let result: Create.Sketch | undefined | 'conflict'; + try { + result = await this.createApi.createSketch(newSketchName); + } catch (err) { + if (isConflict(err)) { + result = 'conflict'; + } else { + throw err; + } + } finally { + if (result) { + await treeModel.refresh(); + } + } + + if (result === 'conflict') { + return this.createNewSketch(newSketchName); + } + + if (result) { + return this.open(treeModel, result); + } + return undefined; + } + + private async open( + treeModel: CloudSketchbookTreeModel, + newSketch: Create.Sketch + ): Promise { + const id = CreateUri.toUri(newSketch).path.toString(); + const node = treeModel.getNode(id); + if (!node) { + throw new Error( + `Could not find remote sketchbook tree node with Tree node ID: ${id}.` + ); + } + if (!CloudSketchbookTree.CloudSketchDirNode.is(node)) { + throw new Error( + `Remote sketchbook tree node expected to represent a directory but it did not. Tree node ID: ${id}.` + ); + } + try { + await treeModel.sketchbookTree().pull({ node }); + } catch (err) { + if (isNotFound(err)) { + await treeModel.refresh(); + this.messageService.error( + nls.localize( + 'arduino/newCloudSketch/notFound', + "Could not pull the remote sketch '{0}'. It does not exist.", + newSketch.name + ) + ); + return undefined; + } + throw err; + } + return this.commandService.executeCommand( + SketchbookCommands.OPEN_NEW_WINDOW.id, + { node } + ); + } + + private treeModelFrom( + widget: SketchbookWidget + ): CloudSketchbookTreeModel | undefined { + const treeWidget = widget.getTreeWidget(); + if (treeWidget instanceof CloudSketchbookTreeWidget) { + const model = treeWidget.model; + if (model instanceof CloudSketchbookTreeModel) { + return model; + } + } + return undefined; + } + + private async newSketchName( + rootNode: CompositeTreeNode, + initialValue?: string | undefined + ): Promise { + const existingNames = rootNode.children + .filter(CloudSketchbookTree.CloudSketchDirNode.is) + .map(({ fileStat }) => fileStat.name); + return new WorkspaceInputDialog( + { + title: nls.localize( + 'arduino/newCloudSketch/newSketchTitle', + 'Name of a new Remote Sketch' + ), + parentUri: CreateUri.root, + initialValue, + validate: (input) => { + if (existingNames.includes(input)) { + return nls.localize( + 'arduino/newCloudSketch/sketchAlreadyExists', + "Remote sketch '{0}' already exists.", + input + ); + } + // This is how https://create.arduino.cc/editor/ works when renaming a sketch. + if (/^[0-9a-zA-Z_]{1,36}$/.test(input)) { + return ''; + } + return nls.localize( + 'arduino/newCloudSketch/invalidSketchName', + 'The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.' + ); + }, + }, + this.labelProvider + ).open(); + } +} +export namespace NewCloudSketch { + export namespace Commands { + export const NEW_CLOUD_SKETCH: Command = { + id: 'arduino-new-cloud-sketch', + }; + } +} + +function isConflict(err: unknown): boolean { + return isErrorWithStatusOf(err, 409); +} +function isNotFound(err: unknown): boolean { + return isErrorWithStatusOf(err, 404); +} +function isErrorWithStatusOf( + err: unknown, + status: number +): err is Error & { status: number } { + if (err instanceof Error) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const object = err as any; + return 'status' in object && object.status === status; + } + return false; +} diff --git a/arduino-ide-extension/src/browser/contributions/new-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-sketch.ts index bebc67767..c625fd802 100644 --- a/arduino-ide-extension/src/browser/contributions/new-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/new-sketch.ts @@ -21,7 +21,7 @@ export class NewSketch extends SketchContribution { override registerMenus(registry: MenuModelRegistry): void { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: NewSketch.Commands.NEW_SKETCH.id, - label: nls.localize('arduino/sketch/new', 'New'), + label: nls.localize('arduino/sketch/new', 'New Sketch'), order: '0', }); } diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-sketch.ts index e7e3f77de..5e41001c3 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch.ts @@ -54,7 +54,7 @@ export class OpenSketch extends SketchContribution { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: OpenSketch.Commands.OPEN_SKETCH.id, label: nls.localize('vscode/workspaceActions/openFileFolder', 'Open...'), - order: '1', + order: '2', }); } diff --git a/arduino-ide-extension/src/browser/contributions/save-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-sketch.ts index 62a6b0f86..5d88433ed 100644 --- a/arduino-ide-extension/src/browser/contributions/save-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-sketch.ts @@ -24,7 +24,7 @@ export class SaveSketch extends SketchContribution { registry.registerMenuAction(ArduinoMenus.FILE__SKETCH_GROUP, { commandId: SaveSketch.Commands.SAVE_SKETCH.id, label: nls.localize('vscode/fileCommands/save', 'Save'), - order: '6', + order: '7', }); } diff --git a/arduino-ide-extension/src/browser/create/create-uri.ts b/arduino-ide-extension/src/browser/create/create-uri.ts index 1d60ffff2..658a65ac1 100644 --- a/arduino-ide-extension/src/browser/create/create-uri.ts +++ b/arduino-ide-extension/src/browser/create/create-uri.ts @@ -7,7 +7,9 @@ export namespace CreateUri { export const scheme = 'arduino-create'; export const root = toUri(posix.sep); - export function toUri(posixPathOrResource: string | Create.Resource): URI { + export function toUri( + posixPathOrResource: string | Create.Resource | Create.Sketch + ): URI { const posixPath = typeof posixPathOrResource === 'string' ? posixPathOrResource diff --git a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts index 96264378a..5a9a77c71 100644 --- a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts +++ b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts @@ -34,7 +34,6 @@ export class LocalCacheFsProvider @inject(AuthenticationClientService) protected readonly authenticationService: AuthenticationClientService; - // TODO: do we need this? Cannot we `await` on the `init` call from `registerFileSystemProviders`? readonly ready = new Deferred(); private _localCacheRoot: URI; @@ -153,7 +152,7 @@ export class LocalCacheFsProvider return uri; } - private toUri(session: AuthenticationSession): URI { + toUri(session: AuthenticationSession): URI { // Hack: instead of getting the UUID only, we get `auth0|UUID` after the authentication. `|` cannot be part of filesystem path or filename. return this._localCacheRoot.resolve(session.id.split('|')[1]); } diff --git a/arduino-ide-extension/src/browser/style/dialogs.css b/arduino-ide-extension/src/browser/style/dialogs.css index 4d56484e8..668c389b2 100644 --- a/arduino-ide-extension/src/browser/style/dialogs.css +++ b/arduino-ide-extension/src/browser/style/dialogs.css @@ -80,10 +80,8 @@ opacity: .4; } - @media only screen and (max-height: 560px) { .p-Widget.dialogOverlay .dialogBlock { max-height: 400px; } } - \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/style/sketchbook.css b/arduino-ide-extension/src/browser/style/sketchbook.css index dcba8d0d2..87143e60c 100644 --- a/arduino-ide-extension/src/browser/style/sketchbook.css +++ b/arduino-ide-extension/src/browser/style/sketchbook.css @@ -33,6 +33,22 @@ height: 100%; } +.sketchbook-trees-container .create-new { + min-height: 58px; + height: 58px; + display: flex; + align-items: center; + justify-content: center; +} +/* +By default, theia-button has a left-margin. IDE2 does not need the left margin +for the _New Remote? Sketch_. Otherwise, the button does not fit the default +widget width. +*/ +.sketchbook-trees-container .create-new .theia-button { + margin-left: unset; +} + .sketchbook-tree__opts { background-color: var(--theia-foreground); -webkit-mask: url(./sketchbook-opts-icon.svg); diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx index 5e0016922..d00ed0545 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx @@ -1,78 +1,78 @@ import * as React from '@theia/core/shared/react'; import * as ReactDOM from '@theia/core/shared/react-dom'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; -import { Message, MessageLoop } from '@theia/core/shared/@phosphor/messaging'; -import { Disposable } from '@theia/core/lib/common/disposable'; -import { BaseWidget } from '@theia/core/lib/browser/widgets/widget'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import { UserStatus } from './cloud-user-status'; +import { nls } from '@theia/core/lib/common/nls'; import { CloudSketchbookTreeWidget } from './cloud-sketchbook-tree-widget'; import { AuthenticationClientService } from '../../auth/authentication-client-service'; import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; -import { nls } from '@theia/core/lib/common'; +import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget'; +import { CreateNew } from '../sketchbook/create-new'; +import { AuthenticationSession } from '../../../node/auth/types'; @injectable() -export class CloudSketchbookCompositeWidget extends BaseWidget { +export class CloudSketchbookCompositeWidget extends BaseSketchbookCompositeWidget { @inject(AuthenticationClientService) - protected readonly authenticationService: AuthenticationClientService; - + private readonly authenticationService: AuthenticationClientService; @inject(CloudSketchbookTreeWidget) - protected readonly cloudSketchbookTreeWidget: CloudSketchbookTreeWidget; - - private compositeNode: HTMLElement; - private cloudUserStatusNode: HTMLElement; + private readonly cloudSketchbookTreeWidget: CloudSketchbookTreeWidget; + private _session: AuthenticationSession | undefined; constructor() { super(); - this.compositeNode = document.createElement('div'); - this.compositeNode.classList.add('composite-node'); - this.cloudUserStatusNode = document.createElement('div'); - this.cloudUserStatusNode.classList.add('cloud-status-node'); - this.compositeNode.appendChild(this.cloudUserStatusNode); - this.node.appendChild(this.compositeNode); + this.id = 'cloud-sketchbook-composite-widget'; this.title.caption = nls.localize( 'arduino/cloud/remoteSketchbook', 'Remote Sketchbook' ); this.title.iconClass = 'cloud-sketchbook-tree-icon'; - this.title.closable = false; - this.id = 'cloud-sketchbook-composite-widget'; - } - - public getTreeWidget(): CloudSketchbookTreeWidget { - return this.cloudSketchbookTreeWidget; } - protected override onAfterAttach(message: Message): void { - super.onAfterAttach(message); - Widget.attach(this.cloudSketchbookTreeWidget, this.compositeNode); - ReactDOM.render( - , - this.cloudUserStatusNode - ); - this.toDisposeOnDetach.push( - Disposable.create(() => Widget.detach(this.cloudSketchbookTreeWidget)) + @postConstruct() + protected init(): void { + this.toDispose.push( + this.authenticationService.onSessionDidChange((session) => { + const oldSession = this._session; + this._session = session; + if (!!oldSession !== !!this._session) { + this.updateFooter(); + } + }) ); } - protected override onActivateRequest(msg: Message): void { - super.onActivateRequest(msg); - - /* - Sending a resize message is needed because otherwise the cloudSketchbookTreeWidget - would render empty - */ - this.onResize(Widget.ResizeMessage.UnknownSize); + get treeWidget(): CloudSketchbookTreeWidget { + return this.cloudSketchbookTreeWidget; } - protected override onResize(message: Widget.ResizeMessage): void { - super.onResize(message); - MessageLoop.sendMessage( - this.cloudSketchbookTreeWidget, - Widget.ResizeMessage.UnknownSize + protected renderFooter(footerNode: HTMLElement): void { + ReactDOM.render( + <> + {this._session && ( + + )} + + , + footerNode ); } + + private onDidClickCreateNew: () => void = () => { + this.commandService.executeCommand('arduino-new-cloud-sketch'); + }; } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts index d76c7497f..666ac1ba8 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts @@ -1,20 +1,26 @@ -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; -import { TreeNode } from '@theia/core/lib/browser/tree'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { CompositeTreeNode, TreeNode } from '@theia/core/lib/browser/tree'; import { posixSegments, splitSketchPath } from '../../create/create-paths'; import { CreateApi } from '../../create/create-api'; import { CloudSketchbookTree } from './cloud-sketchbook-tree'; import { AuthenticationClientService } from '../../auth/authentication-client-service'; import { SketchbookTreeModel } from '../sketchbook/sketchbook-tree-model'; -import { ArduinoPreferences } from '../../arduino-preferences'; import { WorkspaceNode } from '@theia/navigator/lib/browser/navigator-tree'; import { CreateUri } from '../../create/create-uri'; -import { FileStat } from '@theia/filesystem/lib/common/files'; -import { LocalCacheFsProvider } from '../../local-cache/local-cache-fs-provider'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { FileChangesEvent, FileStat } from '@theia/filesystem/lib/common/files'; +import { + LocalCacheFsProvider, + LocalCacheUri, +} from '../../local-cache/local-cache-fs-provider'; import URI from '@theia/core/lib/common/uri'; import { SketchCache } from './cloud-sketch-cache'; import { Create } from '../../create/typings'; -import { nls } from '@theia/core/lib/common'; +import { nls } from '@theia/core/lib/common/nls'; +import { Deferred } from '@theia/core/lib/common/promise-util'; export function sketchBaseDir(sketch: Create.Sketch): FileStat { // extract the sketch path @@ -52,26 +58,16 @@ export function sketchesToFileStats(sketches: Create.Sketch[]): FileStat[] { @injectable() export class CloudSketchbookTreeModel extends SketchbookTreeModel { - @inject(FileService) - protected override readonly fileService: FileService; - - @inject(AuthenticationClientService) - protected readonly authenticationService: AuthenticationClientService; - @inject(CreateApi) - protected readonly createApi: CreateApi; - - @inject(CloudSketchbookTree) - protected readonly cloudSketchbookTree: CloudSketchbookTree; - - @inject(ArduinoPreferences) - protected override readonly arduinoPreferences: ArduinoPreferences; - + private readonly createApi: CreateApi; + @inject(AuthenticationClientService) + private readonly authenticationService: AuthenticationClientService; @inject(LocalCacheFsProvider) - protected readonly localCacheFsProvider: LocalCacheFsProvider; - + private readonly localCacheFsProvider: LocalCacheFsProvider; @inject(SketchCache) - protected readonly sketchCache: SketchCache; + private readonly sketchCache: SketchCache; + + private _localCacheFsProviderReady: Deferred | undefined; @postConstruct() protected override init(): void { @@ -81,6 +77,50 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel { ); } + override *getNodesByUri(uri: URI): IterableIterator { + if (uri.scheme === LocalCacheUri.scheme) { + const workspace = this.root; + const { session } = this.authenticationService; + if (session && WorkspaceNode.is(workspace)) { + const currentUri = this.localCacheFsProvider.to(uri); + if (currentUri) { + const rootPath = this.localCacheFsProvider + .toUri(session) + .path.toString(); + const currentPath = currentUri.path.toString(); + if (rootPath === currentPath) { + return workspace; + } + if (currentPath.startsWith(rootPath)) { + const id = currentPath.substring(rootPath.length); + const node = this.getNode(id); + if (node) { + yield node; + } + } + } + } + } + } + + protected override isRootAffected(changes: FileChangesEvent): boolean { + return changes.changes + .map(({ resource }) => resource) + .some( + (uri) => uri.parent.toString().startsWith(LocalCacheUri.root.toString()) // all files under the root might affect the tree + ); + } + + override async refresh( + parent?: Readonly + ): Promise { + if (parent) { + return super.refresh(parent); + } + await this.updateRoot(); + return super.refresh(); + } + override async createRoot(): Promise { const { session } = this.authenticationService; if (!session) { @@ -89,7 +129,10 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel { } this.createApi.init(this.authenticationService, this.arduinoPreferences); this.sketchCache.init(); - const sketches = await this.createApi.sketches(); + const [sketches] = await Promise.all([ + this.createApi.sketches(), + this.ensureLocalFsProviderReady(), + ]); const rootFileStats = sketchesToFileStats(sketches); if (this.workspaceService.opened) { const workspaceNode = WorkspaceNode.createRoot( @@ -108,7 +151,9 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel { return this.tree as CloudSketchbookTree; } - protected override recursivelyFindSketchRoot(node: TreeNode): any { + protected override recursivelyFindSketchRoot( + node: TreeNode + ): TreeNode | false { if (node && CloudSketchbookTree.CloudSketchDirNode.is(node)) { return node; } @@ -122,13 +167,25 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel { } override async revealFile(uri: URI): Promise { + await this.localCacheFsProvider.ready.promise; // we use remote uris as keys for the tree // convert local URIs - const remoteuri = this.localCacheFsProvider.from(uri); - if (remoteuri) { - return super.revealFile(remoteuri); + const remoteUri = this.localCacheFsProvider.from(uri); + if (remoteUri) { + return super.revealFile(remoteUri); } else { return super.revealFile(uri); } } + + private async ensureLocalFsProviderReady(): Promise { + if (this._localCacheFsProviderReady) { + return this._localCacheFsProviderReady.promise; + } + this._localCacheFsProviderReady = new Deferred(); + this.fileService + .access(LocalCacheUri.root) + .then(() => this._localCacheFsProviderReady?.resolve()); + return this._localCacheFsProviderReady.promise; + } } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx index 7bb0abc73..b160842e4 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx @@ -1,5 +1,5 @@ import * as React from '@theia/core/shared/react'; -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { TreeModel } from '@theia/core/lib/browser/tree/tree-model'; import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; import { AuthenticationClientService } from '../../auth/authentication-client-service'; @@ -27,12 +27,6 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { @inject(CloudSketchbookTree) protected readonly cloudSketchbookTree: CloudSketchbookTree; - @postConstruct() - protected override async init(): Promise { - await super.init(); - this.addClass('tree-container'); // Adds `height: 100%` to the tree. Otherwise you cannot see it. - } - protected override renderTree(model: TreeModel): React.ReactNode { if (this.shouldShowWelcomeView()) return this.renderViewWelcome(); if (this.shouldShowEmptyView()) return this.renderEmptyView(); diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts index 7204df632..7f4b44115 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts @@ -136,7 +136,7 @@ export class CloudSketchbookTree extends SketchbookTree { return; } } - this.runWithState(node, 'pulling', async (node) => { + return this.runWithState(node, 'pulling', async (node) => { const commandsCopy = node.commands; node.commands = []; @@ -196,7 +196,7 @@ export class CloudSketchbookTree extends SketchbookTree { return; } } - this.runWithState(node, 'pushing', async (node) => { + return this.runWithState(node, 'pushing', async (node) => { if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { throw new Error( nls.localize( @@ -269,7 +269,7 @@ export class CloudSketchbookTree extends SketchbookTree { return prev; } - // do not map "do_not_sync" files/directoris and their descendants + // do not map "do_not_sync" files/directories and their descendants const segments = path[1].split(posix.sep) || []; if ( segments.some((segment) => Create.do_not_sync_files.includes(segment)) diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts index 22239a227..6e112eefa 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts @@ -2,6 +2,7 @@ import { inject, injectable, postConstruct } from '@theia/core/shared/inversify' import { CloudSketchbookCompositeWidget } from './cloud-sketchbook-composite-widget'; import { SketchbookWidget } from '../sketchbook/sketchbook-widget'; import { ArduinoPreferences } from '../../arduino-preferences'; +import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget'; @injectable() export class CloudSketchbookWidget extends SketchbookWidget { @@ -19,8 +20,8 @@ export class CloudSketchbookWidget extends SketchbookWidget { override getTreeWidget(): any { const widget: any = this.sketchbookTreesContainer.selectedWidgets().next(); - if (widget && typeof widget.getTreeWidget !== 'undefined') { - return (widget as CloudSketchbookCompositeWidget).getTreeWidget(); + if (widget instanceof BaseSketchbookCompositeWidget) { + return widget.treeWidget; } return widget; } @@ -30,7 +31,7 @@ export class CloudSketchbookWidget extends SketchbookWidget { this.sketchbookTreesContainer.activateWidget(this.widget); } else { this.sketchbookTreesContainer.activateWidget( - this.localSketchbookTreeWidget + this.sketchbookCompositeWidget ); } this.setDocumentMode(); diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx new file mode 100644 index 000000000..d70d5b9a4 --- /dev/null +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx @@ -0,0 +1,20 @@ +import * as React from '@theia/core/shared/react'; + +export class CreateNew extends React.Component { + override render(): React.ReactNode { + return ( +
+ +
+ ); + } +} + +export namespace CreateNew { + export interface Props { + readonly label: string; + readonly onClick: () => void; + } +} diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx new file mode 100644 index 000000000..cdec965e6 --- /dev/null +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx @@ -0,0 +1,93 @@ +import * as React from '@theia/core/shared/react'; +import * as ReactDOM from '@theia/core/shared/react-dom'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { nls } from '@theia/core/lib/common/nls'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { Message, MessageLoop } from '@theia/core/shared/@phosphor/messaging'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { BaseWidget } from '@theia/core/lib/browser/widgets/widget'; +import { CommandService } from '@theia/core/lib/common/command'; +import { SketchbookTreeWidget } from './sketchbook-tree-widget'; +import { CreateNew } from '../sketchbook/create-new'; + +@injectable() +export abstract class BaseSketchbookCompositeWidget< + TW extends SketchbookTreeWidget +> extends BaseWidget { + @inject(CommandService) + protected readonly commandService: CommandService; + + private readonly compositeNode: HTMLElement; + private readonly footerNode: HTMLElement; + + constructor() { + super(); + this.compositeNode = document.createElement('div'); + this.compositeNode.classList.add('composite-node'); + this.footerNode = document.createElement('div'); + this.footerNode.classList.add('footer-node'); + this.compositeNode.appendChild(this.footerNode); + this.node.appendChild(this.compositeNode); + this.title.closable = false; + } + + abstract get treeWidget(): TW; + protected abstract renderFooter(footerNode: HTMLElement): void; + protected updateFooter(): void { + this.renderFooter(this.footerNode); + } + + protected override onAfterAttach(message: Message): void { + super.onAfterAttach(message); + Widget.attach(this.treeWidget, this.compositeNode); + this.renderFooter(this.footerNode); + this.toDisposeOnDetach.push( + Disposable.create(() => Widget.detach(this.treeWidget)) + ); + } + + protected override onActivateRequest(message: Message): void { + super.onActivateRequest(message); + // Sending a resize message is needed because otherwise the tree widget would render empty + this.onResize(Widget.ResizeMessage.UnknownSize); + } + + protected override onResize(message: Widget.ResizeMessage): void { + super.onResize(message); + MessageLoop.sendMessage(this.treeWidget, Widget.ResizeMessage.UnknownSize); + } +} + +@injectable() +export class SketchbookCompositeWidget extends BaseSketchbookCompositeWidget { + @inject(SketchbookTreeWidget) + private readonly sketchbookTreeWidget: SketchbookTreeWidget; + + constructor() { + super(); + this.id = 'sketchbook-composite-widget'; + this.title.caption = nls.localize( + 'arduino/sketch/titleLocalSketchbook', + 'Local Sketchbook' + ); + this.title.iconClass = 'sketchbook-tree-icon'; + } + + get treeWidget(): SketchbookTreeWidget { + return this.sketchbookTreeWidget; + } + + protected renderFooter(footerNode: HTMLElement): void { + ReactDOM.render( + , + footerNode + ); + } + + private onDidClickCreateNew: () => void = () => { + this.commandService.executeCommand('arduino-new-sketch'); + }; +} diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx index bb1a69914..599cac893 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 @@ -59,6 +59,7 @@ export class SketchbookTreeWidget extends FileTreeWidget { 'Local Sketchbook' ); this.title.closable = false; + this.addClass('tree-container'); // Adds `height: 100%` to the tree. Otherwise you cannot see it. } @postConstruct() diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx index 0b7b920a1..eb0059590 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx @@ -11,15 +11,21 @@ import { Disposable } from '@theia/core/lib/common/disposable'; import { BaseWidget } from '@theia/core/lib/browser/widgets/widget'; import { SketchbookTreeWidget } from './sketchbook-tree-widget'; import { nls } from '@theia/core/lib/common'; -import { CloudSketchbookCompositeWidget } from '../cloud-sketchbook/cloud-sketchbook-composite-widget'; import { URI } from '../../contributions/contribution'; +import { + BaseSketchbookCompositeWidget, + SketchbookCompositeWidget, +} from './sketchbook-composite-widget'; @injectable() export class SketchbookWidget extends BaseWidget { - static LABEL = nls.localize('arduino/sketch/titleSketchbook', 'Sketchbook'); + static readonly LABEL = nls.localize( + 'arduino/sketch/titleSketchbook', + 'Sketchbook' + ); - @inject(SketchbookTreeWidget) - protected readonly localSketchbookTreeWidget: SketchbookTreeWidget; + @inject(SketchbookCompositeWidget) + protected readonly sketchbookCompositeWidget: SketchbookCompositeWidget; protected readonly sketchbookTreesContainer: DockPanel; @@ -36,7 +42,7 @@ export class SketchbookWidget extends BaseWidget { @postConstruct() protected init(): void { - this.sketchbookTreesContainer.addWidget(this.localSketchbookTreeWidget); + this.sketchbookTreesContainer.addWidget(this.sketchbookCompositeWidget); } protected override onAfterAttach(message: Message): void { @@ -48,7 +54,7 @@ export class SketchbookWidget extends BaseWidget { } getTreeWidget(): SketchbookTreeWidget { - return this.localSketchbookTreeWidget; + return this.sketchbookCompositeWidget.treeWidget; } activeTreeWidgetId(): string | undefined { @@ -80,8 +86,8 @@ export class SketchbookWidget extends BaseWidget { if (widget instanceof SketchbookTreeWidget) { return widget; } - if (widget instanceof CloudSketchbookCompositeWidget) { - return widget.getTreeWidget(); + if (widget instanceof BaseSketchbookCompositeWidget) { + return widget.treeWidget; } return undefined; }; diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts index 98f8b76e0..842518062 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 @@ -2,8 +2,10 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import * as remote from '@theia/core/electron-shared/@electron/remote'; import { isOSX } from '@theia/core/lib/common/os'; import { + ActionMenuNode, CompositeMenuNode, MAIN_MENU_BAR, + MenuNode, MenuPath, } from '@theia/core/lib/common/menu'; import { @@ -134,7 +136,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { } protected override handleElectronDefault( - menuNode: CompositeMenuNode, + menuNode: MenuNode, args: any[] = [], options?: ElectronMenuOptions ): Electron.MenuItemConstructorOptions[] { @@ -149,4 +151,119 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { } return []; } + + // Copied from 1.25.0 Theia as is to customize the enablement of the menu items. + // Source: https://github.com/eclipse-theia/theia/blob/ca417a31e402bd35717d3314bf6254049d1dae44/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L125-L220 + // See https://github.com/arduino/arduino-ide/issues/1533 + protected override fillMenuTemplate( + items: Electron.MenuItemConstructorOptions[], + menuModel: CompositeMenuNode, + args: any[] = [], + options?: ElectronMenuOptions + ): Electron.MenuItemConstructorOptions[] { + const showDisabled = + options?.showDisabled === undefined ? true : options?.showDisabled; + for (const menu of menuModel.children) { + if (menu instanceof CompositeMenuNode) { + if (menu.children.length > 0) { + // do not render empty nodes + + if (menu.isSubmenu) { + // submenu node + + const submenu = this.fillMenuTemplate([], menu, args, options); + if (submenu.length === 0) { + continue; + } + + items.push({ + label: menu.label, + submenu, + }); + } else { + // group node + + // process children + const submenu = this.fillMenuTemplate([], menu, args, options); + if (submenu.length === 0) { + continue; + } + + if (items.length > 0) { + // do not put a separator above the first group + + items.push({ + type: 'separator', + }); + } + + // render children + items.push(...submenu); + } + } + } else if (menu instanceof ActionMenuNode) { + const node = + menu.altNode && this.context.altPressed ? menu.altNode : menu; + const commandId = node.action.commandId; + + // That is only a sanity check at application startup. + if (!this.commandRegistry.getCommand(commandId)) { + console.debug( + `Skipping menu item with missing command: "${commandId}".` + ); + continue; + } + + if ( + !this.commandRegistry.isVisible(commandId, ...args) || + (!!node.action.when && + !this.contextKeyService.match(node.action.when)) + ) { + continue; + } + + // We should omit rendering context-menu items which are disabled. + if ( + !showDisabled && + !this.commandRegistry.isEnabled(commandId, ...args) + ) { + continue; + } + + const bindings = + this.keybindingRegistry.getKeybindingsForCommand(commandId); + + const accelerator = bindings[0] && this.acceleratorFor(bindings[0]); + + const menuItem: Electron.MenuItemConstructorOptions = { + id: node.id, + label: node.label, + type: this.commandRegistry.getToggledHandler(commandId, ...args) + ? 'checkbox' + : 'normal', + checked: this.commandRegistry.isToggled(commandId, ...args), + enabled: this.commandRegistry.isEnabled(commandId, ...args), // Unlike Theia https://github.com/eclipse-theia/theia/blob/ca417a31e402bd35717d3314bf6254049d1dae44/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts#L197 + visible: true, + accelerator, + click: () => this.execute(commandId, args), + }; + + if (isOSX) { + const role = this.roleFor(node.id); + if (role) { + menuItem.role = role; + delete menuItem.click; + } + } + items.push(menuItem); + + if (this.commandRegistry.getToggledHandler(commandId, ...args)) { + this._toggledCommands.add(commandId); + } + } else { + items.push(...this.handleElectronDefault(menu, args, options)); + } + } + return items; + } } diff --git a/i18n/en.json b/i18n/en.json index 3f64fd926..418a5ae80 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Network", "serial": "Serial" @@ -388,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -407,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", From c3dc7c63076a54efa6180d36449828c6f912c6e3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 2 Nov 2022 16:36:56 +0100 Subject: [PATCH 088/384] fix: avoid ENOTDIR when opening second instance. If the resource is a file, do not try to `readdir`, but return undefined Closes #1590 Signed-off-by: Akos Kitta --- .../src/electron-main/theia/electron-main-application.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 61bb26cc4..448ad1980 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 @@ -181,8 +181,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { if (!stats) { return undefined; } - if (stats.isFile() && path.endsWith('.ino')) { - return path; + if (stats.isFile()) { + return path.endsWith('.ino') ? path : undefined; } try { const entries = await fs.readdir(path, { withFileTypes: true }); From 103acc4b7e7ab6672ddc0a394123474114e2f8fe Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 2 Nov 2022 16:37:43 +0100 Subject: [PATCH 089/384] fix: allow second instance on macOS Signed-off-by: Akos Kitta --- .../src/electron-main/theia/electron-main-application.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 448ad1980..5e83354da 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 @@ -356,10 +356,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { argv: string[], cwd: string ): Promise { - if ( - !os.isOSX && - (await this.launchFromArgs({ cwd, argv, secondInstance: true })) - ) { + if (await this.launchFromArgs({ cwd, argv, secondInstance: true })) { // Application has received a file in its arguments return; } From cc2d557706dddf2f0acade19644bdf33eaf9d52a Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 3 Nov 2022 16:43:34 +0100 Subject: [PATCH 090/384] fix: relaxed condition to check if resource exists The original (`fs-extra`-based) implementation did not check if the file is writable either. Resources are not writable in mounted AppImages. Closes #1586 Signed-off-by: Akos Kitta --- arduino-ide-extension/src/node/sketches-service-impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 1d1d61221..fbfaca7a0 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -660,7 +660,7 @@ export class SketchesServiceImpl private async exists(pathLike: string): Promise { try { - await fs.access(pathLike, constants.R_OK | constants.W_OK); + await fs.access(pathLike, constants.R_OK); return true; } catch { return false; From f6d112e1f606bd755f9cf872cac5a73de2da5b88 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 3 Nov 2022 17:31:05 +0100 Subject: [PATCH 091/384] fix: escaped regex chars in pattern Closes #1600 Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 1 - .../theia/electron-main-application.ts | 4 ---- .../src/node/sketches-service-impl.ts | 13 ++++++++----- yarn.lock | 5 ----- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 2f86e300e..6d88f9cf4 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -45,7 +45,6 @@ "@types/deepmerge": "^2.2.0", "@types/glob": "^7.2.0", "@types/google-protobuf": "^3.7.2", - "@types/is-valid-path": "^0.1.0", "@types/js-yaml": "^3.12.2", "@types/keytar": "^4.4.0", "@types/lodash.debounce": "^4.0.6", 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 5e83354da..784d8fca9 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 @@ -27,7 +27,6 @@ import { CLOSE_PLOTTER_WINDOW, SHOW_PLOTTER_WINDOW, } from '../../common/ipc-communication'; -import isValidPath = require('is-valid-path'); import { ErrnoException } from '../../node/utils/errors'; app.commandLine.appendSwitch('disable-http-cache'); @@ -206,9 +205,6 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { maybePath: string, cwd: string ): Promise { - if (!isValidPath(maybePath)) { - return undefined; - } if (isAbsolute(maybePath)) { return maybePath; } diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index fbfaca7a0..091bf3455 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -26,6 +26,7 @@ import { LoadSketchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; import { Deferred } from '@theia/core/lib/common/promise-util'; +import { escapeRegExpCharacters } from '@theia/core/lib/common/strings'; import { ServiceError } from './service-error'; import { IsTempSketch, @@ -158,7 +159,7 @@ export class SketchesServiceImpl const sketchName = segments[segments.length - 2]; const sketchFilename = segments[segments.length - 1]; const sketchFileExtension = segments[segments.length - 1].replace( - new RegExp(sketchName), + new RegExp(escapeRegExpCharacters(sketchName)), '' ); if (sketchFileExtension !== '.ino' && sketchFileExtension !== '.pde') { @@ -746,10 +747,12 @@ async function isInvalidSketchNameError( if (ino) { const sketchFolderPath = path.dirname(requestSketchPath); const sketchName = path.basename(sketchFolderPath); - const pattern = `${invalidSketchNameErrorRegExpPrefix}${path.join( - sketchFolderPath, - `${sketchName}.ino` - )}`.replace(/\\/g, '\\\\'); // make windows path separator with \\ to have a valid regexp. + const pattern = escapeRegExpCharacters( + `${invalidSketchNameErrorRegExpPrefix}${path.join( + sketchFolderPath, + `${sketchName}.ino` + )}` + ); if (new RegExp(pattern, 'i').test(cliErr.details)) { try { await fs.access(requestSketchPath); diff --git a/yarn.lock b/yarn.lock index 54c90a4aa..b49ed614a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3118,11 +3118,6 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/is-valid-path@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@types/is-valid-path/-/is-valid-path-0.1.0.tgz#d5c6e96801303112c9626d44268c6fabc72d272f" - integrity sha512-2ontWtpN8O2nf5S7EjDDJ0DwrRa2t7wmS3Wmo322yWYG6yFBYC1QCaLhz4Iz+mzJy8Kf4zP5yVyEd1ANPDmOFQ== - "@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" From 3735553003a792fe0f8fc2c97a1f5c3d0fce3fd7 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 7 Nov 2022 18:31:28 +0100 Subject: [PATCH 092/384] fix: flawed timing issue when opening editors From now on, the editor widget open promise resolution does not rely on internal Theia events but solely on @phosphor's `isAttached`/`isVisible` properties. The editor widget promise resolves with the next task after a navigation frame so the browser can render the widget. Closes #1612 Signed-off-by: Akos Kitta --- .../contributions/open-sketch-files.ts | 98 ++++++++++--------- 1 file changed, 51 insertions(+), 47 deletions(-) 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 858719c41..7f937059c 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -1,5 +1,5 @@ import { nls } from '@theia/core/lib/common/nls'; -import { inject, injectable } from '@theia/core/shared/inversify'; +import { injectable } from '@theia/core/shared/inversify'; import type { EditorOpenerOptions } from '@theia/editor/lib/browser/editor-manager'; import { Later } from '../../common/nls'; import { Sketch, SketchesError } from '../../common/protocol'; @@ -15,14 +15,9 @@ import { ApplicationError } from '@theia/core/lib/common/application-error'; import { Deferred, wait } from '@theia/core/lib/common/promise-util'; import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; -import { ContextKeyService as VSCodeContextKeyService } from '@theia/monaco-editor-core/esm/vs/platform/contextkey/browser/contextKeyService'; @injectable() export class OpenSketchFiles extends SketchContribution { - @inject(VSCodeContextKeyService) - private readonly contextKeyService: VSCodeContextKeyService; - override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketchFiles.Commands.OPEN_SKETCH_FILES, { execute: (uri: URI) => this.openSketchFiles(uri), @@ -135,39 +130,36 @@ export class OpenSketchFiles extends SketchContribution { const widget = this.editorManager.all.find( (widget) => widget.editor.uri.toString() === uri ); + if (widget && !forceOpen) { + return widget; + } + const disposables = new DisposableCollection(); - if (!widget || forceOpen) { - const deferred = new Deferred(); + const deferred = new Deferred(); + // An editor can be in two primary states: + // - The editor is not yet opened. The `widget` is `undefined`. With `editorManager#open`, Theia will create an editor and fire an `editorManager#onCreated` event. + // - The editor is opened. Can be active, current, or open. + // - If the editor has the focus (the cursor blinks in the editor): it's the active editor. + // - If the editor does not have the focus (the focus is on a different widget or the context menu is opened in the editor): it's the current editor. + // - If the editor is not the top editor in the main area, it's opened. + if (!widget) { + // If the widget is `undefined`, IDE2 expects one `onCreate` event. Subscribe to the `onCreated` event + // and resolve the promise with the editor only when the new editor's visibility changes. disposables.push( this.editorManager.onCreated((editor) => { if (editor.editor.uri.toString() === uri) { - if (editor.isVisible) { - disposables.dispose(); + if (editor.isAttached && editor.isVisible) { deferred.resolve(editor); } else { - // In Theia, the promise resolves after opening the editor, but the editor is neither attached to the DOM, nor visible. - // This is a hack to first get an event from monaco after the widget update request, then IDE2 waits for the next monaco context key event. - // Here, the monaco context key event is not used, but this is the first event after the editor is visible in the UI. disposables.push( - (editor.editor as MonacoEditor).onDidResize((dimension) => { - if (dimension) { - const isKeyOwner = ( - arg: unknown - ): arg is { key: string } => { - if (typeof arg === 'object') { - const object = arg as Record; - return typeof object['key'] === 'string'; - } - return false; - }; - disposables.push( - this.contextKeyService.onDidChangeContext((e) => { - // `commentIsEmpty` is the first context key change event received from monaco after the editor is for real visible in the UI. - if (isKeyOwner(e) && e.key === 'commentIsEmpty') { - deferred.resolve(editor); - disposables.dispose(); - } - }) + editor.onDidChangeVisibility((visible) => { + if (visible) { + // wait an animation frame. although the visible and attached props are true the editor is not there. + // let the browser render the widget + setTimeout( + () => + requestAnimationFrame(() => deferred.resolve(editor)), + 0 ); } }) @@ -176,29 +168,41 @@ export class OpenSketchFiles extends SketchContribution { } }) ); - this.editorManager.open( + } + + this.editorManager + .open( new URI(uri), options ?? { mode: 'reveal', preview: false, counter: 0, } + ) + .then((editorWidget) => { + // If the widget was defined, it was already opened. + // The editor is expected to be attached to the shell and visible in the UI. + // The deferred promise does not have to wait for the `editorManager#onCreated` event. + // It can resolve earlier. + if (!widget) { + deferred.resolve(editorWidget); + } + }); + + const timeout = 5_000; // number of ms IDE2 waits for the editor to show up in the UI + const result = await Promise.race([ + deferred.promise, + wait(timeout).then(() => { + disposables.dispose(); + return 'timeout'; + }), + ]); + if (result === 'timeout') { + console.warn( + `Timeout after ${timeout} millis. The editor has not shown up in time. URI: ${uri}` ); - const timeout = 5_000; // number of ms IDE2 waits for the editor to show up in the UI - const result = await Promise.race([ - deferred.promise, - wait(timeout).then(() => { - disposables.dispose(); - return 'timeout'; - }), - ]); - if (result === 'timeout') { - console.warn( - `Timeout after ${timeout} millis. The editor has not shown up in time. URI: ${uri}` - ); - } - return result; } + return result; } } export namespace OpenSketchFiles { From d24a3911f810a32dec42c29c0d0ae4664c3cf152 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 8 Nov 2022 11:40:50 +0100 Subject: [PATCH 093/384] fix: workaround for arduino/arduino-cli#1968 Do not try to parse the original `NotFound` error message, but look for a sketch somewhere in the requested path. Signed-off-by: Akos Kitta --- .../contributions/open-sketch-files.ts | 2 +- .../theia/electron-main-application.ts | 58 ++-------- .../src/node/sketches-service-impl.ts | 100 ++++++++++-------- 3 files changed, 65 insertions(+), 95 deletions(-) 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 7f937059c..99ccbd085 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -102,7 +102,7 @@ export class OpenSketchFiles extends SketchContribution { ): Promise { const { invalidMainSketchUri } = err.data; requestAnimationFrame(() => this.messageService.error(err.message)); - await wait(10); // let IDE2 toast the error message. + await wait(250); // let IDE2 open the editor and toast the error message, then open the modal dialog const movedSketch = await promptMoveSketch(invalidMainSketchUri, { fileService: this.fileService, sketchService: this.sketchService, 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 784d8fca9..6cc4ad114 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 @@ -9,7 +9,7 @@ import { import { fork } from 'child_process'; import { AddressInfo } from 'net'; import { join, isAbsolute, resolve } from 'path'; -import { promises as fs, Stats } from 'fs'; +import { promises as fs } from 'fs'; import { MaybePromise } 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'; @@ -28,6 +28,7 @@ import { SHOW_PLOTTER_WINDOW, } from '../../common/ipc-communication'; import { ErrnoException } from '../../node/utils/errors'; +import { isAccessibleSketchPath } from '../../node/sketches-service-impl'; app.commandLine.appendSwitch('disable-http-cache'); @@ -145,7 +146,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { event.preventDefault(); const resolvedPath = await this.resolvePath(path, cwd); if (resolvedPath) { - const sketchFolderPath = await this.isValidSketchPath(resolvedPath); + const sketchFolderPath = await isAccessibleSketchPath( + resolvedPath, + true + ); if (sketchFolderPath) { this.openFilePromise.reject(new InterruptWorkspaceRestoreError()); await this.openSketch(sketchFolderPath); @@ -158,49 +162,6 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } } - /** - * The `path` argument is valid, if accessible and either pointing to a `.ino` file, - * or it's a directory, and one of the files in the directory is an `.ino` file. - * - * If `undefined`, `path` was pointing to neither an accessible sketch file nor a sketch folder. - * - * The sketch folder name and sketch file name can be different. This method is not sketch folder name compliant. - * The `path` must be an absolute, resolved path. - */ - private async isValidSketchPath(path: string): Promise { - let stats: Stats | undefined = undefined; - try { - stats = await fs.stat(path); - } catch (err) { - if (ErrnoException.isENOENT(err)) { - return undefined; - } - throw err; - } - if (!stats) { - return undefined; - } - if (stats.isFile()) { - return path.endsWith('.ino') ? path : undefined; - } - try { - const entries = await fs.readdir(path, { withFileTypes: true }); - const sketchFilename = entries - .filter((entry) => entry.isFile() && entry.name.endsWith('.ino')) - .map(({ name }) => name) - .sort((left, right) => left.localeCompare(right))[0]; - if (sketchFilename) { - return join(path, sketchFilename); - } - // If no sketches found in the folder, but the folder exists, - // return with the path of the empty folder and let IDE2's frontend - // figure out the workspace root. - return path; - } catch (err) { - throw err; - } - } - private async resolvePath( maybePath: string, cwd: string @@ -253,7 +214,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { if (!resolvedPath) { continue; } - const sketchFolderPath = await this.isValidSketchPath(resolvedPath); + const sketchFolderPath = await isAccessibleSketchPath( + resolvedPath, + true + ); if (sketchFolderPath) { workspace.file = sketchFolderPath; if (this.isTempSketch.is(workspace.file)) { @@ -284,7 +248,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { if (!resolvedPath) { continue; } - const sketchFolderPath = await this.isValidSketchPath(resolvedPath); + const sketchFolderPath = await isAccessibleSketchPath(resolvedPath, true); if (sketchFolderPath) { path = sketchFolderPath; break; diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 091bf3455..f20723f01 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -734,62 +734,68 @@ function isNotFoundError(err: unknown): err is ServiceError { /** * Tries to detect whether the error was caused by an invalid main sketch file name. - * IDE2 should handle gracefully when there is an invalid sketch folder name. See the [spec](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-root-folder) for details. - * The CLI does not have error codes (https://github.com/arduino/arduino-cli/issues/1762), so IDE2 parses the error message and tries to guess it. + * IDE2 should handle gracefully when there is an invalid sketch folder name. + * See the [spec](https://arduino.github.io/arduino-cli/latest/sketch-specification/#sketch-root-folder) for details. + * The CLI does not have error codes (https://github.com/arduino/arduino-cli/issues/1762), + * IDE2 cannot parse the error message (https://github.com/arduino/arduino-cli/issues/1968#issuecomment-1306936142) + * so it checks if a sketch even if it's invalid can be discovered from the requested path. * Nothing guarantees that the invalid existing main sketch file still exits by the time client performs the sketch move. */ async function isInvalidSketchNameError( cliErr: unknown, requestSketchPath: string ): Promise { - if (isNotFoundError(cliErr)) { - const ino = requestSketchPath.endsWith('.ino'); - if (ino) { - const sketchFolderPath = path.dirname(requestSketchPath); - const sketchName = path.basename(sketchFolderPath); - const pattern = escapeRegExpCharacters( - `${invalidSketchNameErrorRegExpPrefix}${path.join( - sketchFolderPath, - `${sketchName}.ino` - )}` - ); - if (new RegExp(pattern, 'i').test(cliErr.details)) { - try { - await fs.access(requestSketchPath); - return requestSketchPath; - } catch { - return undefined; - } - } - } else { - try { - const resources = await fs.readdir(requestSketchPath, { - withFileTypes: true, - }); - return ( - resources - .filter((resource) => resource.isFile()) - .filter((resource) => resource.name.endsWith('.ino')) - // A folder might contain multiple sketches. It's OK to ick the first one as IDE2 cannot do much, - // but ensure a deterministic behavior as `readdir(3)` does not guarantee an order. Sort them. - .sort(({ name: left }, { name: right }) => - left.localeCompare(right) - ) - .map(({ name }) => name) - .map((name) => path.join(requestSketchPath, name))[0] - ); - } catch (err) { - if (ErrnoException.isENOENT(err) || ErrnoException.isENOTDIR(err)) { - return undefined; - } - throw err; - } + return isNotFoundError(cliErr) + ? isAccessibleSketchPath(requestSketchPath) + : undefined; +} + +/** + * The `path` argument is valid, if accessible and either pointing to a `.ino` file, + * or it's a directory, and one of the files in the directory is an `.ino` file. + * + * `undefined` if `path` was pointing to neither an accessible sketch file nor a sketch folder. + * + * The sketch folder name and sketch file name can be different. This method is not sketch folder name compliant. + * The `path` must be an absolute, resolved path. This method does not handle EACCES (Permission denied) errors. + * + * When `fallbackToInvalidFolderPath` is `true`, and the `path` is an accessible folder without any sketch files, + * this method returns with the `path` argument instead of `undefined`. + */ +export async function isAccessibleSketchPath( + path: string, + fallbackToInvalidFolderPath = false +): Promise { + let stats: Stats | undefined = undefined; + try { + stats = await fs.stat(path); + } catch (err) { + if (ErrnoException.isENOENT(err)) { + return undefined; } + throw err; + } + if (!stats) { + return undefined; + } + if (stats.isFile()) { + return path.endsWith('.ino') ? path : undefined; + } + const entries = await fs.readdir(path, { withFileTypes: true }); + const sketchFilename = entries + .filter((entry) => entry.isFile() && entry.name.endsWith('.ino')) + .map(({ name }) => name) + // A folder might contain multiple sketches. It's OK to pick the first one as IDE2 cannot do much, + // but ensure a deterministic behavior as `readdir(3)` does not guarantee an order. Sort them. + .sort((left, right) => left.localeCompare(right))[0]; + if (sketchFilename) { + return join(path, sketchFilename); } - return undefined; + // If no sketches found in the folder, but the folder exists, + // return with the path of the empty folder and let IDE2's frontend + // figure out the workspace root. + return fallbackToInvalidFolderPath ? path : undefined; } -const invalidSketchNameErrorRegExpPrefix = - '.*: main file missing from sketch: '; /* * When a new sketch is created, add a suffix to distinguish it From 1a7784a54096d8ecb684b0c23ffd4b4356622dfd Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 14 Nov 2022 15:57:06 +0100 Subject: [PATCH 094/384] feat: progress for the remote sketch creation Closes #1668 Signed-off-by: Akos Kitta --- .../browser/contributions/new-cloud-sketch.ts | 187 +++++++++++++++--- .../src/browser/style/dialogs.css | 10 +- i18n/en.json | 4 +- 3 files changed, 167 insertions(+), 34 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts index d7fb671bd..c61852ca5 100644 --- a/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts @@ -1,9 +1,22 @@ -import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { DialogError } from '@theia/core/lib/browser/dialogs'; import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; import { CompositeTreeNode } from '@theia/core/lib/browser/tree'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Widget } from '@theia/core/lib/browser/widgets/widget'; +import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { + Progress, + ProgressUpdate, +} from '@theia/core/lib/common/message-service-protocol'; import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { WorkspaceInputDialogProps } from '@theia/workspace/lib/browser/workspace-input-dialog'; +import { v4 } from 'uuid'; import { MainMenuManager } from '../../common/main-menu-manager'; import type { AuthenticationSession } from '../../node/auth/types'; import { AuthenticationClientService } from '../auth/authentication-client-service'; @@ -90,7 +103,7 @@ export class NewCloudSketch extends Contribution { private async createNewSketch( initialValue?: string | undefined - ): Promise { + ): Promise { const widget = await this.widgetContribution.widget; const treeModel = this.treeModelFrom(widget); if (!treeModel) { @@ -102,34 +115,50 @@ export class NewCloudSketch extends Contribution { if (!rootNode) { return undefined; } + return this.openWizard(rootNode, treeModel, initialValue); + } - const newSketchName = await this.newSketchName(rootNode, initialValue); - if (!newSketchName) { - return undefined; - } - let result: Create.Sketch | undefined | 'conflict'; - try { - result = await this.createApi.createSketch(newSketchName); - } catch (err) { - if (isConflict(err)) { - result = 'conflict'; - } else { - throw err; + private withProgress( + value: string, + treeModel: CloudSketchbookTreeModel + ): (progress: Progress) => Promise { + return async (progress: Progress) => { + let result: Create.Sketch | undefined | 'conflict'; + try { + progress.report({ + message: nls.localize( + 'arduino/cloudSketch/creating', + "Creating remote sketch '{0}'...", + value + ), + }); + result = await this.createApi.createSketch(value); + } catch (err) { + if (isConflict(err)) { + result = 'conflict'; + } else { + throw err; + } + } finally { + if (result) { + progress.report({ + message: nls.localize( + 'arduino/cloudSketch/synchronizing', + "Synchronizing sketchbook, pulling '{0}'...", + value + ), + }); + await treeModel.refresh(); + } + } + if (result === 'conflict') { + return this.createNewSketch(value); } - } finally { if (result) { - await treeModel.refresh(); + return this.open(treeModel, result); } - } - - if (result === 'conflict') { - return this.createNewSketch(newSketchName); - } - - if (result) { - return this.open(treeModel, result); - } - return undefined; + return undefined; + }; } private async open( @@ -183,14 +212,15 @@ export class NewCloudSketch extends Contribution { return undefined; } - private async newSketchName( + private async openWizard( rootNode: CompositeTreeNode, + treeModel: CloudSketchbookTreeModel, initialValue?: string | undefined - ): Promise { + ): Promise { const existingNames = rootNode.children .filter(CloudSketchbookTree.CloudSketchDirNode.is) .map(({ fileStat }) => fileStat.name); - return new WorkspaceInputDialog( + return new NewCloudSketchDialog( { title: nls.localize( 'arduino/newCloudSketch/newSketchTitle', @@ -216,7 +246,8 @@ export class NewCloudSketch extends Contribution { ); }, }, - this.labelProvider + this.labelProvider, + (value) => this.withProgress(value, treeModel) ).open(); } } @@ -245,3 +276,97 @@ function isErrorWithStatusOf( } return false; } + +@injectable() +class NewCloudSketchDialog extends WorkspaceInputDialog { + constructor( + @inject(WorkspaceInputDialogProps) + protected override readonly props: WorkspaceInputDialogProps, + @inject(LabelProvider) + protected override readonly labelProvider: LabelProvider, + private readonly withProgress: ( + value: string + ) => (progress: Progress) => Promise + ) { + super(props, labelProvider); + } + protected override async accept(): Promise { + if (!this.resolve) { + return; + } + this.acceptCancellationSource.cancel(); + this.acceptCancellationSource = new CancellationTokenSource(); + const token = this.acceptCancellationSource.token; + const value = this.value; + const error = await this.isValid(value, 'open'); + if (token.isCancellationRequested) { + return; + } + if (!DialogError.getResult(error)) { + this.setErrorMessage(error); + } else { + const spinner = document.createElement('div'); + spinner.classList.add('spinner'); + const disposables = new DisposableCollection(); + try { + this.toggleButtons(true); + disposables.push(Disposable.create(() => this.toggleButtons(false))); + + const closeParent = this.closeCrossNode.parentNode; + closeParent?.removeChild(this.closeCrossNode); + disposables.push( + Disposable.create(() => { + closeParent?.appendChild(this.closeCrossNode); + }) + ); + + this.errorMessageNode.classList.add('progress'); + disposables.push( + Disposable.create(() => + this.errorMessageNode.classList.remove('progress') + ) + ); + + const errorParent = this.errorMessageNode.parentNode; + errorParent?.insertBefore(spinner, this.errorMessageNode); + disposables.push( + Disposable.create(() => errorParent?.removeChild(spinner)) + ); + + const cancellationSource = new CancellationTokenSource(); + const progress: Progress = { + id: v4(), + cancel: () => cancellationSource.cancel(), + report: (update: ProgressUpdate) => { + this.setProgressMessage(update); + }, + result: Promise.resolve(value), + }; + await this.withProgress(value)(progress); + } finally { + disposables.dispose(); + } + this.resolve(value); + Widget.detach(this); + } + } + + private toggleButtons(disabled: boolean): void { + if (this.acceptButton) { + this.acceptButton.disabled = disabled; + } + if (this.closeButton) { + this.closeButton.disabled = disabled; + } + } + + private setProgressMessage(update: ProgressUpdate): void { + if (update.work && update.work.done === update.work.total) { + this.errorMessageNode.innerText = ''; + } else { + if (update.message) { + this.errorMessageNode.innerText = update.message; + } + } + } +} diff --git a/arduino-ide-extension/src/browser/style/dialogs.css b/arduino-ide-extension/src/browser/style/dialogs.css index 668c389b2..f48e7e25b 100644 --- a/arduino-ide-extension/src/browser/style/dialogs.css +++ b/arduino-ide-extension/src/browser/style/dialogs.css @@ -55,6 +55,7 @@ align-items: center; } +.p-Widget.dialogOverlay .dialogControl .spinner, .p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow .spinner { background: var(--theia-icon-loading) center center no-repeat; animation: theia-spin 1.25s linear infinite; @@ -63,11 +64,11 @@ } .p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow:first-child { - margin-top: 0px; + margin-top: 0px; height: 32px; } -.fl1{ +.fl1 { flex: 1; } @@ -85,3 +86,8 @@ max-height: 400px; } } + +.p-Widget.dialogOverlay .error.progress { + color: var(--theia-button-background); + align-self: center; +} diff --git a/i18n/en.json b/i18n/en.json index 418a5ae80..b5659bcf0 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -120,7 +120,9 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "new": "New Remote Sketch" + "creating": "Creating remote sketch '{0}'...", + "new": "New Remote Sketch", + "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." }, "common": { "all": "All", From 9cec643cab07f29b02262a705b252b65bc99a84b Mon Sep 17 00:00:00 2001 From: per1234 Date: Thu, 17 Nov 2022 02:44:56 -0800 Subject: [PATCH 095/384] Fix nightly build links in issue forms The issue forms are configured to request the contributor to test using the nightly build of Arduino IDE before submitting an issue in order to make sure the bug or feature request has not already been resolved. Some time ago, the repository's readme contained a table of download links. The links in the issue forms pointed there. That table was replaced with a link to the official "Software" page in order to reduce unnecessary verbosity and maintenance burden of the project's documentation content. The issue form links were not updated at that time. The resulting additional link in the chain made obtaining the nightly build less convenient for the contributor to obtain. The links are hereby updated to point directly to the list of nightly build download links on the arduino.cc "Software" page. --- .github/ISSUE_TEMPLATE/bug-report.yml | 4 ++-- .github/ISSUE_TEMPLATE/feature-request.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index a493028d0..62db515f8 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -30,7 +30,7 @@ body: description: | Which version of the Arduino IDE are you using? See **Help > About Arduino IDE** in the Arduino IDE menus (**Arduino IDE > About Arduino IDE** on macOS). - This should be the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds). + This should be the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds). validations: required: true - type: dropdown @@ -68,7 +68,7 @@ body: options: - label: I searched for previous reports in [the issue tracker](https://github.com/arduino/arduino-ide/issues?q=) required: true - - label: I verified the problem still occurs when using the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds) + - label: I verified the problem still occurs when using the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds) required: true - label: My report contains all necessary details required: true diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index cdc54c3b6..dbfc57856 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -25,7 +25,7 @@ body: description: | Which version of the Arduino IDE are you using? See **Help > About Arduino IDE** in the Arduino IDE menus (**Arduino IDE > About Arduino IDE** on macOS). - This should be the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds). + This should be the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds). validations: required: true - type: dropdown @@ -63,7 +63,7 @@ body: options: - label: I searched for previous requests in [the issue tracker](https://github.com/arduino/arduino-ide/issues?q=) required: true - - label: I verified the feature was still missing when using the latest [nightly build](https://github.com/arduino/arduino-ide#nightly-builds) + - label: I verified the feature was still missing when using the latest [nightly build](https://www.arduino.cc/en/software#nightly-builds) required: true - label: My request contains all necessary details required: true From f1144efb930bf131ace784301e7bd2a588a4c40a Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 17 Nov 2022 12:43:28 +0100 Subject: [PATCH 096/384] Use 0.29.0 CLI in IDE2 (#1683) --- arduino-ide-extension/package.json | 2 +- .../cli/commands/v1/commands_grpc_pb.d.ts | 47 - .../cli/commands/v1/commands_grpc_pb.js | 102 -- .../arduino/cli/commands/v1/commands_pb.d.ts | 160 --- .../cc/arduino/cli/commands/v1/commands_pb.js | 1181 ----------------- .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 4 + .../cc/arduino/cli/commands/v1/lib_pb.js | 32 +- .../src/node/core-client-provider.ts | 6 +- .../src/node/grpc-progressible.ts | 9 +- 9 files changed, 39 insertions(+), 1504 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 6d88f9cf4..d62235dd7 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -158,7 +158,7 @@ ], "arduino": { "cli": { - "version": "0.28.0" + "version": "0.29.0" }, "fwuploader": { "version": "2.2.2" diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts index 65af18363..f4adeb149 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 @@ -22,9 +22,6 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition; responseDeserialize: grpc.deserialize; } -interface IArduinoCoreServiceService_IUpdateCoreLibrariesIndex extends grpc.MethodDefinition { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateCoreLibrariesIndex"; - requestStream: false; - responseStream: true; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} -interface IArduinoCoreServiceService_IOutdated extends grpc.MethodDefinition { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Outdated"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} -interface IArduinoCoreServiceService_IUpgrade extends grpc.MethodDefinition { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Upgrade"; - requestStream: false; - responseStream: true; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} interface IArduinoCoreServiceService_IVersion extends grpc.MethodDefinition { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Version"; requestStream: false; @@ -448,9 +418,6 @@ export interface IArduinoCoreServiceServer { destroy: grpc.handleUnaryCall; updateIndex: grpc.handleServerStreamingCall; updateLibrariesIndex: grpc.handleServerStreamingCall; - updateCoreLibrariesIndex: grpc.handleServerStreamingCall; - outdated: grpc.handleUnaryCall; - upgrade: grpc.handleServerStreamingCall; version: grpc.handleUnaryCall; newSketch: grpc.handleUnaryCall; loadSketch: grpc.handleUnaryCall; @@ -500,13 +467,6 @@ export interface IArduinoCoreServiceClient { updateIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, options?: Partial): grpc.ClientReadableStream; updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; - updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, options?: Partial): grpc.ClientReadableStream; - updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; - outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, options?: Partial): grpc.ClientReadableStream; - upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; @@ -609,13 +569,6 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public updateIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; public updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, options?: Partial): grpc.ClientReadableStream; public updateLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; - public updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, options?: Partial): grpc.ClientReadableStream; - public updateCoreLibrariesIndex(request: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; - public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - public outdated(request: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse) => void): grpc.ClientUnaryCall; - public upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, options?: Partial): grpc.ClientReadableStream; - public upgrade(request: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; public version(request: cc_arduino_cli_commands_v1_commands_pb.VersionRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.VersionResponse) => void): grpc.ClientUnaryCall; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js index 2251692b1..1e4a70058 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 @@ -599,28 +599,6 @@ function deserialize_cc_arduino_cli_commands_v1_NewSketchResponse(buffer_arg) { return cc_arduino_cli_commands_v1_commands_pb.NewSketchResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_OutdatedRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.OutdatedRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_OutdatedRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_OutdatedResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.OutdatedResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_OutdatedResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_PlatformDownloadRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformDownloadRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformDownloadRequest'); @@ -775,28 +753,6 @@ function deserialize_cc_arduino_cli_commands_v1_SupportedUserFieldsResponse(buff return cc_arduino_cli_commands_v1_upload_pb.SupportedUserFieldsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_UpdateIndexRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpdateIndexRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpdateIndexRequest'); @@ -841,28 +797,6 @@ function deserialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse(buf return cc_arduino_cli_commands_v1_commands_pb.UpdateLibrariesIndexResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_UpgradeRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpgradeRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_UpgradeRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_UpgradeResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UpgradeResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_UpgradeResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_UploadRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_upload_pb.UploadRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.UploadRequest'); @@ -1015,42 +949,6 @@ updateLibrariesIndex: { responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateLibrariesIndexResponse, }, - // Update packages indexes for both Cores and Libraries -updateCoreLibrariesIndex: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateCoreLibrariesIndex', - requestStream: false, - responseStream: true, - requestType: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexRequest, - responseType: cc_arduino_cli_commands_v1_commands_pb.UpdateCoreLibrariesIndexResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateCoreLibrariesIndexResponse, - }, - // Outdated returns a message with a list of outdated Cores and Libraries -outdated: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Outdated', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_commands_v1_commands_pb.OutdatedRequest, - responseType: cc_arduino_cli_commands_v1_commands_pb.OutdatedResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_OutdatedRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_OutdatedRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_OutdatedResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_OutdatedResponse, - }, - // Upgrade both Cores and Libraries -upgrade: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Upgrade', - requestStream: false, - responseStream: true, - requestType: cc_arduino_cli_commands_v1_commands_pb.UpgradeRequest, - responseType: cc_arduino_cli_commands_v1_commands_pb.UpgradeResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_UpgradeRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_UpgradeRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_UpgradeResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpgradeResponse, - }, // Get the version of Arduino CLI in use. version: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Version', 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 ff43f4ea0..471a774ca 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 @@ -313,166 +313,6 @@ export namespace UpdateLibrariesIndexResponse { } } -export class UpdateCoreLibrariesIndexRequest extends jspb.Message { - - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateCoreLibrariesIndexRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpdateCoreLibrariesIndexRequest.AsObject; - static toObject(includeInstance: boolean, msg: UpdateCoreLibrariesIndexRequest): UpdateCoreLibrariesIndexRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: UpdateCoreLibrariesIndexRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpdateCoreLibrariesIndexRequest; - static deserializeBinaryFromReader(message: UpdateCoreLibrariesIndexRequest, reader: jspb.BinaryReader): UpdateCoreLibrariesIndexRequest; -} - -export namespace UpdateCoreLibrariesIndexRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - } -} - -export class UpdateCoreLibrariesIndexResponse extends jspb.Message { - - hasDownloadProgress(): boolean; - clearDownloadProgress(): void; - getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; - setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateCoreLibrariesIndexResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpdateCoreLibrariesIndexResponse.AsObject; - static toObject(includeInstance: boolean, msg: UpdateCoreLibrariesIndexResponse): UpdateCoreLibrariesIndexResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: UpdateCoreLibrariesIndexResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpdateCoreLibrariesIndexResponse; - static deserializeBinaryFromReader(message: UpdateCoreLibrariesIndexResponse, reader: jspb.BinaryReader): UpdateCoreLibrariesIndexResponse; -} - -export namespace UpdateCoreLibrariesIndexResponse { - export type AsObject = { - downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, - } -} - -export class OutdatedRequest extends jspb.Message { - - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): OutdatedRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): OutdatedRequest.AsObject; - static toObject(includeInstance: boolean, msg: OutdatedRequest): OutdatedRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: OutdatedRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): OutdatedRequest; - static deserializeBinaryFromReader(message: OutdatedRequest, reader: jspb.BinaryReader): OutdatedRequest; -} - -export namespace OutdatedRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - } -} - -export class OutdatedResponse extends jspb.Message { - clearOutdatedLibrariesList(): void; - getOutdatedLibrariesList(): Array; - setOutdatedLibrariesList(value: Array): OutdatedResponse; - addOutdatedLibraries(value?: cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary, index?: number): cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary; - - clearOutdatedPlatformsList(): void; - getOutdatedPlatformsList(): Array; - setOutdatedPlatformsList(value: Array): OutdatedResponse; - addOutdatedPlatforms(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): OutdatedResponse.AsObject; - static toObject(includeInstance: boolean, msg: OutdatedResponse): OutdatedResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: OutdatedResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): OutdatedResponse; - static deserializeBinaryFromReader(message: OutdatedResponse, reader: jspb.BinaryReader): OutdatedResponse; -} - -export namespace OutdatedResponse { - export type AsObject = { - outdatedLibrariesList: Array, - outdatedPlatformsList: Array, - } -} - -export class UpgradeRequest extends jspb.Message { - - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpgradeRequest; - - getSkipPostInstall(): boolean; - setSkipPostInstall(value: boolean): UpgradeRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpgradeRequest.AsObject; - static toObject(includeInstance: boolean, msg: UpgradeRequest): UpgradeRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: UpgradeRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpgradeRequest; - static deserializeBinaryFromReader(message: UpgradeRequest, reader: jspb.BinaryReader): UpgradeRequest; -} - -export namespace UpgradeRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - skipPostInstall: boolean, - } -} - -export class UpgradeResponse extends jspb.Message { - - hasProgress(): boolean; - clearProgress(): void; - getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; - setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpgradeResponse; - - - hasTaskProgress(): boolean; - clearTaskProgress(): void; - getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; - setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): UpgradeResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): UpgradeResponse.AsObject; - static toObject(includeInstance: boolean, msg: UpgradeResponse): UpgradeResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: UpgradeResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): UpgradeResponse; - static deserializeBinaryFromReader(message: UpgradeResponse, reader: jspb.BinaryReader): UpgradeResponse; -} - -export namespace UpgradeResponse { - export type AsObject = { - progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, - taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, - } -} - export class VersionRequest extends jspb.Message { serializeBinary(): Uint8Array; 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 350a37d8e..51ae173e3 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 @@ -45,16 +45,10 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LoadSketchRequest', null, gl goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LoadSketchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.NewSketchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.NewSketchResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.OutdatedRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.OutdatedResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.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); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpgradeRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpgradeResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.VersionRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.VersionResponse', null, global); /** @@ -288,132 +282,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse'; } -/** - * 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.UpdateCoreLibrariesIndexRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest'; -} -/** - * 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.UpdateCoreLibrariesIndexResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse'; -} -/** - * 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.OutdatedRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.OutdatedRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.OutdatedRequest.displayName = 'proto.cc.arduino.cli.commands.v1.OutdatedRequest'; -} -/** - * 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.OutdatedResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.OutdatedResponse.repeatedFields_, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.OutdatedResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.OutdatedResponse.displayName = 'proto.cc.arduino.cli.commands.v1.OutdatedResponse'; -} -/** - * 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.UpgradeRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpgradeRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.UpgradeRequest.displayName = 'proto.cc.arduino.cli.commands.v1.UpgradeRequest'; -} -/** - * 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.UpgradeResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.UpgradeResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.UpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpgradeResponse'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -2416,1055 +2284,6 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasDownl -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.UpdateCoreLibrariesIndexRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.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.UpdateCoreLibrariesIndexRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest; - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.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.UpdateCoreLibrariesIndexRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.getInstance = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - - - -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.UpdateCoreLibrariesIndexResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.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.UpdateCoreLibrariesIndexResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.toObject = function(includeInstance, msg) { - var f, obj = { - downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.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.UpdateCoreLibrariesIndexResponse} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse; - return proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setDownloadProgress(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.UpdateCoreLibrariesIndexResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.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.UpdateCoreLibrariesIndexResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDownloadProgress(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter - ); - } -}; - - -/** - * optional DownloadProgress download_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.getDownloadProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.setDownloadProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.clearDownloadProgress = function() { - return this.setDownloadProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpdateCoreLibrariesIndexResponse.prototype.hasDownloadProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.OutdatedRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.OutdatedRequest; - return proto.cc.arduino.cli.commands.v1.OutdatedRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.OutdatedRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.getInstance = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.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.OutdatedRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.OutdatedRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.repeatedFields_ = [1,2]; - - - -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.OutdatedResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.OutdatedResponse.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.OutdatedResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.toObject = function(includeInstance, msg) { - var f, obj = { - outdatedLibrariesList: jspb.Message.toObjectList(msg.getOutdatedLibrariesList(), - cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.toObject, includeInstance), - outdatedPlatformsList: jspb.Message.toObjectList(msg.getOutdatedPlatformsList(), - cc_arduino_cli_commands_v1_common_pb.Platform.toObject, includeInstance) - }; - - 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.OutdatedResponse} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.OutdatedResponse; - return proto.cc.arduino.cli.commands.v1.OutdatedResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.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_lib_pb.InstalledLibrary; - reader.readMessage(value,cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.deserializeBinaryFromReader); - msg.addOutdatedLibraries(value); - break; - case 2: - var value = new cc_arduino_cli_commands_v1_common_pb.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); - msg.addOutdatedPlatforms(value); - 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.OutdatedResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.OutdatedResponse.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.OutdatedResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getOutdatedLibrariesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary.serializeBinaryToWriter - ); - } - f = message.getOutdatedPlatformsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 2, - f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter - ); - } -}; - - -/** - * repeated InstalledLibrary outdated_libraries = 1; - * @return {!Array} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.getOutdatedLibrariesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_lib_pb.InstalledLibrary, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.setOutdatedLibrariesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.InstalledLibrary=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.InstalledLibrary} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.addOutdatedLibraries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.InstalledLibrary, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.clearOutdatedLibrariesList = function() { - return this.setOutdatedLibrariesList([]); -}; - - -/** - * repeated Platform outdated_platforms = 2; - * @return {!Array} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.getOutdatedPlatformsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 2)); -}; - - -/** - * @param {!Array} value - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.setOutdatedPlatformsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.Platform=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.addOutdatedPlatforms = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.cc.arduino.cli.commands.v1.Platform, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.OutdatedResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.OutdatedResponse.prototype.clearOutdatedPlatformsList = function() { - return this.setOutdatedPlatformsList([]); -}; - - - - - -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.UpgradeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpgradeRequest.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.UpgradeRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - 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.UpgradeRequest} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpgradeRequest; - return proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setSkipPostInstall(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpgradeRequest.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.UpgradeRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } - f = message.getSkipPostInstall(); - if (f) { - writer.writeBool( - 2, - f - ); - } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.getInstance = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bool skip_post_install = 2; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.getSkipPostInstall = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeRequest.prototype.setSkipPostInstall = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - - - - -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.UpgradeResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpgradeResponse.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.UpgradeResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.toObject = function(includeInstance, msg) { - var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) - }; - - if (includeInstance) { - 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.UpgradeResponse} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpgradeResponse; - return proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setProgress(value); - break; - case 2: - var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); - msg.setTaskProgress(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpgradeResponse.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.UpgradeResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getProgress(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter - ); - } - f = message.getTaskProgress(); - if (f != null) { - writer.writeMessage( - 2, - f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter - ); - } -}; - - -/** - * optional DownloadProgress progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional TaskProgress task_progress = 2; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.getTaskProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 2)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpgradeResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.clearTaskProgress = function() { - return this.setTaskProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.UpgradeResponse.prototype.hasTaskProgress = function() { - return jspb.Message.getField(this, 2) != null; -}; - - - - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. 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 93c23d8f3..1f02e1682 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 @@ -807,6 +807,9 @@ export class Library extends jspb.Message { getCompatibleWithMap(): jspb.Map; clearCompatibleWithMap(): void; + getInDevelopment(): boolean; + setInDevelopment(value: boolean): Library; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Library.AsObject; @@ -847,6 +850,7 @@ export namespace Library { providesIncludesList: Array, compatibleWithMap: Array<[string, boolean]>, + inDevelopment: boolean, } } 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 4b3c39af4..0ccd1856c 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 @@ -5458,7 +5458,8 @@ proto.cc.arduino.cli.commands.v1.Library.toObject = function(includeInstance, ms layout: jspb.Message.getFieldWithDefault(msg, 25, 0), examplesList: (f = jspb.Message.getRepeatedField(msg, 26)) == null ? undefined : f, providesIncludesList: (f = jspb.Message.getRepeatedField(msg, 27)) == null ? undefined : f, - compatibleWithMap: (f = msg.getCompatibleWithMap()) ? f.toObject(includeInstance, undefined) : [] + compatibleWithMap: (f = msg.getCompatibleWithMap()) ? f.toObject(includeInstance, undefined) : [], + inDevelopment: jspb.Message.getBooleanFieldWithDefault(msg, 29, false) }; if (includeInstance) { @@ -5599,6 +5600,10 @@ proto.cc.arduino.cli.commands.v1.Library.deserializeBinaryFromReader = function( jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readBool, null, "", false); }); break; + case 29: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setInDevelopment(value); + break; default: reader.skipField(); break; @@ -5797,6 +5802,13 @@ proto.cc.arduino.cli.commands.v1.Library.serializeBinaryToWriter = function(mess if (f && f.getLength() > 0) { f.serializeBinary(28, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeBool); } + f = message.getInDevelopment(); + if (f) { + writer.writeBool( + 29, + f + ); + } }; @@ -6334,6 +6346,24 @@ proto.cc.arduino.cli.commands.v1.Library.prototype.clearCompatibleWithMap = func return this;}; +/** + * optional bool in_development = 29; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Library.prototype.getInDevelopment = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 29, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Library} returns this + */ +proto.cc.arduino.cli.commands.v1.Library.prototype.setInDevelopment = function(value) { + return jspb.Message.setProto3BooleanField(this, 29, value); +}; + + diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index bb1251103..f039f6594 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -12,7 +12,6 @@ import { CreateRequest, InitRequest, InitResponse, - UpdateCoreLibrariesIndexResponse, UpdateIndexRequest, UpdateIndexResponse, UpdateLibrariesIndexRequest, @@ -347,10 +346,7 @@ export class CoreClientProvider { } private async doUpdateIndex< - R extends - | UpdateIndexResponse - | UpdateLibrariesIndexResponse - | UpdateCoreLibrariesIndexResponse // not used by IDE2 + R extends UpdateIndexResponse | UpdateLibrariesIndexResponse >( responseProvider: () => grpc.ClientReadableStream, progressHandler?: IndexesUpdateProgressHandler, diff --git a/arduino-ide-extension/src/node/grpc-progressible.ts b/arduino-ide-extension/src/node/grpc-progressible.ts index 7b131f0f2..dbb77750c 100644 --- a/arduino-ide-extension/src/node/grpc-progressible.ts +++ b/arduino-ide-extension/src/node/grpc-progressible.ts @@ -11,7 +11,6 @@ import { ResponseService, } from '../common/protocol/response-service'; import { - UpdateCoreLibrariesIndexResponse, UpdateIndexResponse, UpdateLibrariesIndexResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; @@ -78,16 +77,12 @@ namespace PlatformProgressResponse { }; } } -type IndexProgressResponse = - | UpdateIndexResponse - | UpdateLibrariesIndexResponse - | UpdateCoreLibrariesIndexResponse; +type IndexProgressResponse = UpdateIndexResponse | UpdateLibrariesIndexResponse; namespace IndexProgressResponse { export function is(response: unknown): response is IndexProgressResponse { return ( response instanceof UpdateIndexResponse || - response instanceof UpdateLibrariesIndexResponse || - response instanceof UpdateCoreLibrariesIndexResponse // not used by the IDE2 but available for full typings compatibility + response instanceof UpdateLibrariesIndexResponse ); } export function workUnit(response: IndexProgressResponse): UnitOfWork { From 23c7f5f84818017ad2502455d420a3550dc69c15 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 17 Nov 2022 12:47:21 +0100 Subject: [PATCH 097/384] Updated translation files (#1606) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 18 ++++- i18n/ar.json | 18 ++++- i18n/az.json | 18 ++++- i18n/bg.json | 18 ++++- i18n/ca_ES.json | 18 ++++- i18n/cs.json | 120 ++++++++++++++++------------- i18n/de.json | 18 ++++- i18n/el.json | 18 ++++- i18n/es.json | 146 +++++++++++++++++++---------------- i18n/eu.json | 18 ++++- i18n/fa.json | 192 +++++++++++++++++++++++++--------------------- i18n/fil.json | 18 ++++- i18n/fr.json | 18 ++++- i18n/he.json | 18 ++++- i18n/hu.json | 18 ++++- i18n/id.json | 18 ++++- i18n/it.json | 58 +++++++++----- i18n/ja.json | 24 +++++- i18n/ko.json | 50 ++++++++---- i18n/my_MM.json | 18 ++++- i18n/ne.json | 18 ++++- i18n/nl.json | 18 ++++- i18n/pl.json | 18 ++++- i18n/pt.json | 18 ++++- i18n/ro.json | 18 ++++- i18n/ru.json | 18 ++++- i18n/sr.json | 18 ++++- i18n/tr.json | 18 ++++- i18n/uk.json | 36 ++++++--- i18n/vi.json | 18 ++++- i18n/zh-Hant.json | 18 ++++- i18n/zh.json | 34 +++++--- i18n/zh_TW.json | 18 ++++- 33 files changed, 819 insertions(+), 291 deletions(-) diff --git a/i18n/af.json b/i18n/af.json index 4a029242d..2e3070b32 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Netwerk", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Wys ontfoutings uitset tydens", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketsboek ligging", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/ar.json b/i18n/ar.json index f3dc44662..8996afe6c 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -119,6 +119,9 @@ "syncEditSketches": "المزامنة و التعديل على مشاريعك في Arduino Cloud", "visitArduinoCloud": "قم بزيارة Arduino Cloud من اجل انشاء ملف مشاريع على السحابة" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "تعذر اغلاق مقبس الويب", "unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "شبكة", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "اظهر خرج مطوّل خلال", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "موقع ملف المشاريع", "sketchbook.showAllFiles": "True لعرض كل مجلدات مشاريع داخل المشروع . False افتراضيا", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "تصدير الملف الثنائي المترجم", "moving": "يتم النقل", "movingMsg": "الملف \"{0}\" يجب ان يكون داخل مجلد مشروع مسمى \"{1}\"\nهل انشئ المجلد , ثم انقل الملف و اكمل ؟", - "new": "جديد", + "new": "New Sketch", "openFolder": "فتح المجلد", "openRecent": "فُتِحَ مؤخرا ", "openSketchInNewWindow": "فتح المشروع في نافذة جديدة", @@ -404,6 +416,10 @@ "verify": "تحقق", "verifyOrCompile": "تحقق/ترجم" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "الاجابة على الاستبيان", "dismissSurvey": "لا تظهر مرة اخرى", diff --git a/i18n/az.json b/i18n/az.json index 4c181e3e4..4f98b2d8b 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Network", "serial": "Serial" @@ -349,6 +358,9 @@ "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.", @@ -385,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/bg.json b/i18n/bg.json index 0c4a1fec7..1c009d220 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -119,6 +119,9 @@ "syncEditSketches": "Синхронизирайте и редактирайте на вашите Arduino облачни скици", "visitArduinoCloud": "Посетете Arduino Cloud, за да създадете облачни скици." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Мрежа", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Показване на подробен изход по време на", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Местоположение на скицника", "sketchbook.showAllFiles": "True , за да се покажат всички файлове вътре в скицата. По подразбиране е false.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "Експортиране на компилиран двоичен файл", "moving": "Преместване", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "Нов", + "new": "New Sketch", "openFolder": "Отвори папка", "openRecent": "Отвори Скорошен", "openSketchInNewWindow": "Отвори скицата в нов прозорец", @@ -404,6 +416,10 @@ "verify": "Потвърдете", "verifyOrCompile": "Проверете/компилирайте" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 97d0715e0..8e42dbbd4 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -119,6 +119,9 @@ "syncEditSketches": "Tanca la sessió de sincronització i edita els teus programes del núvol Arduino", "visitArduinoCloud": "Visiteu Arduino Cloud per crear programes al núvol." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Xarxa", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Mostra la sortida detallada durant", + "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": "Ubicació del quadern de programes", "sketchbook.showAllFiles": "True per mostrar tots els fitxers del programa dins del programa. És fals per defecte.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "Exporta el binari compilat", "moving": "Movent-se", "movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta deprograma anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?", - "new": "Nou", + "new": "New Sketch", "openFolder": "Obrir carpeta", "openRecent": "Obre Recent", "openSketchInNewWindow": "Obriu el programa a una finestra nova", @@ -404,6 +416,10 @@ "verify": "Verificar", "verifyOrCompile": "Verificar/Compilar" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/cs.json b/i18n/cs.json index 0fcc2b11a..6f8368b91 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -6,46 +6,46 @@ }, "board": { "board": "Deska {0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Zvolit jinou Desku a Port", "boardInfo": "Info o desce", - "boards": "boards", + "boards": "Desky", "configDialog1": "Pokud chcete nahrát sketch, musíte zvolit jak desku tak i port.", "configDialog2": "Pokud zvolíte jen desku, budete schopni kompilovat sketch, ale nebudete ji moci nahrát do desky.", "couldNotFindPreviouslySelected": "Dříve zvolená deska '{0}' v instalované platformě '{1}' nebyla nalezena. Zvolte prosím manuálně desku kterou chcete použít. Chcete tuto desku zvolit nyní? ", - "disconnected": "Disconnected", + "disconnected": "Odpojeno", "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": "No boards found for \"{0}\"", + "noBoardsFound": "Nenalezeny žádné desky pro \"{0}\"", "noFQBN": "FQBN není dostupné pro zvolenou desku \"{0}\". Máte nainstalované příslušné jádro? ", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Nenalezeny žádné porty", "noPortsSelected": "Nebyl zvolen port pro desku '{0}'.", "noneSelected": "Nebyla zvolena deska.", "openBoardsConfig": "Zvolte jinou desku a port...", "platformMissing": "Platforma pro zvolenou desku '{0}' není nainstalována.", "pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ", "port": "Port {0}", - "portLabel": "Port: {0}", - "ports": "ports", + "portLabel": "Port:{0}", + "ports": "porty", "programmer": "Programátor", "reselectLater": "Zvolit později", - "searchBoard": "Search board", + "searchBoard": "Vyhledat desku", "selectBoard": "Zvolit desku", "selectBoardForInfo": "Prosím zvolte desku pro získání informací o desce.", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", "showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)", - "showAllPorts": "Show all ports", + "showAllPorts": "Ukázat všechny porty", "succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.", "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0}porty" }, "boardsManager": "Manažér desek", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certifikováno Arduinem" }, "bootloader": { - "burnBootloader": "Nahrát zavaděč", - "burningBootloader": "Burning bootloader...", + "burnBootloader": "Vypálit zavaděč", + "burningBootloader": "Vypalování zavaděče...", "doneBurningBootloader": "Nahrání zavaděče bylo dokončeno. " }, "burnBootloader": { @@ -69,20 +69,20 @@ "uploadingCertificates": "Nahrávám certifikát." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", + "checkForUpdates": "Kontrola pro aktualizace", + "installAll": "Instalovat vše", + "noUpdates": "Nejsou k dispozici žádné aktualizace", + "promptUpdateBoards": "Jsou k dispozici aktualizace pro některé z vašich desek ", "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "updatingBoards": "Aktualizuji desky...", + "updatingLibraries": "Aktualizuji knihovny..." }, "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", + "account": "Účet", "chooseSketchVisibility": "Zvolte viditelnost sketche:", "connected": "Připojen", "continue": "Pokračovat", @@ -90,7 +90,7 @@ "donePushing": "Odesílání dokončeno ‘{0}’.", "embed": "Vložit: ", "emptySketchbook": "Umístění projektů je prázdné", - "goToCloud": "Go to Cloud", + "goToCloud": "Jít na Cloud", "learnMore": "Zjistit více", "link": "Adresa: ", "notYetPulled": "Nemohu odeslat do cloudu jelikož z něj ještě nebylo staženo.", @@ -108,19 +108,22 @@ "pushSketch": "Odeslat sketch", "pushSketchMsg": "Toto je veřejná sketch. Před odesláním se prosím ujistěte že jsou smazané citlivé informace ze souboru arduino_secrets.h . Tuto sketch můžete změnit na soukromou v panelu pro sdílení. ", "remote": "Vzdálený", - "remoteSketchbook": "Remote Sketchbook", + "remoteSketchbook": "Odstranit Sketchbook", "share": "Sdílet...", "shareSketch": "Sdílet sketch", "showHideRemoveSketchbook": "Zobrazit/skrýt vzdálenou sketch", "signIn": "Přihlásit se", "signInToCloud": "Přihlásit se do Arduino Cloud", "signOut": "Odhlásit se", - "sync": "Sync", + "sync": "Synchronizovat", "syncEditSketches": "Synchronizovat a editovat sketche v Arduino Cloud", "visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudové sketche" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { - "all": "All", + "all": "Vše", "contributed": "Contributed", "installManually": "Instalovat ručně", "later": "Později", @@ -130,11 +133,11 @@ "oldFormat": "{0}používá stále starý formát `.pde`. Chcete ho převést na soubor s příponou `.ino`?", "partner": "Partner", "processing": "Zpracovávám", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Doporučené", + "retired": "Zastaralý", "selectedOn": "zapnuto{0}", "serialMonitor": "Seriový monitor", - "type": "Type", + "type": "typ", "unknown": "Neznámý", "updateable": "Updatable" }, @@ -162,10 +165,10 @@ }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "Vše", + "default": "Výchozí", + "more": "Více", + "none": "Žádný" } }, "coreContribution": { @@ -174,8 +177,8 @@ }, "daemon": { "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "start": "Spustit Daemon", + "stop": "Zastavit Daemon" }, "debug": { "debugWithMessage": "Debug - {0}", @@ -194,8 +197,8 @@ "decreaseIndent": "Zmenšit odrážku", "increaseFontSize": "Zvýšit velikost písma", "increaseIndent": "Zvětšit odrážku", - "nextError": "Next Error", - "previousError": "Previous Error", + "nextError": "Další chyba", + "previousError": "Předchozí chyba", "revealError": "Reveal Error" }, "electron": { @@ -234,7 +237,7 @@ "visit": "Navštívit Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Zkontrolovat aktualizace", "closeAndInstallButton": "Zavřít a nainstalovat", "closeToInstallNotice": "Vypněte program a nainstalujte update na Váš stroj. ", "downloadButton": "Stáhnout", @@ -255,7 +258,7 @@ "arduinoLibraries": "Arduino knihovny", "contributedLibraries": "Přispěné knihovny", "include": "Zahrnout knihovnu", - "installAll": "Install All", + "installAll": "Instalovat vše", "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Chcete nainstalovat všechny chybějící závislosti? ", "installOneMissingDependency": "Chcete nainstalovat chybějící závislost? ", @@ -273,7 +276,7 @@ "zipLibrary": "Knihovna" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Téma" }, "libraryTopic": { "communication": "Communication", @@ -281,17 +284,17 @@ "dataStorage": "Data Storage", "deviceControl": "Device Control", "display": "Display", - "other": "Other", - "sensors": "Sensors", + "other": "Jiné", + "sensors": "Senzory", "signalInputOutput": "Signal Input/Output", - "timing": "Timing", + "timing": "Časování", "uncategorized": "Uncategorized" }, "libraryType": { "installed": "Installed" }, "menu": { - "advanced": "Advanced", + "advanced": "Pokročilé", "sketch": "Sketch", "tools": "Nástroje" }, @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Síť", "serial": "Serial" @@ -332,7 +341,7 @@ "files.inside.sketches": "Zobrazit soubory uvnitř sketche", "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "Výběr kanálu pro aktualizace. 'stable' pro stabilní vydání, 'nightly' pro nejnovější vývojové verze.", - "interfaceScale": "Měřítko prostředí", + "interfaceScale": "Velikost rozhraní", "invalid.editorFontSize": "Neplatná velikost editoru písem: Toto číslo musí být kladné.", "invalid.sketchbook.location": "Neplatné umístění projektů:{0}", "invalid.theme": "Neplatné téma.", @@ -343,12 +352,15 @@ "newSketchbookLocation": "Zvolit nové umístění projektů", "noProxy": "Bez proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "Jméno hosta", + "password": "Heslo", + "port": "Číslo portu", + "username": "Uživatelské jméno" }, "showVerbose": "Zobrazit podrobný výstup během", + "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": "Umístění sketche", "sketchbook.showAllFiles": "Ano pro zobrazení všech souborů sketche. Ne je výchozí hodnota. ", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,12 +397,12 @@ "exportBinary": "Exportovat kompilované soubory", "moving": "Přesouvám", "movingMsg": "Soubor \"{0}\" musí být uvnitř složky která je shodná názvem \"{1}\".\nVytvořit složku, přesunout tam- soubor a pokračovat? ", - "new": "Nový", + "new": "New Sketch", "openFolder": "Otevřít složku", "openRecent": "Otevřít nedávné", "openSketchInNewWindow": "Otevřít sketch v novém okně", "saveFolderAs": "Uložit složku sketche jako...", - "saveSketch": "Save your sketch to open it again later.", + "saveSketch": "Uložte svůj sketch, abyste ho mohli znovu otevřít později.", "saveSketchAs": "Uložit složku sketche jako...", "showFolder": "Zobrazit složku sketche", "sketch": "Sketch", @@ -399,14 +411,18 @@ "titleSketchbook": "Projekty", "upload": "Nahrát", "uploadUsingProgrammer": "Nahrát pomocí programátoru", - "uploading": "Uploading...", + "uploading": "Nahrávám...", "userFieldsNotFoundError": "Nemohu nalézt uživatelská pole pro připojenou desku", "verify": "Ověřit", "verifyOrCompile": "Ověřit/Kompilovat" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", + "dismissSurvey": "Znovu nezobrazovat", "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." }, "updateIndexes": { @@ -430,7 +446,7 @@ "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. ", "daemonOffline": "CLI Daemon nepřipojen", "offline": "Nepřipojen", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "Jste si jisti že chcete odejít" }, "debug": { "start": "Start...", diff --git a/i18n/de.json b/i18n/de.json index 6d250e9e5..03df6cb0f 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -119,6 +119,9 @@ "syncEditSketches": "Synchronisiere und editiere deine Arduino Cloud Sketches.", "visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "Alle", "contributed": "Beigetragen", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Websocket wurde nicht geschlossen", "unableToConnectToWebSocket": "Websocket wurde nicht verbunden" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Netzwerk", "serial": "Seriell" @@ -349,6 +358,9 @@ "username": "Benutzername" }, "showVerbose": "Compiler-Meldungen anzeigen beim", + "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": "Dateipfad des Sketchbooks", "sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardgemäß deaktiviert. ", "survey.notification": "Wenn aktiviert, werden Nutzer benachrichtigt, wenn eine Umfrage verfügbar ist. Standardgemäß aktiviert.", @@ -385,7 +397,7 @@ "exportBinary": "Kompilierte Binärdatei exportieren", "moving": "Übertragen...", "movingMsg": "Die Datei \"{0}\" muss sich in einen Sketch Ordner \"{1}\" befinden.\nOrdner erstellen, Datei verschieben und fortfahren?", - "new": "Neu", + "new": "New Sketch", "openFolder": "Ordner öffnen", "openRecent": "Zuletzt geöffnet", "openSketchInNewWindow": "Sketch in neuen Fenster öffnen", @@ -404,6 +416,10 @@ "verify": "Überprüfen", "verifyOrCompile": "Überprüfen/Kompilieren" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Umfrage beantworten", "dismissSurvey": "Nicht erneut anzeigen", diff --git a/i18n/el.json b/i18n/el.json index 6856f0d5e..61af9021d 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -119,6 +119,9 @@ "syncEditSketches": "Συγχρονισμός και τροποποίηση των Arduino Cloud Σχεδίων σου.", "visitArduinoCloud": "Επισκέψου το Arduino Cloud για δημιουργία Σχεδίων Cloud." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Δίκτυο", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Εμφάνιση λεπτομερούς εξόδου κατά τη διάρκεια", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Τοποθεσία σχεδίων", "sketchbook.showAllFiles": "Αληθές για εμφάνιση όλων των αρχείων σχεδίου μεσα στο σχέδιο. Είναι ψευδές απο προεπιλογή.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "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": "New Sketch", "openFolder": "Άνοιγμα φακέλου", "openRecent": "Άνοιγμα πρόσφατου", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Επαλήθευση", "verifyOrCompile": "Επικύρωση" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/es.json b/i18n/es.json index 0b0ae0035..89bab864f 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -6,9 +6,9 @@ }, "board": { "board": "Placa{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Seleccionar Otra Placa y Puerto", "boardInfo": "Información de la placa", - "boards": "boards", + "boards": "Placas", "configDialog1": "Selecciona tanto una placa como un puerto si quieres cargar un sketch.", "configDialog2": "Si seleccionas solo una placa podrás compilar, pero no cargar tu sketch.", "couldNotFindPreviouslySelected": "No se ha podido encontrar la placa previamente seleccionada '{0}' en la plataforma instalada '{1}'. Por favor, vuelve a seleccionar manualmente la placa que quieres utilizar. ¿Quieres volver a seleccionarla ahora?", @@ -16,9 +16,9 @@ "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 boards found for \"{0}\"", + "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?", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "No se ha descubierto ningún puerto", "noPortsSelected": "No se han seleccionado puertos para la placa: '{0}'.", "noneSelected": "Ninguna placa seleccionada.", "openBoardsConfig": "Seleccione otra placa y puerto...", @@ -26,26 +26,26 @@ "pleasePickBoard": "Por favor, elija una placa conectada al puerto que haya seleccionado.", "port": "Puerto {0}", "portLabel": "Puerto: {0}", - "ports": "ports", + "ports": "puertos", "programmer": "Programador", "reselectLater": "Vuelve a seleccionar más tarde", - "searchBoard": "Search board", + "searchBoard": "Buscar placa", "selectBoard": "Seleccionar Placa", "selectBoardForInfo": "Por favor, seleccione una placa para obtener información sobre ella.", "selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.", "showAllAvailablePorts": "Muestra todos los puertos disponibles cuando está activado", - "showAllPorts": "Show all ports", + "showAllPorts": "Mostrar todos los puertos", "succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente", "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} puertos" }, "boardsManager": "Gestor de placas", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificado Arduino" }, "bootloader": { "burnBootloader": "Grabar Bootloader", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Grabando bootloader...", "doneBurningBootloader": "Finalizada la grabación del bootloader." }, "burnBootloader": { @@ -69,13 +69,13 @@ "uploadingCertificates": "Cargando certificados." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Comprobar Actualizaciones para Arduino", + "installAll": "Instalar todo", + "noUpdates": "No se han encontrado actualizaciones recientes disponibles", + "promptUpdateBoards": "Actualizaciones disponibles para alguna de tus placas", + "promptUpdateLibraries": "Actualizaciones disponibles para algunas de tus librerías", + "updatingBoards": "Actualizando placas...", + "updatingLibraries": "Actualizando librerías..." }, "cli-error-parser": { "keyboardError": "'Keyboard' no encontrado. ¿Tiene tu proyecto incluida la linea '#include '?", @@ -90,7 +90,7 @@ "donePushing": "Envío a '{0}' realizado.", "embed": "Incrustado:", "emptySketchbook": "Tu Sketchbook está vacío", - "goToCloud": "Go to Cloud", + "goToCloud": "Ir al Cloud", "learnMore": "Aprender más", "link": "Enlace:", "notYetPulled": "No se puede cargar a las nube. Todavía no ha sido descargado", @@ -119,34 +119,37 @@ "syncEditSketches": "Sincroniza y edita tus Arduino Cloud Sketches", "visitArduinoCloud": "Visita Arduino Cloud para crear Cloud Sketches. " }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "Todo", + "contributed": "Contribuido", "installManually": "Instalar manualmente", "later": "Más tarde", "noBoardSelected": "Ninguna placa seleccionada.", "notConnected": "[no conectado]", "offlineIndicator": "Al parecer no estás en línea. Sin una conexión a internet, el CLI de Arduino no podrá descargar los recursos necesarios, lo cual puede ocasionar fallos. Por favor, conecte a internet y reinicie la aplicación.", "oldFormat": "La página '{0}' sigue utilizando el formato antiguo `.pde`. ¿Quieres cambiar a la nueva extensión `.ino`?", - "partner": "Partner", + "partner": "Socio", "processing": "Procesando", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Recomendado", + "retired": "Retirado", "selectedOn": "on 1{0}\n ", "serialMonitor": "Monitor Serie", - "type": "Type", + "type": "Tipo", "unknown": "Desconocido", - "updateable": "Updatable" + "updateable": "Actualizable" }, "compile": { "error": "Error de compilación: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Placas incluidas en este paquete:", "by": "de", "filterSearch": "Filtre su búsqueda...", "install": "Instalar", - "installed": "Installed", + "installed": "Instalado", "moreInfo": "Más información", "uninstall": "Desinstalar", "uninstallMsg": "¿Quieres desinstalar {0}?", @@ -156,21 +159,21 @@ "addFile": "Añadir fichero...", "fileAdded": "Un archivo añadido al sketch.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "No se puede abrir el plotter serial" }, "replaceTitle": "Reemplazar" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "Todo", + "default": "Predeterminado", + "more": "Más", + "none": "Niguno" } }, "coreContribution": { "copyError": "Copiar mensajes de error", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Ninguna placa seleccionada. Por favor selecciona una placa Arduino en el menú Herramientas > Placas" }, "daemon": { "restart": "Reiniciar Daemon", @@ -196,7 +199,7 @@ "increaseIndent": "Aumentar sangría", "nextError": "Siguiente Error", "previousError": "Error Anterior", - "revealError": "Reveal Error" + "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.", @@ -234,7 +237,7 @@ "visit": "Visitar Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Comprobar actualizaciones para Arduino IDE", "closeAndInstallButton": "Cerrar e instalar", "closeToInstallNotice": "Cierra el programa e instala la actualización en tu máquina.", "downloadButton": "Descargar", @@ -255,11 +258,11 @@ "arduinoLibraries": "Bibliotecas de Arduino", "contributedLibraries": "Bibliotecas aportadas", "include": "Incluir biblioteca", - "installAll": "Install All", - "installLibraryDependencies": "Install library dependencies", + "installAll": "Instalar todo", + "installLibraryDependencies": "Instalar las dependencias de la biblioteca", "installMissingDependencies": "¿Quieres instalar todas las dependencias faltantes?", "installOneMissingDependency": "¿Quieres instalar la dependencia faltante?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Instalar sin dependencias", "installedSuccessfully": "Biblioteca {0}:{1} instalada correctamente", "libraryAlreadyExists": "Ya existe una biblioteca. ¿Quieres sobrescribirla?", "manageLibraries": "Gestionar bibliotecas...", @@ -273,22 +276,22 @@ "zipLibrary": "Biblioteca" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Tema" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Comunicación", + "dataProcessing": "Procesando datos", + "dataStorage": "Almacenamiento de datos", + "deviceControl": "Control de dispositivo", + "display": "Pantalla", + "other": "Otro", + "sensors": "Sensores", + "signalInputOutput": "Señal Entrada/Salida", + "timing": "Temporización", + "uncategorized": "Descategorizado" }, "libraryType": { - "installed": "Installed" + "installed": "Instalado" }, "menu": { "advanced": "Avanzado", @@ -299,9 +302,15 @@ "unableToCloseWebSocket": " No se puede cerrar websocket", "unableToConnectToWebSocket": " No se puede conectar al websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Red", - "serial": "Serial" + "serial": "Serie" }, "preferences": { "additionalManagerURLs": "URLs adicionales de gestor de placas", @@ -312,7 +321,7 @@ "automatic": "Automático", "board.certificates": "Listado de certificados que pueden ser cargados en las placas", "browse": "Explorar", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Recibe notificaciones sobre actualizaciones disponibles del IDE, placas y librerías. Requiere reiniciar el IDE despues de hacer cambios. Por defecto está habilitado.", "choose": "Elija", "cli.daemonDebug": "Habilitar logueo de depuración de las llamadas gRPC al Arduino CLI. Requiere un reinicio del IDE para tener efecto. Deshabilitado por defecto.", "cloud.enabled": "Verdadero si las funciones de sincronización del sketch están activadas. Verdadero por defecto.", @@ -343,12 +352,15 @@ "newSketchbookLocation": "Selecciona la nueva ruta del sketchbook", "noProxy": "Sin Proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "nombre del host", + "password": "Contraseña", + "port": "Numero del puerto", + "username": "Nombre de usuario" }, "showVerbose": "Mostrar salida verbosa durante", + "sketch": { + "inoBlueprint": "Ruta absoluta del sistema de archivos al archivo blueprint `.ino` por defecto. Si se especifica, el contenido del archivo blueprint se utilizará para cada nuevo sketch creado por el IDE. Los sketches se generarán con el contenido por defecto de Arduino si no se especifica. Los archivos blueprint no accesibles son ignorados. **Se necesita reiniciar el IDE** para que este ajuste surta efecto." + }, "sketchbook.location": "Ruta del Sketchbook", "sketchbook.showAllFiles": "Verdadero para mostrar todos los archivos de bocetos dentro del boceto. Por defecto es falso.", "survey.notification": "Verdadero si usuarios deberían ser notificados cuando una encuesta esté disponible. Verdadero es predeterminado.", @@ -364,7 +376,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Retorno de carro", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "message": "Mensaje (Intro para mandar el mensaje de '{0}' a '{1}')", "newLine": "Nueva línea", "newLineCarriageReturn": "Ambos NL & CR", "noLineEndings": "Sin ajuste de línea", @@ -377,15 +389,15 @@ "archiveSketch": "Archivo de programa", "cantOpen": "Ya existe una carpeta con el nombre \"{0}\". No se puede abrir.", "close": "¿Estás seguro de que quieres cerrar el sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", + "compile": "Compilando proyecto...", + "configureAndUpload": "Configura y Subir", "createdArchive": "Archivo '{0}' creado.", "doneCompiling": "Compilación completada.", "doneUploading": "Carga completada.", "exportBinary": "Exportar binario compilado", "moving": "Moviendo", "movingMsg": "El archivo \"{0}\" tiene que estar dentro de una carpeta de bocetos llamada \"{1}\".\n¿Crear esta carpeta, mover el archivo y continuar?", - "new": "Nuevo", + "new": "New Sketch", "openFolder": "Abrir carpeta", "openRecent": "Abierto recientemente", "openSketchInNewWindow": "Abrir Sketch en una ventana nueva", @@ -399,27 +411,31 @@ "titleSketchbook": "Sketchbook", "upload": "Cargar", "uploadUsingProgrammer": "Cargar usando el programador", - "uploading": "Uploading...", + "uploading": "Actualizando...", "userFieldsNotFoundError": "No se pueden encontrar campos de usuario para la placa conectada", "verify": "Verificar", "verifyOrCompile": "Verificar/Compilar" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Completar encuesta", "dismissSurvey": "No volver a mostrar", "surveyMessage": "Por favor ayudenos mejorar completando esta breve encuesta. Valoramos nuestra comunidad y nos gustaría conocer algo mejor a los que nos apoyan." }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "Actualizar indices", + "updateLibraryIndex": "Actualizar Indice de librerías", + "updatePackageIndex": "Actualizar índice de paquete" }, "upload": { "error": "1{0} error: 2{1}" }, "userFields": { "cancel": "Cancelar", - "enterField": "Enter {0}", + "enterField": "Introduce {0}", "upload": "Cargar" } }, diff --git a/i18n/eu.json b/i18n/eu.json index 95e5cfa63..35dd81624 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sinkronizatu eta editatu zure Arduino Cloud-eko programak", "visitArduinoCloud": "Bisitatu Arduino Cloud hodeiko programak sortzeko." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Sarea", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Erakutsi irteera xehatua honetan zehar:", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Programa bildumaren kokalekua", "sketchbook.showAllFiles": "Egia programaren barruko programa-fitxategi guztiak erakusteko. Lehenetsia gezurra da.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "Esportatu konpilatutako bitarra", "moving": "Lekuz aldatzen", "movingMsg": "\"{0}\" fitxategiak \"{1}\" izeneko programa-karpetaren barruan egon behar du.\nSortu karpeta, eraman fitxategia bertara eta jarraitu?", - "new": "Berria", + "new": "New Sketch", "openFolder": "Ireki karpeta", "openRecent": "Ireki azkenaldikoa", "openSketchInNewWindow": "Ireki programa leiho berrian", @@ -404,6 +416,10 @@ "verify": "Egiaztatu", "verifyOrCompile": "Egiaztatu/Konpilatu" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/fa.json b/i18n/fa.json index 317c87da3..002f4f29c 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -8,7 +8,7 @@ "board": "بورد {0}", "boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر", "boardInfo": "مشخصات برد", - "boards": "boards", + "boards": "بردها", "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", "configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.", "couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟", @@ -16,7 +16,7 @@ "getBoardInfo": "دریافت راهنمای برد", "inSketchbook": "(در منبع طرح ها)", "installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟", - "noBoardsFound": "No boards found for \"{0}\"", + "noBoardsFound": "هیچ بردی پیدا نشد برای{0}", "noFQBN": "FQBN برای برد انتخاب شده \"{0}\" موجود نیست. آیا هسته مربوطه را نصب کرده اید؟", "noPortsDiscovered": "هیچ پورتی پیدا نشد", "noPortsSelected": "هیچ پورتی برای برد انتخاب نشده است.{0}", @@ -26,7 +26,7 @@ "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", "portLabel": "پورت: {0}", - "ports": "ports", + "ports": "پورت ها", "programmer": "برنامه ریز", "reselectLater": "بعدا انتخاب کنید", "searchBoard": "جستجوی بورد", @@ -34,18 +34,18 @@ "selectBoardForInfo": "لطفاً یک برد را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "showAllAvailablePorts": "نمایش تمام پورت های موجود در صورت فعال بودن", - "showAllPorts": "Show all ports", + "showAllPorts": "نمایش تمام پورت ها", "succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}", "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "پورت ها{0}" }, "boardsManager": "مدیریت برد ها", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "گواهی آردینو" }, "bootloader": { "burnBootloader": "بارگذاری بوت لودر.", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "بارگذاری بوت لودر", "doneBurningBootloader": "اتمام بارگذاری بوت لودر." }, "burnBootloader": { @@ -69,20 +69,20 @@ "uploadingCertificates": "در حال بارگذاری سند." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "بررسی به روزرسانی برای آردینو", + "installAll": "همه را نصب کنید", + "noUpdates": "هیچ به روز رسانی اخیر در دسترس نیست", + "promptUpdateBoards": "به روز رسانی برای برخی از بردها شما در دسترس است.", + "promptUpdateLibraries": "به روز رسانی برای برخی از کتابخانه های شما در دسترس است.", + "updatingBoards": "در حال به روز رسانی بردها ...", + "updatingLibraries": "در حال به روز رسانی کتابخانه ها..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" + "keyboardError": "صفحه کلید پیدا نشد. آیا طرح شما شامل خط \"#include \" است؟", + "mouseError": "\"موس\" پیدا نشد. آیا طرح شما شامل خط \"#include \" است؟" }, "cloud": { - "account": "Account", + "account": "حساب کاربری", "chooseSketchVisibility": "قابلیت مشاهده طرح خود را انتخاب کنید:", "connected": "متصل", "continue": "ادامه", @@ -90,7 +90,7 @@ "donePushing": "پایان ارسال {0}", "embed": "قرار دادن:", "emptySketchbook": "طرح شما خالی است", - "goToCloud": "Go to Cloud", + "goToCloud": "به فضای ابری بروید", "learnMore": "یادگیری بیشتر", "link": "لینک:", "notYetPulled": "نمی توان به ابر ارسال کرد. هنوز دریافت نشده است.", @@ -108,45 +108,48 @@ "pushSketch": "ارسال طرح", "pushSketchMsg": "این یک طرح عمومی است. قبل از ارسال، مطمئن شوید که اطلاعات حساس در فایل‌های arduino_secrets.h تعریف شده است. می‌توانید از پانل اشتراک‌گذاری یک طرح را خصوصی کنید.", "remote": "از راه دور", - "remoteSketchbook": "Remote Sketchbook", + "remoteSketchbook": "کتاب طراحی از راه دور", "share": "اشتراک گذاری...", "shareSketch": "اشتراک طرح", "showHideRemoveSketchbook": "نمایش/پنهان کردن از راه دور منبع طرح ها", "signIn": "ورود کاربر", "signInToCloud": "ورود به ابر آردوینو", "signOut": "خروج کاربر", - "sync": "Sync", + "sync": "همگام سازی", "syncEditSketches": "طرح های ابر آردوینو خود را همگام سازی و ویرایش کنید", "visitArduinoCloud": "بازدید از ابر آردوینو برای ساخت ابر طرح ها" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { - "all": "All", - "contributed": "Contributed", + "all": "همه", + "contributed": "کمک کرد", "installManually": "دستی نصب کن", "later": "بعدا", "noBoardSelected": "بردی انتخاب نشده", "notConnected": "[متصل نشد]", "offlineIndicator": "به نظر می رسد آفلاین هستید. بدون اتصال به اینترنت، رابط ترمینال آردوینو ممکن است نتواند منابع مورد نیاز را دانلود کند و باعث اختلال در عملکرد شود. لطفاً به اینترنت متصل شوید و برنامه را مجدداً راه اندازی کنید.", "oldFormat": "'{0}' هنوز از قالب قدیمی `.pde` استفاده می کند. آیا می‌خواهید به برنامه افزودنی «.ino» جدید بروید؟", - "partner": "Partner", + "partner": "شریک", "processing": "در حال محاسبه", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "توصیه شده", + "retired": "بازنشسته", "selectedOn": "روشن {0}", "serialMonitor": "نمایشگر ترمینال سریال", - "type": "Type", + "type": "نوع", "unknown": "نامعلوم", - "updateable": "Updatable" + "updateable": "قابل به روز رسانی" }, "compile": { "error": "خطای کامپایل : {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "بردهای موجود در این بسته :", "by": "توسط", "filterSearch": "محدود کردن جستجوی شما ...", "install": "نصب", - "installed": "Installed", + "installed": "نصب شده است", "moreInfo": "اطلاعات بیشتر", "uninstall": "لغو نصب", "uninstallMsg": "آیا شما می خواهید {0} را لغو نصب کنید؟", @@ -156,26 +159,26 @@ "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": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "کپی پیام های خطا", + "noBoardSelected": "هیچ بردی انتخاب نشده است. لطفاً برد آردوینو خود را از منوی Tools > Board انتخاب کنید" }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "راه اندازی مجدد Daemon", + "start": "شروع Daemon", + "stop": " متوقف کردن Daemon" }, "debug": { "debugWithMessage": "رفع خطا {0}", @@ -194,9 +197,9 @@ "decreaseIndent": "برداشتن دندانه", "increaseFontSize": "افزایش اندازه فونت", "increaseIndent": "افزودن دندانه", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "nextError": "خطای بعدی", + "previousError": "خطای قبلی", + "revealError": "فاش کردن خطا" }, "electron": { "couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.", @@ -234,7 +237,7 @@ "visit": "بازدید از Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "به روز رسانی آردوینو IDE را بررسی کنید", "closeAndInstallButton": "بستن و نصب", "closeToInstallNotice": "نرم افزار را ببندید و به روز رسانی را روی دستگاه خود نصب کنید.", "downloadButton": "دانلود", @@ -255,11 +258,11 @@ "arduinoLibraries": "کتابخانه های آردوینو", "contributedLibraries": "کتابخانه های اشتراکی", "include": "اضافه کتابخانه", - "installAll": "Install All", - "installLibraryDependencies": "Install library dependencies", + "installAll": "همه را نصب کنید", + "installLibraryDependencies": "وابستگی های کتابخانه را نصب کنید", "installMissingDependencies": "آیا می خواهید تمام وابستگی های از دست رفته را نصب کنید؟", "installOneMissingDependency": "آیا می خواهید وابستگی از دست رفته را نصب کنید؟", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "بدون وابستگی نصب کنید", "installedSuccessfully": "نصب کتابخانه {0}:{1} موفقیت آمیز بود.", "libraryAlreadyExists": "یک کتابخانه از قبل وجود دارد. آیا میخواهید آن را بازنویسی کنید؟", "manageLibraries": "مدیریت کتابخانه ها...", @@ -273,35 +276,41 @@ "zipLibrary": "کتابخانه" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "موضوع" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "ارتباط", + "dataProcessing": "پردازش داده ها", + "dataStorage": "ذخیره سازی داده ها", + "deviceControl": "کنترل دستگاه", + "display": "نمایش دادن", + "other": "دیگر", + "sensors": "سنسورها", + "signalInputOutput": "سیگنال ورودی/خروجی", + "timing": "زمان سنجی", + "uncategorized": "دسته بندی نشده" }, "libraryType": { - "installed": "Installed" + "installed": "نصب شده است" }, "menu": { - "advanced": "Advanced", + "advanced": "پیشرفته", "sketch": "طرح", "tools": "ابزار ها" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "unableToCloseWebSocket": "بسته شدن وب سوکت ممکن نیست", + "unableToConnectToWebSocket": "اتصال به وب سوکت امکان پذیر نیست" + }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." }, "portProtocol": { "network": "نتورک", - "serial": "Serial" + "serial": "سریال" }, "preferences": { "additionalManagerURLs": "نشانی‌های اینترنتی مدیر تابلوهای افزوده", @@ -312,17 +321,17 @@ "automatic": "اتوماتیک", "board.certificates": "فهرست گواهی‌هایی که می‌توان در تابلوها بارگذاری کرد", "browse": "مرور کردن", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "اعلان‌های به‌روزرسانی‌های موجود برای IDE، بردها و کتابخانه‌ها را دریافت کنید. پس از تغییر نیاز به راه اندازی مجدد IDE دارد. به طور پیش فرض درست است.", "choose": "انتخاب", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "ثبت اشکال زدایی تماس های gRPC به Arduino CLI را فعال کنید. برای اعمال این تنظیم به راه اندازی مجدد IDE نیاز است. به طور پیش فرض نادرست است", "cloud.enabled": "اگر فعال بودن توابع همگام سازی طرح درست می باشد ، پیش فرض ها درست است", "cloud.pull.warn": "اگر هشدار دادن به کاربران قبل از کشیدن یک طرح ابری درست می باشد ، پیش فرض ها صحیح است.", "cloud.push.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح ابری درست است پیش فرض ها درست می باشد", "cloud.pushpublic.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح عمومی به فضای درست می باشد پیش فرض ها درست است.", "cloud.sketchSyncEndpoint": "نقطه ای برای ارسال و دریافت طرح ها استفاده می شود . به طور پیش فرض به رابط ابر آردوینو استفاده می کند.", "compile": "کامپایل", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "درست است اگر IDE باید چندین خطای کامپایلر را مدیریت کند. به طور پیش فرض نادرست است", + "compile.revealRange": "نحوه آشکار شدن خطاهای کامپایلر در ویرایشگر پس از تأیید/آپلود ناموفق را تنظیم می کند. مقادیر ممکن: 'auto': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط را نشان دهید. 'مرکز': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط را در مرکز عمودی نشان دهید. 'بالا': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط نزدیک به بالای نمای درگاه را نشان دهید که برای مشاهده تعریف کد بهینه شده است. 'centerIfOutsideViewport': در صورت لزوم به صورت عمودی اسکرول کنید و یک خط در مرکز عمودی را فقط در صورتی نشان دهید که خارج از درگاه دید قرار داشته باشد. مقدار پیش فرض است{0}", "compile.verbose": "برای خروجی کامپایل پرمخاطب درست است. به طور پیش فرض نادرست است", "compile.warnings": "به gcc می گوید از کدام سطح هشدار استفاده کند. به طور پیش فرض \"هیچ\" است", "compilerWarnings": "هشدار های کامپایلر", @@ -330,28 +339,31 @@ "editorQuickSuggestions": "پیشنهادات سریع ویرایشگر", "enterAdditionalURLs": "نشانی‌های وب اضافی، یکی برای هر ردیف وارد کنید", "files.inside.sketches": "نمایش فایل ها در داخل طرح ها", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateBaseUrl": "نشانی وب سایت که از آن برای به‌روزرسانی‌ها را دانلود کنیم. پیش‌فرض «https://downloads.arduino.cc/arduino-ide» است", "ide.updateChannel": "برای به روز رسانی کانال را منتشر کنید 'stable' نسخه پایدار است، 'nightly' جدیدترین ساخت توسعه است.", "interfaceScale": "مقیاس رابط", "invalid.editorFontSize": "اندازه فونت ویرایشگر نامعتبر است. باید یک عدد صحیح مثبت باشد.", "invalid.sketchbook.location": "مکان نامعتبر منبع طرح ها: {0}", "invalid.theme": "طرح زمینه موجود نیست", "language.log": "اگر سرور زبان آردوینو باید فایل های گزارش را در پوشه طرح ایجاد کند درست می باشد. در غیر این صورت، نادرست است. به طور پیش فرض نادرست است.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "اگر درست باشد، سرور زبان هنگام تایپ در ویرایشگر، عیب‌یابی بی‌درنگ ارائه می‌کند. به طور پیش فرض نادرست است.", "manualProxy": "پیکربندی دستی پروکسی", "network": "نتورک", "newSketchbookLocation": "مکان جدید منبع طرح ها را مشخص کنید", "noProxy": "بدون پروکسی", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "نام میزبان", + "password": "رمز عبور", + "port": "شماره پورت", + "username": "نام کاربری" }, "showVerbose": "نمایش خروجی پرمخاطب در طول", + "sketch": { + "inoBlueprint": "مسیر سیستم فایل مطلق به فایل طرح اولیه «.ino». در صورت مشخص شدن، محتوای فایل طرح اولیه برای هر طرح جدید ایجاد شده توسط IDE استفاده خواهد شد. اسکچ ها با محتوای پیش فرض آردوینو در صورتی که مشخص نشده باشند تولید می شوند. فایل های طرح اولیه غیرقابل دسترسی نادیده گرفته می شوند. **برای اعمال این تنظیم به راه اندازی مجدد IDE نیاز است**." + }, "sketchbook.location": "مکان منبع طرح ها", "sketchbook.showAllFiles": "همه فایل‌های طرح را در داخل طرح نشان دهد درست است. به طور پیش فرض نادرست است.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", + "survey.notification": "درست است اگر در صورت وجود نظرسنجی به کاربران اطلاع داده شود. به طور پیش فرض درست است.", "unofficialBoardSupport": "برای لیستی از آدرس های اینترنتی پشتیبانی هیئت مدیره غیررسمی کلیک کنید", "upload": "آپلود", "upload.verbose": "برای خروجی آپلود پرمخاطب درست است. به طور پیش فرض نادرست است.", @@ -364,12 +376,12 @@ "serial": { "autoscroll": "پیمایش خودکار", "carriageReturn": "رفتن به سر سطر", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "message": "پیام (برای ارسال پیام به '' د{0}ر '' وارد شوید{1})", "newLine": "خط جدید", "newLineCarriageReturn": "هم NL و هم CR", "noLineEndings": "بدون پایان خط", "notConnected": "متصل نشد. برد و پورت را انتخاب کنید تا بطور خودکار متصل شود.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "سریال رسام", "timestamp": "برچسب زمانی", "toggleTimestamp": "اتصال برچسب زمان" }, @@ -377,20 +389,20 @@ "archiveSketch": "آرشیو طرح", "cantOpen": "پوشه ای با نام \"{0}\" از قبل وجود دارد. طرح را نمی توان باز کرد", "close": "آیا شما می خواهید این طرح را ببندید؟", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", + "compile": "تدوین طرح...", + "configureAndUpload": "پیکری بندی و بارگذاری", "createdArchive": "آرشیو {0} ایجاد شد.", "doneCompiling": "پایان کامپایل کردن", "doneUploading": "پایان بارگذاری", "exportBinary": "دریافت خروجی باینری کامپایل شده", "moving": "جابجا کردن", "movingMsg": "فایل \"{0}\" باید داخل یک پوشه طرح به نام \"{1}\" باشد.\nاین پوشه را ایجاد کنید، فایل را منتقل کنید و ادامه دهید؟", - "new": "جدید", + "new": "New Sketch", "openFolder": "بازکردن پوشه", "openRecent": "باز کردن آخرین ها", "openSketchInNewWindow": "باز کردن طرح در پنجره جدید.", "saveFolderAs": "ذخیره پوشه طرح در ...", - "saveSketch": "Save your sketch to open it again later.", + "saveSketch": "طرح خود را ذخیره کنید تا بعداً دوباره باز شود.", "saveSketchAs": "ذخیره پوشه طرح در ...", "showFolder": "نمایش پوشه ظرح", "sketch": "طرح", @@ -399,27 +411,31 @@ "titleSketchbook": "منبع طرح ها", "upload": "آپلود", "uploadUsingProgrammer": "بارگذاری با استفاده از پروگرامر", - "uploading": "Uploading...", + "uploading": "درحال بارگذاری...", "userFieldsNotFoundError": "عدم یافت شدن فیلد های کاربر برای برد متصل", "verify": "تائید", "verifyOrCompile": "تائید / کامپایل" }, + "sketchbook": { + "newRemoteSketch": "New Remote 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." + "answerSurvey": "به نظرسنجی پاسخ دهید", + "dismissSurvey": "دیگر نشان نده", + "surveyMessage": "لطفاً با پاسخ دادن به این نظرسنجی فوق العاده کوتاه ما را در پیشرفت خود یاری کنید. ما برای جامعه خود ارزش قائلیم و دوست داریم حامیان خود را کمی بهتر بشناسیم." }, "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": "بارگذاری" } }, @@ -430,7 +446,7 @@ "couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.", "daemonOffline": "CLI آفلاین پس زمینه", "offline": "آفلاین", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "آیا مطمئن هستید که می خواهید خارج شوید؟" }, "debug": { "start": "شروع...", diff --git a/i18n/fil.json b/i18n/fil.json index a06b95ae1..307e6636c 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Network", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True para ipakita lahat ng sketch files sa loob ng isang sketch. Ito ay false by default.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/fr.json b/i18n/fr.json index 200239265..6c58d2770 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -119,6 +119,9 @@ "syncEditSketches": "Synchroniser et éditer vos croquis Arduino Cloud.", "visitArduinoCloud": "Visitez Arduino Cloud pour créer des croquis sut le cloud." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Impossible de fermer le web socket", "unableToConnectToWebSocket": "Impossible de se connecter au web socket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Réseau", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Afficher la sortie de débogage verbeuse pendant", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Localisation du croquis.", "sketchbook.showAllFiles": "Vrai pour montrer tous les fichiers croquis à l'intérieur du croquis. La valeur par défaut est faux.", "survey.notification": "Vrai si les utilisateurs doivent être avertis si une enquête est disponible. Vrai par défaut.", @@ -385,7 +397,7 @@ "exportBinary": "Exporter les binaires compilés", "moving": "Déplacement", "movingMsg": "Le fichier \"{0}\" à besoin d'être à l'intérieur d'un dossier de croquis appelé \"{1}\".\nCréer ce dossier, déplacer le fichier et continuer ?", - "new": "Nouveau", + "new": "New Sketch", "openFolder": "Ouvrir le dossier", "openRecent": "Ouvrir les récents", "openSketchInNewWindow": "Ouvrir le croquis dans une nouvelle fenêtre", @@ -404,6 +416,10 @@ "verify": "Vérifier", "verifyOrCompile": "Vérifier / Compiler" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Enquête sur les réponses", "dismissSurvey": "Ne pas montrer de nouveau", diff --git a/i18n/he.json b/i18n/he.json index 4f61c1a45..7a6153feb 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -119,6 +119,9 @@ "syncEditSketches": "סנכרון ועריכת הסקיצה בענן של ארדואינו", "visitArduinoCloud": "כנס.י לענן של ארדואינו ליצור סקיצה בענן" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "הכל", "contributed": "נתרם", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "רשת", "serial": "Serial" @@ -349,6 +358,9 @@ "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.", @@ -385,7 +397,7 @@ "exportBinary": "ייצוא בינארי מקומפל.", "moving": "מעביר", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "חדש", + "new": "New Sketch", "openFolder": "פתח תיקיה", "openRecent": "נפתח לאחרונה", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "בדיקה", "verifyOrCompile": "בדיקה\\קומפילציה" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "ענה על סקר", "dismissSurvey": "אל תראה שוב.", diff --git a/i18n/hu.json b/i18n/hu.json index ae5521ba7..27c170eee 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -119,6 +119,9 @@ "syncEditSketches": "Arduino felhővázlatok szinkronizálása és szerkesztése", "visitArduinoCloud": "Látogasd meg az Arduino Cloud webhelyet, hogy a felhőben vázlatokat hozhass létre. " }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Hálózat", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Részletes kimenet megjelenítése eközben: ", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "SketchBook elérési helye ", "sketchbook.showAllFiles": "Kipipálva: az összes vázlatfájl/sketch megjelenítése a vázlaton/sketch-en belül. Alapértelmezés szerint: nincs kipipálva.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "Összeállított bináris exportálása", "moving": "Mozgatás", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "Új", + "new": "New Sketch", "openFolder": "Mappa megnyitása", "openRecent": "Legutóbbi megnyitása", "openSketchInNewWindow": "Vázlat/sketch megnyitása új ablakban", @@ -404,6 +416,10 @@ "verify": "Ellenőrzés", "verifyOrCompile": "Ellenőrzés/fordítás" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/id.json b/i18n/id.json index ea6db769a..418a5ae80 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Network", "serial": "Serial" @@ -349,6 +358,9 @@ "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.", @@ -385,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/it.json b/i18n/it.json index 9f9d4a79c..d84e47e5a 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -8,7 +8,7 @@ "board": "Scheda{0}", "boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta", "boardInfo": "Informazioni sulla scheda", - "boards": "boards", + "boards": "schede", "configDialog1": "Seleziona una scheda ed una porta se vuoi caricare uno sketch.", "configDialog2": "Se selezioni solo una scheda, potrai compilare, ma non potrai caricare il tuo sketch.", "couldNotFindPreviouslySelected": "Impossibile trovare la scheda selezionata '{0}' nella piattaforma installata '{1}'. Scegli nuovamente la scheda che vuoi utilizzare. Vuoi sceglierla ora?", @@ -16,7 +16,7 @@ "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 è stata trovata per \"{0}\"", + "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?", "noPortsDiscovered": "Nessuna porta rilevata", "noPortsSelected": "Nessuna porta selezionata per la scheda: '{0}'.", @@ -26,7 +26,7 @@ "pleasePickBoard": "Scegli la scheda collegata alla porta che hai selezionato.", "port": "Porta{0}", "portLabel": "Porta: {0}", - "ports": "ports", + "ports": "porte", "programmer": "Programmatore", "reselectLater": "Riselezionare più tardi", "searchBoard": "Seleziona la scheda", @@ -34,10 +34,10 @@ "selectBoardForInfo": "Seleziona la scheda per la quale desideri informazioni.", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", "showAllAvailablePorts": "Quando abilitato, mostra tutte le porte disponibili", - "showAllPorts": "Show all ports", + "showAllPorts": "Mostra tutte le porte", "succesfullyInstalledPlatform": "Piattaforma installata correttamente {0}:{1}", "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} porte" }, "boardsManager": "Gestore schede", "boardsType": { @@ -90,7 +90,7 @@ "donePushing": "Invio terminato ‘{0}’.", "embed": "Includi:", "emptySketchbook": "La raccolta degli sketch è vuota", - "goToCloud": "Go to Cloud", + "goToCloud": "Vai al Cloud", "learnMore": "Più informazioni", "link": "Link:", "notYetPulled": "Sul Cloud non puoi effettuare il push se non hai ancora fatto il pull", @@ -119,6 +119,9 @@ "syncEditSketches": "Sincronizza e modifica la tua raccolta di Sketches sul Cloud Arduino", "visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch " }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "Tutti", "contributed": "Fornita da terzi", @@ -156,16 +159,16 @@ "addFile": "Aggiungi file...", "fileAdded": "Aggiunto un file allo sketch.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "Impossibile aprire la porta seriale" }, "replaceTitle": "Sostituisci" }, "core": { "compilerWarnings": { "all": "Tutti", - "default": "Default", - "more": "More", - "none": "None" + "default": "Predefinito", + "more": "Altro", + "none": "Nessuno" } }, "coreContribution": { @@ -256,10 +259,10 @@ "contributedLibraries": "Librerie di terze parti", "include": "Includi Libreria", "installAll": "Installa tutto", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "Installa le dipendenze della libreria", "installMissingDependencies": "Vorresti installare tutte le dipendenze mancanti?", "installOneMissingDependency": "Vorresti installare le dipendenze mancanti?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Installa senza le dipendenze", "installedSuccessfully": "Libreria installata correttamente 1{0} : 2{1} ", "libraryAlreadyExists": "Libreria già presente. Vuoi sovrascriverla?", "manageLibraries": "Gestisci Librerie", @@ -299,9 +302,15 @@ "unableToCloseWebSocket": "Impossibile chiudere il websocket", "unableToConnectToWebSocket": "Impossibile connettersi al websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Rete", - "serial": "Serial" + "serial": "Seriale" }, "preferences": { "additionalManagerURLs": "URL aggiuntive per il Gestore schede", @@ -343,12 +352,15 @@ "newSketchbookLocation": "Seleziona un percorso per il nuovo sketchbook", "noProxy": "Nessun proxy", "proxySettings": { - "hostname": "Host name", + "hostname": "Nome host", "password": "Password", - "port": "Port number", - "username": "Username" + "port": "Numero di porta", + "username": "Nome utente" }, "showVerbose": "Mostra un output dettagliato durante", + "sketch": { + "inoBlueprint": "Percorso assoluto del filesystem per il file predefinito blueprint `.ino`. Se specificato, il contenuto del file blueprint sarà utilizzato per ogni nuovo sketch creato dall'IDE. Se non specificato, gli sketch saranno generati con il contenuto predefinito di Arduino. I file blueprint non accessibili saranno ignorati. **È necessario un riavvio dell'IDE** affinché questa impostazione abbia effetto." + }, "sketchbook.location": "Posizione della raccolta degli sketch", "sketchbook.showAllFiles": "Vero per mostrare tutti i file relativi contenuti all'interno dello sketch. L'opzione predefinita è falso.", "survey.notification": "Vero se gli utenti devono essere avvisati quando è disponibile un sondaggio. Vero per impostazione predefinita.", @@ -378,14 +390,14 @@ "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": "Configure and Upload", + "configureAndUpload": "Configura e Carica", "createdArchive": "Creato l'archivio '{0}'.", "doneCompiling": "Compilazione completata.", "doneUploading": "Caricamento terminato.", "exportBinary": "Esporta sketch compilato", "moving": "Spostando", "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", - "new": "Nuovo", + "new": "New Sketch", "openFolder": "Apri Cartella", "openRecent": "Apri recenti", "openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra.", @@ -404,15 +416,19 @@ "verify": "Verifica", "verifyOrCompile": "Verifica/Compila" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Rispondi al questionario", "dismissSurvey": "Non mostrare più", "surveyMessage": "Aiutaci a migliorare rispondendo a questo brevissimo questionario. Abbiamo a cuore la nostra comunità e vorremmo conoscere meglio chi ci supporta!" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "Aggiorna gli indici", + "updateLibraryIndex": "Aggiorna l'indice di libreria", + "updatePackageIndex": "Aggiorna l'indice del pacchetto" }, "upload": { "error": "1 {0} errore: 2 {1}" diff --git a/i18n/ja.json b/i18n/ja.json index 737db62f0..e5d141f12 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -90,7 +90,7 @@ "donePushing": "‘{0}’のプッシュが完了しました。", "embed": "埋め込み:", "emptySketchbook": "スケッチブックは空です", - "goToCloud": "Go to Cloud", + "goToCloud": "クラウドへ", "learnMore": "詳細はこちら", "link": "リンク:", "notYetPulled": "クラウドにプッシュできません。まだプルされていません。", @@ -119,6 +119,9 @@ "syncEditSketches": "Arduinoクラウドスケッチの同期と編集", "visitArduinoCloud": "Arduino Cloudにアクセスしてクラウドスケッチを作成する" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "全て", "contributed": "提供された", @@ -256,10 +259,10 @@ "contributedLibraries": "提供されたライブラリ", "include": "ライブラリをインクルード", "installAll": "全てをインストール", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "ライブラリの依存関係をインストール", "installMissingDependencies": "不足している全ての依存関係をインストールしますか?", "installOneMissingDependency": "不足している依存関係をインストールしますか?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "依存関係なしにインストール", "installedSuccessfully": "ライブラリ{0}:{1}のインストールに成功しました。", "libraryAlreadyExists": "ライブラリはすでに存在しています。上書きしますか?", "manageLibraries": "ライブラリを管理...", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "websocketを閉じることができません", "unableToConnectToWebSocket": "websocketに接続することができません" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "ネットワーク", "serial": "シリアル" @@ -349,6 +358,9 @@ "username": "ユーザ名" }, "showVerbose": "より詳細な情報を表示する", + "sketch": { + "inoBlueprint": "デフォルトの `.ino` ブループリント・ファイルへの絶対ファイルシステムパス。指定された場合、IDEによって作成されるすべての新しいスケッチに、ブループリント・ファイルの内容が使用されます。指定されない場合、スケッチはArduinoデフォルトの内容で生成されます。アクセスできないブループリント・ファイルは無視されます。この設定を有効にするには**IDE の再起動が必要**です。" + }, "sketchbook.location": "スケッチブックの場所", "sketchbook.showAllFiles": "スケッチ内のすべてのスケッチファイルを表示するにはtrueを指定。デフォルトではfalse。", "survey.notification": "アンケートが利用可能になったとき、通知を受け取る場合はTrueを指定します。デフォルトではTrue。", @@ -385,7 +397,7 @@ "exportBinary": "コンパイル済みバイナリをエクスポート", "moving": "移動", "movingMsg": "ファイル\"{0}\"は、\"{1}\"という名前のスケッチフォルダの中にあることが必要です。\nこのフォルダを作成し、ファイルを移動させ、継続しますか?", - "new": "新規", + "new": "New Sketch", "openFolder": "フォルダを開く", "openRecent": "最近使った項目を開く", "openSketchInNewWindow": "新規ウィンドウでスケッチを開く", @@ -404,6 +416,10 @@ "verify": "検証", "verifyOrCompile": "検証・コンパイル" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "アンケートに回答する", "dismissSurvey": "次回から表示しない", diff --git a/i18n/ko.json b/i18n/ko.json index f17c9e6b6..41432976d 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -83,7 +83,7 @@ }, "cloud": { "account": "계정", - "chooseSketchVisibility": "Choose visibility of your Sketch:", + "chooseSketchVisibility": "보여질 스케치를 선택하세요", "connected": "연결됨", "continue": "계속", "donePulling": "pulling 완료 ‘{0}’.", @@ -119,16 +119,19 @@ "syncEditSketches": "아두이노 클라우드 스케치 동기화 및 편집", "visitArduinoCloud": "아두이노 클라우드를 방문하여 클라우드 스케치를 만드십시오." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "전체", - "contributed": "Contributed", + "contributed": "공헌된", "installManually": "수동설치", "later": "나중에", "noBoardSelected": "선택된 보드 없음", "notConnected": "[연결되지 않음]", "offlineIndicator": "오프라인 상태인 것 같습니다. 인터넷 연결이 없으면 Arduino CLI가 필요한 리소스를 다운로드하지 못하고 오작동을 일으킬 수 있습니다. 인터넷에 연결하고 애플리케이션을 다시 시작해주세요.", "oldFormat": "'{0}' 파일은 오래된 `.pde` 확장자로 되어있어요. 새로운 `.ino` 확장자로 변경하시겠어요?", - "partner": "Partner", + "partner": "파트너", "processing": "처리 중", "recommended": "추천됨", "retired": "Retired", @@ -144,7 +147,7 @@ "component": { "boardsIncluded": "이 패키지에 포함된 보드:", "by": "by", - "filterSearch": "Filter your search...", + "filterSearch": "필터 검색...", "install": "설치", "installed": "설치됨", "moreInfo": "더 많은 정보", @@ -163,9 +166,9 @@ "core": { "compilerWarnings": { "all": "전체", - "default": "Default", - "more": "More", - "none": "None" + "default": "기본", + "more": "추가", + "none": "없음" } }, "coreContribution": { @@ -253,10 +256,10 @@ "library": { "addZip": ".ZIP 라이브러리 추가...", "arduinoLibraries": "아두이노 라이브러리", - "contributedLibraries": "Contributed libraries", + "contributedLibraries": "공헌된 라이브러리들", "include": "라이브러리 포함", "installAll": "모두 설치", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "라이브러리 종속성 설치", "installMissingDependencies": "누락된 모든 종속성을 설치하시겠습니까?", "installOneMissingDependency": "Would you like to install the missing dependency?", "installWithoutDependencies": "Install without dependencies", @@ -267,7 +270,7 @@ "needsMultipleDependencies": "라이브러리 {0}:{1} 는 현재 설치되지 않은 다른 종속성이 필요합니다.", "needsOneDependency": "The library {0}:{1} needs another dependency currently not installed:", "overwriteExistingLibrary": "기존 라이브러리를 덮어쓰시겠습니까?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "successfullyInstalledZipLibrary": "라이브러리가 {0} 저장소에 성공적으로 설치됨", "title": "라이브러리 매니저", "uninstalledSuccessfully": "라이브러리가 성공적으로 제거됨 {0}:{1}", "zipLibrary": "라이브러리" @@ -291,7 +294,7 @@ "installed": "설치됨" }, "menu": { - "advanced": "Advanced", + "advanced": "고급", "sketch": "스케치", "tools": "도구" }, @@ -299,9 +302,15 @@ "unableToCloseWebSocket": "웹소켓을 닫을 수 없습니다.", "unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다." }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "네트워크", - "serial": "Serial" + "serial": "시리얼" }, "preferences": { "additionalManagerURLs": "추가 보드 관리자 URL", @@ -349,6 +358,9 @@ "username": "사용자이름" }, "showVerbose": "출력 중 자세한 표시", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "스케치북 위치", "sketchbook.showAllFiles": "스케치 내부의 모든 스케치 파일을 표시하려면 True입니다. 기본은 false입니다.", "survey.notification": "설문조사를 사용할 수 있는 경우 사용자에게 알림을 보내야 하는 경우 True입니다. 기본은 True입니다.", @@ -363,18 +375,18 @@ "selectZip": "추가하려는 라이브러리가 포함된 zip 파일을 선택하세요.", "serial": { "autoscroll": "자동스크롤", - "carriageReturn": "Carriage Return", + "carriageReturn": "캐리지 리턴", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "새 줄", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", "notConnected": "연결되지 않음. 자동으로 연결할 보드와 포트를 선택합니다.", "openSerialPlotter": "시리얼 플로터", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" + "timestamp": "타임스탬프", + "toggleTimestamp": "타임스탬프 표시" }, "sketch": { - "archiveSketch": "Archive Sketch", + "archiveSketch": "스케치 압축저장", "cantOpen": "이름이 \"{0}\" 인 폴더가 이미 존재합니다. 스케치를 열 수 없습니다.", "close": "스케치를 닫으시겠습니까?", "compile": "스케치 컴파일중...", @@ -385,7 +397,7 @@ "exportBinary": "컴파일된 바이너리 내보내기", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "새 파일", + "new": "New Sketch", "openFolder": "폴더 열기", "openRecent": "최근 파일 열기", "openSketchInNewWindow": "새 창에서 스케치 열기", @@ -404,6 +416,10 @@ "verify": "확인", "verifyOrCompile": "확인/컴파일" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "설문조사 응답", "dismissSurvey": "다시보지 않기", diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 01c7ab7e3..47a60a271 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -119,6 +119,9 @@ "syncEditSketches": "သင်၏Arduino Cloud ကုတ်ဖိုင်လ်များကို အင်တာနက်မှတဆင့် အချိန်နှင့်တပြေးညီ ရယူကိုက်ညီစေပြီး တည်းဖြတ်လိုက်ပါ", "visitArduinoCloud": "ကလောက်ကုတ်ဖိုင်ဖန်တီးရန် Arduino Cloudသို့သွားပါ။" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "အားလုံး", "contributed": "ကူညီရေးသားထားသည်များ", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "ဝက်ဘ်ဆော့ကတ်ကိုမပိတ်နိုင်ပါ", "unableToConnectToWebSocket": "ဝက်ဘ်ဆော့ကတ်သို့မချိတ်ဆက်နိုင်ပါ" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "ကွန်ရက်", "serial": "အတန်းလိုက်" @@ -349,6 +358,9 @@ "username": "အသုံးပြုသူအမည်" }, "showVerbose": "နောက်ပါလုပ်နေစဉ် အချက်အလက်များပိုမိုများပြားစွာပြမည်", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ", "sketchbook.showAllFiles": "အမှန်ဖြစ်ပါက ကုတ်ဖိုင်လ်အတွင်း ဖိုင်လ်အားလုံးပြမည်။ မူရင်းတန်ဖိုး - အမှား", "survey.notification": "စစ်တမ်းကောက်ပါက အသုံးပြုသူကို အသိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", @@ -385,7 +397,7 @@ "exportBinary": "ကုတ်ပေါင်းထားသောဘိုင်နရီဖိုင် ထုတ်ပို့မည်", "moving": "ရွှေ့နေသည်", "movingMsg": "ဖိုင်လ် \"{0}\" သည် ကုတ်ဖိုင်လ်ဖိုလ်ဒါ \"{1}\"အတွင်းရှိရန်လိုသည်။\nဖိုလ်ဒါတည်ဆောက်ပြီးဖိုင်လ်ကိုရွှေ့မည်လား။", - "new": "အသစ်", + "new": "New Sketch", "openFolder": "ဖိုလ်ဒါဖွင့်မည်", "openRecent": "လတ်တလောဖိုင်လ်ဖွင့်မည်", "openSketchInNewWindow": "ကုတ်ဖိုင်လ်ကို ဝင်းဒိုးအသစ်တွင်ဖွင့်မည်", @@ -404,6 +416,10 @@ "verify": "စစ်ဆေး", "verifyOrCompile": "စစ်ဆေး/ကုတ်ပေါင်း" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "စစ်တမ်းကိုဖြေဆိုပါ", "dismissSurvey": "နောက်ထပ်မပြပါနှင့်", diff --git a/i18n/ne.json b/i18n/ne.json index 70f0d120e..9cb88b1a5 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Network", "serial": "Serial" @@ -349,6 +358,9 @@ "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.", @@ -385,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/nl.json b/i18n/nl.json index e11d0dc5f..ab1a938be 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -119,6 +119,9 @@ "syncEditSketches": "Synchroniseer en bewerk uw Arduino Cloud Sketches", "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "Alle", "contributed": "Bijgedragen", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Kan websocket niet sluiten", "unableToConnectToWebSocket": "Kan geen verbinding maken met websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Netwerk", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Uitgebreide uitvoer weergeven tijdens", + "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": "Schetsboek locatie", "sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.", "survey.notification": "Waar als gebruikers een melding moeten krijgen als er een enquête beschikbaar is. Standaard is dit waar.", @@ -385,7 +397,7 @@ "exportBinary": "Gecompileerd binair bestand exporteren", "moving": "Verplaatsten", "movingMsg": "Het bestand \"{0}\" moet binnen een schetsmap met de naam \"{1}\" staan.\nMaak deze map, verplaats het bestand, en ga verder?", - "new": "Nieuw", + "new": "New Sketch", "openFolder": "Map Openen", "openRecent": "Recentelijk geopend", "openSketchInNewWindow": "Schets openen in nieuw venster", @@ -404,6 +416,10 @@ "verify": "Verifiëren", "verifyOrCompile": "Verifiëren/Compileren" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Antwoord enquête", "dismissSurvey": "Niet meer laten zien", diff --git a/i18n/pl.json b/i18n/pl.json index cdc06ab6a..48d9c31f5 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -119,6 +119,9 @@ "syncEditSketches": "Synchronizuj i edytuj swoje szkice w chmurze Arduino", "visitArduinoCloud": "Odwiedź chmurę Arduino, aby tworzyć szkice w chmurze." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "Wszytko", "contributed": "Przyczynił się", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Nie można zamknąć gniazda sieciowego", "unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Sieć", "serial": "Szaregowy" @@ -349,6 +358,9 @@ "username": "Nazwa Użytkownika" }, "showVerbose": "Pokazuj informacje zwrotne podczas:", + "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": "Lokalizacja szkicownika", "sketchbook.showAllFiles": "Prawda, aby wyświetlać wszystkie pliki ze szkicu. Fałsz jest wartością domyślną.", "survey.notification": "Prawdziwy, jeśli użytkownicy powinni być powiadamiani o dostępności ankiety. Domyślnie prawdwdziwy.", @@ -385,7 +397,7 @@ "exportBinary": "Eksportuj skompilowane binarnie", "moving": "Przenoszenie", "movingMsg": "Plik \"{0}\" musi znajdować się w folderze szkiców o nazwie \"{1}\".\nCzy utworzyć ten folder, przenieść podany plik i kontynuować?", - "new": "Nowy", + "new": "New Sketch", "openFolder": "Otwórz folder", "openRecent": "Otwórz ostatnie", "openSketchInNewWindow": "Otwórz szkic w nowym oknie.", @@ -404,6 +416,10 @@ "verify": "Weryfikuj", "verifyOrCompile": "Weryfikuj/Kompiluj" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Odpowiedz na ankietę", "dismissSurvey": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają.", diff --git a/i18n/pt.json b/i18n/pt.json index 9eb7932b7..173cba74f 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sincronizar e editar seus Sketches no Arduino Cloud", "visitArduinoCloud": "Visite Arduino Cloud para criar Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contribuído", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Impossível fechar websocket", "unableToConnectToWebSocket": "Impossível conectar ao websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Rede", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Mostrar a saída detalhada durante", + "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": "Localização dos Sketchbooks", "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de sketch dentro do sketch. Falso é padrão.", "survey.notification": "Verdadeiro se o usuário deve ser notificado se uma pesquisa estiver disponível. Verdadeiro por padrão", @@ -385,7 +397,7 @@ "exportBinary": "Exportar Binário Compilado", "moving": "Movendo", "movingMsg": "O ficheiro \"{0}\" tem que estar dentro de uma pasta de esboços chamada \"{1}\".\nCriar esta pasta, mover o ficheiro e continuar?", - "new": "Novo", + "new": "New Sketch", "openFolder": "Abrir Pasta", "openRecent": "Abrir Recente", "openSketchInNewWindow": "Abrir sketch em uma nova janela", @@ -404,6 +416,10 @@ "verify": "Verificar", "verifyOrCompile": "Verificar/Compilar" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Responder a pesquisa", "dismissSurvey": "Não mostrar novamente", diff --git a/i18n/ro.json b/i18n/ro.json index 845c3d051..eb78c681c 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Rețea", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "Adevărat pentru a afișa toate fișierele tip schița din interiorul schiței. Este fals în modul implicit.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "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": "Nou", + "new": "New Sketch", "openFolder": "Deschide Folder", "openRecent": "Deschide Recente", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verifică", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/ru.json b/i18n/ru.json index 7dbb9738b..ce2bb90b8 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -119,6 +119,9 @@ "syncEditSketches": "Синхронизировать и редактировать скетчи в Arduino Cloud", "visitArduinoCloud": "Посетите Arduino Cloud, чтобы создать скетчи в облаке." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Не удалось закрыть веб-сокет.", "unableToConnectToWebSocket": "Не удается подключиться к веб-сокету." }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Сеть", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Показывать детализированный вывод при", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Путь к альбому со скетчами", "sketchbook.showAllFiles": "True - показывать все файлы внутри скетча. По умолчанию - false.", "survey.notification": "Включите, если пользователи должны получать уведомления, когда появится новый опрос. Включено по умолчанию.", @@ -385,7 +397,7 @@ "exportBinary": "Экспортировать скомпилированный бинарный файл", "moving": "Переместить", "movingMsg": "Файл «{0}» должен быть в папке с именем скетча «{1}». \nСоздать эту папку, переместить файл и продолжить?", - "new": "Новый скетч", + "new": "New Sketch", "openFolder": "Открыть папку", "openRecent": "Открыть предыдущий", "openSketchInNewWindow": "Открыть скетч в новом окне", @@ -404,6 +416,10 @@ "verify": "Проверить", "verifyOrCompile": "Проверить/Скомпилировать" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Ответить на опрос", "dismissSurvey": "Больше не показывать", diff --git a/i18n/sr.json b/i18n/sr.json index bc61a8029..18636293d 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Мрежа", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Прикажи детаљан испис током", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Локација радне свеске", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "Export Compiled Binary", "moving": "Премјешта се", "movingMsg": "Датотека \"{0}\" мора да буде унутар радног директоријума \"{1}\".\nКреирај овај директоријум, премјести датотеку, и настави?", - "new": "Нови", + "new": "New Sketch", "openFolder": "Отвори директоријум", "openRecent": "Отвори недавно", "openSketchInNewWindow": "Отвори рад у новом прозору", @@ -404,6 +416,10 @@ "verify": "Провјери", "verifyOrCompile": "Провјери/Преведи" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/tr.json b/i18n/tr.json index 274da9d43..f59ad8857 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -119,6 +119,9 @@ "syncEditSketches": "Arduino Cloud eskizlerinizi eşitleyin ve düzenleyin", "visitArduinoCloud": "Bulut Eskizleri oluşturmak için Arduino Cloud'u ziyaret edin." }, + "cloudSketch": { + "new": "Yeni Uzak Eskiz" + }, "common": { "all": "Tümü", "contributed": "Eklenen", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Websocket kapatılamadı ", "unableToConnectToWebSocket": "Websocket'e bağlanılamadı" }, + "newCloudSketch": { + "invalidSketchName": "İsim harfler, rakamlar veya altçizgiden oluşmalıdır. Azami uzunluk 36 karakterdir.", + "newSketchTitle": "Yeni bir Uzak Eskiz'in adı", + "notFound": "Uzak eskiz '{0}' çekilemedi. Böyle bir eskiz yok.", + "sketchAlreadyExists": "'{0}' adlı uzak eskiz zaten mevcut." + }, "portProtocol": { "network": "Ağ", "serial": "Seri" @@ -349,6 +358,9 @@ "username": "Kullanıcı adı" }, "showVerbose": "Ayrıntılı çıktıyı görüntüle", + "sketch": { + "inoBlueprint": "Örnek `.ino` dosyasının tam dosya yoludur. Açıldığında IDE'de oluşturulan her yeni eskizde bu örnek dosya içeriği kullanılır. Açılmadığında eskizler varsayılan Arduino içeriği ile oluşturulur. Ulaşılamayan örnek dosyalar yoksayılır. Bu ayarın etkili olması için **IDE'nin yeniden başlatılması** gerekir." + }, "sketchbook.location": "Eskiz Defteri konumu", "sketchbook.showAllFiles": "Tüm eskiz dosyalarını eskiz içinde görüntülemek için açın. Varsayılan: kapalı.", "survey.notification": "Bir anket bulunduğunda kullanıcılara gösterilecekse açın. Varsayılan olarak açıktır.", @@ -385,7 +397,7 @@ "exportBinary": "Derlenmiş Dosyayı Dışa Aktar", "moving": "Taşınıyor", "movingMsg": "\"{0}\" dosyasının \"{1}\" isminde bir eskiz klasörünün içinde olması gerekiyor.\nKlasörü oluştur, dosyayı taşı ve devam et?", - "new": "Yeni", + "new": "Yeni Eskiz", "openFolder": "Klasörü Aç", "openRecent": "Yakın Geçmiş", "openSketchInNewWindow": "Eskizi Yeni Pencerede Aç", @@ -404,6 +416,10 @@ "verify": "Doğrula", "verifyOrCompile": "Doğrula/Derle" }, + "sketchbook": { + "newRemoteSketch": "Yeni Uzak Eskiz", + "newSketch": "Yeni Eskiz" + }, "survey": { "answerSurvey": "Anketi yanıtla", "dismissSurvey": "Tekrar gösterme", diff --git a/i18n/uk.json b/i18n/uk.json index 9163178c5..3bf8df0e9 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -8,18 +8,18 @@ "board": "Плата {0}", "boardConfigDialogTitle": "Оберіть іншу плату або порт", "boardInfo": "Інформація про плату", - "boards": "boards", + "boards": "плати", "configDialog1": "Оберіть плату та порт якщо бажаєте завантажити скетч", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", + "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", + "disconnected": "Від’єднано", "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": "No boards found for \"{0}\"", + "noBoardsFound": "Для \"{0}\" не знайдено плат", "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", + "noPortsDiscovered": "Порти не знайдено", + "noPortsSelected": "Немає вибраних портів для плати: '{0}'.", "noneSelected": "Не обрана плата", "openBoardsConfig": "Оберіть іншу плату або порт", "platformMissing": "The platform for the selected '{0}' board is not installed.", @@ -29,9 +29,9 @@ "ports": "ports", "programmer": "Programmer", "reselectLater": "Reselect later", - "searchBoard": "Search board", + "searchBoard": "Шукати плату", "selectBoard": "Оберіть плату", - "selectBoardForInfo": "Please select a board to obtain board info.", + "selectBoardForInfo": "Виберіть плату, щоб отримати інформацію про плату.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "Все", "contributed": "Contributed", @@ -207,7 +210,7 @@ "couldNotInitializeExamples": "Could not initialize built-in examples.", "customLibrary": "Examples from Custom Libraries", "for": "Examples for {0}", - "forAny": "Examples for any board", + "forAny": "Приклади для будь-якої плати", "menu": "Приклади" }, "firmware": { @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Мережа", "serial": "Serial" @@ -349,6 +358,9 @@ "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.", @@ -385,7 +397,7 @@ "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": "New Sketch", "openFolder": "Відкрити папку", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Перевірити ", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/vi.json b/i18n/vi.json index 882d652f3..306854d51 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -119,6 +119,9 @@ "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": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Mạng", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "Hiển thị đầu ra chi tiết trong khi", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "Địa điểm chứa sketchbook", "sketchbook.showAllFiles": "'True' để hiển thị tất cả các tệp sketch trong sketch. Mặc định là 'false'.", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "Xuất tệp nhị phân đã biên dịch", "moving": "Chuyển", "movingMsg": "Tệp \"{0}\" cần phải được chứa trong thư mục sketch tên \"{1}\".\nTạo thư mục này, chuyển tệp tin vào đó, và tiếp tục?", - "new": "Tạo mới", + "new": "New Sketch", "openFolder": "Mở thư mục", "openRecent": "Mở gần đây", "openSketchInNewWindow": "Mở sketch trong cửa sổ mới", @@ -404,6 +416,10 @@ "verify": "Xác thực", "verifyOrCompile": "Xác thực/Biên dịch" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index ea6db769a..418a5ae80 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -119,6 +119,9 @@ "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "All", "contributed": "Contributed", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "Network", "serial": "Serial" @@ -349,6 +358,9 @@ "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.", @@ -385,7 +397,7 @@ "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", + "new": "New Sketch", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", @@ -404,6 +416,10 @@ "verify": "Verify", "verifyOrCompile": "Verify/Compile" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "Answer survey", "dismissSurvey": "Don't show again", diff --git a/i18n/zh.json b/i18n/zh.json index 22124e370..8283e8042 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -90,7 +90,7 @@ "donePushing": "已完成推送 ‘{0}’。", "embed": "嵌入:", "emptySketchbook": "你的项目文件夹是空的", - "goToCloud": "Go to Cloud", + "goToCloud": "前往 Cloud", "learnMore": "查看更多", "link": "链接:", "notYetPulled": "无法推送到 Cloud。未被拉取。", @@ -119,6 +119,9 @@ "syncEditSketches": "同步和编辑 Arduino Cloud 项目", "visitArduinoCloud": "访问 Arduino Cloud 以创建云项目。" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "全部", "contributed": "已贡献", @@ -132,7 +135,7 @@ "processing": "正在处理中", "recommended": "推荐", "retired": "不再支持的", - "selectedOn": "on {0}", + "selectedOn": "在{0}上", "serialMonitor": "串口监视器", "type": "类型", "unknown": "未知", @@ -146,7 +149,7 @@ "by": "by", "filterSearch": "筛选搜索结果......", "install": "安装", - "installed": "安装", + "installed": "已安装", "moreInfo": "更多信息", "uninstall": "卸载", "uninstallMsg": "是否要卸载 {0}?", @@ -256,10 +259,10 @@ "contributedLibraries": "贡献库", "include": "包含库", "installAll": "全部安装", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "安装库的依赖", "installMissingDependencies": "是否安装所有缺少的依赖?", "installOneMissingDependency": "是否安装缺少的依赖?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "仅安装库 (跳过依赖)", "installedSuccessfully": "已成功安装 {0} 库:{1}", "libraryAlreadyExists": "库已经存在。是否要覆盖它?", "manageLibraries": "管理库...", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "无法关闭 websocket", "unableToConnectToWebSocket": "无法连接 websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "网络", "serial": "串口" @@ -349,6 +358,9 @@ "username": "用户名" }, "showVerbose": "显示详细输出", + "sketch": { + "inoBlueprint": "指定默认 “.ino” 模板文件的绝对路径。如果指定,则该模板文件的内容将被用于 IDE 创建的每一个新 sketch。如果未指定,则使用Arduino默认的内容来创建新 sketch。不可用的模板文件将被自动忽略。**需要重启IDE** 以使此设置生效。" + }, "sketchbook.location": "项目文件夹地址", "sketchbook.showAllFiles": "True 则显示项目中的所有项目文件。默认情况下为 False。", "survey.notification": "True 则在有调查时应通知用户。默认为 True。", @@ -385,7 +397,7 @@ "exportBinary": "导出已编译的二进制文件", "moving": "移动", "movingMsg": "“{0}” 文件需要位于 “{1}” 项目文件夹中。\n创建此文件夹,移动文件,然后继续?", - "new": "新建", + "new": "New Sketch", "openFolder": "打开文件夹", "openRecent": "打开最近", "openSketchInNewWindow": "在新窗口打开项目", @@ -404,15 +416,19 @@ "verify": "验证", "verifyOrCompile": "验证/编译" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "回答问卷", "dismissSurvey": "不要再显示", "surveyMessage": "请回答这份很短的调查来帮助我们改进。我们重视我们的社区,也希望能够更好地了解我们的支持者。" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "更新索引", + "updateLibraryIndex": "更新库索引", + "updatePackageIndex": "更新包索引" }, "upload": { "error": "{0} 错误:{1}" diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index d75a1d218..ff831d2ac 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -119,6 +119,9 @@ "syncEditSketches": "同步和編輯您的Arduino Clou草稿", "visitArduinoCloud": "前往Arduino Cloud建立雲端草稿。" }, + "cloudSketch": { + "new": "New Remote Sketch" + }, "common": { "all": "所有", "contributed": "已貢獻", @@ -299,6 +302,12 @@ "unableToCloseWebSocket": "無法關閉 websocket", "unableToConnectToWebSocket": "無法連接到 websocket" }, + "newCloudSketch": { + "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", + "newSketchTitle": "Name of a new Remote Sketch", + "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", + "sketchAlreadyExists": "Remote sketch '{0}' already exists." + }, "portProtocol": { "network": "網路", "serial": "Serial" @@ -349,6 +358,9 @@ "username": "Username" }, "showVerbose": "顯示詳細輸出", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, "sketchbook.location": "草稿資料夾位置", "sketchbook.showAllFiles": "True則顯示所有草稿中的草稿檔案。預設為false。", "survey.notification": "True if users should be notified if a survey is available. True by default.", @@ -385,7 +397,7 @@ "exportBinary": "會出已編譯的二進位檔", "moving": "移動", "movingMsg": "\"{0}\"必須在命名為\"{1}\"的草稿資料夾中。建立這個資料夾,移動草稿並繼續?", - "new": "新增", + "new": "New Sketch", "openFolder": "打開資料夾", "openRecent": "開啟最近的", "openSketchInNewWindow": "在新視窗開啟草稿", @@ -404,6 +416,10 @@ "verify": "驗證", "verifyOrCompile": "驗證/編譯" }, + "sketchbook": { + "newRemoteSketch": "New Remote Sketch", + "newSketch": "New Sketch" + }, "survey": { "answerSurvey": "回覆問卷", "dismissSurvey": "不要再顯示", From fe3fbb189c90ce7e0141977061dabe817ac824a9 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 17 Nov 2022 15:03:22 +0100 Subject: [PATCH 098/384] 2.0.3 (#1687) --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index d62235dd7..5efaf9cd1 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.0.2", + "version": "2.0.3", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 76fdd43a6..997898b3a 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.0.2", + "version": "2.0.3", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "1.25.0", "@theia/terminal": "1.25.0", "@theia/workspace": "1.25.0", - "arduino-ide-extension": "2.0.2" + "arduino-ide-extension": "2.0.3" }, "devDependencies": { "@theia/cli": "1.25.0", diff --git a/package.json b/package.json index e88494256..862f71d98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.0.2", + "version": "2.0.3", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 8778d70ad795eb9236d49695900b8f415d954a0b Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 28 Nov 2022 19:09:50 +0100 Subject: [PATCH 099/384] fix: editor widget resolving when creating new tab An already opened editor widget can resolve without waiting. Closes #1718 Signed-off-by: Akos Kitta --- .../src/browser/contributions/open-sketch-files.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 99ccbd085..237ab0cb0 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -184,7 +184,7 @@ export class OpenSketchFiles extends SketchContribution { // The editor is expected to be attached to the shell and visible in the UI. // The deferred promise does not have to wait for the `editorManager#onCreated` event. // It can resolve earlier. - if (!widget) { + if (widget) { deferred.resolve(editorWidget); } }); From 3ad660927f2dea3eaff3e4738179ecb7c92da255 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 29 Nov 2022 09:22:14 +0100 Subject: [PATCH 100/384] Fix keybindings to switch between tabs on MacOs (#1686) --- .../core/common-frontend-contribution.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts index 0785cad03..98d6d49e6 100644 --- a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts @@ -6,6 +6,8 @@ import { } from '@theia/core/lib/browser/common-frontend-contribution'; import { CommandRegistry } from '@theia/core/lib/common/command'; import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application'; +import { KeybindingRegistry } from '@theia/core/lib/browser'; +import { isOSX } from '@theia/core'; @injectable() export class CommonFrontendContribution extends TheiaCommonFrontendContribution { @@ -50,6 +52,36 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution } } + override registerKeybindings(registry: KeybindingRegistry): void { + super.registerKeybindings(registry); + // Workaround for https://github.com/eclipse-theia/theia/issues/11875 + if (isOSX) { + registry.unregisterKeybinding('ctrlcmd+tab'); + registry.unregisterKeybinding('ctrlcmd+alt+d'); + registry.unregisterKeybinding('ctrlcmd+shift+tab'); + registry.unregisterKeybinding('ctrlcmd+alt+a'); + + registry.registerKeybindings( + { + command: CommonCommands.NEXT_TAB.id, + keybinding: 'ctrl+tab', + }, + { + command: CommonCommands.NEXT_TAB.id, + keybinding: 'ctrl+alt+d', + }, + { + command: CommonCommands.PREVIOUS_TAB.id, + keybinding: 'ctrl+shift+tab', + }, + { + command: CommonCommands.PREVIOUS_TAB.id, + keybinding: 'ctrl+alt+a', + } + ); + } + } + override onWillStop(): OnWillStopAction | undefined { // This is NOOP here. All window close and app quit requests are handled in the `Close` contribution. return undefined; From ac9cce16f749f7b43abc145ed8d1ee79159dd5e9 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Tue, 29 Nov 2022 09:39:54 +0100 Subject: [PATCH 101/384] chore: Updated to Theia `1.31.1` (#1662) Closes #1655 Closes #1656 Signed-off-by: Akos Kitta --- .gitignore | 4 +- arduino-ide-extension/package.json | 63 +- .../browser/arduino-ide-frontend-module.ts | 95 +- .../browser/contributions/sketch-control.ts | 2 +- .../src/browser/create/create-uri.ts | 2 +- .../firmware-uploader-dialog.tsx | 124 +- .../ide-updater/ide-updater-component.tsx | 55 +- .../ide-updater/ide-updater-dialog.tsx | 108 +- .../dialogs/settings/settings-component.tsx | 21 +- .../dialogs/settings/settings-dialog.tsx | 13 +- .../src/browser/dialogs/settings/settings.ts | 49 +- .../user-fields/user-fields-dialog.tsx | 109 +- .../src/browser/icons/loading-dark.svg | 6 + .../src/browser/icons/loading-light.svg | 6 + .../local-cache/local-cache-fs-provider.ts | 2 +- .../browser/serial/monitor/monitor-widget.tsx | 5 +- .../src/browser/style/index.css | 10 + .../core/common-frontend-contribution.ts | 2 +- .../src/browser/theia/core/status-bar.ts | 13 - .../browser/theia/core/tab-bar-toolbar.tsx | 61 - .../src/browser/theia/core/theming.ts | 26 + .../src/browser/theia/core/widget-manager.ts | 42 - .../theia/core/window-title-updater.ts | 87 + .../debug/debug-configuration-manager.ts | 8 +- .../theia/debug/debug-configuration-model.ts | 1 + .../theia/debug/debug-session-manager.ts | 90 - .../src/browser/theia/dialogs/dialogs.ts | 17 - .../src/browser/theia/dialogs/dialogs.tsx | 63 + .../theia/editor/editor-widget-factory.ts | 2 +- .../browser/theia/markers/problem-manager.ts | 2 +- .../theia/messages/notifications-renderer.tsx | 6 +- .../theia/monaco/monaco-theming-service.ts | 23 + .../type-hierarchy-contribution.ts | 32 + .../typehierarchy/type-hierarchy-service.ts | 9 + .../theia/workspace/workspace-service.ts | 118 +- .../src/browser/widgets/arduino-select.tsx | 17 +- .../cloud-sketchbook-composite-widget.tsx | 9 +- .../sketchbook-composite-widget.tsx | 24 +- .../theia/core/electron-main-menu-factory.ts | 258 +- .../arduino-electron-main-module.ts | 11 +- .../theia/electron-messaging-contribution.ts | 44 + .../theia/theia-electron-window.ts | 36 +- .../src/node/arduino-ide-backend-module.ts | 10 +- .../i18n/localization-backend-contribution.ts | 45 - .../src/node/monitor-service.ts | 2 +- .../monitor-settings-provider-impl.ts | 8 +- .../plotter/plotter-backend-contribution.ts | 2 +- .../hosted-plugin-localization-service.ts | 13 + .../src/node/utils/buffers.ts | 2 +- .../web-socket/web-socket-provider-impl.ts | 2 +- .../node/web-socket/web-socket-provider.ts | 2 +- arduino-ide-extension/tsconfig.json | 2 - electron-app/package.json | 42 +- electron-app/patch/frontend/index.js | 152 - electron-app/webpack.config.js | 26 - electron/.gitignore | 2 +- electron/build/template-package.json | 2 +- electron/build/webpack.config.js | 10 - electron/packager/index.js | 450 +- electron/packager/package.json | 1 - electron/packager/utils.js | 48 +- electron/packager/yarn.lock | 432 +- i18n/en.json | 5 - package.json | 11 +- scripts/sort-dependencies | 26 + yarn.lock | 4586 ++++++++--------- 66 files changed, 3333 insertions(+), 4223 deletions(-) create mode 100644 arduino-ide-extension/src/browser/icons/loading-dark.svg create mode 100644 arduino-ide-extension/src/browser/icons/loading-light.svg delete mode 100644 arduino-ide-extension/src/browser/theia/core/status-bar.ts delete mode 100644 arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx create mode 100644 arduino-ide-extension/src/browser/theia/core/theming.ts create mode 100644 arduino-ide-extension/src/browser/theia/core/window-title-updater.ts delete mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts delete mode 100644 arduino-ide-extension/src/browser/theia/dialogs/dialogs.ts create mode 100644 arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx create mode 100644 arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts create mode 100644 arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts create mode 100644 arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts create mode 100644 arduino-ide-extension/src/electron-main/theia/electron-messaging-contribution.ts delete mode 100644 arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts create mode 100644 arduino-ide-extension/src/node/theia/plugin-ext/hosted-plugin-localization-service.ts delete mode 100644 electron-app/patch/frontend/index.js delete mode 100644 electron-app/webpack.config.js delete mode 100644 electron/build/webpack.config.js create mode 100755 scripts/sort-dependencies diff --git a/.gitignore b/.gitignore index 4380cce54..b683e4e6e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ build/ Examples/ !electron/build/ src-gen/ -!webpack.config.js +webpack.config.js gen-webpack.config.js .DS_Store # switching from `electron` to `browser` in dev mode. @@ -15,8 +15,6 @@ gen-webpack.config.js yarn*.log # For the VS Code extensions used by Theia. plugins -# the config files for the CLI -arduino-ide-extension/data/cli/config # the tokens folder for the themes scripts/themes/tokens # environment variables diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 5efaf9cd1..0daf84ced 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -21,27 +21,31 @@ }, "dependencies": { "@grpc/grpc-js": "^1.6.7", - "@theia/application-package": "1.25.0", - "@theia/core": "1.25.0", - "@theia/editor": "1.25.0", - "@theia/electron": "1.25.0", - "@theia/filesystem": "1.25.0", - "@theia/keymaps": "1.25.0", - "@theia/markers": "1.25.0", - "@theia/monaco": "1.25.0", - "@theia/navigator": "1.25.0", - "@theia/outline-view": "1.25.0", - "@theia/output": "1.25.0", - "@theia/preferences": "1.25.0", - "@theia/search-in-workspace": "1.25.0", - "@theia/terminal": "1.25.0", - "@theia/workspace": "1.25.0", + "@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", "@tippyjs/react": "^4.2.5", - "@types/atob": "^2.1.2", "@types/auth0-js": "^9.14.0", "@types/btoa": "^1.2.3", "@types/dateformat": "^3.0.1", - "@types/deep-equal": "^1.0.1", "@types/deepmerge": "^2.2.0", "@types/glob": "^7.2.0", "@types/google-protobuf": "^3.7.2", @@ -50,49 +54,48 @@ "@types/lodash.debounce": "^4.0.6", "@types/ncp": "^2.0.4", "@types/node-fetch": "^2.5.7", + "@types/p-queue": "^2.3.1", "@types/ps-tree": "^1.1.0", - "@types/react-select": "^3.0.0", "@types/react-tabs": "^2.3.2", + "@types/react-virtualized": "^9.21.21", "@types/temp": "^0.8.34", "@types/which": "^1.3.1", - "ajv": "^6.5.3", "arduino-serial-plotter-webapp": "0.2.0", "async-mutex": "^0.3.0", - "atob": "^2.1.2", "auth0-js": "^9.14.0", "btoa": "^1.2.1", "classnames": "^2.3.1", "dateformat": "^3.0.3", - "deep-equal": "^2.0.5", "deepmerge": "2.0.1", "electron-updater": "^4.6.5", "fast-safe-stringify": "^2.1.1", "glob": "^7.1.6", "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", - "is-valid-path": "^0.1.1", "js-yaml": "^3.13.1", "jwt-decode": "^3.1.2", "keytar": "7.2.0", "lodash.debounce": "^4.0.8", + "minimatch": "^3.1.2", "ncp": "^2.0.0", "node-fetch": "^2.6.1", "open": "^8.0.6", - "p-queue": "^5.0.0", + "p-debounce": "^2.1.0", + "p-queue": "^2.4.2", "ps-tree": "^1.2.0", "query-string": "^7.0.1", - "react-disable": "^0.1.0", + "react-disable": "^0.1.1", "react-markdown": "^8.0.0", - "react-select": "^3.0.4", + "react-perfect-scrollbar": "^1.5.8", + "react-select": "^5.6.0", "react-tabs": "^3.1.2", + "react-virtualized": "^9.22.3", "react-window": "^1.8.6", "semver": "^7.3.2", "string-natural-compare": "^2.0.3", "temp": "^0.9.1", "temp-dir": "^2.0.0", "tree-kill": "^1.2.1", - "upath": "^1.1.2", - "url": "^0.11.0", "which": "^1.3.1" }, "devDependencies": { @@ -101,11 +104,10 @@ "@types/chai-string": "^1.4.2", "@types/mocha": "^5.2.7", "@types/react-window": "^1.8.5", - "@types/sinon": "^10.0.6", - "@types/sinon-chai": "^3.2.6", "chai": "^4.2.0", "chai-string": "^1.5.0", "decompress": "^4.2.0", + "decompress-tarbz2": "^4.1.1", "decompress-targz": "^4.1.1", "decompress-unzip": "^4.0.1", "download": "^7.1.0", @@ -115,9 +117,6 @@ "moment": "^2.24.0", "protoc": "^1.0.4", "shelljs": "^0.8.3", - "sinon": "^12.0.1", - "sinon-chai": "^3.7.0", - "typemoq": "^2.1.0", "uuid": "^3.2.1", "yargs": "^11.1.0" }, 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 dfeffb0cb..ba13b1b11 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -3,10 +3,7 @@ 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'; -import { - TabBarToolbarContribution, - TabBarToolbarFactory, -} from '@theia/core/lib/browser/shell/tab-bar-toolbar'; +import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/ws-connection-provider'; import { FrontendApplicationContribution, @@ -84,10 +81,7 @@ import { BoardsAutoInstaller } from './boards/boards-auto-installer'; import { ShellLayoutRestorer } from './theia/core/shell-layout-restorer'; import { ListItemRenderer } from './widgets/component-list/list-item-renderer'; import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; -import { - MonacoThemeJson, - MonacoThemingService, -} from '@theia/monaco/lib/browser/monaco-theming-service'; + import { ArduinoDaemonPath, ArduinoDaemon, @@ -137,7 +131,6 @@ import { Settings } from './contributions/settings'; import { WorkspaceCommandContribution } from './theia/workspace/workspace-commands'; import { WorkspaceDeleteHandler as TheiaWorkspaceDeleteHandler } from '@theia/workspace/lib/browser/workspace-delete-handler'; import { WorkspaceDeleteHandler } from './theia/workspace/workspace-delete-handler'; -import { TabBarToolbar } from './theia/core/tab-bar-toolbar'; import { EditorWidgetFactory as TheiaEditorWidgetFactory } from '@theia/editor/lib/browser/editor-widget-factory'; import { EditorWidgetFactory } from './theia/editor/editor-widget-factory'; import { BurnBootloader } from './contributions/burn-bootloader'; @@ -181,8 +174,6 @@ import { EditorCommandContribution } from './theia/editor/editor-command'; import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator'; import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator'; import { Debug } from './contributions/debug'; -import { DebugSessionManager } from './theia/debug/debug-session-manager'; -import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; import { Sketchbook } from './contributions/sketchbook'; import { DebugFrontendApplicationContribution } from './theia/debug/debug-frontend-application-contribution'; import { DebugFrontendApplicationContribution as TheiaDebugFrontendApplicationContribution } from '@theia/debug/lib/browser/debug-frontend-application-contribution'; @@ -241,7 +232,6 @@ import { UploadFirmware } from './contributions/upload-firmware'; import { UploadFirmwareDialog, UploadFirmwareDialogProps, - UploadFirmwareDialogWidget, } from './dialogs/firmware-uploader/firmware-uploader-dialog'; import { UploadCertificate } from './contributions/upload-certificate'; @@ -258,7 +248,6 @@ import { PlotterFrontendContribution } from './serial/plotter/plotter-frontend-c import { UserFieldsDialog, UserFieldsDialogProps, - UserFieldsDialogWidget, } from './dialogs/user-fields/user-fields-dialog'; import { nls } from '@theia/core/lib/common'; import { IDEUpdaterCommands } from './ide-updater/ide-updater-commands'; @@ -271,7 +260,6 @@ import { IDEUpdaterClientImpl } from './ide-updater/ide-updater-client-impl'; import { IDEUpdaterDialog, IDEUpdaterDialogProps, - IDEUpdaterDialogWidget, } from './dialogs/ide-updater/ide-updater-dialog'; import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-provider'; import { MonitorModel } from './monitor-model'; @@ -313,10 +301,6 @@ import { SelectedBoard } from './contributions/selected-board'; import { CheckForIDEUpdates } from './contributions/check-for-ide-updates'; import { OpenBoardsConfig } from './contributions/open-boards-config'; import { SketchFilesTracker } from './contributions/sketch-files-tracker'; -import { MonacoThemeServiceIsReady } from './utils/window'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { StatusBarImpl } from './theia/core/status-bar'; -import { StatusBarImpl as TheiaStatusBarImpl } from '@theia/core/lib/browser'; import { EditorMenuContribution } from './theia/editor/editor-file'; import { EditorMenuContribution as TheiaEditorMenuContribution } from '@theia/editor/lib/browser/editor-menu'; import { PreferencesEditorWidget as TheiaPreferencesEditorWidget } from '@theia/preferences/lib/browser/views/preference-editor-widget'; @@ -337,32 +321,16 @@ import { InterfaceScale } from './contributions/interface-scale'; import { OpenHandler } from '@theia/core/lib/browser/opener-service'; import { NewCloudSketch } from './contributions/new-cloud-sketch'; import { SketchbookCompositeWidget } from './widgets/sketchbook/sketchbook-composite-widget'; - -const registerArduinoThemes = () => { - const themes: MonacoThemeJson[] = [ - { - id: 'arduino-theme', - label: 'Light (Arduino)', - uiTheme: 'vs', - json: require('../../src/browser/data/default.color-theme.json'), - }, - { - id: 'arduino-theme-dark', - label: 'Dark (Arduino)', - uiTheme: 'vs-dark', - json: require('../../src/browser/data/dark.color-theme.json'), - }, - ]; - themes.forEach((theme) => MonacoThemingService.register(theme)); -}; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const global = window as any; -const ready = global[MonacoThemeServiceIsReady] as Deferred; -if (ready) { - ready.promise.then(registerArduinoThemes); -} else { - registerArduinoThemes(); -} +import { WindowTitleUpdater } from './theia/core/window-title-updater'; +import { WindowTitleUpdater as TheiaWindowTitleUpdater } from '@theia/core/lib/browser/window/window-title-updater'; +import { ThemeService } from './theia/core/theming'; +import { ThemeService as TheiaThemeService } from '@theia/core/lib/browser/theming'; +import { MonacoThemingService } from './theia/monaco/monaco-theming-service'; +import { MonacoThemingService as TheiaMonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service'; +import { TypeHierarchyServiceProvider } from './theia/typehierarchy/type-hierarchy-service'; +import { TypeHierarchyServiceProvider as TheiaTypeHierarchyServiceProvider } from '@theia/typehierarchy/lib/browser/typehierarchy-service'; +import { TypeHierarchyContribution } from './theia/typehierarchy/type-hierarchy-contribution'; +import { TypeHierarchyContribution as TheiaTypeHierarchyContribution } from '@theia/typehierarchy/lib/browser/typehierarchy-contribution'; export default new ContainerModule((bind, unbind, isBound, rebind) => { // Commands and toolbar items @@ -587,14 +555,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .to(WorkspaceDeleteHandler) .inSingletonScope(); rebind(TheiaEditorWidgetFactory).to(EditorWidgetFactory).inSingletonScope(); - rebind(TabBarToolbarFactory).toFactory( - ({ container: parentContainer }) => - () => { - const container = parentContainer.createChild(); - container.bind(TabBarToolbar).toSelf().inSingletonScope(); - return container.get(TabBarToolbar); - } - ); bind(OutputChannelManager).toSelf().inSingletonScope(); rebind(TheiaOutputChannelManager).toService(OutputChannelManager); bind(OutputChannelRegistryMainImpl).toSelf().inTransientScope(); @@ -838,9 +798,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(AboutDialog).toSelf().inSingletonScope(); rebind(TheiaAboutDialog).toService(AboutDialog); - // To avoid running `Save All` when there are no dirty editors before starting the debug session. - bind(DebugSessionManager).toSelf().inSingletonScope(); - rebind(TheiaDebugSessionManager).toService(DebugSessionManager); // To remove the `Run` menu item from the application menu. bind(DebugFrontendApplicationContribution).toSelf().inSingletonScope(); rebind(TheiaDebugFrontendApplicationContribution).toService( @@ -854,10 +811,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(WidgetManager).toSelf().inSingletonScope(); rebind(TheiaWidgetManager).toService(WidgetManager); - // To avoid running a status bar update on every single `keypress` event from the editor. - bind(StatusBarImpl).toSelf().inSingletonScope(); - rebind(TheiaStatusBarImpl).toService(StatusBarImpl); - // Debounced update for the tab-bar toolbar when typing in the editor. bind(DockPanelRenderer).toSelf(); rebind(TheiaDockPanelRenderer).toService(DockPanelRenderer); @@ -942,12 +895,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(LocalCacheFsProvider).toSelf().inSingletonScope(); bind(FileServiceContribution).toService(LocalCacheFsProvider); bind(CloudSketchbookCompositeWidget).toSelf(); - bind(WidgetFactory).toDynamicValue((ctx) => ({ + bind(WidgetFactory).toDynamicValue((ctx) => ({ id: 'cloud-sketchbook-composite-widget', createWidget: () => ctx.container.get(CloudSketchbookCompositeWidget), })); - bind(UploadFirmwareDialogWidget).toSelf().inSingletonScope(); bind(UploadFirmwareDialog).toSelf().inSingletonScope(); bind(UploadFirmwareDialogProps).toConstantValue({ title: 'UploadFirmware', @@ -958,13 +910,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { title: 'UploadCertificate', }); - bind(IDEUpdaterDialogWidget).toSelf().inSingletonScope(); bind(IDEUpdaterDialog).toSelf().inSingletonScope(); bind(IDEUpdaterDialogProps).toConstantValue({ title: 'IDEUpdater', }); - bind(UserFieldsDialogWidget).toSelf().inSingletonScope(); bind(UserFieldsDialog).toSelf().inSingletonScope(); bind(UserFieldsDialogProps).toConstantValue({ title: 'UserFields', @@ -991,4 +941,23 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(TheiaHostedPluginSupport).toService(HostedPluginSupport); bind(HostedPluginEvents).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(HostedPluginEvents); + + // custom window titles + bind(WindowTitleUpdater).toSelf().inSingletonScope(); + rebind(TheiaWindowTitleUpdater).toService(WindowTitleUpdater); + + // register Arduino themes + bind(ThemeService).toSelf().inSingletonScope(); + rebind(TheiaThemeService).toService(ThemeService); + bind(MonacoThemingService).toSelf().inSingletonScope(); + rebind(TheiaMonacoThemingService).toService(MonacoThemingService); + + // disable type-hierarchy support + // https://github.com/eclipse-theia/theia/commit/16c88a584bac37f5cf3cc5eb92ffdaa541bda5be + bind(TypeHierarchyServiceProvider).toSelf().inSingletonScope(); + rebind(TheiaTypeHierarchyServiceProvider).toService( + TypeHierarchyServiceProvider + ); + bind(TypeHierarchyContribution).toSelf().inSingletonScope(); + rebind(TheiaTypeHierarchyContribution).toService(TypeHierarchyContribution); }); diff --git a/arduino-ide-extension/src/browser/contributions/sketch-control.ts b/arduino-ide-extension/src/browser/contributions/sketch-control.ts index 62f2d8ce8..eef34817e 100644 --- a/arduino-ide-extension/src/browser/contributions/sketch-control.ts +++ b/arduino-ide-extension/src/browser/contributions/sketch-control.ts @@ -235,7 +235,7 @@ export class SketchControl extends SketchContribution { }); registry.registerKeybinding({ command: CommonCommands.PREVIOUS_TAB.id, - keybinding: 'CtrlCmd+Alt+Left', // TODO: check why electron does not show the keybindings in the UI. + keybinding: 'CtrlCmd+Alt+Left', }); registry.registerKeybinding({ command: CommonCommands.NEXT_TAB.id, diff --git a/arduino-ide-extension/src/browser/create/create-uri.ts b/arduino-ide-extension/src/browser/create/create-uri.ts index 658a65ac1..be1a30e9c 100644 --- a/arduino-ide-extension/src/browser/create/create-uri.ts +++ b/arduino-ide-extension/src/browser/create/create-uri.ts @@ -1,4 +1,4 @@ -import { URI as Uri } from 'vscode-uri'; +import { URI as Uri } from '@theia/core/shared/vscode-uri'; import URI from '@theia/core/lib/common/uri'; import { toPosixPath, parentPosix, posix } from './create-paths'; import { Create } from './typings'; diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx index 448bbf0e4..20d97d4b2 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx @@ -5,10 +5,8 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { DialogProps } from '@theia/core/lib/browser/dialogs'; -import { AbstractDialog } from '../../theia/dialogs/dialogs'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { ReactDialog } from '../../theia/dialogs/dialogs'; import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; import { AvailableBoard, BoardsServiceProvider, @@ -23,26 +21,30 @@ import { Port } from '../../../common/protocol'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @injectable() -export class UploadFirmwareDialogWidget extends ReactWidget { - @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; +export class UploadFirmwareDialogProps extends DialogProps {} +@injectable() +export class UploadFirmwareDialog extends ReactDialog { + @inject(BoardsServiceProvider) + private readonly boardsServiceClient: BoardsServiceProvider; @inject(ArduinoFirmwareUploader) - protected readonly arduinoFirmwareUploader: ArduinoFirmwareUploader; - + private readonly arduinoFirmwareUploader: ArduinoFirmwareUploader; @inject(FrontendApplicationStateService) private readonly appStatusService: FrontendApplicationStateService; - protected updatableFqbns: string[] = []; - protected availableBoards: AvailableBoard[] = []; - protected isOpen = new Object(); - - public busyCallback = (busy: boolean) => { - return; - }; + private updatableFqbns: string[] = []; + private availableBoards: AvailableBoard[] = []; + private isOpen = new Object(); + private busy = false; - constructor() { - super(); + constructor( + @inject(UploadFirmwareDialogProps) + protected override readonly props: UploadFirmwareDialogProps + ) { + super({ title: UploadFirmware.Commands.OPEN.label || '' }); + this.node.id = 'firmware-uploader-dialog-container'; + this.contentNode.classList.add('firmware-uploader-dialog'); + this.acceptButton = undefined; } @postConstruct() @@ -59,79 +61,34 @@ export class UploadFirmwareDialogWidget extends ReactWidget { }); } - protected flashFirmware(firmware: FirmwareInfo, port: Port): Promise { - this.busyCallback(true); - return this.arduinoFirmwareUploader - .flash(firmware, port) - .finally(() => this.busyCallback(false)); - } - - protected override onCloseRequest(msg: Message): void { - super.onCloseRequest(msg); - this.isOpen = new Object(); + get value(): void { + return; } - protected render(): React.ReactNode { + protected override render(): React.ReactNode { return ( -
- - +
+
+ + +
); } -} - -@injectable() -export class UploadFirmwareDialogProps extends DialogProps {} - -@injectable() -export class UploadFirmwareDialog extends AbstractDialog { - @inject(UploadFirmwareDialogWidget) - protected readonly widget: UploadFirmwareDialogWidget; - - private busy = false; - - constructor( - @inject(UploadFirmwareDialogProps) - protected override readonly props: UploadFirmwareDialogProps - ) { - super({ title: UploadFirmware.Commands.OPEN.label || '' }); - this.node.id = 'firmware-uploader-dialog-container'; - this.contentNode.classList.add('firmware-uploader-dialog'); - this.acceptButton = undefined; - } - - get value(): void { - return; - } protected override onAfterAttach(msg: Message): void { - if (this.widget.isAttached) { - Widget.detach(this.widget); - } - Widget.attach(this.widget, this.contentNode); - const firstButton = this.widget.node.querySelector('button'); + const firstButton = this.node.querySelector('button'); firstButton?.focus(); - this.widget.busyCallback = this.busyCallback.bind(this); 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(); - } - + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars protected override handleEnter(event: KeyboardEvent): boolean | void { return false; } @@ -140,11 +97,11 @@ export class UploadFirmwareDialog extends AbstractDialog { if (this.busy) { return; } - this.widget.close(); super.close(); + this.isOpen = new Object(); } - busyCallback(busy: boolean): void { + private busyCallback(busy: boolean): void { this.busy = busy; if (busy) { this.closeCrossNode.classList.add('disabled'); @@ -152,4 +109,11 @@ export class UploadFirmwareDialog extends AbstractDialog { this.closeCrossNode.classList.remove('disabled'); } } + + private flashFirmware(firmware: FirmwareInfo, port: Port): Promise { + this.busyCallback(true); + return this.arduinoFirmwareUploader + .flash(firmware, port) + .finally(() => this.busyCallback(false)); + } } diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx index 93da416e5..ecb4be944 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx @@ -1,7 +1,6 @@ import { nls } from '@theia/core/lib/common'; -import { shell } from 'electron'; +import { shell } from '@theia/core/electron-shared/@electron/remote'; import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; import ReactMarkdown from 'react-markdown'; import { ProgressInfo, UpdateInfo } from '../../../common/protocol/ide-updater'; import ProgressBar from '../../components/ProgressBar'; @@ -28,32 +27,19 @@ export const IDEUpdaterComponent = ({ }, }: IDEUpdaterComponentProps): React.ReactElement => { const { version, releaseNotes } = updateInfo; - const changelogDivRef = - React.useRef() as React.MutableRefObject; + const [changelog, setChangelog] = React.useState(''); React.useEffect(() => { - if (!!releaseNotes && changelogDivRef.current) { - let changelog: string; - if (typeof releaseNotes === 'string') changelog = releaseNotes; - else - changelog = releaseNotes.reduce((acc, item) => { - return item.note ? (acc += `${item.note}\n\n`) : acc; - }, ''); - ReactDOM.render( - ( - href && shell.openExternal(href)} {...props}> - {children} - - ), - }} - > - {changelog} - , - changelogDivRef.current + if (releaseNotes) { + setChangelog( + typeof releaseNotes === 'string' + ? releaseNotes + : releaseNotes.reduce( + (acc, item) => (item.note ? (acc += `${item.note}\n\n`) : acc), + '' + ) ); } - }, [updateInfo]); + }, [releaseNotes, changelog]); const DownloadCompleted: () => React.ReactElement = () => (
@@ -106,9 +92,24 @@ export const IDEUpdaterComponent = ({ version )}
- {releaseNotes && ( + {changelog && (
- )}
diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index 7dc2d7347..c4f2d940b 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -5,10 +5,8 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { DialogProps } from '@theia/core/lib/browser/dialogs'; -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 { ReactDialog } from '../../theia/dialogs/dialogs'; import { nls } from '@theia/core'; import { IDEUpdaterComponent, UpdateProgress } from './ide-updater-component'; import { @@ -22,47 +20,11 @@ import { WindowService } from '@theia/core/lib/browser/window/window-service'; const DOWNLOAD_PAGE_URL = 'https://www.arduino.cc/en/software'; -@injectable() -export class IDEUpdaterDialogWidget extends ReactWidget { - private _updateInfo: UpdateInfo; - private _updateProgress: UpdateProgress = {}; - - setUpdateInfo(updateInfo: UpdateInfo): void { - this._updateInfo = updateInfo; - this.update(); - } - - mergeUpdateProgress(updateProgress: UpdateProgress): void { - this._updateProgress = { ...this._updateProgress, ...updateProgress }; - this.update(); - } - - get updateInfo(): UpdateInfo { - return this._updateInfo; - } - - get updateProgress(): UpdateProgress { - return this._updateProgress; - } - - protected render(): React.ReactNode { - return !!this._updateInfo ? ( - - ) : null; - } -} - @injectable() export class IDEUpdaterDialogProps extends DialogProps {} @injectable() -export class IDEUpdaterDialog extends AbstractDialog { - @inject(IDEUpdaterDialogWidget) - private readonly widget: IDEUpdaterDialogWidget; - +export class IDEUpdaterDialog extends ReactDialog { @inject(IDEUpdater) private readonly updater: IDEUpdater; @@ -75,6 +37,9 @@ export class IDEUpdaterDialog extends AbstractDialog { @inject(WindowService) private readonly windowService: WindowService; + private _updateInfo: UpdateInfo | undefined; + private _updateProgress: UpdateProgress = {}; + constructor( @inject(IDEUpdaterDialogProps) protected override readonly props: IDEUpdaterDialogProps @@ -94,26 +59,34 @@ export class IDEUpdaterDialog extends AbstractDialog { protected init(): void { this.updaterClient.onUpdaterDidFail((error) => { this.appendErrorButtons(); - this.widget.mergeUpdateProgress({ error }); + this.mergeUpdateProgress({ error }); }); this.updaterClient.onDownloadProgressDidChange((progressInfo) => { - this.widget.mergeUpdateProgress({ progressInfo }); + this.mergeUpdateProgress({ progressInfo }); }); this.updaterClient.onDownloadDidFinish(() => { this.appendInstallButtons(); - this.widget.mergeUpdateProgress({ downloadFinished: true }); + this.mergeUpdateProgress({ downloadFinished: true }); }); } - get value(): UpdateInfo { - return this.widget.updateInfo; + protected render(): React.ReactNode { + return ( + this.updateInfo && ( + + ) + ); + } + + get value(): UpdateInfo | undefined { + return this.updateInfo; } protected override onAfterAttach(msg: Message): void { - if (this.widget.isAttached) { - Widget.detach(this.widget); - } - Widget.attach(this.widget, this.contentNode); + this.update(); this.appendInitialButtons(); super.onAfterAttach(msg); } @@ -196,15 +169,19 @@ export class IDEUpdaterDialog extends AbstractDialog { } private skipVersion(): void { + if (!this.updateInfo) { + console.warn(`Nothing to skip. No update info is available`); + return; + } this.localStorageService.setData( SKIP_IDE_VERSION, - this.widget.updateInfo.version + this.updateInfo.version ); this.close(); } private startDownload(): void { - this.widget.mergeUpdateProgress({ + this.mergeUpdateProgress({ downloadStarted: true, }); this.clearButtons(); @@ -216,31 +193,48 @@ export class IDEUpdaterDialog extends AbstractDialog { this.close(); } + private set updateInfo(updateInfo: UpdateInfo | undefined) { + this._updateInfo = updateInfo; + this.update(); + } + + private get updateInfo(): UpdateInfo | undefined { + return this._updateInfo; + } + + private get updateProgress(): UpdateProgress { + return this._updateProgress; + } + + private mergeUpdateProgress(updateProgress: UpdateProgress): void { + this._updateProgress = { ...this._updateProgress, ...updateProgress }; + this.update(); + } + override async open( data: UpdateInfo | undefined = undefined ): Promise { if (data && data.version) { - this.widget.mergeUpdateProgress({ + this.mergeUpdateProgress({ progressInfo: undefined, downloadStarted: false, downloadFinished: false, error: undefined, }); - this.widget.setUpdateInfo(data); + this.updateInfo = data; return super.open(); } } protected override onActivateRequest(msg: Message): void { super.onActivateRequest(msg); - this.widget.activate(); + this.update(); } override close(): void { - this.widget.dispose(); if ( - this.widget.updateProgress?.downloadStarted && - !this.widget.updateProgress?.downloadFinished + this.updateProgress?.downloadStarted && + !this.updateProgress?.downloadFinished ) { this.updater.stopDownload(); } diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 3138c7242..414cee7d7 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -218,16 +218,14 @@ export class SettingsComponent extends React.Component<
@@ -612,11 +610,11 @@ export class SettingsComponent extends React.Component< event: React.ChangeEvent ): void => { const { selectedIndex } = event.target.options; - const theme = ThemeService.get().getThemes()[selectedIndex]; + const theme = this.props.themeService.getThemes()[selectedIndex]; if (theme) { this.setState({ themeId: theme.id }); - if (ThemeService.get().getCurrentTheme().id !== theme.id) { - ThemeService.get().setCurrentTheme(theme.id); + if (this.props.themeService.getCurrentTheme().id !== theme.id) { + this.props.themeService.setCurrentTheme(theme.id); } } }; @@ -755,6 +753,7 @@ export namespace SettingsComponent { readonly fileDialogService: FileDialogService; readonly windowService: WindowService; readonly localizationProvider: AsyncLocalizationProvider; + readonly themeService: ThemeService; } export type State = Settings & { rawAdditionalUrlsValue: string; diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 7ebc7c5ba..0c9e51e43 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -35,6 +35,9 @@ export class SettingsWidget extends ReactWidget { @inject(AsyncLocalizationProvider) protected readonly localizationProvider: AsyncLocalizationProvider; + @inject(ThemeService) + private readonly themeService: ThemeService; + protected render(): React.ReactNode { return ( ); } @@ -59,6 +63,9 @@ export class SettingsDialog extends AbstractDialog> { @inject(SettingsWidget) protected readonly widget: SettingsWidget; + @inject(ThemeService) + private readonly themeService: ThemeService; + constructor( @inject(SettingsDialogProps) protected override readonly props: SettingsDialogProps @@ -121,11 +128,11 @@ export class SettingsDialog extends AbstractDialog> { } override async open(): Promise | undefined> { - const themeIdBeforeOpen = ThemeService.get().getCurrentTheme().id; + const themeIdBeforeOpen = this.themeService.getCurrentTheme().id; const result = await super.open(); if (!result) { - if (ThemeService.get().getCurrentTheme().id !== themeIdBeforeOpen) { - ThemeService.get().setCurrentTheme(themeIdBeforeOpen); + if (this.themeService.getCurrentTheme().id !== themeIdBeforeOpen) { + this.themeService.setCurrentTheme(themeIdBeforeOpen); } } return result; diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index 7033f8e8a..c8c0344ec 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -5,7 +5,7 @@ import { } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { Emitter } from '@theia/core/lib/common/event'; -import { Deferred, timeout } from '@theia/core/lib/common/promise-util'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { deepClone } from '@theia/core/lib/common/objects'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { ThemeService } from '@theia/core/lib/browser/theming'; @@ -25,6 +25,8 @@ import { LanguageInfo, } from '@theia/core/lib/common/i18n/localization'; import { ElectronCommands } from '@theia/core/lib/electron-browser/menu/electron-menu-contribution'; +import { DefaultTheme } from '@theia/application-package/lib/application-props'; +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; export const EDITOR_SETTING = 'editor'; export const FONT_SIZE_SETTING = `${EDITOR_SETTING}.fontSize`; @@ -101,6 +103,9 @@ export class SettingsService { @inject(CommandService) protected commandService: CommandService; + @inject(ThemeService) + private readonly themeService: ThemeService; + protected readonly onDidChangeEmitter = new Emitter>(); readonly onDidChange = this.onDidChangeEmitter.event; protected readonly onDidResetEmitter = new Emitter>(); @@ -141,10 +146,9 @@ export class SettingsService { this.preferenceService.get(FONT_SIZE_SETTING, 12), this.preferenceService.get( 'workbench.colorTheme', - window.matchMedia && - window.matchMedia('(prefers-color-scheme: dark)').matches - ? 'arduino-theme-dark' - : 'arduino-theme' + DefaultTheme.defaultForOSTheme( + FrontendApplicationConfigProvider.get().defaultTheme + ) ), this.preferenceService.get( AUTO_SAVE_SETTING, @@ -231,11 +235,7 @@ export class SettingsService { 'Invalid editor font size. It must be a positive integer.' ); } - if ( - !ThemeService.get() - .getThemes() - .find(({ id }) => id === themeId) - ) { + if (!this.themeService.getThemes().find(({ id }) => id === themeId)) { return nls.localize( 'arduino/preferences/invalid.theme', 'Invalid theme.' @@ -252,7 +252,6 @@ export class SettingsService { private async savePreference(name: string, value: unknown): Promise { await this.preferenceService.set(name, value, PreferenceScope.User); - await timeout(5); } async save(): Promise { @@ -283,19 +282,21 @@ export class SettingsService { (config as any).network = network; (config as any).locale = currentLanguage; - await this.savePreference('editor.fontSize', editorFontSize); - await this.savePreference('workbench.colorTheme', themeId); - await this.savePreference(AUTO_SAVE_SETTING, autoSave); - await this.savePreference('editor.quickSuggestions', quickSuggestions); - await this.savePreference(AUTO_SCALE_SETTING, autoScaleInterface); - await this.savePreference(ZOOM_LEVEL_SETTING, interfaceScale); - await this.savePreference(ZOOM_LEVEL_SETTING, interfaceScale); - await this.savePreference(COMPILE_VERBOSE_SETTING, verboseOnCompile); - await this.savePreference(COMPILE_WARNINGS_SETTING, compilerWarnings); - await this.savePreference(UPLOAD_VERBOSE_SETTING, verboseOnUpload); - await this.savePreference(UPLOAD_VERIFY_SETTING, verifyAfterUpload); - await this.savePreference(SHOW_ALL_FILES_SETTING, sketchbookShowAllFiles); - await this.configService.setConfiguration(config); + await Promise.all([ + this.savePreference('editor.fontSize', editorFontSize), + this.savePreference('workbench.colorTheme', themeId), + this.savePreference(AUTO_SAVE_SETTING, autoSave), + this.savePreference('editor.quickSuggestions', quickSuggestions), + this.savePreference(AUTO_SCALE_SETTING, autoScaleInterface), + this.savePreference(ZOOM_LEVEL_SETTING, interfaceScale), + this.savePreference(ZOOM_LEVEL_SETTING, interfaceScale), + this.savePreference(COMPILE_VERBOSE_SETTING, verboseOnCompile), + this.savePreference(COMPILE_WARNINGS_SETTING, compilerWarnings), + this.savePreference(UPLOAD_VERBOSE_SETTING, verboseOnUpload), + this.savePreference(UPLOAD_VERIFY_SETTING, verifyAfterUpload), + this.savePreference(SHOW_ALL_FILES_SETTING, sketchbookShowAllFiles), + this.configService.setConfiguration(config), + ]); this.onDidChangeEmitter.fire(this._settings); // after saving all the settings, if we need to change the language we need to perform a reload diff --git a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx index b95ef21cf..88109cf71 100644 --- a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx @@ -1,63 +1,18 @@ import * as React from '@theia/core/shared/react'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { - AbstractDialog, - DialogProps, - ReactWidget, -} from '@theia/core/lib/browser'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { DialogProps } from '@theia/core/lib/browser/dialogs'; import { Message } from '@theia/core/shared/@phosphor/messaging'; import { UploadSketch } from '../../contributions/upload-sketch'; import { UserFieldsComponent } from './user-fields-component'; import { BoardUserField } from '../../../common/protocol'; - -@injectable() -export class UserFieldsDialogWidget extends ReactWidget { - private _currentUserFields: BoardUserField[] = []; - - constructor(private cancel: () => void, private accept: () => Promise) { - super(); - } - - set currentUserFields(userFields: BoardUserField[]) { - this.setUserFields(userFields); - } - - get currentUserFields(): BoardUserField[] { - return this._currentUserFields; - } - - resetUserFieldsValue(): void { - this._currentUserFields = this._currentUserFields.map((field) => { - field.value = ''; - return field; - }); - } - - private setUserFields(userFields: BoardUserField[]): void { - this._currentUserFields = userFields; - } - - protected render(): React.ReactNode { - return ( -
- - - ); - } -} +import { ReactDialog } from '../../theia/dialogs/dialogs'; @injectable() export class UserFieldsDialogProps extends DialogProps {} @injectable() -export class UserFieldsDialog extends AbstractDialog { - protected readonly widget: UserFieldsDialogWidget; +export class UserFieldsDialog extends ReactDialog { + private _currentUserFields: BoardUserField[] = []; constructor( @inject(UserFieldsDialogProps) @@ -69,39 +24,36 @@ export class UserFieldsDialog extends AbstractDialog { this.titleNode.classList.add('user-fields-dialog-title'); this.contentNode.classList.add('user-fields-dialog-content'); this.acceptButton = undefined; - this.widget = new UserFieldsDialogWidget( - this.close.bind(this), - this.accept.bind(this) - ); + } + + get value(): BoardUserField[] { + return this._currentUserFields; } set value(userFields: BoardUserField[]) { - this.widget.currentUserFields = userFields; + this._currentUserFields = userFields; } - get value(): BoardUserField[] { - return this.widget.currentUserFields; + protected override render(): React.ReactNode { + return ( +
+
+ + +
+ ); } protected override onAfterAttach(msg: Message): void { - if (this.widget.isAttached) { - Widget.detach(this.widget); - } - Widget.attach(this.widget, this.contentNode); super.onAfterAttach(msg); this.update(); } - protected override onUpdateRequest(msg: Message): void { - super.onUpdateRequest(msg); - this.widget.update(); - } - - protected override onActivateRequest(msg: Message): void { - super.onActivateRequest(msg); - this.widget.activate(); - } - protected override async accept(): Promise { // If the user presses enter and at least // a field is empty don't accept the input @@ -114,8 +66,21 @@ export class UserFieldsDialog extends AbstractDialog { } override close(): void { - this.widget.resetUserFieldsValue(); - this.widget.close(); + this.resetUserFieldsValue(); super.close(); } + + private resetUserFieldsValue(): void { + this.value = this.value.map((field) => { + field.value = ''; + return field; + }); + } + + private readonly doCancel: () => void = () => this.close(); + private readonly doAccept: () => Promise = () => this.accept(); + private readonly doUpdateUserFields: (userFields: BoardUserField[]) => void = + (userFields: BoardUserField[]) => { + this.value = userFields; + }; } diff --git a/arduino-ide-extension/src/browser/icons/loading-dark.svg b/arduino-ide-extension/src/browser/icons/loading-dark.svg new file mode 100644 index 000000000..d886fd06f --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/loading-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/arduino-ide-extension/src/browser/icons/loading-light.svg b/arduino-ide-extension/src/browser/icons/loading-light.svg new file mode 100644 index 000000000..d46f25880 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/loading-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts index 5a9a77c71..ee2aebf99 100644 --- a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts +++ b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts @@ -1,5 +1,5 @@ import { inject, injectable } from '@theia/core/shared/inversify'; -import { URI as Uri } from 'vscode-uri'; +import { URI as Uri } from '@theia/core/shared/vscode-uri'; import URI from '@theia/core/lib/common/uri'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index f9aba5ed4..a5a25230c 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -1,6 +1,5 @@ import * as React from '@theia/core/shared/react'; import { injectable, inject } from '@theia/core/shared/inversify'; -import { OptionsType } from 'react-select/src/types'; import { Emitter } from '@theia/core/lib/common/event'; import { Disposable } from '@theia/core/lib/common/disposable'; import { @@ -128,9 +127,7 @@ export class MonitorWidget extends ReactWidget { ); }; - protected get lineEndings(): OptionsType< - SerialMonitorOutput.SelectOption - > { + protected get lineEndings(): SerialMonitorOutput.SelectOption[] { return [ { label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index e46cdcdd7..638403697 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -20,6 +20,16 @@ @import './progress-bar.css'; @import './settings-step-input.css'; +/* Revive of the `--theia-icon-loading`. The variable has been removed from Theia while IDE2 still uses is. */ +/* The SVG icons are still part of Theia (1.31.1) */ +/* https://github.com/arduino/arduino-ide/pull/1662#issuecomment-1324997134 */ +body { + --theia-icon-loading: url(../icons/loading-light.svg); +} +body.theia-dark { + --theia-icon-loading: url(../icons/loading-dark.svg); +} + .theia-input.warning:focus { outline-width: 1px; outline-style: solid; diff --git a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts index 98d6d49e6..29d092017 100644 --- a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts @@ -24,7 +24,7 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution CommonCommands.TOGGLE_MAXIMIZED, CommonCommands.PIN_TAB, CommonCommands.UNPIN_TAB, - CommonCommands.NEW_FILE, + CommonCommands.NEW_UNTITLED_FILE, ]) { commandRegistry.unregisterCommand(command); } diff --git a/arduino-ide-extension/src/browser/theia/core/status-bar.ts b/arduino-ide-extension/src/browser/theia/core/status-bar.ts deleted file mode 100644 index 3e7782c3b..000000000 --- a/arduino-ide-extension/src/browser/theia/core/status-bar.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { StatusBarImpl as TheiaStatusBarImpl } from '@theia/core/lib/browser'; - -@injectable() -export class StatusBarImpl extends TheiaStatusBarImpl { - override async removeElement(id: string): Promise { - await this.ready; - if (this.entries.delete(id)) { - // Unlike Theia, IDE2 updates the status bar only if the element to remove was among the entries. Otherwise, it's a NOOP. - this.update(); - } - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx b/arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx deleted file mode 100644 index 42e086d2b..000000000 --- a/arduino-ide-extension/src/browser/theia/core/tab-bar-toolbar.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from '@theia/core/shared/react'; -import { injectable } from '@theia/core/shared/inversify'; -import { LabelIcon } from '@theia/core/lib/browser/label-parser'; -import { - TabBarToolbar as TheiaTabBarToolbar, - TabBarToolbarItem, -} from '@theia/core/lib/browser/shell/tab-bar-toolbar'; - -@injectable() -export class TabBarToolbar extends TheiaTabBarToolbar { - /** - * Copied over from Theia. Added an ID to the parent of the toolbar item (`--container`). - * CSS3 does not support parent selectors but we want to style the parent of the toolbar item. - */ - protected override renderItem(item: TabBarToolbarItem): React.ReactNode { - let innerText = ''; - const classNames = []; - if (item.text) { - for (const labelPart of this.labelParser.parse(item.text)) { - if (typeof labelPart !== 'string' && LabelIcon.is(labelPart)) { - const className = `fa fa-${labelPart.name}${ - labelPart.animation ? ' fa-' + labelPart.animation : '' - }`; - classNames.push(...className.split(' ')); - } else { - innerText = labelPart; - } - } - } - const command = this.commands.getCommand(item.command); - const iconClass = - (typeof item.icon === 'function' && item.icon()) || - item.icon || - (command && command.iconClass); - if (iconClass) { - classNames.push(iconClass); - } - const tooltip = item.tooltip || (command && command.label); - return ( -
-
- {innerText} -
-
- ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/core/theming.ts b/arduino-ide-extension/src/browser/theia/core/theming.ts new file mode 100644 index 000000000..4438d94e8 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/theming.ts @@ -0,0 +1,26 @@ +import { ThemeService as TheiaThemeService } from '@theia/core/lib/browser/theming'; +import type { Theme } from '@theia/core/lib/common/theme'; +import { injectable } from '@theia/core/shared/inversify'; + +export namespace ArduinoThemes { + export const Light: Theme = { + id: 'arduino-theme', + type: 'light', + label: 'Light (Arduino)', + editorTheme: 'arduino-theme', + }; + export const Dark: Theme = { + id: 'arduino-theme-dark', + type: 'dark', + label: 'Dark (Arduino)', + editorTheme: 'arduino-theme-dark', + }; +} + +@injectable() +export class ThemeService extends TheiaThemeService { + protected override init(): void { + this.register(ArduinoThemes.Light, ArduinoThemes.Dark); + super.init(); + } +} diff --git a/arduino-ide-extension/src/browser/theia/core/widget-manager.ts b/arduino-ide-extension/src/browser/theia/core/widget-manager.ts index 2e98c2bfc..038b046a1 100644 --- a/arduino-ide-extension/src/browser/theia/core/widget-manager.ts +++ b/arduino-ide-extension/src/browser/theia/core/widget-manager.ts @@ -1,4 +1,3 @@ -import type { MaybePromise } from '@theia/core'; import type { Widget } from '@theia/core/lib/browser'; import { WidgetManager as TheiaWidgetManager } from '@theia/core/lib/browser/widget-manager'; import { @@ -8,7 +7,6 @@ import { } from '@theia/core/shared/inversify'; import { EditorWidget } from '@theia/editor/lib/browser'; import { OutputWidget } from '@theia/output/lib/browser/output-widget'; -import deepEqual = require('deep-equal'); import { CurrentSketch, SketchesServiceClientImpl, @@ -72,44 +70,4 @@ export class WidgetManager extends TheiaWidgetManager { title.className += title.className + ` ${uncloseableClass}`; } } - - /** - * Customized to find any existing widget based on `options` deepEquals instead of string equals. - * See https://github.com/eclipse-theia/theia/issues/11309. - */ - protected override doGetWidget( - key: string - ): MaybePromise | undefined { - const pendingWidget = this.findExistingWidget(key); - if (pendingWidget) { - return pendingWidget as MaybePromise; - } - return undefined; - } - - private findExistingWidget( - key: string - ): MaybePromise | undefined { - const parsed = this.parseJson(key); - for (const [candidateKey, widget] of [ - ...this.widgetPromises.entries(), - ...this.pendingWidgetPromises.entries(), - ]) { - const candidate = this.parseJson(candidateKey); - if (deepEqual(candidate, parsed)) { - return widget as MaybePromise; - } - } - return undefined; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private parseJson(json: string): any { - try { - return JSON.parse(json); - } catch (err) { - console.log(`Failed to parse JSON: <${json}>.`, err); - throw err; - } - } } diff --git a/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts new file mode 100644 index 000000000..9e786e262 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts @@ -0,0 +1,87 @@ +import * as remote from '@theia/core/electron-shared/@electron/remote'; +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +import { NavigatableWidget } from '@theia/core/lib/browser/navigatable-types'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { Widget } from '@theia/core/lib/browser/widgets/widget'; +import { WindowTitleUpdater as TheiaWindowTitleUpdater } from '@theia/core/lib/browser/window/window-title-updater'; +import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; +import { isOSX } from '@theia/core/lib/common/os'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; +import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; + +@injectable() +export class WindowTitleUpdater extends TheiaWindowTitleUpdater { + @inject(ApplicationServer) + private readonly applicationServer: ApplicationServer; + @inject(ApplicationShell) + private readonly applicationShell: ApplicationShell; + @inject(WorkspaceService) + private readonly workspaceService: WorkspaceService; + + private _previousRepresentedFilename: string | undefined; + + private readonly applicationName = + FrontendApplicationConfigProvider.get().applicationName; + private applicationVersion: string | undefined; + + @postConstruct() + protected init(): void { + setTimeout( + () => + this.applicationServer.getApplicationInfo().then((info) => { + this.applicationVersion = info?.version; + if (this.applicationVersion) { + this.handleWidgetChange(this.applicationShell.currentWidget); + } + }), + 0 + ); + } + + protected override handleWidgetChange(widget?: Widget | undefined): void { + if (isOSX) { + this.maybeUpdateRepresentedFilename(widget); + } + // Unlike Theia, IDE2 does not want to show in the window title if the current widget is dirty or not. + // Hence, IDE2 does not track widgets but updates the window title on current widget change. + this.updateTitleWidget(widget); + } + + protected override updateTitleWidget(widget?: Widget | undefined): void { + let activeEditorShort = ''; + const rootName = this.workspaceService.workspace?.name ?? ''; + let appName = `${this.applicationName}${ + this.applicationVersion ? ` ${this.applicationVersion}` : '' + }`; + if (rootName) { + appName = ` | ${appName}`; + } + const uri = NavigatableWidget.getUri(widget); + if (uri) { + const base = uri.path.base; + // Do not show the basename of the main sketch file. Only other sketch file names are visible in the title. + if (`${rootName}.ino` !== base) { + activeEditorShort = ` - ${base} `; + } + } + this.windowTitleService.update({ rootName, appName, activeEditorShort }); + } + + private maybeUpdateRepresentedFilename(widget?: Widget | undefined): void { + if (widget instanceof EditorWidget) { + const { uri } = widget.editor; + const filename = uri.path.toString(); + // Do not necessarily require the current window if not needed. It's a synchronous, blocking call. + if (this._previousRepresentedFilename !== filename) { + const currentWindow = remote.getCurrentWindow(); + currentWindow.setRepresentedFilename(uri.path.toString()); + this._previousRepresentedFilename = filename; + } + } + } +} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts index 0059f433c..2523c99c8 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts @@ -1,5 +1,9 @@ import debounce = require('p-debounce'); -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { Event, Emitter } from '@theia/core/lib/common/event'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @@ -126,7 +130,7 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { const uri = tempFolderUri.resolve('launch.json'); const { value } = await this.fileService.read(uri); const configurations = DebugConfigurationModel.parse(JSON.parse(value)); - return { uri, configurations }; + return { uri, configurations, compounds: [] }; } catch (err) { if ( err instanceof FileOperationError && diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts index 225a003c1..4eaadf172 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-model.ts @@ -29,6 +29,7 @@ export class DebugConfigurationModel extends TheiaDebugConfigurationModel { return { uri: this.configUri, configurations: this.config, + compounds: [], }; } } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts deleted file mode 100644 index 6eb2ebdeb..000000000 --- a/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { DebugError } from '@theia/debug/lib/common/debug-service'; -import { DebugSession } from '@theia/debug/lib/browser/debug-session'; -import { DebugSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; -import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; -import { nls } from '@theia/core/lib/common'; - -@injectable() -export class DebugSessionManager extends TheiaDebugSessionManager { - override async start(options: DebugSessionOptions): Promise { - return this.progressService.withProgress( - nls.localize('theia/debug/start', 'Start...'), - 'debug', - async () => { - try { - // Only save when dirty. To avoid saving temporary sketches. - // This is a quick fix for not saving the editor when there are no dirty editors. - // // https://github.com/bcmi-labs/arduino-editor/pull/172#issuecomment-741831888 - if (this.shell.canSaveAll()) { - await this.shell.saveAll(); - } - await this.fireWillStartDebugSession(); - const resolved = await this.resolveConfiguration(options); - - //#region "cherry-picked" from here: https://github.com/eclipse-theia/theia/commit/e6b57ba4edabf797f3b4e67bc2968cdb8cc25b1e#diff-08e04edb57cd2af199382337aaf1dbdb31171b37ae4ab38a38d36cd77bc656c7R196-R207 - if (!resolved) { - // As per vscode API: https://code.visualstudio.com/api/references/vscode-api#DebugConfigurationProvider - // "Returning the value 'undefined' prevents the debug session from starting. - // Returning the value 'null' prevents the debug session from starting and opens the - // underlying debug configuration instead." - - if (resolved === null) { - this.debugConfigurationManager.openConfiguration(); - } - return undefined; - } - //#endregion end of cherry-pick - - // preLaunchTask isn't run in case of auto restart as well as postDebugTask - if (!options.configuration.__restart) { - const taskRun = await this.runTask( - options.workspaceFolderUri, - resolved.configuration.preLaunchTask, - true - ); - if (!taskRun) { - return undefined; - } - } - - const sessionId = await this.debug.createDebugSession( - resolved.configuration - ); - return this.doStart(sessionId, resolved); - } catch (e) { - if (DebugError.NotFound.is(e)) { - this.messageService.error( - nls.localize( - 'theia/debug/typeNotSupported', - 'The debug session type "{0}" is not supported.', - e.data.type - ) - ); - return undefined; - } - - this.messageService.error( - nls.localize( - 'theia/debug/startError', - 'There was an error starting the debug session, check the logs for more details.' - ) - ); - console.error('Error starting the debug session', e); - throw e; - } - } - ); - } - override async terminateSession(session?: DebugSession): Promise { - if (!session) { - this.updateCurrentSession(this._currentSession); - session = this._currentSession; - } - // The cortex-debug extension does not respond to close requests - // So we simply terminate the debug session immediately - // Alternatively the `super.terminateSession` call will terminate it after 5 seconds without a response - await this.debug.terminateDebugSession(session!.id); - await super.terminateSession(session); - } -} diff --git a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.ts b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.ts deleted file mode 100644 index b93131c7f..000000000 --- a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; - -import { - AbstractDialog as TheiaAbstractDialog, - codiconArray, - DialogProps, -} from '@theia/core/lib/browser'; - -@injectable() -export abstract class AbstractDialog extends TheiaAbstractDialog { - constructor(@inject(DialogProps) protected override readonly props: DialogProps) { - super(props); - - this.closeCrossNode.classList.remove(...codiconArray('close')); - this.closeCrossNode.classList.add('fa', 'fa-close'); - } -} diff --git a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx new file mode 100644 index 000000000..57eef5639 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx @@ -0,0 +1,63 @@ +import { + AbstractDialog as TheiaAbstractDialog, + DialogProps, +} from '@theia/core/lib/browser/dialogs'; +import { ReactDialog as TheiaReactDialog } from '@theia/core/lib/browser/dialogs/react-dialog'; +import { codiconArray, Message } from '@theia/core/lib/browser/widgets/widget'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import * as React from '@theia/core/shared/react'; +import { createRoot } from '@theia/core/shared/react-dom/client'; + +@injectable() +export abstract class AbstractDialog extends TheiaAbstractDialog { + constructor( + @inject(DialogProps) protected override readonly props: DialogProps + ) { + super(props); + + this.closeCrossNode.classList.remove(...codiconArray('close')); + this.closeCrossNode.classList.add('fa', 'fa-close'); + } +} + +@injectable() +export abstract class ReactDialog extends TheiaReactDialog { + protected override onUpdateRequest(msg: Message): void { + // This is tricky to bypass the default Theia code. + // Otherwise, there is a warning when opening the dialog for the second time. + // You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it. + const disposables = new DisposableCollection(); + if (!this.isMounted) { + // toggle the `isMounted` logic for the time being of the super call so that the `createRoot` does not run + this.isMounted = true; + disposables.push(Disposable.create(() => (this.isMounted = false))); + } + + // Always unset the `contentNodeRoot` so there is no double update when calling super. + const restoreContentNodeRoot = this.contentNodeRoot; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (this.contentNodeRoot as any) = undefined; + disposables.push( + Disposable.create(() => (this.contentNodeRoot = restoreContentNodeRoot)) + ); + + try { + super.onUpdateRequest(msg); + } finally { + disposables.dispose(); + } + + // Use the patched rendering. + if (!this.isMounted) { + this.contentNodeRoot = createRoot(this.contentNode); + // Resetting the prop is missing from the Theia code. + // https://github.com/eclipse-theia/theia/blob/v1.31.1/packages/core/src/browser/dialogs/react-dialog.tsx#L41-L47 + this.isMounted = true; + } + this.contentNodeRoot?.render(<>{this.render()}); + } +} diff --git a/arduino-ide-extension/src/browser/theia/editor/editor-widget-factory.ts b/arduino-ide-extension/src/browser/theia/editor/editor-widget-factory.ts index fc368c90d..3df32188c 100644 --- a/arduino-ide-extension/src/browser/theia/editor/editor-widget-factory.ts +++ b/arduino-ide-extension/src/browser/theia/editor/editor-widget-factory.ts @@ -20,7 +20,7 @@ export class EditorWidgetFactory extends TheiaEditorWidgetFactory { protected override async createEditor( uri: URI, - options: NavigatableWidgetOptions + options?: NavigatableWidgetOptions ): Promise { const widget = await super.createEditor(uri, options); return this.maybeUpdateCaption(widget); diff --git a/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts b/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts index b260bdab3..b218dde3e 100644 --- a/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts +++ b/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts @@ -3,7 +3,7 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { Diagnostic } from 'vscode-languageserver-types'; +import { Diagnostic } from '@theia/core/shared/vscode-languageserver-types'; import URI from '@theia/core/lib/common/uri'; import { ILogger } from '@theia/core'; import { Marker } from '@theia/markers/lib/common/marker'; diff --git a/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx b/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx index 56652d66a..89ef20724 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx +++ b/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx @@ -1,5 +1,4 @@ import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; import { inject, injectable, @@ -25,15 +24,14 @@ export class NotificationsRenderer extends TheiaNotificationsRenderer { } protected override render(): void { - ReactDOM.render( + this.containerRoot.render(
-
, - this.container +
); } } diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts new file mode 100644 index 000000000..4951ba771 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts @@ -0,0 +1,23 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { MonacoThemingService as TheiaMonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service'; +import { ArduinoThemes } from '../core/theming'; + +@injectable() +export class MonacoThemingService extends TheiaMonacoThemingService { + override initialize(): void { + super.initialize(); + const { Light, Dark } = ArduinoThemes; + this.registerParsedTheme({ + id: Light.id, + label: Light.label, + uiTheme: 'vs', + json: require('../../../../src/browser/data/default.color-theme.json'), + }); + this.registerParsedTheme({ + id: Dark.id, + label: Dark.label, + uiTheme: 'vs-dark', + json: require('../../../../src/browser/data/dark.color-theme.json'), + }); + } +} diff --git a/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts new file mode 100644 index 000000000..5afd1e8cf --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-contribution.ts @@ -0,0 +1,32 @@ +import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import { CommandRegistry } from '@theia/core/lib/common/command'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { injectable } from '@theia/core/shared/inversify'; +import { + TypeHierarchyCommands, + TypeHierarchyContribution as TheiaTypeHierarchyContribution, +} from '@theia/typehierarchy/lib/browser/typehierarchy-contribution'; + +@injectable() +export class TypeHierarchyContribution extends TheiaTypeHierarchyContribution { + protected override init(): void { + // NOOP + } + + override registerCommands(registry: CommandRegistry): void { + super.registerCommands(registry); + registry.unregisterCommand(TypeHierarchyCommands.OPEN_SUBTYPE.id); + registry.unregisterCommand(TypeHierarchyCommands.OPEN_SUPERTYPE.id); + } + + override registerMenus(registry: MenuModelRegistry): void { + super.registerMenus(registry); + registry.unregisterMenuAction(TypeHierarchyCommands.OPEN_SUBTYPE.id); + registry.unregisterMenuAction(TypeHierarchyCommands.OPEN_SUPERTYPE.id); + } + + override registerKeybindings(registry: KeybindingRegistry): void { + super.registerKeybindings(registry); + registry.unregisterKeybinding(TypeHierarchyCommands.OPEN_SUBTYPE.id); + } +} diff --git a/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts new file mode 100644 index 000000000..1062eea89 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/typehierarchy/type-hierarchy-service.ts @@ -0,0 +1,9 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { TypeHierarchyServiceProvider as TheiaTypeHierarchyServiceProvider } from '@theia/typehierarchy/lib/browser/typehierarchy-service'; + +@injectable() +export class TypeHierarchyServiceProvider extends TheiaTypeHierarchyServiceProvider { + override init(): void { + // NOOP + } +} diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts index 22c74728d..1310610a1 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts @@ -1,58 +1,37 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { injectable, inject, named } from '@theia/core/shared/inversify'; +import { ContributionProvider } from '@theia/core/lib/common/contribution-provider'; import URI from '@theia/core/lib/common/uri'; -import { EditorWidget } from '@theia/editor/lib/browser'; -import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; -import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; -import { FocusTracker, Widget } from '@theia/core/lib/browser'; import { DEFAULT_WINDOW_HASH, NewWindowOptions, } from '@theia/core/lib/common/window'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import { FileStat } from '@theia/filesystem/lib/common/files'; import { WorkspaceInput, WorkspaceService as TheiaWorkspaceService, } from '@theia/workspace/lib/browser/workspace-service'; import { - SketchesService, - Sketch, SketchesError, + SketchesService, } from '../../../common/protocol/sketches-service'; -import { FileStat } from '@theia/filesystem/lib/common/files'; import { StartupTask, StartupTaskProvider, } from '../../../electron-common/startup-task'; import { WindowServiceExt } from '../core/window-service-ext'; -import { ContributionProvider } from '@theia/core/lib/common/contribution-provider'; @injectable() export class WorkspaceService extends TheiaWorkspaceService { @inject(SketchesService) private readonly sketchService: SketchesService; - @inject(ApplicationServer) - private readonly applicationServer: ApplicationServer; @inject(WindowServiceExt) private readonly windowServiceExt: WindowServiceExt; @inject(ContributionProvider) @named(StartupTaskProvider) private readonly providers: ContributionProvider; - private version?: string; private _workspaceError: Error | undefined; - async onStart(application: FrontendApplication): Promise { - const info = await this.applicationServer.getApplicationInfo(); - this.version = info?.version; - application.shell.onDidChangeCurrentWidget( - this.onCurrentWidgetChange.bind(this) - ); - const newValue = application.shell.currentWidget - ? application.shell.currentWidget - : null; - this.onCurrentWidgetChange({ newValue, oldValue: null }); - } - get workspaceError(): Error | undefined { return this._workspaceError; } @@ -121,58 +100,6 @@ export class WorkspaceService extends TheiaWorkspaceService { } } - /** - * Copied from Theia as-is to be able to pass the original `options` down. - */ - protected override async doOpen( - uri: URI, - options?: WorkspaceInput - ): Promise { - const stat = await this.toFileStat(uri); - if (stat) { - if (!stat.isDirectory && !this.isWorkspaceFile(stat)) { - const message = `Not a valid workspace: ${uri.path.toString()}`; - this.messageService.error(message); - throw new Error(message); - } - // The same window has to be preserved too (instead of opening a new one), if the workspace root is not yet available and we are setting it for the first time. - // Option passed as parameter has the highest priority (for api developers), then the preference, then the default. - await this.roots; - const { preserveWindow } = { - preserveWindow: - this.preferences['workspace.preserveWindow'] || !this.opened, - ...options, - }; - await this.server.setMostRecentlyUsedWorkspace(uri.toString()); - if (preserveWindow) { - this._workspace = stat; - } - this.openWindow(stat, Object.assign(options ?? {}, { preserveWindow })); // Unlike Theia, IDE2 passes the whole `input` downstream and not only { preserveWindow } - return; - } - throw new Error( - 'Invalid workspace root URI. Expected an existing directory or workspace file.' - ); - } - - /** - * Copied from Theia. Can pass the `options` further down the chain. - */ - protected override openWindow(uri: FileStat, options?: WorkspaceInput): void { - const workspacePath = uri.resource.path.toString(); - if (this.shouldPreserveWindow(options)) { - this.reloadWindow(options); // Unlike Theia, IDE2 passes the `input` downstream. - } else { - try { - this.openNewWindow(workspacePath, options); // Unlike Theia, IDE2 passes the `input` downstream. - } catch (error) { - // Fall back to reloading the current window in case the browser has blocked the new window - this._workspace = uri; - this.logger.error(error.toString()).then(() => this.reloadWindow()); - } - } - } - protected override reloadWindow(options?: WorkspaceInput): void { const tasks = this.tasks(options); this.setURLFragment(this._workspace?.resource.path.toString() || ''); @@ -192,6 +119,10 @@ export class WorkspaceService extends TheiaWorkspaceService { ); } + protected override updateTitle(): void { + // NOOP. IDE2 handles the `window.title` updates solely via the customized `WindowTitleUpdater`. + } + private tasks(options?: WorkspaceInput): StartupTask[] { const tasks = this.providers .getContributions() @@ -202,37 +133,4 @@ export class WorkspaceService extends TheiaWorkspaceService { } return tasks; } - - protected onCurrentWidgetChange({ - newValue, - }: FocusTracker.IChangedArgs): void { - if (newValue instanceof EditorWidget) { - const { uri } = newValue.editor; - const currentWindow = remote.getCurrentWindow(); - currentWindow.setRepresentedFilename(uri.path.toString()); - if (Sketch.isSketchFile(uri.toString())) { - this.updateTitle(); - } else { - const title = this.workspaceTitle; - const fileName = this.labelProvider.getName(uri); - document.title = this.formatTitle( - title ? `${title} - ${fileName}` : fileName - ); - } - } else { - this.updateTitle(); - } - } - - protected override formatTitle(title?: string): string { - const version = this.version ? ` ${this.version}` : ''; - const name = `${this.applicationName} ${version}`; - return title ? `${title} | ${name}` : name; - } - - protected get workspaceTitle(): string | undefined { - if (this.workspace) { - return this.labelProvider.getName(this.workspace.resource); - } - } } diff --git a/arduino-ide-extension/src/browser/widgets/arduino-select.tsx b/arduino-ide-extension/src/browser/widgets/arduino-select.tsx index 4ee84e82a..da3ff5f53 100644 --- a/arduino-ide-extension/src/browser/widgets/arduino-select.tsx +++ b/arduino-ide-extension/src/browser/widgets/arduino-select.tsx @@ -1,17 +1,22 @@ import * as React from '@theia/core/shared/react'; import Select from 'react-select'; -import { Styles } from 'react-select/src/styles'; -import { Props } from 'react-select/src/components'; -import { ThemeConfig } from 'react-select/src/theme'; +import type { StylesConfig } from 'react-select/dist/declarations/src/styles'; +import type { ThemeConfig } from 'react-select/dist/declarations/src/theme'; +import type { GroupBase } from 'react-select/dist/declarations/src/types'; +import type { StateManagerProps } from 'react-select/dist/declarations/src/useStateManager'; -export class ArduinoSelect extends Select { - constructor(props: Readonly>) { +export class ArduinoSelect< + Option, + IsMulti extends boolean = false, + Group extends GroupBase
); } @@ -128,7 +94,6 @@ export namespace UserStatus { } export interface State { status: 'connected' | 'offline'; - accountInfo?: AuthenticationSessionAccountInformation; refreshing?: boolean; } } diff --git a/i18n/en.json b/i18n/en.json index 8fd1a3a1b..e02f7eeb4 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -4,6 +4,12 @@ "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", @@ -83,7 +89,6 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", From cf6f83c8a2edff3f06cd0b4bf0150787460b0340 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:37:29 +0100 Subject: [PATCH 147/384] bump go version in workflow .yml files --- .github/workflows/build.yml | 2 +- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cec735093..d153c9cea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,7 +29,7 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: "1.19" JOB_TRANSFER_ARTIFACT: build-artifacts CHANGELOG_ARTIFACTS: changelog diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 2e82e846f..9e65dbdb3 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -2,7 +2,7 @@ name: Check Internationalization env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: "1.19" # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index dceb6df0a..708262c7f 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -2,7 +2,7 @@ name: i18n-nightly-push env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: "1.19" on: schedule: diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 31d4ef225..5b7337cf1 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -2,7 +2,7 @@ name: i18n-weekly-pull env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: "1.19" on: schedule: diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index dff11a145..8c735d938 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -8,7 +8,7 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.17" + GO_VERSION: "1.19" NODE_VERSION: 16.x jobs: From 01ee045beb1cd69b23bc68c83b918bb14ab6ef91 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 22 Feb 2023 14:05:55 +0100 Subject: [PATCH 148/384] chore: Updated to `0.31.0-rc.1` CLI Aligned CLI build path calculation (arduino/arduino-cli#2031) Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 2 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 64 +-- .../cc/arduino/cli/commands/v1/board_pb.js | 468 ++---------------- .../cli/commands/v1/commands_grpc_pb.d.ts | 15 - .../cli/commands/v1/commands_grpc_pb.js | 35 -- .../arduino/cli/commands/v1/commands_pb.d.ts | 8 + .../cc/arduino/cli/commands/v1/commands_pb.js | 64 ++- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 28 ++ .../cc/arduino/cli/commands/v1/common_pb.js | 205 +++++++- .../arduino/cli/commands/v1/compile_pb.d.ts | 6 + .../cc/arduino/cli/commands/v1/compile_pb.js | 53 +- .../cc/arduino/cli/commands/v1/port_pb.d.ts | 4 + .../cc/arduino/cli/commands/v1/port_pb.js | 32 +- .../src/node/sketches-service-impl.ts | 15 +- 14 files changed, 437 insertions(+), 562 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index be99e0366..1ab09157f 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -163,7 +163,7 @@ ], "arduino": { "cli": { - "version": "0.29.0" + "version": "0.31.0-rc.1" }, "fwuploader": { "version": "2.2.2" diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts index 8b39c5085..8fed14afe 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 @@ -388,66 +388,6 @@ export namespace ConfigValue { } } -export class BoardAttachRequest extends jspb.Message { - - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardAttachRequest; - - getBoardUri(): string; - setBoardUri(value: string): BoardAttachRequest; - - getSketchPath(): string; - setSketchPath(value: string): BoardAttachRequest; - - getSearchTimeout(): string; - setSearchTimeout(value: string): BoardAttachRequest; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): BoardAttachRequest.AsObject; - static toObject(includeInstance: boolean, msg: BoardAttachRequest): BoardAttachRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: BoardAttachRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): BoardAttachRequest; - static deserializeBinaryFromReader(message: BoardAttachRequest, reader: jspb.BinaryReader): BoardAttachRequest; -} - -export namespace BoardAttachRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - boardUri: string, - sketchPath: string, - searchTimeout: string, - } -} - -export class BoardAttachResponse extends jspb.Message { - - hasTaskProgress(): boolean; - clearTaskProgress(): void; - getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; - setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): BoardAttachResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): BoardAttachResponse.AsObject; - static toObject(includeInstance: boolean, msg: BoardAttachResponse): BoardAttachResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: BoardAttachResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): BoardAttachResponse; - static deserializeBinaryFromReader(message: BoardAttachResponse, reader: jspb.BinaryReader): BoardAttachResponse; -} - -export namespace BoardAttachResponse { - export type AsObject = { - taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, - } -} - export class BoardListRequest extends jspb.Message { hasInstance(): boolean; @@ -458,6 +398,9 @@ export class BoardListRequest extends jspb.Message { getTimeout(): number; setTimeout(value: number): BoardListRequest; + getFqbn(): string; + setFqbn(value: string): BoardListRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListRequest.AsObject; @@ -473,6 +416,7 @@ export namespace BoardListRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, timeout: number, + fqbn: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js index 3753037cb..83a3002b6 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 @@ -19,8 +19,6 @@ var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cl goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardAttachRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardAttachResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties', null, global); @@ -251,48 +249,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ConfigValue.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigValue'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.BoardAttachRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.BoardAttachRequest.displayName = 'proto.cc.arduino.cli.commands.v1.BoardAttachRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.BoardAttachResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.BoardAttachResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardAttachResponse'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -3132,398 +3088,6 @@ proto.cc.arduino.cli.commands.v1.ConfigValue.prototype.setSelected = function(va -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.BoardAttachRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardAttachRequest.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.BoardAttachRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - boardUri: jspb.Message.getFieldWithDefault(msg, 2, ""), - sketchPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - searchTimeout: jspb.Message.getFieldWithDefault(msg, 4, "") - }; - - 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.BoardAttachRequest} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardAttachRequest; - return proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setBoardUri(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setSearchTimeout(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.BoardAttachRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardAttachRequest.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.BoardAttachRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } - f = message.getBoardUri(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getSketchPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getSearchTimeout(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.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.BoardAttachRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional string board_uri = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getBoardUri = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setBoardUri = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string sketch_path = 3; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getSketchPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setSketchPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional string search_timeout = 4; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.getSearchTimeout = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardAttachRequest.prototype.setSearchTimeout = 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.BoardAttachResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.BoardAttachResponse.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.BoardAttachResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.toObject = function(includeInstance, msg) { - var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.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.BoardAttachResponse} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.BoardAttachResponse; - return proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); - msg.setTaskProgress(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.BoardAttachResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.BoardAttachResponse.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.BoardAttachResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getTaskProgress(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter - ); - } -}; - - -/** - * optional TaskProgress task_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.getTaskProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.BoardAttachResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.clearTaskProgress = function() { - return this.setTaskProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardAttachResponse.prototype.hasTaskProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -3554,7 +3118,8 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.toObject = function( proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - timeout: jspb.Message.getFieldWithDefault(msg, 2, 0) + timeout: jspb.Message.getFieldWithDefault(msg, 2, 0), + fqbn: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -3600,6 +3165,10 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader = var value = /** @type {number} */ (reader.readInt64()); msg.setTimeout(value); break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; default: reader.skipField(); break; @@ -3644,6 +3213,13 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter = func f ); } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } }; @@ -3702,6 +3278,24 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setTimeout = functio }; +/** + * optional string fqbn = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + /** * List of repeated fields within this message type. 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 f4adeb149..b321b3c23 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 @@ -27,7 +27,6 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition; responseDeserialize: grpc.deserialize; } -interface IArduinoCoreServiceService_IBoardAttach extends grpc.MethodDefinition { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardAttach"; - requestStream: false; - responseStream: true; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} interface IArduinoCoreServiceService_IBoardList extends grpc.MethodDefinition { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardList"; requestStream: false; @@ -423,7 +413,6 @@ export interface IArduinoCoreServiceServer { loadSketch: grpc.handleUnaryCall; archiveSketch: grpc.handleUnaryCall; boardDetails: grpc.handleUnaryCall; - boardAttach: grpc.handleServerStreamingCall; boardList: grpc.handleUnaryCall; boardListAll: grpc.handleUnaryCall; boardSearch: grpc.handleUnaryCall; @@ -482,8 +471,6 @@ export interface IArduinoCoreServiceClient { 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; - boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, options?: Partial): grpc.ClientReadableStream; - boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; @@ -584,8 +571,6 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor 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; - public boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, options?: Partial): grpc.ClientReadableStream; - public boardAttach(request: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, metadata?: grpc.Metadata, options?: Partial): grpc.ClientReadableStream; public boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; public boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => void): grpc.ClientUnaryCall; public boardList(request: cc_arduino_cli_commands_v1_board_pb.BoardListRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardListResponse) => 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 1e4a70058..887ef6b04 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 @@ -49,28 +49,6 @@ function deserialize_cc_arduino_cli_commands_v1_ArchiveSketchResponse(buffer_arg return cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_BoardAttachRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardAttachRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_BoardAttachRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_BoardAttachResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardAttachResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_BoardAttachResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_BoardDetailsRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardDetailsRequest'); @@ -1012,19 +990,6 @@ boardDetails: { responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardDetailsResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardDetailsResponse, }, - // Attach a board to a sketch. When the `fqbn` field of a request is not -// provided, the FQBN of the attached board will be used. -boardAttach: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardAttach', - requestStream: false, - responseStream: true, - requestType: cc_arduino_cli_commands_v1_board_pb.BoardAttachRequest, - responseType: cc_arduino_cli_commands_v1_board_pb.BoardAttachResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_BoardAttachRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardAttachRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardAttachResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardAttachResponse, - }, // List the boards currently connected to the computer. boardList: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardList', 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 471a774ca..ecfeeb4ff 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 @@ -364,6 +364,9 @@ export class NewSketchRequest extends jspb.Message { getSketchDir(): string; setSketchDir(value: string): NewSketchRequest; + getOverwrite(): boolean; + setOverwrite(value: boolean): NewSketchRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): NewSketchRequest.AsObject; @@ -380,6 +383,7 @@ export namespace NewSketchRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, sketchName: string, sketchDir: string, + overwrite: boolean, } } @@ -485,6 +489,9 @@ export class ArchiveSketchRequest extends jspb.Message { getIncludeBuildDir(): boolean; setIncludeBuildDir(value: boolean): ArchiveSketchRequest; + getOverwrite(): boolean; + setOverwrite(value: boolean): ArchiveSketchRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ArchiveSketchRequest.AsObject; @@ -501,6 +508,7 @@ export namespace ArchiveSketchRequest { sketchPath: string, archivePath: string, includeBuildDir: boolean, + overwrite: boolean, } } 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 51ae173e3..9d688b4f4 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 @@ -2546,7 +2546,8 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeIns 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, "") + sketchDir: jspb.Message.getFieldWithDefault(msg, 3, ""), + overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -2596,6 +2597,10 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = var value = /** @type {string} */ (reader.readString()); msg.setSketchDir(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOverwrite(value); + break; default: reader.skipField(); break; @@ -2647,6 +2652,13 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = func f ); } + f = message.getOverwrite(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -2723,6 +2735,24 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchDir = funct }; +/** + * optional bool overwrite = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getOverwrite = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setOverwrite = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + @@ -3382,7 +3412,8 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject = function(includ var f, obj = { sketchPath: jspb.Message.getFieldWithDefault(msg, 1, ""), archivePath: jspb.Message.getFieldWithDefault(msg, 2, ""), - includeBuildDir: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + includeBuildDir: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3431,6 +3462,10 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReade var value = /** @type {boolean} */ (reader.readBool()); msg.setIncludeBuildDir(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOverwrite(value); + break; default: reader.skipField(); break; @@ -3481,6 +3516,13 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter = f ); } + f = message.getOverwrite(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -3538,6 +3580,24 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setIncludeBuildD }; +/** + * optional bool overwrite = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getOverwrite = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setOverwrite = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + 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 de19321dc..7d7926f9e 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 @@ -255,6 +255,12 @@ export class Platform extends jspb.Message { addType(value: string, index?: number): string; + hasHelp(): boolean; + clearHelp(): void; + getHelp(): HelpResources | undefined; + setHelp(value?: HelpResources): Platform; + + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Platform.AsObject; static toObject(includeInstance: boolean, msg: Platform): Platform.AsObject; @@ -278,6 +284,7 @@ export namespace Platform { manuallyInstalled: boolean, deprecated: boolean, typeList: Array, + help?: HelpResources.AsObject, } } @@ -363,3 +370,24 @@ export namespace Profile { fqbn: string, } } + +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; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: HelpResources, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): HelpResources; + static deserializeBinaryFromReader(message: HelpResources, reader: jspb.BinaryReader): HelpResources; +} + +export namespace HelpResources { + export type AsObject = { + online: string, + } +} 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 7b7a4bcd3..3a8294695 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 @@ -21,6 +21,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgress.MessageCase goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressEnd', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressStart', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.HelpResources', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledPlatformReference', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Instance', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); @@ -258,6 +259,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Profile.displayName = 'proto.cc.arduino.cli.commands.v1.Profile'; } +/** + * 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.HelpResources = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.HelpResources, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.HelpResources.displayName = 'proto.cc.arduino.cli.commands.v1.HelpResources'; +} @@ -1608,7 +1630,8 @@ proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, m proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 9, false), deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - typeList: (f = jspb.Message.getRepeatedField(msg, 11)) == null ? undefined : f + typeList: (f = jspb.Message.getRepeatedField(msg, 11)) == null ? undefined : f, + help: (f = msg.getHelp()) && proto.cc.arduino.cli.commands.v1.HelpResources.toObject(includeInstance, f) }; if (includeInstance) { @@ -1690,6 +1713,11 @@ proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function var value = /** @type {string} */ (reader.readString()); msg.addType(value); break; + case 12: + var value = new proto.cc.arduino.cli.commands.v1.HelpResources; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader); + msg.setHelp(value); + break; default: reader.skipField(); break; @@ -1797,6 +1825,14 @@ proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter = function(mes f ); } + f = message.getHelp(); + if (f != null) { + writer.writeMessage( + 12, + f, + proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter + ); + } }; @@ -2037,6 +2073,43 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.clearTypeList = function() { }; +/** + * optional HelpResources help = 12; + * @return {?proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.getHelp = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.HelpResources} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.HelpResources, 12)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.HelpResources|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this +*/ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setHelp = function(value) { + return jspb.Message.setWrapperField(this, 12, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.clearHelp = function() { + return this.setHelp(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.hasHelp = function() { + return jspb.Message.getField(this, 12) != null; +}; + + @@ -2577,4 +2650,134 @@ proto.cc.arduino.cli.commands.v1.Profile.prototype.setFqbn = function(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.HelpResources.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.HelpResources.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.HelpResources} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.HelpResources.toObject = function(includeInstance, msg) { + var f, obj = { + online: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.HelpResources; + return proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.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.setOnline(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.HelpResources.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.HelpResources.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.HelpResources} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getOnline(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string online = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.getOnline = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} returns this + */ +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.setOnline = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts index 34c8ec082..5954b8501 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 @@ -182,6 +182,11 @@ export class CompileResponse extends jspb.Message { 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; @@ -203,6 +208,7 @@ export namespace CompileResponse { boardPlatform?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.AsObject, buildPlatform?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.AsObject, progress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + buildPropertiesList: Array, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js index c2bae211d..d5d0a7812 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 @@ -1052,7 +1052,7 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setSkipLibrariesDiscov * @private {!Array} * @const */ -proto.cc.arduino.cli.commands.v1.CompileResponse.repeatedFields_ = [4,5]; +proto.cc.arduino.cli.commands.v1.CompileResponse.repeatedFields_ = [4,5,9]; @@ -1094,7 +1094,8 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.toObject = function(includeInst proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject, includeInstance), boardPlatform: (f = msg.getBoardPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), buildPlatform: (f = msg.getBuildPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 9)) == null ? undefined : f }; if (includeInstance) { @@ -1168,6 +1169,10 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.deserializeBinaryFromReader = f reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setProgress(value); break; + case 9: + var value = /** @type {string} */ (reader.readString()); + msg.addBuildProperties(value); + break; default: reader.skipField(); break; @@ -1258,6 +1263,13 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.serializeBinaryToWriter = funct cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getBuildPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 9, + f + ); + } }; @@ -1550,6 +1562,43 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasProgress = functio }; +/** + * repeated string build_properties = 9; + * @return {!Array} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBuildPropertiesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 9)); +}; + + +/** + * @param {!Array} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBuildPropertiesList = function(value) { + return jspb.Message.setField(this, 9, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.addBuildProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 9, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearBuildPropertiesList = function() { + return this.setBuildPropertiesList([]); +}; + + diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.d.ts index 233f0d59f..17c863eea 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 @@ -23,6 +23,9 @@ export class Port extends jspb.Message { getPropertiesMap(): jspb.Map; clearPropertiesMap(): void; + getHardwareId(): string; + setHardwareId(value: string): Port; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Port.AsObject; @@ -42,5 +45,6 @@ export namespace Port { protocolLabel: string, propertiesMap: Array<[string, string]>, + hardwareId: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb.js index 6b8eacaee..6f905454d 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 @@ -73,7 +73,8 @@ proto.cc.arduino.cli.commands.v1.Port.toObject = function(includeInstance, msg) label: jspb.Message.getFieldWithDefault(msg, 2, ""), protocol: jspb.Message.getFieldWithDefault(msg, 3, ""), protocolLabel: jspb.Message.getFieldWithDefault(msg, 4, ""), - propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [] + propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [], + hardwareId: jspb.Message.getFieldWithDefault(msg, 6, "") }; if (includeInstance) { @@ -132,6 +133,10 @@ proto.cc.arduino.cli.commands.v1.Port.deserializeBinaryFromReader = function(msg jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setHardwareId(value); + break; default: reader.skipField(); break; @@ -193,6 +198,13 @@ proto.cc.arduino.cli.commands.v1.Port.serializeBinaryToWriter = function(message if (f && f.getLength() > 0) { f.serializeBinary(5, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getHardwareId(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } }; @@ -290,4 +302,22 @@ proto.cc.arduino.cli.commands.v1.Port.prototype.clearPropertiesMap = function() return this;}; +/** + * optional string hardware_id = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Port.prototype.getHardwareId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Port} returns this + */ +proto.cc.arduino.cli.commands.v1.Port.prototype.setHardwareId = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index a1e53a9ec..42ca3e9a3 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -619,17 +619,16 @@ export class SketchesServiceImpl } private tempBuildPathMD5Hash(tempFolderPath: string, path: string): string { - return join(tempFolderPath, this.tempBuildFolderMD5Hash(path)); + return join( + tempFolderPath, + 'arduino', + 'sketches', + this.tempBuildFolderMD5Hash(path) + ); } private tempBuildFolderMD5Hash(path: string): string { - const hash = crypto - .createHash('md5') - .update(path) - .digest('hex') - .toUpperCase(); - const folderName = `arduino-sketch-${hash}`; - return folderName; + return crypto.createHash('md5').update(path).digest('hex').toUpperCase(); } // Returns the default.ino from the settings or from default folder. From c97e34aa04a843991b0bd88f9f2587aba1f1957e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:11:22 +0000 Subject: [PATCH 149/384] build(deps): Bump svenstaro/upload-release-action from 2.4.1 to 2.5.0 Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.4.1 to 2.5.0. - [Release notes](https://github.com/svenstaro/upload-release-action/releases) - [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenstaro/upload-release-action/compare/2.4.1...2.5.0) --- updated-dependencies: - dependency-name: svenstaro/upload-release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d153c9cea..52af464a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -235,7 +235,7 @@ jobs: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] - uses: svenstaro/upload-release-action@2.4.1 + uses: svenstaro/upload-release-action@2.5.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} From c0af297f48874fe2d88725274580311cad5a93f9 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 23 Feb 2023 11:30:44 +0100 Subject: [PATCH 150/384] build: force notarization on macOS if not on a CI IDE2 needs a way to manually sign the application on M1. The 'MACOS_FORCE_NOTARIZE' env variable forces the notarization to proceed if not on a CI. Signed-off-by: Akos Kitta --- electron/build/scripts/notarize.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/electron/build/scripts/notarize.js b/electron/build/scripts/notarize.js index 05a7b64b3..ec29ec09c 100644 --- a/electron/build/scripts/notarize.js +++ b/electron/build/scripts/notarize.js @@ -3,8 +3,18 @@ const { notarize } = require('electron-notarize'); exports.default = async function notarizing(context) { if (!isCI) { - console.log('Skipping notarization: not on CI.'); - return; + 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.'); From fe19e0ef263ce3f9feeaf7a123080e97b623355c Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 26 Feb 2023 22:51:04 -0800 Subject: [PATCH 151/384] Use Apple Silicon build artifact name required by electron-updater The Arduino IDE update check uses a "channel update info file" on Arduino's download server. This file specifies the latest version of Arduino IDE available from the Arduino download server as well as the download URLs for the release archives. There is a separate channel file for each host operating system: - Windows - Linux - macOS Two macOS host architectures are now supported: - x86 (AKA "Intel") - ARM64 (AKA "Apple Silicon") These each have their own release archive files. The macOS channel file contains data on both. So the updater must be able to identify the appropriate archive to use for the update based on the host architecture. This is based on the archive filename. Arduino IDE's auto-update feature is built on the electron-updater package. The release archive selection is handled by the electron-updater codebase and the filename pattern is hardcoded there. It selects the archive file that contains `arm64` in its name (case sensitive), if present, to use for updates on macOS hosts with ARM64 architecture. Previously, the build system produced archive files with the name format arduino-ide__macOS_ARM64.zip, consistent with the established naming in other Arduino tooling projects. Unfortunately this naming would cause either (depending on the order of the entries in the channel file) the x86 build to be used to update ARM64 macOS hosts (resulting in lesser performance due to Rosetta 2 overhead) or the ARM64 build to be used to update x86 hosts (resulting in the IDE failing to start). So it is necessary to change the build artifact name to follow the format dictated by the electron-updater package. Although it is not required (because electron-updater uses separate channel files for the x86 and ARM hosts), the Linux archive filename format was also changed for the sake of consistency. --- electron/packager/config.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/electron/packager/config.js b/electron/packager/config.js index d460b9c82..caa1cd6b2 100644 --- a/electron/packager/config.js +++ b/electron/packager/config.js @@ -28,17 +28,17 @@ function artifactName() { } case 'darwin': { if (arch === 'arm64') { - return `${name}_${id}_macOS_ARM64.\$\{ext}`; + return `${name}_${id}_macOS_arm64.\$\{ext}`; } return `${name}_${id}_macOS_64bit.\$\{ext}`; } case 'linux': { switch (arch) { case 'arm': { - return `${name}_${id}_Linux_ARMv7.\$\{ext}`; + return `${name}_${id}_Linux_armv7.\$\{ext}`; } case 'arm64': { - return `${name}_${id}_Linux_ARM64.\$\{ext}`; + return `${name}_${id}_Linux_arm64.\$\{ext}`; } case 'x64': { return `${name}_${id}_Linux_64bit.\$\{ext}`; From 43b5d4e22fa3c78262a053b1997442b3d25a52a8 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:35:51 +0100 Subject: [PATCH 152/384] Enhance board config auto-selection with hardwareId (#1913) --- .../browser/boards/boards-service-provider.ts | 75 ++++++++++++++----- .../src/common/protocol/boards-service.ts | 14 ++++ .../src/node/board-discovery.ts | 4 +- 3 files changed, 72 insertions(+), 21 deletions(-) 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 65842eca3..279a2e3fa 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -158,15 +158,9 @@ export class BoardsServiceProvider this.lastAvailablePortsOnUpload = undefined; } - private portToAutoSelectCanBeDerived(): boolean { - return Boolean( - this.lastBoardsConfigOnUpload && this.lastAvailablePortsOnUpload - ); - } - attemptPostUploadAutoSelect(): void { setTimeout(() => { - if (this.portToAutoSelectCanBeDerived()) { + if (this.lastBoardsConfigOnUpload && this.lastAvailablePortsOnUpload) { this.attemptAutoSelect({ ports: this._availablePorts, boards: this._availableBoards, @@ -185,12 +179,12 @@ export class BoardsServiceProvider private deriveBoardConfigToAutoSelect( newState: AttachedBoardsChangeEvent['newState'] ): void { - if (!this.portToAutoSelectCanBeDerived()) { + if (!this.lastBoardsConfigOnUpload || !this.lastAvailablePortsOnUpload) { this.boardConfigToAutoSelect = undefined; return; } - const oldPorts = this.lastAvailablePortsOnUpload!; + const oldPorts = this.lastAvailablePortsOnUpload; const { ports: newPorts, boards: newBoards } = newState; const appearedPorts = @@ -205,20 +199,39 @@ export class BoardsServiceProvider Port.sameAs(board.port, port) ); - const lastBoardsConfigOnUpload = this.lastBoardsConfigOnUpload!; + const lastBoardsConfigOnUpload = this.lastBoardsConfigOnUpload; - if ( - boardOnAppearedPort && - lastBoardsConfigOnUpload.selectedBoard && - Board.sameAs( + 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: boardOnAppearedPort, + selectedBoard: boardToAutoSelect, selectedPort: port, }; return; @@ -326,8 +339,10 @@ export class BoardsServiceProvider // it is just a FQBN, so we need to find the `selected` board among the `AvailableBoards` const selectedAvailableBoard = AvailableBoard.is(selectedBoard) ? selectedBoard - : this._availableBoards.find((availableBoard) => - Board.sameAs(availableBoard, selectedBoard) + : this._availableBoards.find( + (availableBoard) => + Board.hardwareIdEquals(availableBoard, selectedBoard) || + Board.sameAs(availableBoard, selectedBoard) ); if ( selectedAvailableBoard && @@ -353,9 +368,28 @@ export class BoardsServiceProvider 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 && @@ -365,12 +399,15 @@ export class BoardsServiceProvider 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; + // ** } return false; } diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index cbb057028..c955b9462 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -245,6 +245,7 @@ export interface Port { readonly protocol: string; readonly protocolLabel: string; readonly properties?: Record; + readonly hardwareId?: string; } export namespace Port { export type Properties = Record; @@ -553,6 +554,19 @@ 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 { // 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 diff --git a/arduino-ide-extension/src/node/board-discovery.ts b/arduino-ide-extension/src/node/board-discovery.ts index bce8a36d0..8699b7232 100644 --- a/arduino-ide-extension/src/node/board-discovery.ts +++ b/arduino-ide-extension/src/node/board-discovery.ts @@ -323,14 +323,14 @@ export class BoardDiscovery } private fromRpcPort(rpcPort: RpcPort): Port { - const port = { + return { address: rpcPort.getAddress(), addressLabel: rpcPort.getLabel(), protocol: rpcPort.getProtocol(), protocolLabel: rpcPort.getProtocolLabel(), properties: Port.Properties.create(rpcPort.getPropertiesMap().toObject()), + hardwareId: rpcPort.getHardwareId(), }; - return port; } } From 9dec9c5a188790dee836e031f3c9fd101dcb34aa Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Mon, 27 Feb 2023 12:34:31 +0100 Subject: [PATCH 153/384] Bump CLI to 0.31.0 (#1921) --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 1ab09157f..dd2959470 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -163,7 +163,7 @@ ], "arduino": { "cli": { - "version": "0.31.0-rc.1" + "version": "0.31.0" }, "fwuploader": { "version": "2.2.2" From 5bf38d804efedcee2caf3723059f9666528be8b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:09:52 +0100 Subject: [PATCH 154/384] Updated translation files (#1763) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 67 ++-- i18n/ar.json | 67 ++-- i18n/az.json | 69 +++-- i18n/bg.json | 67 ++-- i18n/ca_ES.json | 467 +++++++++++++++------------- i18n/cs.json | 77 +++-- i18n/da.json | 503 ++++++++++++++++++++++++++++++ i18n/de.json | 83 +++-- i18n/el.json | 67 ++-- i18n/es.json | 79 +++-- i18n/eu.json | 67 ++-- i18n/fa.json | 67 ++-- i18n/fil.json | 67 ++-- i18n/fr.json | 69 +++-- i18n/he.json | 67 ++-- i18n/hu.json | 67 ++-- i18n/id.json | 67 ++-- i18n/it.json | 127 +++++--- i18n/ja.json | 75 +++-- i18n/ko.json | 73 +++-- i18n/my_MM.json | 67 ++-- i18n/ne.json | 67 ++-- i18n/nl.json | 67 ++-- i18n/pl.json | 95 ++++-- i18n/pt.json | 71 +++-- i18n/ro.json | 67 ++-- i18n/ru.json | 69 +++-- i18n/sl.json | 503 ++++++++++++++++++++++++++++++ i18n/sr.json | 67 ++-- i18n/th.json | 503 ++++++++++++++++++++++++++++++ i18n/tr.json | 69 +++-- i18n/uk.json | 67 ++-- i18n/vi.json | 67 ++-- i18n/zh-Hant.json | 755 ++++++++++++++++++++++++---------------------- i18n/zh.json | 83 +++-- i18n/zh_TW.json | 105 ++++--- 36 files changed, 3806 insertions(+), 1208 deletions(-) create mode 100644 i18n/da.json create mode 100644 i18n/sl.json create mode 100644 i18n/th.json diff --git a/i18n/af.json b/i18n/af.json index fdde0d0e3..383b19186 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, "board": { @@ -18,11 +18,12 @@ "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...", - "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}", @@ -31,13 +32,13 @@ "reselectLater": "Herselekteer later", "searchBoard": "Search board", "selectBoard": "Kies Bord", - "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", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Wolk Skets", "connected": "Connected", "continue": "Continue", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Deel...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "TEKEN AAN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Teken Uit", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Weergawe {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Add File", "fileAdded": "Een lêer by skets gevoeg", @@ -186,7 +197,8 @@ "debugWithMessage": "Ontfouting {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "Platform is nie geïnstalleer vir ' {0} '", - "optimizeForDebugging": "Geoptimaliseerd vir ontfouting" + "optimizeForDebugging": "Geoptimaliseerd vir ontfouting", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Netwerk", @@ -352,6 +361,7 @@ "manualProxy": "Manual proxy configuration", "network": "Netwerk", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "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": { @@ -460,10 +493,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Wil jy die huidige skets uitvee?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Naam vir nuwe lêer", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Ongeldige lêernaam", "newFileName": "Nuwe naam vir lêer" } } diff --git a/i18n/ar.json b/i18n/ar.json index 8f01562ec..dea546143 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "النسخة : {0}\nالتاريخ : {1} {2} \nنسخة موجه سطر الاوامر CLI {3}{4} [{5}] \n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "حول {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "قم باختيار لوحة و منفذ مختلفين", - "platformMissing": "المنصة للّوحة المختارة '{0}' غير مثبتة", "pleasePickBoard": "من فضلك اختر لوحة متصلة على المنفذ الذي اخترته", "port": "المنفذ {0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "اعد الاختيار لاحقا", "searchBoard": "أبحث عن متحكم", "selectBoard": "اختر لوحة", - "selectBoardForInfo": "الرجاء اختيار لوحة من احل الحصول على معلومات اللوحة", "selectPortForInfo": "الرجاء اختيار منفذ من اجل الحصول على معلومات اللوحة", "showAllAvailablePorts": "يظهر كل المنافذ المتاحة عند تفعيله", "showAllPorts": "أظهر جميع المنافذ", "succesfullyInstalledPlatform": "تم تثبيت المنصة {0}:{1} بنجاح", "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "مدير اللوحة", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "الحساب", "chooseSketchVisibility": "اختر خصوصية مشروعك:", + "cloudSketchbook": "مشاريع على السحابة", "connected": "متصل", "continue": "استئناف", "donePulling": "تم السحب بنجاح '{0}'", @@ -108,10 +110,9 @@ "pushSketch": "دفع المشروع", "pushSketchMsg": "هذا مشروع عام . قبل دفعه , تاكد من عدم وجود اي معلومات حساسة داخل ملف arduino_secrets.h . تستطيع جعل المشروع خاصا من لوحة المشاركة", "remote": "عن بعد", - "remoteSketchbook": "ملف المشاريع عن بعد (Remote Sketchbook)", "share": "مشاركة...", "shareSketch": "مشاركة المشروع", - "showHideRemoveSketchbook": "اظهار/اخفاء المشاريع عن بعد", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "تسجيل الدخول", "signInToCloud": "تسجيل الدخول الى Arduino Cloud", "signOut": "تسجيل الخروج", @@ -120,9 +121,14 @@ "visitArduinoCloud": "قم بزيارة Arduino Cloud من اجل انشاء ملف مشاريع على السحابة" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "هل تريد الغاء تثبيت {0}؟", "version": "النسخة {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "اضف ملف...", "fileAdded": "تمت اضافة ملف واحد الى المشروع", @@ -186,7 +197,8 @@ "debugWithMessage": "تصحيح برمجي - {0}", "debuggingNotSupported": "'{0}' لا يقبل التصحيح البرمجي", "noPlatformInstalledFor": "المنصة غير مثبتة ل '{0}'", - "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي" + "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "لا تسأل مرة اخرى" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "شبكة", @@ -352,6 +361,7 @@ "manualProxy": "اعدادات الوكيل يدوياً", "network": "شبكة", "newSketchbookLocation": "اختر مكان المشروع الجديد", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "لا يوجد وكيل", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "هل تريد استبدال النسخة الحالية من {0} ؟", "selectZip": "اختر ملف .zip يحوي المكتبة التي تريد اضافتها", "serial": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "يتم النقل", "movingMsg": "الملف \"{0}\" يجب ان يكون داخل مجلد مشروع مسمى \"{1}\"\nهل انشئ المجلد , ثم انقل الملف و اكمل ؟", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "فتح المجلد", "openRecent": "فُتِحَ مؤخرا ", "openSketchInNewWindow": "فتح المشروع في نافذة جديدة", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "احفظ مجلد المشروع باسم", "saveSketch": "احفظ ملف المشروع لفتحه مرة اخرى لاحقا", "saveSketchAs": "حفظ ملف المشروع باسم ...", @@ -421,7 +443,7 @@ "verifyOrCompile": "تحقق/ترجم" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "الغاء", "enterField": "Enter {0}", "upload": "رفع" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "توسيع" }, "workspace": { - "deleteCurrentSketch": "هل تريد حذف المشروع الحالي؟", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "اسم الملف الجديد", "invalidExtension": "\".{0}\" امتداد غير صالح", - "invalidFilename": "اسم الملف خاطئ", "newFileName": "الاسم الجديد لملف" } } diff --git a/i18n/az.json b/i18n/az.json index 3e838cabf..d4e949964 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Haqqında {0}" }, "board": { @@ -18,11 +18,12 @@ "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…", - "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}", @@ -31,13 +32,13 @@ "reselectLater": "Daha Sonra Yenidən Seç", "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Uğurla Silindi\nPlatforma 1{0}:2{1}", - "typeOfPorts": "{0} ports" + "succesfullyUninstalledPlatform": "Uğurla Silindi Platforma {0}:{1}", + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Əlaqə Yaradıldı", "continue": "Davam Et", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Giriş Edin", "signInToCloud": "Ardunio Cloud'a Giriş Edin", "signOut": "Çıxış Edin", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Fayl Əlavə Et", "fileAdded": "One file added to the sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Yenidən Soruşma" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Network", @@ -352,6 +361,7 @@ "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", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "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": { @@ -460,10 +493,10 @@ "expand": "Genişləndir" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/bg.json b/i18n/bg.json index bb74053bb..56b3a9393 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Версия: {0}\nДата: {1}{2}\nВерсия на CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Относно {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "Изберете друга платка и порт...", - "platformMissing": "Платформата за избраната платка „{0}“ не е инсталирана.", "pleasePickBoard": "Моля, изберете платка, свързана към порта, който сте избрали.", "port": "Порт{0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Изберете отново по-късно", "searchBoard": "Search board", "selectBoard": "Изберете платка", - "selectBoardForInfo": "Моля, изберете платка, за да получите информация за нея.", "selectPortForInfo": "Моля, изберете порт, за да получите информация за платката.", "showAllAvailablePorts": "Показва всички налични портове, когато е активиран", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Успешно инсталирана платформа {0}:{1}", "succesfullyUninstalledPlatform": "Успешно деинсталирана платформа {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Мениджър на платки", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Изберете видимост на вашата скица:", + "cloudSketchbook": "Облачен скицник", "connected": "Свързано", "continue": "Продължи", "donePulling": "Изтеглянето на „{0}“ приключи.", @@ -108,10 +110,9 @@ "pushSketch": "Изпрати скица", "pushSketchMsg": "Това е публична скица. Преди да я изпратите, уверете се, че всяка чувствителна информация е дефинирана във файловете arduino_secrets.h. Можете да направите скица частна от панела за споделяне.", "remote": "Отдалечен", - "remoteSketchbook": "Remote Sketchbook", "share": "Сподели...", "shareSketch": "Споделете скица", - "showHideRemoveSketchbook": "Показване/скриване на отдалечен скицник", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ВПИШИ СЕ", "signInToCloud": "Влезте в Arduino Cloud", "signOut": "Отписване", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Посетете Arduino Cloud, за да създадете облачни скици." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Искате ли да деинсталирате {0}?", "version": "Версия {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Добави файл", "fileAdded": "Към скицата е добавен един файл.", @@ -186,7 +197,8 @@ "debugWithMessage": "Отстраняване на грешки - {0}", "debuggingNotSupported": "Отстраняването на грешки не се поддържа от „{0}“", "noPlatformInstalledFor": "Платформата не е инсталирана за „{0}“", - "optimizeForDebugging": "Оптимизиране за отстраняване на грешки" + "optimizeForDebugging": "Оптимизиране за отстраняване на грешки", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Не питай отново" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Мрежа", @@ -352,6 +361,7 @@ "manualProxy": "Ръчна конфигурация на прокси", "network": "Мрежа", "newSketchbookLocation": "Изберете местоположение за новата скицниката", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Без прокси", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Да се замени ли съществуващата версия на {0}?", "selectZip": "Изберете zip файл, съдържащ библиотеката, която искате да добавите", "serial": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Преместване", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Отвори папка", "openRecent": "Отвори Скорошен", "openSketchInNewWindow": "Отвори скицата в нов прозорец", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Запазете папката със скица като...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Запазете папката със скици като...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Проверете/компилирайте" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Отмяна", "enterField": "Enter {0}", "upload": "Качване" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Разгънете" }, "workspace": { - "deleteCurrentSketch": "Искате ли да изтриете текущата скица?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Име за нов файл", "invalidExtension": ".{0} не е валидно разширение", - "invalidFilename": "Невалидно име на файла.", "newFileName": "Ново име на файла" } } diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 747d6063a..43017de46 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -5,188 +5,200 @@ "label": "Sobre{0}" }, "board": { - "board": "Tarja{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardInfo": "Informació de la Tarja", - "boards": "boards", - "configDialog1": "Seleccioneu una Tarja i un port si voleu carregar un programa.", - "configDialog2": "Si només seleccioneu una Tarja, podreu compilar, però no carregar el vostre programa.", - "couldNotFindPreviouslySelected": "No s'ha pogut trobar la Tarja seleccionada anteriorment '{0}' a la plataforma instal·lada '{1}'. Torneu a seleccionar manualment la tarja que voleu utilitzar. Vols tornar a seleccionar-la ara?", - "disconnected": "Disconnected", - "getBoardInfo": "Obtenir informació de la Tarja", + "board": "Placa {0}", + "boardConfigDialogTitle": "Selecciona una altra placa i port", + "boardInfo": "Informació de la placa", + "boards": "plaques", + "configDialog1": "Selecciona una placa i un port si vols carregar un programa.", + "configDialog2": "Si només selecciones una placa, podràs compilar, però no carregar un programa.", + "couldNotFindPreviouslySelected": "No s'ha trobat la placa \"{0}\" seleccionada anteriorment en la plataforma instal·lada \"{1}\". Torna a seleccionar manualment la placa que vols utilitzar. Vols tornar-la a seleccionar ara?", + "disconnected": "Desconnectada", + "getBoardInfo": "Obtín informació de la placa", "inSketchbook": "(al quadern de programes)", - "installNow": "El nucli de \"{0} {1}\" s'ha d'instal·lar per a la Tarja \"{2}\" seleccionada actualment. Vols instal·lar-lo ara?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "El FQBN no està disponible per la Tarja seleccionada \"{0}\". Tens instal·lat el nucli corresponent?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No hi ha cap port seleccionat per a la tarja: '{0}'.", - "noneSelected": "No hi ha cap tarja seleccionada.", - "openBoardsConfig": "Selecciona una altre tarja i port...", - "platformMissing": "La plataforma per a la tarja '{0}' seleccionada no està instal·lada.", - "pleasePickBoard": "Si us plau, trieu una tarja connectada al port que heu seleccionat.", + "installNow": "El nucli de \"{0} {1}\" s'ha d'instal·lar en la placa \"{2}\" seleccionada actualment. Vols instal·lar-lo ara?", + "noBoardsFound": "No s'han trobat plaques per a \"{0}\"", + "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}", + "portLabel": "Port {0}", "ports": "ports", "programmer": "Programador", - "reselectLater": "Torneu a seleccionar més tard", - "searchBoard": "Search board", - "selectBoard": "Seleccioneu la Tarja", - "selectBoardForInfo": "Seleccioneu una tarja per obtenir informació sobre ella.", - "selectPortForInfo": "Seleccioneu un port per obtenir la informació de la tarja.", - "showAllAvailablePorts": "Mostra tots els ports disponibles quan estiguin habilitats", - "showAllPorts": "Show all ports", + "reselectLater": "Torna a triar més tard", + "searchBoard": "Busca una placa", + "selectBoard": "Tria una placa", + "selectPortForInfo": "Tria un port per obtenir informació de la placa.", + "showAllAvailablePorts": "Mostra tots els ports disponibles habilitats", + "showAllPorts": "Mostra tots els ports", "succesfullyInstalledPlatform": "Plataforma instal·lada correctament {0}:{1}", "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Placa desconeguda" }, - "boardsManager": "Gestor de Targetes", + "boardsManager": "Gestor de plaques", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificat per Arduino" }, "bootloader": { "burnBootloader": "Grava el carregador d'arrencada (Bootloader)", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "S'ha acabat de gravar el carregador d'arrencada (Bootloader)." + "burningBootloader": "Gravant el carregador d'arrencada...", + "doneBurningBootloader": "S'ha acabat de gravar el carregador d'arrencada." }, "burnBootloader": { - "error": "Error mentre es gravava el carregador d'arrencada (Bootloader): {0} " + "error": "Error mentre es gravava el carregador d'arrencada: {0} " }, "certificate": { - "addNew": "Afegir Nou", + "addNew": "Afig nou", "addURL": "Afegeix l'URL per obtenir el certificat SSL", "boardAtPort": "{0} a {1}", "certificatesUploaded": "S'han carregat els certificats.", "enterURL": "Introduïu l'URL", - "noSupportedBoardConnected": "No hi ha cap tarja compatible connectada", + "noSupportedBoardConnected": "No hi ha cap placa compatible connectada", "openContext": "Context obert", - "remove": "Eliminar", - "selectBoard": "Seleccioneu una tarja...", + "remove": "Elimina", + "selectBoard": "Tria una placa...", "selectCertificateToUpload": "1. Seleccioneu el certificat per carregar", - "selectDestinationBoardToUpload": "2. Seleccioneu la tarja de destinació i carregueu el certificat", + "selectDestinationBoardToUpload": "2. Tria la placa de destinació i carrega el certificat", "upload": "Carrega", "uploadFailed": "La càrrega ha fallat. Si us plau, torna-ho a provar.", "uploadRootCertificates": "Carregueu els certificats arrel SSL", "uploadingCertificates": "Càrrega de certificats." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Comprovant actualitzacions d'Arduino", + "installAll": "Instal·la-ho tot", + "noUpdates": "No hi ha actualitzacions disponibles", + "promptUpdateBoards": "Algunes plaques tenen actualitzacions disponibles.", + "promptUpdateLibraries": "Algunes llibreries tenen actualitzacions disponibles.", + "updatingBoards": "Actualitzant plaques...", + "updatingLibraries": "Actualitzant llibreries..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" + "keyboardError": "No s'ha trobat \"Keyboard\". El teu programa té la línia \"#include \"?", + "mouseError": "No s'ha trobat \"Mouse\". El teu programa té la línia \"#include \"?" }, "cloud": { - "account": "Account", + "account": "Compte", "chooseSketchVisibility": "Trieu la visibilitat del vostre programa:", + "cloudSketchbook": "Quadern de programes del núvol", "connected": "Connectat", - "continue": "Continuar", - "donePulling": "S'ha acabat de extreure '{0}.", - "donePushing": "S'ha acabat de enviar '{0}'.", - "embed": "Incrustar:", + "continue": "Continua", + "donePulling": "Descarregat correctament \"{0}\".", + "donePushing": "Enviat correctament \"{0}\".", + "embed": "Encasta:", "emptySketchbook": "El teu quadern de programes està buit", - "goToCloud": "Go to Cloud", + "goToCloud": "Ves al núvol", "learnMore": "Aprèn més", "link": "Enllaç:", - "notYetPulled": "No es pot enviar cap als núvol. Encara no ha estat baixat", + "notYetPulled": "No es pot enviar al núvol. Encara no s'ha descarregat.", "offline": "Fora de línia", - "openInCloudEditor": "Obre a l'Editor del núvol", + "openInCloudEditor": "Obri a l'editor del núvol", "options": "Opcions...", "privateVisibility": "Privat. Només tu pots veure el programa.", "profilePicture": "Imatge del perfil", "publicVisibility": "Públic. Qualsevol persona amb l'enllaç pot veure el programa.", - "pull": "Descarregar", + "pull": "Descarrega", "pullFirst": "Primer has de descarregar per poder enviar al núvol.", - "pullSketch": "Descarregar programa", - "pullSketchMsg": "Si descarregueu aquest programa del núvol, sobreescriurà la seva versió local. Esteu segur que voleu continuar?", - "push": "Enviar", - "pushSketch": "Enviar programa", - "pushSketchMsg": "Aquest és un programa públic. Abans d'enviar, assegureu-vos que qualsevol informació sensible estigui definida als fitxers arduino_secrets.h. Podeu fer un programa privat des del tauler Compartir.", + "pullSketch": "Baixa el programa", + "pullSketchMsg": "Si descarregueu aquest programa del núvol, sobreescriurà la seva versió local. Segur que vols continuar?", + "push": "Envia", + "pushSketch": "Envia el programa", + "pushSketchMsg": "Aquest és un programa públic. Abans d'enviar, assegureu-vos que qualsevol informació sensible estigui definida als fitxers arduino_secrets.h. Podeu fer un programa privat des del tauler de compartir.", "remote": "Remot", - "remoteSketchbook": "Remote Sketchbook", - "share": "Compartir...", - "shareSketch": "Compartir programa", - "showHideRemoveSketchbook": "Mostra/amaga el quadern de programes remot", - "signIn": "Inicieu sessió", - "signInToCloud": "Inicieu la sessió a Arduino Cloud", + "share": "Comparteix...", + "shareSketch": "Comparteix programa...", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "signIn": "Inicia sessió", + "signInToCloud": "Inicia la sessió a Arduino Cloud", "signOut": "Tanca sessió", - "sync": "Sync", + "sync": "Sincronitza", "syncEditSketches": "Tanca la sessió de sincronització i edita els teus programes del núvol Arduino", "visitArduinoCloud": "Visiteu Arduino Cloud per crear programes al núvol." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Sincronitzant quadern de programes, descarregant \"{0}\"...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { - "all": "All", - "contributed": "Contributed", - "installManually": "Instal·la Manualment", + "all": "Tot", + "contributed": "Contribucions", + "installManually": "Instal·la manualment", "later": "Més tard", - "noBoardSelected": "No s'ha seleccionat cap tarja", + "noBoardSelected": "No s'ha seleccionat cap placa", "notConnected": "[no connectat]", "offlineIndicator": "Sembla que estàs fora de línia. Sense connexió a Internet, és possible que l'Arduino CLI no pugui descarregar els recursos necessaris i podria provocar un mal funcionament. Connecteu-vos a Internet i reinicieu l'aplicació.", - "oldFormat": "El '{0}' encara utilitza l'antic format `.pde`. Voleu canviar a la nova extensió '.ino'`?", - "partner": "Partner", + "oldFormat": "El \"{0}\" encara utilitza l'antic format \".pde\". Voleu canviar a la nova extensió \".ino\"?", + "partner": "Company", "processing": "Processant", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "Recomanat", + "retired": "Retirat", "selectedOn": "sobre {0}", "serialMonitor": "Monitor sèrie", - "type": "Type", + "type": "Tipus", "unknown": "Desconegut", - "updateable": "Updatable" + "updateable": "Actualitzable" }, "compile": { "error": "Error de compilació: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Plaques incloses al paquet:", "by": "per", "filterSearch": "Filtra la teva cerca...", - "install": "Instal·lar", - "installed": "Installed", + "install": "Instal·la", + "installed": "Instal·lat", "moreInfo": "Més informació", "uninstall": "Desinstal·la", "uninstallMsg": "Vols desinstal·lar {0}?", "version": "Versió {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "No s'ha pogut accedir a la ubicació del quadern de programes a \"{0}\": {1}" + } + }, "contributions": { "addFile": "Afegeix un fitxer", "fileAdded": "S'ha afegit un fitxer al programa.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "No s'ha pogut obrir el gràfic sèrie" }, "replaceTitle": "Substitueix" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "Tot", + "default": "Per defecte", + "more": "Més", + "none": "Cap" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Còpia els missatges d'error", + "noBoardSelected": "No s'ha seleccionat cap placa. Tria una placa Arduino des d'Eines > Plaques" }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "Reinicia el servei", + "start": "Inicia el servei", + "stop": "Para el servei" }, "debug": { "debugWithMessage": "Depuració - {0}", "debuggingNotSupported": "La depuració no és compatible amb '{0}'", "noPlatformInstalledFor": "La plataforma no està instal·lada per a '{0}'", - "optimizeForDebugging": "Optimitzar per a la depuració" + "optimizeForDebugging": "Optimitzar per a la depuració", + "sketchIsNotCompiled": "El programa \"{0}\" s'ha de comprovar abans de començar la depuració. Per favor, verifica el programa i comença a depurar de nou. Vols verificar el programa ara?" }, "dialog": { "dontAskAgain": "No ho tornis a preguntar" @@ -194,42 +206,42 @@ "editor": { "autoFormat": "Format automàtic", "commentUncomment": "Comenta/Descomenta", - "copyForForum": "Còpia per al fòrum (Markdown)", + "copyForForum": "Còpia per al fòrum (baix de l'últim)", "decreaseFontSize": "Disminueix la mida de la lletra", "decreaseIndent": "Disminueix el sagnat", "increaseFontSize": "Augmenta la mida de la lletra", "increaseIndent": "Augmenta el sagnat", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "nextError": "Següent error", + "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 no es desaran." + "unsavedChanges": "Els canvis no desats es perdran." }, "examples": { "builtInExamples": "Exemples incorporats", "couldNotInitializeExamples": "No es poden inicialitzar els exemples incorporats.", - "customLibrary": "Exemples de Llibreries personalitzades", - "for": "Exemples per {0}", - "forAny": "Exemples per a qualsevol tarja", + "customLibrary": "Exemples de llibreries personalitzades", + "for": "Exemples per a {0}", + "forAny": "Exemples per a qualsevol placa", "menu": "Exemples" }, "firmware": { - "checkUpdates": "Consulta les actualitzacions", + "checkUpdates": "Comprova si hi ha actualitzacions", "failedInstall": "La instal·lació ha fallat. Si us plau, torna-ho a provar.", - "install": "Instal·lar", - "installingFirmware": "Instal·lació del firmware.", - "overwriteSketch": "La instal·lació sobreescriurà el programa a la tarja.", - "selectBoard": "Seleccioneu la Tarja", - "selectVersion": "Seleccioneu la versió del firmware", - "successfullyInstalled": "El firmware s'ha instal·lat correctament.", - "updater": "Actualitzador de firmware WiFi101 / WiFiNINA" + "install": "Instal·la", + "installingFirmware": "Instal·lació de l'entorn.", + "overwriteSketch": "La instal·lació sobreescriurà el programa a la placa.", + "selectBoard": "Selecciona una placa", + "selectVersion": "Selecciona la versió de l'entorn", + "successfullyInstalled": "L'entorn s'ha instal·lat correctament.", + "updater": "Actualitzador de l'entorn WiFi101 / WiFiNINA" }, "help": { - "environment": "L'entorn", + "environment": "Entorn", "faq": "Preguntes freqüents", - "findInReference": "Cerca a Referència", + "findInReference": "Busca a les referències", "gettingStarted": "Com començar", "keyword": "Escriviu una paraula clau", "privacyPolicy": "Política de privacitat", @@ -239,231 +251,252 @@ "visit": "Visiteu Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Comprova si hi ha actualitzacions de l'IDE d'Arduino", "closeAndInstallButton": "Tanca i instal·la", "closeToInstallNotice": "Tanqueu el programari i instal·leu l'actualització a la vostra màquina.", - "downloadButton": "Descarregar", - "downloadingNotice": "Descàrrega de l'última versió de l'IDE d'Arduino.", - "errorCheckingForUpdates": "S'ha produït un error en comprovar si hi ha actualitzacions d'IDE d'Arduino. \n{0}", - "goToDownloadButton": "Vés a Descarregar", + "downloadButton": "Descarrega", + "downloadingNotice": "Descarregant de l'última versió de l'IDE d'Arduino.", + "errorCheckingForUpdates": "S'ha produït un error en comprovar si hi ha actualitzacions de l'IDE d'Arduino.\n{0}", + "goToDownloadButton": "Ves a descàrregues", "goToDownloadPage": "Hi ha disponible una actualització per a l'IDE d'Arduino, però no podem baixar-la i instal·lar-la automàticament. Si us plau, aneu a la pàgina de descàrrega i descarregueu-ne la darrera versió.", - "ideUpdaterDialog": "Actualització de software", - "newVersionAvailable": "Una nova versió d'Arduino IDE ({0}) està disponible per descarregar.", + "ideUpdaterDialog": "Actualització de programari", + "newVersionAvailable": "Una nova versió de l'IDE d'Arduino ({0}) està disponible per descarregar.", "noUpdatesAvailable": "No hi ha actualitzacions recents disponibles per a l'IDE d'Arduino", "notNowButton": "Ara no", "skipVersionButton": "Omet la versió", "updateAvailable": "Actualització disponible", - "versionDownloaded": "Arduino IDE {0} s'ha descarregat." + "versionDownloaded": "L'IDE d'Arduino {0} s'ha descarregat" }, "library": { "addZip": "Afegeix llibreria .ZIP...", - "arduinoLibraries": "Llibreries Arduino", + "arduinoLibraries": "Llibreries d'Arduino", "contributedLibraries": "Llibreriess aportades", "include": "Inclou llibreria", - "installAll": "Install All", - "installLibraryDependencies": "Install library dependencies", + "installAll": "Instal·la-ho tot", + "installLibraryDependencies": "Instal·la les dependències de la llibreria", "installMissingDependencies": "Voleu instal·lar totes les dependències que falten?", "installOneMissingDependency": "Voleu instal·lar la dependència que falta?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Instal·la sense les dependències", "installedSuccessfully": "Llibreria instal·lada correctament {0}:{1}", "libraryAlreadyExists": "Ja existeix una llibreria. Voleu sobreescriure-la?", - "manageLibraries": "Gestiona les Llibreries...", - "namedLibraryAlreadyExists": "Ja existeix una carpeta de llibreria anomenada {0}. Voleu sobreescriure-lo?", + "manageLibraries": "Gestiona les llibreries...", + "namedLibraryAlreadyExists": "Ja existeix una carpeta de llibreria anomenada {0}. Voleu sobreescriure-la?", "needsMultipleDependencies": "La llibreria {0}: {1} necessita algunes altres dependències actualment no instal·lades:", "needsOneDependency": "La llibreria{0}:{1} necessita una altra dependència actualment no instal·lada:", "overwriteExistingLibrary": "Voleu sobreescriure la llibreria existent?", "successfullyInstalledZipLibrary": "La llibreria s'ha instal·lat correctament des de l'arxiu {0}", - "title": "Gestor de Llibreries", + "title": "Gestor de llibreries", "uninstalledSuccessfully": "Llibreria desinstal·lada correctament {0}:{1}", "zipLibrary": "Llibreria" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Tema" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", + "communication": "Comunicació", + "dataProcessing": "Processament de dades", + "dataStorage": "Emmagatzematge de dades", + "deviceControl": "Control del dispositiu", + "display": "Pantalla", + "other": "Altres", "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "signalInputOutput": "Senyal entrada/eixida", + "timing": "Temporitzador", + "uncategorized": "Sense categoria" }, "libraryType": { - "installed": "Installed" + "installed": "Instal·lat" }, "menu": { - "advanced": "Advanced", + "advanced": "Avançat", "sketch": "Programa", "tools": "Eines" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "unableToCloseWebSocket": "No s'ha pogut tancar la ranura web", + "unableToConnectToWebSocket": "No s'ha pogut connectar a la ranura web" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Xarxa", - "serial": "Serial" + "serial": "Sèrie" }, "preferences": { - "additionalManagerURLs": "URL addicionals del gestor de targetes", + "additionalManagerURLs": "URLs addicionals del gestor de plaques", "auth.audience": "L'audiència d'OAuth2.", "auth.clientID": "L'identificador de client OAuth2.", "auth.domain": "El domini OAuth2.", "auth.registerUri": "L'URI utilitzat per registrar un nou usuari.", "automatic": "Automàtic", - "board.certificates": "Llista de certificats que es poden carregar a les targes", + "board.certificates": "Llistat de certificats que es poden carregar a les plaques", "browse": "Navega", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Rep notificacions d'actualitzacions disponibles per a l'IDE, plaques i llibreries. Requereix reiniciar l'IDE per aplicar els canvis. Per defecte està activat.", "choose": "Tria", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "És cert si les funcions de sincronització del programa estan habilitades. El valor predeterminat és true.", - "cloud.pull.warn": "És cert si s'ha d'avisar als usuaris abans de baixar un programa del núvol. El valor predeterminat és true.", - "cloud.push.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa del núvol. El valor predeterminat és true.", - "cloud.pushpublic.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa públic al núvol. El valor predeterminat és true.", - "cloud.sketchSyncEndpoint": "El punt final s'utilitza per a enviar i descarregar programes des d'un backend. Per defecte apunta a l'API d'Arduino Cloud.", - "compile": "compilar", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "Veritat per a la sortida de compilació detallada. Fals per defecte", + "cli.daemonDebug": "Activa la depuració de registre de les cridades gRPC a l'Arduino CLI. Requereix reiniciar l'IDE perquè els canvis tinguen efecte. Per defecte està desactivat.", + "cloud.enabled": "És cert si les funcions de sincronització del programa estan habilitades. Per defecte està activat.", + "cloud.pull.warn": "És cert si s'ha d'avisar als usuaris abans de baixar un programa del núvol. Per defecte està activat.", + "cloud.push.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa del núvol. Per defecte està activat.", + "cloud.pushpublic.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa públic al núvol. Per defecte està activat.", + "cloud.sketchSyncEndpoint": "El punt final s'utilitza per a enviar i descarregar programes des d'un administrador. Per defecte apunta a l'API d'Arduino Cloud.", + "compile": "compila", + "compile.experimental": "És cert si l'IDE gestiona múltiples errors de compilació. Per defecte està desactivat.", + "compile.revealRange": "Ajusta com els errors de compilació es mostren a l'editor després d'un error de verificació/pujada. Els possibles valors són \"auto\": Baixa verticalment si és necessari per revelar una línia. \"center\": Baixa verticalment si és necessari revelar una línia centrada verticalment. \"top\": Baixa verticalment si és necessari revelar una línia prop de la part de dalt de tot de la consola, optimitzat per veure la definició del codi. \"centerIfOutsideViewport\": Baixa verticalment si és necessari revelar una línia centrada verticalment només si se n'ix de la consola. Per defecte el valor és \"{0}\".", + "compile.verbose": "És cert si l'eixida de la compilació és detallada. Per defecte està desactivat.", "compile.warnings": "Indica a gcc quin nivell d'avís s'ha d'utilitzar. Per defecte és \"Cap\".", "compilerWarnings": "Advertències del compilador", "editorFontSize": "Mida de lletra de l'editor", "editorQuickSuggestions": "Suggeriments ràpids de l'editor", "enterAdditionalURLs": "Introduïu URL addicionals, un per a cada fila", - "files.inside.sketches": "Mostra fitxers dins del programes", + "files.inside.sketches": "Mostra fitxers dins dels programes", "ide.updateBaseUrl": "L'URL base des d'on baixar les actualitzacions. El valor per defecte és \"https://downloads.arduino.cc/arduino-ide\"", - "ide.updateChannel": "Allibera el canal per rebre actualitzacions. 'stable' és la versió estable, 'nightly' és l'última versió de desenvolupament.", + "ide.updateChannel": "Canal de novetats per rebre actualitzacions. \"stable\" és la versió estable, \"nightly\" és l'última versió de desenvolupament.", "interfaceScale": "Escala de la interfície", "invalid.editorFontSize": "Mida del tipus de lletra de l'editor no vàlida. Ha de ser un nombre enter positiu.", "invalid.sketchbook.location": "La ubicació del quadern de programes no és vàlida: {0}", "invalid.theme": "Tema no vàlid.", "language.log": "És cert si el servidor d'idiomes Arduino hauria de generar fitxers de registre a la carpeta de programes. En cas contrari, fals. És fals per defecte.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.realTimeDiagnostics": "Si està activat, el servidor d'idiomes ofereix diagnòstics en temps real mentre s'escriu. Per defecte està desactivat.", "manualProxy": "Configuració manual del proxy", "network": "Xarxa", "newSketchbookLocation": "Seleccioneu una ubicació nova del quadern de programes", + "noCliConfig": "No s'ha pogut carregar la configuració del CLI", "noProxy": "Sense proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "Nom de l'hostatge", + "password": "Contrasenya", + "port": "Número de port", + "username": "Nom d'usuari" }, "showVerbose": "Mostra la sortida detallada durant", "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": "Ruta del sistema d'arxius absolut per als fitxers per defecte \".ino\". Si s'especifica, el contingut dels fitxers s'utilitzarà per als nous programes creats per l'IDE. Si no, els programes es generaran amb el contingut per defecte d'Arduino. Els fitxers inaccessibles seran ignorats. **Es requereix reiniciar l'IDE** perquè els canvis tinguen efecte." }, "sketchbook.location": "Ubicació del quadern de programes", - "sketchbook.showAllFiles": "True per mostrar tots els fitxers del programa dins del programa. És fals per defecte.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Feu clic per obtenir una llista d'URL de suport de targetes no oficials", - "upload": "carregar", - "upload.verbose": "True per a la sortida detallada de la càrrega. Fals per defecte.", - "verifyAfterUpload": "Verifica el codi després de pujar", - "window.autoScale": "És cert si la interfície d'usuari escala automàticament amb la mida de la lletra.", + "sketchbook.showAllFiles": "Si està activat es mostraran els fitxers dins del programa. Per defecte està desactivat.", + "survey.notification": "Si està activat els usuaris seran notificats si hi ha una enquesta disponible. Per defecte està activat.", + "unofficialBoardSupport": "Fes clic per obtenir una llista d'URLs de suport de plaques no oficials", + "upload": "carrega", + "upload.verbose": "Si està activat es mostrarà l'eixida detallada de la càrrega. Per defecte està desactivat.", + "verifyAfterUpload": "Verifica el codi després de pujar-lo", + "window.autoScale": "Si està activat la interfície s'escalarà automàticament amb la mida de la lletra.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Obsolet. Utilitza \"window.zoomLevel\"." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Substitueix la versió existent de {0}?", "selectZip": "Seleccioneu un fitxer zip que contingui la llibreria que voleu afegir", "serial": { "autoscroll": "Desplaçament automàtic", "carriageReturn": "Retorn de carro", - "message": "Message (Enter to send message to '{0}' on '{1}')", - "newLine": "Nova Línia", + "message": "Missatge (escriu per enviar un missatge a \"{0}\" en \"{1}\")", + "newLine": "Línia nova", "newLineCarriageReturn": "Ambdós NL & CR", "noLineEndings": "Sense final de línia", - "notConnected": "No connectat. Seleccioneu una tarja i un port per connectar-vos automàticament.", - "openSerialPlotter": "Serial Plotter", + "notConnected": "No connectat. Selecciona una placa i un port per connectar-te automàticament.", + "openSerialPlotter": "Gràfic sèrie", "timestamp": "Marca de temps", "toggleTimestamp": "Activa o desactiva la marca de temps" }, "sketch": { - "archiveSketch": "Guardar programa", + "archiveSketch": "Arxiva el programa", "cantOpen": "Ja existeix una carpeta anomenada \"{0}\". No es pot obrir el programa.", "close": "Esteu segur que voleu tancar el programa?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "S'ha creat l'arxiu '{0}'.", - "doneCompiling": "S'ha fet la compilació.", - "doneUploading": "S'ha acabat de carregar.", + "compile": "Compilant el programa...", + "configureAndUpload": "Configura i puja", + "createdArchive": "S'ha creat l'arxiu \"{0}\".", + "doneCompiling": "Compilació enllestida.", + "doneUploading": "Pujada enllestida.", + "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": "Exporta el binari compilat", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Movent-se", - "movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta deprograma anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?", - "new": "New Sketch", - "openFolder": "Obrir carpeta", - "openRecent": "Obre Recent", - "openSketchInNewWindow": "Obriu el programa a una finestra nova", - "saveFolderAs": "Desa la carpeta de programa com a...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Desa la carpeta de programa com a...", - "showFolder": "Mostra la carpeta de programa", + "movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?", + "new": "Programa nou", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Obri la carpeta", + "openRecent": "Obri recent", + "openSketchInNewWindow": "Obri el programa en una finestra nova", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Desa la carpeta del programa com a...", + "saveSketch": "Guarda el fitxer per obrir-lo de nou més tard.", + "saveSketchAs": "Desa la carpeta del programa com a...", + "showFolder": "Mostra la carpeta del programa", "sketch": "Programa", "sketchbook": "Quadern de programes", - "titleLocalSketchbook": "Quadern de programes Local", + "titleLocalSketchbook": "Quadern de programes local", "titleSketchbook": "Quadern de programes", "upload": "Carrega", - "uploadUsingProgrammer": "Càrrega mitjançant el programador", - "uploading": "Uploading...", - "userFieldsNotFoundError": "No s'han trobat camps d'usuari per a la tarja connectada", - "verify": "Verificar", - "verifyOrCompile": "Verificar/Compilar" + "uploadUsingProgrammer": "Carrega mitjançant el programador", + "uploading": "Carregant...", + "userFieldsNotFoundError": "No s'han trobat camps d'usuari per a la placa connectada", + "verify": "Verifica", + "verifyOrCompile": "Verifica/Compila" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "New Cloud Sketch", + "newSketch": "Programa nou" }, "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": "Contesta l'enquesta", + "dismissSurvey": "No ho tornes a mostrar", + "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." }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "Actualitza els índexs", + "updateLibraryIndex": "Actualitza l'índex de la llibreria", + "updatePackageIndex": "Actualitza l'índex del paquet" }, "upload": { "error": "{0} error: {1}" }, "userFields": { - "cancel": "Cancel · lar", - "enterField": "Enter {0}", + "cancel": "Cancel·la", + "enterField": "Entra {0}", "upload": "Carrega" + }, + "validateSketch": { + "abortFixMessage": "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": "No es pot connectar al backend.", - "cannotConnectDaemon": "No es pot connectar al CLI daemon.", + "cannotConnectBackend": "No es pot connectar amb l'administrador.", + "cannotConnectDaemon": "No es pot connectar amb el servei del CLI.", "couldNotSave": "No s'ha pogut desar el programa. Copieu el vostre treball no desat al vostre editor de text preferit i reinicieu l'IDE.", - "daemonOffline": "CLI Daemon fora de línia", + "daemonOffline": "El servei CLI està fora de línia", "offline": "Fora de línia", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "Segur que vols eixir?" }, "editor": { "unsavedTitle": "No desat –{0}" }, "messages": { - "collapse": "Col·lapsar", + "collapse": "Col·lapsa", "expand": "Expandeix" }, "workspace": { - "deleteCurrentSketch": "Voleu eliminar el programa actual?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Nom del nou fitxer", "invalidExtension": ". {0} no és una extensió vàlida", - "invalidFilename": "El nom del fitxer no és vàlid.", "newFileName": "Nou nom per al fitxer" } } diff --git a/i18n/cs.json b/i18n/cs.json index fbb23a3b1..d4a2e9eff 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Verze: {0}\nDatum: {1}[2]\nVerze CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "O {0}" }, "board": { @@ -18,11 +18,12 @@ "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...", - "platformMissing": "Platforma pro zvolenou desku '{0}' není nainstalována.", "pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ", "port": "Port {0}", "portLabel": "Port:{0}", @@ -31,13 +32,13 @@ "reselectLater": "Zvolit později", "searchBoard": "Vyhledat desku", "selectBoard": "Zvolit desku", - "selectBoardForInfo": "Prosím zvolte desku pro získání informací o desce.", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", "showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)", "showAllPorts": "Ukázat všechny porty", "succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.", "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.", - "typeOfPorts": "{0}porty" + "typeOfPorts": "{0}porty", + "unknownBoard": "Neznámá deska" }, "boardsManager": "Manažér desek", "boardsType": { @@ -73,17 +74,18 @@ "installAll": "Instalovat vše", "noUpdates": "Nejsou k dispozici žádné aktualizace", "promptUpdateBoards": "Jsou k dispozici aktualizace pro některé z vašich desek ", - "promptUpdateLibraries": "Updates are available for some of your libraries.", + "promptUpdateLibraries": "Jsou k dispozici aktualizace pro některé z vašich knihoven", "updatingBoards": "Aktualizuji desky...", "updatingLibraries": "Aktualizuji knihovny..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", + "keyboardError": "'Keyboard' nebylo nalezeno. Obsahuje váš projekt řádek '#include '?", "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" }, "cloud": { "account": "Účet", "chooseSketchVisibility": "Zvolte viditelnost sketche:", + "cloudSketchbook": "Cloudové umístění projektů", "connected": "Připojen", "continue": "Pokračovat", "donePulling": "Stahování dokončeno ’{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Odeslat sketch", "pushSketchMsg": "Toto je veřejná sketch. Před odesláním se prosím ujistěte že jsou smazané citlivé informace ze souboru arduino_secrets.h . Tuto sketch můžete změnit na soukromou v panelu pro sdílení. ", "remote": "Vzdálený", - "remoteSketchbook": "Odstranit Sketchbook", "share": "Sdílet...", "shareSketch": "Sdílet sketch", - "showHideRemoveSketchbook": "Zobrazit/skrýt vzdálenou sketch", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Přihlásit se", "signInToCloud": "Přihlásit se do Arduino Cloud", "signOut": "Odhlásit se", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudové sketche" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Synchronizuji projekt..." }, "common": { "all": "Vše", @@ -151,12 +157,17 @@ "by": "od", "filterSearch": "Filtrovat vyhledávání... ", "install": "Instalovat", - "installed": "Installed", + "installed": "Nainstalováno", "moreInfo": "Více informací", "uninstall": "Odinstalovat", "uninstallMsg": "Chcete odinstalovat {0}?", "version": "Verze {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Přidat soubor", "fileAdded": "Soubor byl přidán do sketche.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging není podporován s '{0}'", "noPlatformInstalledFor": "Platforma není nainstalována pro '{0}'", - "optimizeForDebugging": "optimalizovat pro Debugging" + "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?" }, "dialog": { "dontAskAgain": "Znovu se neptat" @@ -201,7 +213,7 @@ "increaseIndent": "Zvětšit odrážku", "nextError": "Další chyba", "previousError": "Předchozí chyba", - "revealError": "Reveal Error" + "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. ", @@ -293,7 +305,7 @@ "uncategorized": "Uncategorized" }, "libraryType": { - "installed": "Installed" + "installed": "Nainstalováno" }, "menu": { "advanced": "Pokročilé", @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Síť", @@ -352,6 +361,7 @@ "manualProxy": "Ruční nastavení proxy", "network": "Síť", "newSketchbookLocation": "Zvolit nové umístění projektů", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Bez proxy", "proxySettings": { "hostname": "Jméno hosta", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Vyměnit existující verzi {0}?", "selectZip": "Zvolte ZIP soubor s knihovnou kterou chcete přidat", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Vytvořen archív '{0}'.", "doneCompiling": "Ověřování dokončeno.", "doneUploading": "Nahrávání dokončeno. ", + "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": "Exportovat kompilované soubory", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Přesouvám", "movingMsg": "Soubor \"{0}\" musí být uvnitř složky která je shodná názvem \"{1}\".\nVytvořit složku, přesunout tam- soubor a pokračovat? ", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Otevřít složku", "openRecent": "Otevřít nedávné", "openSketchInNewWindow": "Otevřít sketch v novém okně", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Uložit složku sketche jako...", "saveSketch": "Uložte svůj sketch, abyste ho mohli znovu otevřít později.", "saveSketchAs": "Uložit složku sketche jako...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Ověřit/Kompilovat" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Zrušit", "enterField": "Enter {0}", "upload": "Nahrát" + }, + "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": { @@ -460,10 +493,10 @@ "expand": "Rozšířit" }, "workspace": { - "deleteCurrentSketch": "Opravdu chcete vymazat aktuální sketch? ", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Název pro nový soubor", "invalidExtension": ".{0}je neplatná přípona", - "invalidFilename": "Neplatný název souboru.", "newFileName": "Nový název souboru" } } diff --git a/i18n/da.json b/i18n/da.json new file mode 100644 index 000000000..8fd1a3a1b --- /dev/null +++ b/i18n/da.json @@ -0,0 +1,503 @@ +{ + "arduino": { + "about": { + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "label": "About {0}" + }, + "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": { + "account": "Account", + "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", + "filterSearch": "Filter your search...", + "install": "Install", + "installed": "Installed", + "moreInfo": "More info", + "uninstall": "Uninstall", + "uninstallMsg": "Do you want to uninstall {0}?", + "version": "Version {0}" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "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." + }, + "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": { + "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", + "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 or number, 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 or number, 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." + }, + "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", + "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 d0e4ecdfb..fbce134f0 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDatum: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Über {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "Native serial port, can't obtain info.", "noPortsDiscovered": "Keine Ports gefunden", "noPortsSelected": "Kein Port für das Board : '{0}' ausgewählt.", + "nonSerialPort": "Non-serial port, can't obtain info.", "noneSelected": "Kein Board ausgewählt.", "openBoardsConfig": "Wähle einen anderes Board und einen anderen Port...", - "platformMissing": "Die Plattform für das gewählte '{0}' Board ist nicht installiert.", "pleasePickBoard": "Bitte wählen Sie das Board, welches am ausgewählten Port angeschlossen ist.", "port": "Port{0}", "portLabel": "Port{0}", @@ -31,13 +32,13 @@ "reselectLater": "Später auswählen", "searchBoard": "Board suchen", "selectBoard": "Board wählen", - "selectBoardForInfo": "Wähle ein Board für die Board-Informationen.", "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", "showAllAvailablePorts": "Zeige alle verfügbaren Ports, wenn aktiviert.", "showAllPorts": "Zeige alle Ports", "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", - "typeOfPorts": "{0} Ports" + "typeOfPorts": "{0} Ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Board-Verwaltung", "boardsType": { @@ -45,7 +46,7 @@ }, "bootloader": { "burnBootloader": "Bootloader brennen", - "burningBootloader": "Bootloader überschreiben...", + "burningBootloader": "Bootloader überschreiben ...", "doneBurningBootloader": "Bootloader erfolgreich gebrannt." }, "burnBootloader": { @@ -74,8 +75,8 @@ "noUpdates": "Es sind keine aktuellen Updates verfügbar.", "promptUpdateBoards": "Es sind Updates für einige Ihrer Boards verfügbar.", "promptUpdateLibraries": "Es sind Updates für einige Ihrer Blibliotheken verfügbar.", - "updatingBoards": "Boards werden aktualisiert...", - "updatingLibraries": "Bibliotheken werden aktualisiert..." + "updatingBoards": "Boards werden aktualisiert ...", + "updatingLibraries": "Bibliotheken werden aktualisiert ..." }, "cli-error-parser": { "keyboardError": "'Keyboard' nicht gefunden. Enthält ihr Sketch die Zeile '#include '?", @@ -84,6 +85,7 @@ "cloud": { "account": "Konto", "chooseSketchVisibility": "Wähle die Sichtbarkeit deines Sketches:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Verbunden", "continue": "Fortfahren", "donePulling": "Herunterladen von '{0}' erfolgreich.", @@ -96,7 +98,7 @@ "notYetPulled": "Kann nicht in die Cloud geschoben werden. Es ist noch nicht heruntergeladen.", "offline": "Offline", "openInCloudEditor": "Im Cloud Editor öffnen", - "options": "Optionen....", + "options": "Optionen ...", "privateVisibility": "Private. Nur du siehst diesen Sketch.", "profilePicture": "Profilbild", "publicVisibility": "Public. Jeder kann mit diesen Link den Sketch sehen.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "Das ist ein öffentliches Sketch. Vor dem Pushen solltest du überprüfen, ob alle sensiblen Informationen in arduino_secrets.h definiert sind. Du kannst einen Sketch mit dem Teilen-Feld privat machen.", "remote": "Remote", - "remoteSketchbook": "Cloud Sketchbook", "share": "Teilen....", "shareSketch": "Sketch teilen", - "showHideRemoveSketchbook": "Zeige/Verstecke Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Anmelden", "signInToCloud": "Anmelden zur Arduino Cloud", "signOut": "Abmelden", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Alle", @@ -149,7 +155,7 @@ "component": { "boardsIncluded": "In diesem Paket enthaltene Boards:", "by": "von", - "filterSearch": "Filtern Sie Ihre Suche...", + "filterSearch": "Filtern Sie Ihre Suche ...", "install": "Installieren", "installed": "Installiert", "moreInfo": "Mehr Information", @@ -157,6 +163,11 @@ "uninstallMsg": "Möchten Sie {0} deinstallieren?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Datei hinzufügen...", "fileAdded": "Eine Datei wurde zum Sketch hinzugefügt.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "'{0}' unterstützt kein Debuggen", "noPlatformInstalledFor": "Die Platform für '{0}' ist nicht instaliert.", - "optimizeForDebugging": "Für Debugging optimieren" + "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?" }, "dialog": { "dontAskAgain": "Nicht noch einmal fragen" @@ -267,7 +279,7 @@ "installWithoutDependencies": "Ohne Abhängigkeiten installieren", "installedSuccessfully": "Bibliothek {0}:{1} erfolgreich installiert", "libraryAlreadyExists": "Eine Bibliothek existiert bereits. Möchten sie diese überschreiben?", - "manageLibraries": "Bibliotheken verwalten...", + "manageLibraries": "Bibliotheken verwalten ...", "namedLibraryAlreadyExists": "Der Bibliothek-Ordner '{0}' existiert bereits. Überschreiben?", "needsMultipleDependencies": "Die Bibliothek {0}:{1} benötigt ein paar andere Abhängigkeiten, die derzeit nicht installiert sind:", "needsOneDependency": "Die Bibliothek {0}:{1} benötigt eine andere Abhängigkeit, welche derzeit nicht installiert ist:", @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Websocket wurde nicht verbunden" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Netzwerk", @@ -352,6 +361,7 @@ "manualProxy": "Manuelle Proxy Einstellung", "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Kein Proxy", "proxySettings": { "hostname": "Hostname", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Existierende Version von {0} ersetzen?", "selectZip": "Wähle die ZIP-Datei, welche die hinzuzufügende Bibliothek enthält", "serial": { @@ -393,18 +406,27 @@ "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...", + "compile": "Kompiliere Sketch ...", "configureAndUpload": "Konfigurieren und Hochladen", "createdArchive": "Archiv '{0}' erstellt.", "doneCompiling": "Kompilieren erfolgreich!", "doneUploading": "Hochladen erfolgreich! ", + "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": "Kompilierte Binärdatei exportieren", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Übertragen...", "movingMsg": "Die Datei \"{0}\" muss sich in einen Sketch Ordner \"{1}\" befinden.\nOrdner erstellen, Datei verschieben und fortfahren?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Ordner öffnen", "openRecent": "Zuletzt geöffnet", "openSketchInNewWindow": "Sketch in neuen Fenster öffnen", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Sketch Ordner speichern als...", "saveSketch": "Sketch speichern und später wieder öffnen", "saveSketchAs": "Sketch Ordner speichern als...", @@ -415,13 +437,13 @@ "titleSketchbook": "Sketchbook", "upload": "Hochladen", "uploadUsingProgrammer": "Mit Programmer hochladen", - "uploading": "Hochladen...", + "uploading": "Hochladen ...", "userFieldsNotFoundError": "User Fields für das angeschlossene Board nicht gefunden", "verify": "Überprüfen", "verifyOrCompile": "Überprüfen/Kompilieren" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Abbrechen", "enterField": "Eingabe {0}", "upload": "Hochladen" + }, + "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": { @@ -460,10 +493,10 @@ "expand": "Ausklappen" }, "workspace": { - "deleteCurrentSketch": "Möchtest du den aktuellen Sketch löschen?", + "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 für die neue Datei", "invalidExtension": "\".{0}\" ist keine gültige Dateierweiterung.", - "invalidFilename": "Ungültiger Dateiname. ", "newFileName": "Neuer Name für die Datei" } } diff --git a/i18n/el.json b/i18n/el.json index 35cbc40d2..b12595f4e 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Σχετικά με {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "Επιλογή διαφορετικής πλακέτας και θύρας...", - "platformMissing": "Η πλατφόρμα για την επιλεγμένη πλακέτα '{0}' δεν έχει εγκατασταθεί.", "pleasePickBoard": "Πσρακαλώ επίλεξε μια πλακέτα που συνδέθηκε στην θύρα που έχεις επιλέξει.", "port": "Θύρα{0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Επιλογή αργότερα", "searchBoard": "Search board", "selectBoard": "Επιλογή Πλακέτας", - "selectBoardForInfo": "Παρακαλώ επίλεξε μια πλακέτα για εμφάνιση πληροφοριών πλακέτας.", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", "showAllAvailablePorts": "Εμφανίζει όλες τις διαθέσιμες θύρες όταν είναι ενεργοποιημένο.", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Επιτυχής εγκατάσταση πλατφόρμας {0}:{1}", "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Διαχειριστής Πλακετών", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Επίλεξε την ορατότητα του Σχεδίου σου:", + "cloudSketchbook": "Σχέδια Cloud", "connected": "Συνδέθηκε", "continue": "Συνέχεια", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Απομακρυνσμένο", - "remoteSketchbook": "Remote Sketchbook", "share": "Κοινοποίηση...", "shareSketch": "Κοινοποίηση Σχεδίου", - "showHideRemoveSketchbook": "Εμφάνιση/Απόκρυψη Απομακρυνσμένων Σχεδίων", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ΣΥΥΝΔΕΣΗ", "signInToCloud": "Σύνδεση στο Arduino Cloud", "signOut": "Αποσύνδεση", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Επισκέψου το Arduino Cloud για δημιουργία Σχεδίων Cloud." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Έκδοση {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Προσθήκη αρχείου", "fileAdded": "Ένα αρχείο προστέθηκε στον κώδικα.", @@ -186,7 +197,8 @@ "debugWithMessage": "Αποσφαλμάτωση - {0}", "debuggingNotSupported": "Δεν υποστιρίζεται αποσφαλμάτωση από '{0}'", "noPlatformInstalledFor": "Δεν έχει εγκατασταθεί πλατφόρμα για '{0}'", - "optimizeForDebugging": "Βελτιστοποίηση για Αποσφαλμάτωση" + "optimizeForDebugging": "Βελτιστοποίηση για Αποσφαλμάτωση", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Δίκτυο", @@ -352,6 +361,7 @@ "manualProxy": "Manual proxy configuration", "network": "Δίκτυο", "newSketchbookLocation": "Επιλογή νέας τοποθεσίας σχεδίων", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Ολοκλήρωση ανεβάσματος", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, 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": "Άνοιγμα φακέλου", "openRecent": "Άνοιγμα πρόσφατου", "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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Επικύρωση" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Ακύρωση", "enterField": "Enter {0}", "upload": "Ανέβασμα" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Επαναφορά" }, "workspace": { - "deleteCurrentSketch": "Θέλεις να διαγράψεις το υπάρχον σχέδιο;", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Όνομα για το νεό αρχείο", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Μη-έγκυρο όνομα αρχείου", "newFileName": "Νέο όνομα για το αρχείο" } } diff --git a/i18n/es.json b/i18n/es.json index 601820b09..c498a5476 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Versión: {0}\nFecha: {1}{2}\nVersión del CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Acerca de {0}" }, "board": { @@ -18,11 +18,12 @@ "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...", - "platformMissing": "La plataforma seleccionada para la placa '{0}' no está instalada.", "pleasePickBoard": "Por favor, elija una placa conectada al puerto que haya seleccionado.", "port": "Puerto {0}", "portLabel": "Puerto: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Vuelve a seleccionar más tarde", "searchBoard": "Buscar placa", "selectBoard": "Seleccionar Placa", - "selectBoardForInfo": "Por favor, seleccione una placa para obtener información sobre ella.", "selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.", "showAllAvailablePorts": "Muestra todos los puertos disponibles cuando está activado", "showAllPorts": "Mostrar todos los puertos", "succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente", "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente", - "typeOfPorts": "{0} puertos" + "typeOfPorts": "{0} puertos", + "unknownBoard": "Unknown board" }, "boardsManager": "Gestor de placas", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Cuenta", "chooseSketchVisibility": "Elige la visibilidad de tu Sketch:", + "cloudSketchbook": "Libro de bocetos en la nube", "connected": "Conectado", "continue": "Continuar", "donePulling": "Extracción de '{0}' realizada.", @@ -108,10 +110,9 @@ "pushSketch": "Pulsa para listar las URLs de la tarjetas no oficiales", "pushSketchMsg": "Este es un Sketch público. Antes de enviarlo, asegúrate de que cualquier información sensible está definida en los archivos arduino_secrets.h. Puedes hacer que un Sketch sea privado desde el panel Compartir.", "remote": "Remoto", - "remoteSketchbook": "Libreria de proyectos remota", "share": "Compartir...", "shareSketch": "Compartir Sketch", - "showHideRemoveSketchbook": "Mostrar/Ocultar Sketchbook Remoto", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Iniciar sesión", "signInToCloud": "Iniciar sesión en Arduino Cloud", "signOut": "Cerrar sesión", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visita Arduino Cloud para crear Cloud Sketches. " }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Todo", @@ -137,7 +143,7 @@ "processing": "Procesando", "recommended": "Recomendado", "retired": "Retirado", - "selectedOn": "on 1{0}\n ", + "selectedOn": "en {0}", "serialMonitor": "Monitor Serie", "type": "Tipo", "unknown": "Desconocido", @@ -157,6 +163,11 @@ "uninstallMsg": "¿Quieres desinstalar {0}?", "version": "Versión {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Añadir fichero...", "fileAdded": "Un archivo añadido al sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "La depuración no está soportada por '{0}'", "noPlatformInstalledFor": "La plataforma no está instalada para '{0}'", - "optimizeForDebugging": "Optimizar para depuración" + "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?" }, "dialog": { "dontAskAgain": "No volver a preguntar" @@ -208,7 +220,7 @@ "unsavedChanges": "Los cambios no guardados no serán guardados." }, "examples": { - "builtInExamples": "Ejemplos Construidos ", + "builtInExamples": "Ejemplos Construidos", "couldNotInitializeExamples": "No se han podido inicializar los ejemplos integrados.", "customLibrary": "Ejemplos de bibliotecas personalizadas", "for": "Ejemplos para {0}", @@ -253,7 +265,7 @@ "notNowButton": "Ahora no", "skipVersionButton": "Omitir versión", "updateAvailable": "Actualización disponible", - "versionDownloaded": "Arduino IDE 1{0} se ha descargado." + "versionDownloaded": "Arduino IDE {0} se ha descargado." }, "library": { "addZip": "Añadir biblioteca .ZIP...", @@ -301,14 +313,11 @@ "tools": "Herramientas" }, "monitor": { - "unableToCloseWebSocket": " No se puede cerrar websocket", - "unableToConnectToWebSocket": " No se puede conectar al websocket" + "unableToCloseWebSocket": "No se puede cerrar websocket", + "unableToConnectToWebSocket": "No se puede conectar al websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Red", @@ -352,6 +361,7 @@ "manualProxy": "Configuración manual del proxy", "network": "Red", "newSketchbookLocation": "Selecciona la nueva ruta del sketchbook", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Sin Proxy", "proxySettings": { "hostname": "nombre del host", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "¿Sustituir la versión existente de {0}?", "selectZip": "Seleccione un archivo zip que contenga la biblioteca que deseas añadir", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Archivo '{0}' creado.", "doneCompiling": "Compilación completada.", "doneUploading": "Carga completada.", + "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": "Exportar binario compilado", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moviendo", "movingMsg": "El archivo \"{0}\" tiene que estar dentro de una carpeta de bocetos llamada \"{1}\".\n¿Crear esta carpeta, mover el archivo y continuar?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Abrir carpeta", "openRecent": "Abierto recientemente", "openSketchInNewWindow": "Abrir Sketch en una ventana nueva", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Guardar carpeta de sketch como...", "saveSketch": "Guarde su sketch para abirlo más tarde.", "saveSketchAs": "Guardar carpeta de sketch como...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verificar/Compilar" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -435,12 +457,23 @@ "updatePackageIndex": "Actualizar índice de paquete" }, "upload": { - "error": "1{0} error: 2{1}" + "error": "{0} error: {1}" }, "userFields": { "cancel": "Cancelar", "enterField": "Introduce {0}", "upload": "Cargar" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Expandir" }, "workspace": { - "deleteCurrentSketch": "¿Quieres borrar el sketch actual?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Nombre del nuevo archivo", "invalidExtension": "\".{0}\" no es una extensión válida", - "invalidFilename": "Nombre de archivo no válido.", "newFileName": "Nuevo nombre para el archivo" } } diff --git a/i18n/eu.json b/i18n/eu.json index ee2feccf1..71b238814 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Bertsioa: {0}\nData: {1}{2}\nCLI bertsioa: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "{0}ri buruz" }, "board": { @@ -18,11 +18,12 @@ "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...", - "platformMissing": "Hautatutako '{0}' plakarentzako plataforma ez dago instalatuta.", "pleasePickBoard": "Aukeratu hautatu duzun atakara konektatutako plaka bat.", "port": "{0} ataka", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Hautatu berriz geroago", "searchBoard": "Search board", "selectBoard": "Hautatu plaka", - "selectBoardForInfo": "Hautatu plaka bat plakaren informazioa eskuratzeko.", "selectPortForInfo": "Hautatu ataka bat plakaren informazioa eskuratzeko.", "showAllAvailablePorts": "Gaituta dagoenean erabilgarri dauden ataka guztiak erakusten ditu", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "{0}:{1} plataforma behar bezala instalatu da", "succesfullyUninstalledPlatform": "{0}:{1} plataforma behar bezala desinstalatu da", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Plaka kudeatzailea", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Aukeratu zure programaren ikusgaitasuna:", + "cloudSketchbook": "Hodeiko programa bilduma", "connected": "Konektatuta", "continue": "Jarraitu", "donePulling": "Hodeitik kargatzea burututa: '{0}'.", @@ -108,10 +110,9 @@ "pushSketch": "Kargatu hodeitik", "pushSketchMsg": "Hau programa publiko bat da. Hodeian gorde aurretik, ziurtatu isilpeko informazioa arduino_secrets.h fitxategietan definituta dagoela. Programa pribatu bihurtu dezakezu Partekatu paneletik.", "remote": "Urrunekoa", - "remoteSketchbook": "Remote Sketchbook", "share": "Partekatu...", "shareSketch": "Partekatu programa", - "showHideRemoveSketchbook": "Erakutsi/Ezkutatu urruneko programa bilduma", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "HASI SAIOA", "signInToCloud": "Hasi saioa Arduino Cloud-en", "signOut": "Amaitu saioa", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Bisitatu Arduino Cloud hodeiko programak sortzeko." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "{0} desinstalatu nahi duzu?", "version": "{0} bertsioa" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Gehitu fitxategia", "fileAdded": "Fitxategi bat gehitu da programara.", @@ -186,7 +197,8 @@ "debugWithMessage": "Araztu - {0}", "debuggingNotSupported": "Ez dauka arazketarako euskarririk: '{0}'", "noPlatformInstalledFor": "Plataforma ez dago instalatuta honentzat: '{0}'", - "optimizeForDebugging": "Optimizatu arazketarako" + "optimizeForDebugging": "Optimizatu arazketarako", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Ez galdetu berriro" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Sarea", @@ -352,6 +361,7 @@ "manualProxy": "Proxyaren eskuzko konfigurazioa", "network": "Sarea", "newSketchbookLocation": "Hautatu programa bilduma berriaren kokalekua", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Proxyrik ez", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Lehendik dagoen {0} bertsioa ordezkatu?", "selectZip": "Hautatu gehitu nahi duzun liburutegia daukan zip fitxategia", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "'{0}' artxiboa sortu da.", "doneCompiling": "Konpilazioa burutu da.", "doneUploading": "Karga burutu da.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Esportatu konpilatutako bitarra", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Lekuz aldatzen", "movingMsg": "\"{0}\" fitxategiak \"{1}\" izeneko programa-karpetaren barruan egon behar du.\nSortu karpeta, eraman fitxategia bertara eta jarraitu?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Ireki karpeta", "openRecent": "Ireki azkenaldikoa", "openSketchInNewWindow": "Ireki programa leiho berrian", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Gorde programen karpeta honela...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Gorde programen karpeta honela...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Egiaztatu/Konpilatu" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Utzi", "enterField": "Enter {0}", "upload": "Kargatu" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Zabaldu" }, "workspace": { - "deleteCurrentSketch": "Uneko programa ezabatu nahi duzu?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Fitxategi berriaren izena", "invalidExtension": "{0} ez da baliozko luzapen bat.", - "invalidFilename": "Fitxategi-izen baliogabea.", "newFileName": "Fitxategiaren izen berria" } } diff --git a/i18n/fa.json b/i18n/fa.json index fb3e533d1..40a13963e 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "نسخه :{0}\nتاریخ: {1} {2}\nنسخه CLI : {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "درباره {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "انتخاب سایر برد ها و پورت ها", - "platformMissing": "پلت فرم برای برد انتخابی '{0}' نصب نشده است.", "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", "portLabel": "پورت: {0}", @@ -31,13 +32,13 @@ "reselectLater": "بعدا انتخاب کنید", "searchBoard": "جستجوی بورد", "selectBoard": "انتخاب برد", - "selectBoardForInfo": "لطفاً یک برد را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "showAllAvailablePorts": "نمایش تمام پورت های موجود در صورت فعال بودن", "showAllPorts": "نمایش تمام پورت ها", "succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}", "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}", - "typeOfPorts": "پورت ها{0}" + "typeOfPorts": "پورت ها{0}", + "unknownBoard": "Unknown board" }, "boardsManager": "مدیریت برد ها", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "حساب کاربری", "chooseSketchVisibility": "قابلیت مشاهده طرح خود را انتخاب کنید:", + "cloudSketchbook": "منبع ابری طرح ها", "connected": "متصل", "continue": "ادامه", "donePulling": "پایان دریافت {0}", @@ -108,10 +110,9 @@ "pushSketch": "ارسال طرح", "pushSketchMsg": "این یک طرح عمومی است. قبل از ارسال، مطمئن شوید که اطلاعات حساس در فایل‌های arduino_secrets.h تعریف شده است. می‌توانید از پانل اشتراک‌گذاری یک طرح را خصوصی کنید.", "remote": "از راه دور", - "remoteSketchbook": "کتاب طراحی از راه دور", "share": "اشتراک گذاری...", "shareSketch": "اشتراک طرح", - "showHideRemoveSketchbook": "نمایش/پنهان کردن از راه دور منبع طرح ها", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ورود کاربر", "signInToCloud": "ورود به ابر آردوینو", "signOut": "خروج کاربر", @@ -120,9 +121,14 @@ "visitArduinoCloud": "بازدید از ابر آردوینو برای ساخت ابر طرح ها" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "همه", @@ -157,6 +163,11 @@ "uninstallMsg": "آیا شما می خواهید {0} را لغو نصب کنید؟", "version": "ورژن {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "فایل اظافه کن", "fileAdded": "یک فایل به طرح افزوده شد.", @@ -186,7 +197,8 @@ "debugWithMessage": "رفع خطا {0}", "debuggingNotSupported": "رفع خطا توسط {0} پشتیبانی نمی شود.", "noPlatformInstalledFor": "دستگاه مورد نظر برای {0} نصب نشده است", - "optimizeForDebugging": "بهینه کردن برای رفع خطا" + "optimizeForDebugging": "بهینه کردن برای رفع خطا", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "نمی تواند بپرسد." @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "اتصال به وب سوکت امکان پذیر نیست" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "نتورک", @@ -352,6 +361,7 @@ "manualProxy": "پیکربندی دستی پروکسی", "network": "نتورک", "newSketchbookLocation": "مکان جدید منبع طرح ها را مشخص کنید", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "بدون پروکسی", "proxySettings": { "hostname": "نام میزبان", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "آیا می خواهید نسخه موجود را با {0} جایگزین کنید؟", "selectZip": "یک فایل فشرده حاوی کتابخانه ای را که می خواهید اضافه کنید انتخاب کنید", "serial": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "جابجا کردن", "movingMsg": "فایل \"{0}\" باید داخل یک پوشه طرح به نام \"{1}\" باشد.\nاین پوشه را ایجاد کنید، فایل را منتقل کنید و ادامه دهید؟", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "بازکردن پوشه", "openRecent": "باز کردن آخرین ها", "openSketchInNewWindow": "باز کردن طرح در پنجره جدید.", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "ذخیره پوشه طرح در ...", "saveSketch": "طرح خود را ذخیره کنید تا بعداً دوباره باز شود.", "saveSketchAs": "ذخیره پوشه طرح در ...", @@ -421,7 +443,7 @@ "verifyOrCompile": "تائید / کامپایل" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "لغو", "enterField": "ورود{0}", "upload": "بارگذاری" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "باز کردن." }, "workspace": { - "deleteCurrentSketch": "آیا می خواهید طرح کنونی را حذف کنید؟", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "نام برای فایل جدید", "invalidExtension": "افزونه {0} نادرست است.", - "invalidFilename": "عدم وجود نام برای فایل", "newFileName": "نام جدید برای فایل" } } diff --git a/i18n/fil.json b/i18n/fil.json index 75a09c114..710477141 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, "board": { @@ -18,11 +18,12 @@ "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…", - "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}", @@ -31,13 +32,13 @@ "reselectLater": "Reselect later", "searchBoard": "Search board", "selectBoard": "Pumili ng 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", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Ang debugging ay hindi suportado ng '{0}'", "noPlatformInstalledFor": "Ang platform ay hindi naka-install para sa '{0}'", - "optimizeForDebugging": "Pinahusay para sa Debugging" + "optimizeForDebugging": "Pinahusay para sa Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Network", @@ -352,6 +361,7 @@ "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", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "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": { @@ -460,10 +493,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/fr.json b/i18n/fr.json index 1eaad63be..dced35c4d 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}Date: {1}{2} Version CLI: {3}{4} [{5}]{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "A propos de {0}" }, "board": { @@ -18,11 +18,12 @@ "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 ...", - "platformMissing": "La plateforme pour la carte '{0}' sélectionnée n'est pas installée.", "pleasePickBoard": "Merci de sélectionner une carte connecté au port que vous avez sélectionné.", "port": "Port{0}", "portLabel": "Port : {0}", @@ -31,13 +32,13 @@ "reselectLater": "Re-sélectionner plus tard", "searchBoard": "Search board", "selectBoard": "Selectionner une carte", - "selectBoardForInfo": "Merci de choisir une carte pour obtenir ses informations.", "selectPortForInfo": "Merci de choisir un port pour obtenir des informations sur la carte.", "showAllAvailablePorts": "Affiche les ports disponibles quand activer.", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Plateforme installé avec succès {0}:{1}", "succesfullyUninstalledPlatform": "Plateforme désinstallée avec succès {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Gestionnaire de carte", "boardsType": { @@ -84,9 +85,10 @@ "cloud": { "account": "Compte", "chooseSketchVisibility": "Choisissez la visibilité du croquis :", + "cloudSketchbook": "Carnet de Croquis Cloud", "connected": "Connecté", "continue": "Continuer", - "donePulling": "Récupération de '{0}' terminée.", + "donePulling": "Récupération de '{0}' terminée.", "donePushing": "Téléchargement terminé pour '{0}'", "embed": "Embarqué : ", "emptySketchbook": "Votre carnet de croquis est vide", @@ -108,10 +110,9 @@ "pushSketch": "Push le croquis", "pushSketchMsg": "Ceci est un croquis public. Avant de le publier, assurez-vous que les informations sensibles sont bien définies dans le fichier arduino_secrets.h. Vous pouvez rendre priver le croquis à partir du panneau de Partage.", "remote": "A distance", - "remoteSketchbook": "Carnet de croquis à distance", "share": "Partager...", "shareSketch": "Partager le croquis", - "showHideRemoveSketchbook": "Montrer / Cacher le carnet de croquis distant.", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Se connecter", "signInToCloud": "Se connecter à Arduino Cloud", "signOut": "Deconnexion", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visitez Arduino Cloud pour créer des croquis sut le cloud." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Voulez vous désinstaller {0}?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Ajouter un fichier", "fileAdded": "Un fichier a été ajouté au croquis", @@ -186,7 +197,8 @@ "debugWithMessage": "Débogage - {0}", "debuggingNotSupported": "Le débogage n'est pas supporté pour '{0}'", "noPlatformInstalledFor": "La plateforme n'est pas installée pour '{0}'", - "optimizeForDebugging": "Optimisé pour le déboggage." + "optimizeForDebugging": "Optimisé pour le déboggage.", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Ne plus demander." @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Impossible de se connecter au web socket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Réseau", @@ -352,6 +361,7 @@ "manualProxy": "Configuration manuelle du proxy", "network": "Réseau", "newSketchbookLocation": "Sélectionner la localisation du nouveau croquis.", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Aucun proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Remplacer la version existante de {0} ?", "selectZip": "Sélectionnez un fichier zip contenant la bibliothèque que vous souhaitez ajouter", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Archive créer '{0}'", "doneCompiling": "Compilation terminée.", "doneUploading": "Téléversement fait.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Exporter les binaires compilés", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Déplacement", "movingMsg": "Le fichier \"{0}\" à besoin d'être à l'intérieur d'un dossier de croquis appelé \"{1}\".\nCréer ce dossier, déplacer le fichier et continuer ?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Ouvrir le dossier", "openRecent": "Ouvrir les récents", "openSketchInNewWindow": "Ouvrir le croquis dans une nouvelle fenêtre", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Sauvegarder le dossier de croquis en tant que ...", "saveSketch": "Enregistrer son programme pour le rouvrir plus tard.", "saveSketchAs": "Sauvegarder un dossier de croquis comme ...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Vérifier / Compiler" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Annuler", "enterField": "Enter {0}", "upload": "Téléverser" + }, + "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": { @@ -460,10 +493,10 @@ "expand": "Replier" }, "workspace": { - "deleteCurrentSketch": "Voulez-vous supprimer le croquis en cours ?", + "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": "Nouveau nom pour le fichier", "invalidExtension": "« .{0} » n''est pas une extension valide.", - "invalidFilename": "Nom de fichier non valide", "newFileName": "Nouveau nom pour le fichier" } } diff --git a/i18n/he.json b/i18n/he.json index 984c42ff6..0f55630b2 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "גרסה: {0}\nתאריך: {1} {2}\nגרסאת ממשק שורת הפקודה: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "פרטים על {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "בחר לוח ופורט אחר...", - "platformMissing": "הפלטפורמה ל'{0}' בלוח הנבחר לא הותקן.", "pleasePickBoard": "יש לבחור את הלוח המחובר לפורט הנבחר.", "port": "פורט{0}", "portLabel": "פורט: {0}", @@ -31,13 +32,13 @@ "reselectLater": "בחר מחדש מאוחר יותר", "searchBoard": "חפש לוח", "selectBoard": "בחר לוח", - "selectBoardForInfo": "אנא בחר לוח לקבל מידע אודותיו.", "selectPortForInfo": "אנא בחר פורט לקבלת מידע אודותיו.", "showAllAvailablePorts": "הצג את כל הפורטים הזמינים כשמופעל", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "פלטפורמה הותקנה בהצלחה {0}:{1}", "succesfullyUninstalledPlatform": "פלטפורמה הוסרה בהצלחה {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "מנהל לוחות", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "חשבון", "chooseSketchVisibility": "בחר.י נראות של הסקיצה שלך:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "מחובר", "continue": "המשך", "donePulling": "סיים למשוך '{0}'.", @@ -108,10 +110,9 @@ "pushSketch": "דחיפת הסקיצה.", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "מרוחק", - "remoteSketchbook": "סקיצה מרוחקת", "share": "שיתוף...", "shareSketch": "שיתוף הסקיצה", - "showHideRemoveSketchbook": "הצג\\הסתר סקיצה מרוחקת", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "התחברות", "signInToCloud": "התחברות לענן של ארדואינו Arduino Cloud", "signOut": "התנתק", @@ -120,9 +121,14 @@ "visitArduinoCloud": "כנס.י לענן של ארדואינו ליצור סקיצה בענן" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "הכל", @@ -157,6 +163,11 @@ "uninstallMsg": "האם ברצונך להסיר את {0}?", "version": "גירסה {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "הוסף קובץ", "fileAdded": "קובץ אחד נוסף לסקיצה.", @@ -186,7 +197,8 @@ "debugWithMessage": "דיבאג - {0}", "debuggingNotSupported": "דיבאג לא נתמך על ידי '{0}'", "noPlatformInstalledFor": "פלטפורמה אינה מותקנת עבור ׳{0}׳", - "optimizeForDebugging": "אופטימיזציה לדיבאג" + "optimizeForDebugging": "אופטימיזציה לדיבאג", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "אל תשאל שוב" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "רשת", @@ -352,6 +361,7 @@ "manualProxy": "הגדרת פרוקסי ידנית", "network": "רשת", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "ללא פרוקסי", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "מעביר", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "פתח תיקיה", "openRecent": "נפתח לאחרונה", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "שמירת תיקיית הסקיצה כ...", "saveSketch": "שמירת הסקיצה לפתיחה מאוחרת יותר.", "saveSketchAs": "שמירת תיקיית הסקיצה כ...", @@ -421,7 +443,7 @@ "verifyOrCompile": "בדיקה\\קומפילציה" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "ביטול", "enterField": "יש להקליד {0}", "upload": "העלאה" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "הרחב" }, "workspace": { - "deleteCurrentSketch": "האם את.ה רוצה למחוק את הסקיצה הנוכחית? ", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "שם הקובץ החדש", "invalidExtension": "{0} אינה סיומת תקנית.", - "invalidFilename": "שם קובץ לא חוקי.", "newFileName": "שם חדש לקובץ" } } diff --git a/i18n/hu.json b/i18n/hu.json index 4c83ac183..cff9eebc3 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Verziószám: {0}\nDátum: {1}{2}\nCLI Verziószám: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, "board": { @@ -18,11 +18,12 @@ "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… ", - "platformMissing": "A kiválasztott '{0}' alaplap platformja nincs telepítve. ", "pleasePickBoard": "Válassz alaplapot, amely a kiválasztott porthoz csatlakozik. ", "port": "Port {0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Később újra válaszd ki", "searchBoard": "Search board", "selectBoard": "Alaplap választás", - "selectBoardForInfo": "Válassz egy alaplapot az információinak megtekintéséhez. ", "selectPortForInfo": "Válassz egy portot az alaplap információinak megtekintéséhez. ", "showAllAvailablePorts": "Elérhető portok mutatása - ha engedélyezett", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Sikeresen telepített platform {0}:{1}", "succesfullyUninstalledPlatform": "A platform sikeresen eltávolítva: {0}:{1} ", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Alaplap-kezelő", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Válaszd ki a vázlat/sketch láthatóságát: ", + "cloudSketchbook": "Felhő vázlatfüzet/sketchbook ", "connected": "Kapcsolódva", "continue": "Tovább", "donePulling": "Letöltés kész: '{0}'.", @@ -108,10 +110,9 @@ "pushSketch": "Vázlat/sketch feltöltése", "pushSketchMsg": "Ez egy nyilvános vázlat/sketch. A beküldés előtt győződj meg arról, hogy minden érzékeny információ definiálva van az arduino_secrets.h fájlokban. A vázlatot priváttá tehet tenni a Megosztás panelen. ", "remote": "Távoli", - "remoteSketchbook": "Remote Sketchbook", "share": "Megosztás...", "shareSketch": "Vázlat/sketch megosztása", - "showHideRemoveSketchbook": "Távoli vázlatfüzet/sketch megjelenítése/elrejtése ", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "BEJELENTKEZÉS", "signInToCloud": "Bejelentkezés az Arduino Cloudba ", "signOut": "Kijelentkezés", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Látogasd meg az Arduino Cloud webhelyet, hogy a felhőben vázlatokat hozhass létre. " }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "El szeretnéd távolítani a következőt: {0}? ", "version": "Verzió: {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Fájl hozzáadása", "fileAdded": "Egy fájl hozzáadása megtörtént a vázlathoz/sketch-hez. ", @@ -186,7 +197,8 @@ "debugWithMessage": "Hibakeresés/Debug - {0}", "debuggingNotSupported": "A hibakeresést a '{0}' nem támogatja ", "noPlatformInstalledFor": "A platform nincs telepítve a következőhöz: „{0}” ", - "optimizeForDebugging": "Optimalizálás hibakereséséhez" + "optimizeForDebugging": "Optimalizálás hibakereséséhez", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Ne kérdezd meg még egyszer" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Hálózat", @@ -352,6 +361,7 @@ "manualProxy": "Kézi proxy konfiguráció", "network": "Hálózat", "newSketchbookLocation": "Új Vázlatfüzet/Sketchbook elérési út", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Nincs proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Lecseréled a/az {0} meglévő verzióját? ", "selectZip": "Válaszd ki a hozzáadni kívánt könyvtárat tartalmazó ZIP-fájlt ", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Archívum létrehozva: {0}. ", "doneCompiling": "Fordítás kész.", "doneUploading": "Feltöltés kész.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Összeállított bináris exportálása", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Mozgatás", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Mappa megnyitása", "openRecent": "Legutóbbi megnyitása", "openSketchInNewWindow": "Vázlat/sketch megnyitása új ablakban", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Vázlat-/sketch-mappa mentése másként... ", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Vázlat-/sketch-mappa mentése másként... ", @@ -421,7 +443,7 @@ "verifyOrCompile": "Ellenőrzés/fordítás" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Mégsem", "enterField": "Enter {0}", "upload": "Feltöltés" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Bővebb" }, "workspace": { - "deleteCurrentSketch": "Törlöd az aktuális vázlatot/sketch-et? ", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Az új fájl neve", "invalidExtension": "A .{0} nem érvényes kiterjesztés", - "invalidFilename": "Hibás fájlnév.", "newFileName": "A fájl új neve" } } diff --git a/i18n/id.json b/i18n/id.json index 778914aa6..8fd1a3a1b 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, "board": { @@ -18,11 +18,12 @@ "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…", - "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}", @@ -31,13 +32,13 @@ "reselectLater": "Reselect later", "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Network", @@ -352,6 +361,7 @@ "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", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "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": { @@ -460,10 +493,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/it.json b/i18n/it.json index 38a6893a0..4d37bae14 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Versione: {0}\nData: {1}{2}\nVersione CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Versione: {0}\nData: {1}{2}\nVersione CLI: {3}\n\n{4}", "label": "Informazioni su {0}" }, "board": { @@ -15,29 +15,30 @@ "disconnected": "Disconnesso", "getBoardInfo": "Acquisisci informazioni sulla scheda", "inSketchbook": "(nella raccolta degli sketch)", - "installNow": "Il \"{0} {1}\" core non è installato per la scheda \"{2}\" . Vuoi installarlo ora?", + "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...", - "platformMissing": "La piattaforma per la scheda '{0}' non è installata.", "pleasePickBoard": "Scegli la scheda collegata alla porta che hai selezionato.", "port": "Porta{0}", "portLabel": "Porta: {0}", "ports": "porte", "programmer": "Programmatore", "reselectLater": "Riselezionare più tardi", - "searchBoard": "Seleziona la scheda", + "searchBoard": "Cerca la scheda", "selectBoard": "Seleziona la scheda", - "selectBoardForInfo": "Seleziona la scheda per la quale desideri informazioni.", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", "showAllAvailablePorts": "Quando abilitato, mostra tutte le porte disponibili", "showAllPorts": "Mostra tutte le porte", "succesfullyInstalledPlatform": "Piattaforma installata correttamente {0}:{1}", "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}", - "typeOfPorts": "{0} porte" + "typeOfPorts": "{0} porte", + "unknownBoard": "Scheda sconosciuta" }, "boardsManager": "Gestore schede", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Scegli a chi far vedere il tuo Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connesso", "continue": "Continua", "donePulling": "Pulling terminato ‘{0}’.", @@ -108,11 +110,10 @@ "pushSketch": "Invia lo Sketch", "pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente puoi rendere lo sketch privato dal Pannello di Condivisione.", "remote": "Remoto", - "remoteSketchbook": "Raccolta remota degli sketch", "share": "Condividi...", "shareSketch": "Condividi sketch", - "showHideRemoveSketchbook": "Mostra/Nascondi la raccolta remota degli sketch", - "signIn": "COLLEGATI", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "signIn": "ACCEDI", "signInToCloud": "Effettua la registrazione su Arduino Cloud", "signOut": "Disconnetti", "sync": "Sincronizza", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch " }, "cloudSketch": { - "creating": "Creando lo sketch remoto{0}", - "new": "Nuovo Sketch remoto", - "synchronizing": "Sincronizzazione degli sketch, pulling{0}" + "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": "Sincronizzazione degli sketch, pulling \"{0}\"...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { "all": "Tutti", @@ -132,7 +138,7 @@ "noBoardSelected": "Nessuna scheda selezionata", "notConnected": "[non connesso]", "offlineIndicator": "Sembra che tu sia offline. Senza una connessione Internet, l'Arduino CLI potrebbe non essere in grado di scaricare le risorse richieste e potrebbe causare un malfunzionamento. Verificare la connessione a Internet e riavviare l'applicazione.", - "oldFormat": "Il '{0}' utilizza ancora il vecchio formato `.pde` . Vuoi sostituirlo con la nuova estensione `.ino?", + "oldFormat": "Il '{0}' utilizza ancora il vecchio formato `.pde`. Vuoi sostituirlo con la nuova estensione `.ino?", "partner": "Partner", "processing": "In elaborazione", "recommended": "Consigliato", @@ -154,11 +160,16 @@ "installed": "Installata", "moreInfo": "Maggiori informazioni", "uninstall": "Disinstalla", - "uninstallMsg": "Vuoi veramente disinstallare 1 {0} ?", + "uninstallMsg": "Vuoi veramente disinstallare {0}?", "version": "Versione {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Impossibile accedere alla raccolta degli sketch presenti in '{0}': {1}" + } + }, "contributions": { - "addFile": "Aggiungi file...", + "addFile": "Aggiungi file", "fileAdded": "Aggiunto un file allo sketch.", "plotter": { "couldNotOpen": "Impossibile aprire la porta seriale" @@ -184,9 +195,10 @@ }, "debug": { "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Il debug non è supportato da '{0}'", + "debuggingNotSupported": "Il debug non è supportato da '{0}'", "noPlatformInstalledFor": "La piattaforma non è ancora stata installata per '{0}'", - "optimizeForDebugging": "Ottimizzato per il Debug." + "optimizeForDebugging": "Ottimizzato per il Debug.", + "sketchIsNotCompiled": "Lo sketch '{0}' deve essere verificato prima di avviare una sessione di debug. Verificare lo sketch e avviare nuovamente il debug. Si desidera verificare lo sketch adesso?" }, "dialog": { "dontAskAgain": "Non chiedere più" @@ -204,14 +216,14 @@ "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" + "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.", "customLibrary": "Esempi da librerie di terzi", - "for": "Esempi per {0}", + "for": "Esempi per {0}", "forAny": "Esempi per tutte le schede", "menu": "Esempi" }, @@ -224,7 +236,7 @@ "selectBoard": "Seleziona la scheda", "selectVersion": "Selezione la versione del firmware", "successfullyInstalled": "Firmware correttamente installato.", - "updater": "WiFi101 / WiFiNINA Aggiornamento Frmware" + "updater": "WiFi101 / WiFiNINA Aggiornamento Firmware" }, "help": { "environment": "Ambiente di sviluppo", @@ -244,16 +256,16 @@ "closeToInstallNotice": "Chiudi il software e installa l’aggiornamento sulla tua macchina", "downloadButton": "Scarica", "downloadingNotice": "Stai scaricando l’ultima versione dell’Arduino IDE", - "errorCheckingForUpdates": "Si è verificato un errore durante il controllo degli aggiornamenti per Arduino IDE {0} .", + "errorCheckingForUpdates": "Si è verificato un errore durante il controllo degli aggiornamenti per Arduino IDE {0}.", "goToDownloadButton": "Clicca per scaricare", "goToDownloadPage": "E' disponibile un nuovo aggiornamento per Arduino IDE, ma attualmente non è possibile scaricarlo ne tantomeno installarlo in modalità automatica. Si consiglia di andare sul sito ufficiale e dalla pagina download scaricare l'ultima versione disponibile. ", "ideUpdaterDialog": "Aggiornamento software", - "newVersionAvailable": "La nuova versione (1{0}) di Arduino IDE è disponibile per il download.", + "newVersionAvailable": "La nuova versione ({0}) di Arduino IDE è disponibile per il download.", "noUpdatesAvailable": "Non ci sono aggiornamenti recenti per Arduino IDE ", "notNowButton": "Non ora", "skipVersionButton": "Salta questa versione", "updateAvailable": "Aggiornamento disponibile", - "versionDownloaded": "L'Arduino IDE ( 1 {0} ) è stato correttamente scaricato." + "versionDownloaded": "Arduino IDE {0} è stato scaricato correttamente." }, "library": { "addZip": "Aggiungi libreria da file .ZIP...", @@ -265,16 +277,16 @@ "installMissingDependencies": "Vorresti installare tutte le dipendenze mancanti?", "installOneMissingDependency": "Vorresti installare le dipendenze mancanti?", "installWithoutDependencies": "Installa senza le dipendenze", - "installedSuccessfully": "Libreria installata correttamente 1{0} : 2{1} ", + "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} di altre dipendenze che al momento non risultano installate:", - "needsOneDependency": "La libreria {0}:{1} necessità di dipendenze che attualmente non sono installate:", + "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:", "overwriteExistingLibrary": "Vuoi sovrascrivere la libreria esistente?", "successfullyInstalledZipLibrary": "La libreria è stata installata con successo dalla cartella {0}", "title": "Gestore Librerie", - "uninstalledSuccessfully": "Libreria disinstallata con successo 1{0} : 2{1}", + "uninstalledSuccessfully": "Libreria disinstallata con successo {0}:{1}", "zipLibrary": "Libreria" }, "librarySearchProperty": { @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Impossibile connettersi al websocket" }, "newCloudSketch": { - "invalidSketchName": "Il nome deve essere composto da lettere, numeri o underscores. La lunghezza massima è di 36 caratteri.", - "newSketchTitle": "Nome del nuovo Sketch Remoto", - "notFound": "Non posso fare il pull dello sketch '{0}'. Lo sketch non esiste.", - "sketchAlreadyExists": "Esiste già lo sketch remoto {0}" + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Rete", @@ -335,7 +344,7 @@ "compile.experimental": "Imposta su true se l'IDE deve gestire errori multipli del compilatore. Il valore predefinito è false.", "compile.revealRange": "Regola il modo in cui gli errori del compilatore vengono rivelati nell'editor, dopo una verifica/caricamento non andato a buon fine. Valori possibili: 'auto': scorre verticalmente come necessario e rivela una riga. 'center': scorre verticalmente come necessario e rivela una riga centrata verticalmente. 'top': scorre verticalmente come necessario e rivela una riga vicino alla parte superiore della finestra, ottimizzata per la visualizzazione di una definizione di codice. 'centerIfOutsideViewport': scorre in verticale come necessario e rivela una riga centrata verticalmente solo se si trova al di fuori della finestra di visualizzazione. Il valore predefinito è '{0}'.", "compile.verbose": "Vero per compilazione esplicita. Falso come opzione predefinita", - "compile.warnings": "Indica a gcc il livello di avviso che deve mostrare. Il valore predefinito è 'None' ", + "compile.warnings": "Indica a gcc il livello di avviso che deve mostrare. Il valore predefinito è \"Nessuno\"", "compilerWarnings": "Warning del compilatore", "editorFontSize": "Dimensione del carattere dell'editor", "editorQuickSuggestions": "Suggerimenti rapidi dell'editor", @@ -352,6 +361,7 @@ "manualProxy": "Configurazione manuale del proxy", "network": "Rete", "newSketchbookLocation": "Seleziona un percorso per il nuovo sketchbook", + "noCliConfig": "Impossibile caricare il file di configurazione della CLI", "noProxy": "Nessun proxy", "proxySettings": { "hostname": "Nome host", @@ -363,19 +373,22 @@ "sketch": { "inoBlueprint": "Percorso assoluto del filesystem per il file predefinito blueprint `.ino`. Se specificato, il contenuto del file blueprint sarà utilizzato per ogni nuovo sketch creato dall'IDE. Se non specificato, gli sketch saranno generati con il contenuto predefinito di Arduino. I file blueprint non accessibili saranno ignorati. **È necessario un riavvio dell'IDE** affinché questa impostazione abbia effetto." }, - "sketchbook.location": "Posizione della raccolta degli sketch", + "sketchbook.location": "Percorso della cartella degli sketch", "sketchbook.showAllFiles": "Vero per mostrare tutti i file relativi contenuti all'interno dello sketch. L'opzione predefinita è falso.", "survey.notification": "Vero se gli utenti devono essere avvisati quando è disponibile un sondaggio. Vero per impostazione predefinita.", "unofficialBoardSupport": "Clicca per ottenere la lista di collegamenti per le schede di terze parti, non schede ufficiali.", "upload": "caricamento", - "upload.verbose": " Seleziona Vero per un rapporto dettagliato durante l'upload. Il valore predefinito è impostato su falso", + "upload.verbose": "Vero per un rapporto dettagliato durante l'upload. Il valore predefinito è impostato su falso.", "verifyAfterUpload": "Verifica il codice dopo il caricamento", - "window.autoScale": "Impostato su True l'interfaccia scala automaticamente in base alla dimensione del font .", + "window.autoScale": "Vero se l'interfaccia scala automaticamente in base alla dimensione del font.", "window.zoomLevel": { "deprecationMessage": "Non più disponibile. Al suo posto utilizza 'windows.zoomLevel'." } }, - "replaceMsg": "Sostituisce la versione esistente con la versione 1{0} ?", + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "Sostituire la versione esistente con la versione {0}?", "selectZip": "Scegli il file zip che contiene la libreria che vuoi aggiungere", "serial": { "autoscroll": "Scorrimento automatico", @@ -398,13 +411,22 @@ "createdArchive": "Creato l'archivio '{0}'.", "doneCompiling": "Compilazione completata.", "doneUploading": "Caricamento terminato.", + "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": "Esporta sketch compilato", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Spostando", - "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", + "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", "new": "Nuovo Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Apri Cartella", "openRecent": "Apri recenti", - "openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra.", + "openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Salva la cartella sketch come...", "saveSketch": "Salva il tuo sketch per riaprirlo in seguito.", "saveSketchAs": "Salva la cartella dello sketch come...", @@ -413,7 +435,7 @@ "sketchbook": "Raccolta degli sketch", "titleLocalSketchbook": "Cartella degli sketch locali", "titleSketchbook": "Sketchbook", - "upload": "Caricare", + "upload": "Carica", "uploadUsingProgrammer": "Carica tramite Programmatore", "uploading": "Caricamento in corso...", "userFieldsNotFoundError": "Non è possibile trovare i campi utente per connettere la scheda", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verifica/Compila" }, "sketchbook": { - "newRemoteSketch": "Nuovo Sketch Remoto", + "newCloudSketch": "New Cloud Sketch", "newSketch": "Nuovo Sketch" }, "survey": { @@ -435,12 +457,23 @@ "updatePackageIndex": "Aggiorna l'indice del pacchetto" }, "upload": { - "error": "1 {0} errore: 2 {1}" + "error": "{0} errore: {1}" }, "userFields": { "cancel": "Annulla", "enterField": "Inserisci {0}", "upload": "Carica" + }, + "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": { @@ -449,21 +482,21 @@ "cannotConnectDaemon": "Non riesco a collegarmi al demone CLI", "couldNotSave": "Non è stato possibile salvare lo sketch. Si consiglia di copiarlo è salvarlo su un file di testo e solo successivamente riavviare l' Arduino IDE. ", "daemonOffline": "Il CLI Daemon è disconnesso", - "offline": "Disconnesso", + "offline": "Offline", "quitTitle": "Sei sicuro di volere chiudere?" }, "editor": { - "unsavedTitle": "Non salvato – 1{0}" + "unsavedTitle": "Non salvato – {0}" }, "messages": { "collapse": "Collassa", "expand": "Espandi" }, "workspace": { - "deleteCurrentSketch": "Vuoi eliminare lo sketch attuale?", + "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": "Nome per il nuovo file", "invalidExtension": "\".{0}\" non è un'estensione valida", - "invalidFilename": "Nome del file invalido", "newFileName": "Nuovo nome del file" } } diff --git a/i18n/ja.json b/i18n/ja.json index b480c1b4c..0d8981ba7 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "バージョン: {0}\n日付: {1}{2}\nCLIバージョン: {3}{4} [{5}]\n\n{6}", + "detail": "バージョン:{0}\n日付:{1}{2}\nCLIバージョン:{3}\n\n{4}", "label": "{0}について" }, "board": { @@ -18,11 +18,12 @@ "installNow": "現在選択されているボード\"{2}\"用にコア\"{0} {1}\"をインストールする必要があります。今すぐインストールしますか?", "noBoardsFound": "\"{0}\"のボードが見つかりませんでした", "noFQBN": "選択されたボード\"{0}\"にはFQBNがありません。対応するコアをインストール済みですか?", + "noNativeSerialPort": "ネイティブのシリアルポートで、情報を取得できません。", "noPortsDiscovered": "ポートが見つかりませんでした", "noPortsSelected": "ボード用に選択されたポートがありません: '{0}'.", + "nonSerialPort": "シリアルポートではないため、情報を取得できません。", "noneSelected": "ボード未選択です。", "openBoardsConfig": "他のボードとポートを選択…", - "platformMissing": "選択したボード'{0}'用のプラットフォームがインストールされていません。", "pleasePickBoard": "選択したポートに接続されているボードを選んでください。", "port": "ポート{0}", "portLabel": "ポート: {0}", @@ -31,13 +32,13 @@ "reselectLater": "後で選択しなおす", "searchBoard": "ボードを検索", "selectBoard": "ボードを選択", - "selectBoardForInfo": "ボード情報を得るには、ボードを選択してください。", "selectPortForInfo": "ボード情報を得るには、ポートを選択してください。", "showAllAvailablePorts": "有効な場合、利用可能なすべてのポートを表示", "showAllPorts": "全てのポートを表示", "succesfullyInstalledPlatform": "プラットフォーム{0}:{1}のインストールに成功しました", "succesfullyUninstalledPlatform": "プラットフォーム{0}:{1}のアンインストールに成功しました", - "typeOfPorts": "{0}ポート" + "typeOfPorts": "{0}ポート", + "unknownBoard": "未知のボード" }, "boardsManager": "ボードマネージャ", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "アカウント", "chooseSketchVisibility": "スケッチの可視性を選択:", + "cloudSketchbook": "クラウドスケッチブック", "connected": "接続済み", "continue": "続ける", "donePulling": "‘{0}’のプルが完了しました。", @@ -108,10 +110,9 @@ "pushSketch": "スケッチをプッシュする", "pushSketchMsg": "これはパブリックなスケッチです。プッシュする前に、すべての機密情報がarduino_secrets.hファイルで定義されていることを確認してください。共有パネルでスケッチをプライベートにできます。", "remote": "リモート", - "remoteSketchbook": "リモートスケッチブック", "share": "共有...", "shareSketch": "スケッチを共有", - "showHideRemoveSketchbook": "リモートスケッチブックの表示・非表示", + "showHideSketchbook": "クラウドスケッチブックの表示・非表示", "signIn": "ログイン", "signInToCloud": "Arduino Cloudにログインする", "signOut": "ログアウト", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Arduino Cloudにアクセスしてクラウドスケッチを作成する" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "alreadyExists": "クラウドスケッチ'{0}'は既に存在しています。", + "creating": "クラウドスケッチ'{0}'を作成中…", + "new": "新規クラウドスケッチ", + "notFound": "クラウドスケッチ'{0}'を取得できませんでした。存在しません。", + "pulling": "スケッチブックを同期中。'{0}'を取得中です…", + "pushing": "スケッチブックを同期中。'{0}'をプッシュ中です…", + "renaming": "クラウドスケッチの名前を'{0}'から'{1}'に変更中です...", + "synchronizingSketchbook": "スケッチブックを同期中です…" }, "common": { "all": "全て", @@ -157,6 +163,11 @@ "uninstallMsg": "{0}をアンインストールしますか?", "version": "バージョン{0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "'{0}': {1}にあるスケッチブックにアクセスできませんでした" + } + }, "contributions": { "addFile": "ファイルを追加...", "fileAdded": "スケッチにファイルが1つ追加されました。", @@ -186,7 +197,8 @@ "debugWithMessage": "デバッグ - {0}", "debuggingNotSupported": "デバッグは'{0}'ではサポートされていません。", "noPlatformInstalledFor": "'{0}'用にプラットフォームがインストールされていません。", - "optimizeForDebugging": "デバッグに最適化" + "optimizeForDebugging": "デバッグに最適化", + "sketchIsNotCompiled": "デバッグセッションを開始する前に、スケッチ'{0}'を検証する必要があります。スケッチを検証してから、もう一度デバッグを開始してください。今すぐスケッチを検証しますか?" }, "dialog": { "dontAskAgain": "次回から表示しない" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "websocketに接続することができません" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "新しいクラウドスケッチの名前" }, "portProtocol": { "network": "ネットワーク", @@ -352,12 +361,13 @@ "manualProxy": "手動プロキシ設定", "network": "ネットワーク", "newSketchbookLocation": "新しいスケッチブックの場所を選択", + "noCliConfig": "CLIの設定を読み込めませんでした", "noProxy": "プロキシなし", "proxySettings": { "hostname": "ホスト名", "password": "パスワード", "port": "ポート番号", - "username": "ユーザ名" + "username": "ユーザー名" }, "showVerbose": "より詳細な情報を表示する", "sketch": { @@ -372,9 +382,12 @@ "verifyAfterUpload": "書き込み後にコードを検証する", "window.autoScale": "ユーザーインターフェイスをフォントサイズに合わせて自動的に拡大縮小させるにはtrueを指定。", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "廃止済み。代わりに'window.zoomLevel'を使用してください。" } }, + "renameCloudSketch": { + "renameSketchTitle": "クラウドスケッチの新しい名前" + }, "replaceMsg": "{0}の既存のバージョンを置き換えますか?", "selectZip": "追加したいライブラリの入ったZIPファイルを選択", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "アーカイブ'{0}'を作成しました。", "doneCompiling": "コンパイル完了。", "doneUploading": "書き込み完了", + "editInvalidSketchFolderLocationQuestion": "スケッチを別の場所に保存してみますか?", + "editInvalidSketchFolderQuestion": "スケッチを別の名前で保存しますか?", "exportBinary": "コンパイル済みバイナリをエクスポート", + "invalidCloudSketchName": "名前は、文字または数字で始まり、文字、数字、ダッシュ、ドット、アンダースコアが続く必要があります。最大文字数は36文字です。", + "invalidSketchFolderLocationDetails": "スケッチは、それ自身の中のフォルダに保存することはできません。", + "invalidSketchFolderLocationMessage": "無効なスケッチフォルダの場所:'{0}'。", + "invalidSketchFolderNameMessage": "スケッチフォルダの名前が無効です:'{0}'", + "invalidSketchName": "名前は、文字または数字で始まり、文字、数字、ダッシュ、ドット、アンダースコアが続く必要があります。最大文字数は63文字です。", "moving": "移動", "movingMsg": "ファイル\"{0}\"は、\"{1}\"という名前のスケッチフォルダの中にあることが必要です。\nこのフォルダを作成し、ファイルを移動させ、継続しますか?", - "new": "New Sketch", + "new": "新規スケッチ", + "noTrailingPeriod": "ファイル名の末尾にドットを付けることはできません", "openFolder": "フォルダを開く", "openRecent": "最近使った項目を開く", "openSketchInNewWindow": "新規ウィンドウでスケッチを開く", + "reservedFilename": "'{0}'は予約されたファイル名です。", "saveFolderAs": "スケッチフォルダを別名で保存…", "saveSketch": "あとで再び開くためスケッチを保存する。", "saveSketchAs": "スケッチを別名で保存…", @@ -421,8 +443,8 @@ "verifyOrCompile": "検証・コンパイル" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "新規クラウドスケッチ", + "newSketch": "新規スケッチ" }, "survey": { "answerSurvey": "アンケートに回答する", @@ -441,6 +463,17 @@ "cancel": "キャンセル", "enterField": "{0}を入力", "upload": "マイコンボードに書き込む" + }, + "validateSketch": { + "abortFixMessage": "スケッチはまだ無効です。残りの問題を修正しますか?'{0}'をクリックすると、新しいスケッチが開かれます。", + "abortFixTitle": "無効なスケッチです", + "renameSketchFileMessage": "スケッチファイル'{0}'は使用できません。{1}スケッチファイルの名前を今すぐ変更しますか?", + "renameSketchFileTitle": "無効なスケッチファイル名です", + "renameSketchFolderMessage": "スケッチ'{0}'は使用できません。{1}このメッセージをなくすには、スケッチの名前を変えてください。今すぐスケッチ名を変更しますか?", + "renameSketchFolderTitle": "無効なスケッチ名です" + }, + "workspace": { + "alreadyExists": "'{0}'は既に存在しています。" } }, "theia": { @@ -460,10 +493,10 @@ "expand": "展開する" }, "workspace": { - "deleteCurrentSketch": "現在のスケッチを削除しますか?", + "deleteCloudSketch": "クラウドスケッチ'{0}'はArduinoサーバおよびローカルキャッシュから永久に削除されます。この動作はやり直せません。現在のスケッチを削除しますか?", + "deleteCurrentSketch": "スケッチ'{0}'は永久に削除されます。この動作はやり直せません。現在のスケッチを削除しますか?", "fileNewName": "新しいファイルの名前", "invalidExtension": "拡張子「.{0}」は、使えません。", - "invalidFilename": "無効なファイル名です。", "newFileName": "ファイルの新しい名前" } } diff --git a/i18n/ko.json b/i18n/ko.json index f7ec85918..3c7a507cf 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "버전: {0}\n날짜: {1}{2}\nCLI 버전: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "프로그램 정보 {0}" }, "board": { @@ -15,14 +15,15 @@ "disconnected": "연결해제됨", "getBoardInfo": "보드정보 얻기", "inSketchbook": "(스케치북에서)", - "installNow": "\"1{0} 2{1}\"버전은 최근에 선택된 \"{2}\"보드를 설치해야 합니다. 지금 설치하시겠습니까?", + "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": "보드 및 포트를 선택하세요.", - "platformMissing": "선택한 '{0}' 보드의 플랫폼이 설치되지 않았습니다.", "pleasePickBoard": "선택한 포트에 연결할 보드를 선택하십시오", "port": "포트{0}", "portLabel": "포트: {0}", @@ -31,13 +32,13 @@ "reselectLater": "나중에 선택", "searchBoard": "보드찾기", "selectBoard": "보드 선택", - "selectBoardForInfo": "보드 정보를 얻으려면 보드를 선택하십시오.", "selectPortForInfo": "보드 정보를 얻으려면 포트를 선택하십시오.", "showAllAvailablePorts": "활성화된 사용 가능한 모든 포트를 표시합니다.", "showAllPorts": "모든 포트 보이기", "succesfullyInstalledPlatform": "성공적으로 설치된 플랫폼{0}:{1}", "succesfullyUninstalledPlatform": "성공적으로 설치된 플랫폼 {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "보드매니저", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "계정", "chooseSketchVisibility": "보여질 스케치를 선택하세요", + "cloudSketchbook": "Cloud Sketchbook", "connected": "연결됨", "continue": "계속", "donePulling": "pulling 완료 ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push 스케치", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "원격", - "remoteSketchbook": "원격 스케치북", "share": "공유...", "shareSketch": "스케치 공유", - "showHideRemoveSketchbook": "보이기/숨기기 원격 스케치북", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "로그인", "signInToCloud": "아두이노 클라우드에 로그인", "signOut": "로그아웃", @@ -120,9 +121,14 @@ "visitArduinoCloud": "아두이노 클라우드를 방문하여 클라우드 스케치를 만드십시오." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "전체", @@ -157,6 +163,11 @@ "uninstallMsg": "설치해제를 원하십니까 {0}?", "version": "버전 {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "파일 추가", "fileAdded": "스케치에 하나의 파일이 추가되었습니다.", @@ -186,7 +197,8 @@ "debugWithMessage": "디버그 - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "'{0}'에 대한 플랫폼이 설치되어 있지 않습니다", - "optimizeForDebugging": "디버깅 최적화" + "optimizeForDebugging": "디버깅 최적화", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "다시 묻지 않음" @@ -268,7 +280,7 @@ "installedSuccessfully": "성공적으로 설치된 라이브러리 {0}:{1}", "libraryAlreadyExists": "라이브러리가 이미 존재합니다. 덮어 쓰시겠습니까? ", "manageLibraries": "라이브러리 관리...", - "namedLibraryAlreadyExists": " {0} 이라는 라이브러리 폴더이름이 이미 존재합니다. 덮어 쓰시겠습니까?", + "namedLibraryAlreadyExists": "{0} 이라는 라이브러리 폴더이름이 이미 존재합니다. 덮어 쓰시겠습니까?", "needsMultipleDependencies": "라이브러리 {0}:{1} 는 현재 설치되지 않은 다른 종속성이 필요합니다.", "needsOneDependency": "The library {0}:{1} needs another dependency currently not installed:", "overwriteExistingLibrary": "기존 라이브러리를 덮어쓰시겠습니까?", @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다." }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "네트워크", @@ -352,6 +361,7 @@ "manualProxy": "수동 프록시 구성", "network": "네트워크", "newSketchbookLocation": "새 스케치북 위치 선택", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "No proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "{0}의 기존 버젼을 바꾸시겠습니까?", "selectZip": "추가하려는 라이브러리가 포함된 zip 파일을 선택하세요.", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Created archive '{0}'.", "doneCompiling": "컴파일 완료.", "doneUploading": "업로딩 완료.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "컴파일된 바이너리 내보내기", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, 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": "폴더 열기", "openRecent": "최근 파일 열기", "openSketchInNewWindow": "새 창에서 스케치 열기", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "스케치 폴더를 다른 이름으로 저장...", "saveSketch": "스케치를 저장하여 나중에 다시 엽니다.", "saveSketchAs": "스케치 폴더를 다른 이름으로 저장...", @@ -421,7 +443,7 @@ "verifyOrCompile": "확인/컴파일" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "취소", "enterField": "Enter {0}", "upload": "업로드" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -453,17 +486,17 @@ "quitTitle": "정말 종료하시겠습니까?" }, "editor": { - "unsavedTitle": "저장되지않음 – 1{0}\n " + "unsavedTitle": "저장되지않음 – {0}" }, "messages": { "collapse": "Collapse", "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "현재 스케치를 삭제하겠습니까?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "새 파일의 이름", "invalidExtension": ".{0} 유효한 확장자가 아닙니다", - "invalidFilename": "잘못된 파일이름.", "newFileName": "New name for file" } } diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 59906487b..13ab1710b 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "ဗားရှင်း: {0}\nရက်စွဲ: {1}{2}\nCLI ဗားရှင်း: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "{0} အကြောင်း" }, "board": { @@ -18,11 +18,12 @@ "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": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ရန်...", - "platformMissing": "ရွေးချယ်ထားသည့် '{0}' ဘုတ်အတွက် ပလက်ဖောင်းမှာ မတပ်ဆင်ထားပါ။", "pleasePickBoard": "သင်ရွေးချယ်ထားသော အပေါက်နှင့် ချိတ်ဆက်ထားသည့် ဘုတ်ကို ကျေးဇူးပြု၍ ရွေးပေးပါ။", "port": "အပေါက်{0}", "portLabel": "အပေါက် - {0}", @@ -31,13 +32,13 @@ "reselectLater": "နောက်မှ ပြန်ရွေးချယ်မည်", "searchBoard": "ဘုတ်ရှာမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", - "selectBoardForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် ဘုတ်ရွေးချယ်ပါ", "selectPortForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် အပေါက်ကို ရွေးချယ်ပါ။", "showAllAvailablePorts": "အမှန်ခြစ်ထားပါက ရွေးချယ်နိုင်သော အပေါက်များအားလုံးကို ဖော်ပြပေးမည်", "showAllPorts": "အပေါက်အားလုံးပြ", "succesfullyInstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ တပ်ဆင်ပြီးသည် :{1}", "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}", - "typeOfPorts": "{0} အပေါက်များ" + "typeOfPorts": "{0} အပေါက်များ", + "unknownBoard": "Unknown board" }, "boardsManager": "ဘုတ်မန်နေဂျာ", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "အကောင့်", "chooseSketchVisibility": "သင့်ကုတ်ပုံကြမ်း၏ မြင်နိုင်စွမ်းအား ရွေးချယ်ခြင်း - ", + "cloudSketchbook": "တိမ်တိုက် Sketchbook ဖိုင်တွဲ", "connected": "ချိတ်ဆက်ထားသည်", "continue": "ဆက်သွားမည်", "donePulling": "‘{0}’ကိုဆွဲယူပြီးပါပြီ။", @@ -108,10 +110,9 @@ "pushSketch": "ကုတ်ဖိုင်လ်တင်မည်", "pushSketchMsg": "ဤကုတ်ဖိုင်လ်သည် အများသုံးဖြစ်သည်။ မတင်မီ လျှိုဝှက်သင့်သောအချက်အလက်ကို arduino_secrets.h ဖိုင်လ်များတွင် သတ်မှတ်ထားပေးပါ။ သင်အနေဖြင့် 'ဝေမျှမည်'ပန်နယ်တွင် ကုတ်ဖိုင်လ်ကို ပုဂ္ဂလိကအဖြစ်သတ်မှတ်နိုင်သည်။", "remote": "အဝေး", - "remoteSketchbook": "အဝေးရှိ ကုတ်ပုံကြမ်းဖိုင်တွဲ", "share": "ဝေမျှမည်…", "shareSketch": "ကုတ်ဖိုင်လ်ဝေမျှမည်", - "showHideRemoveSketchbook": "အဝေးရှိ Sketchbook ဖိုင်တွဲအား ပြ/ဖွက် မည်", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "လက်မှတ်ထိုးဝင်", "signInToCloud": "Arduino Cloudသို့ လက်မှတ်ထိုးဝင်ရောက်ပါ", "signOut": "လက်မှတ်ထိုးထွက်", @@ -120,9 +121,14 @@ "visitArduinoCloud": "ကလောက်ကုတ်ဖိုင်ဖန်တီးရန် Arduino Cloudသို့သွားပါ။" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "အားလုံး", @@ -157,6 +163,11 @@ "uninstallMsg": "သင် {0} ကိုဖြုတ်ချချင်ပါသလား?", "version": "ဗားရှင်း {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "ဖိုင်လ်ထည့်မည်", "fileAdded": "ကုတ်ပုံကြမ်းထဲသို့ ဖိုင်တစ်ခု ထည့်လိုက်သည်။", @@ -186,7 +197,8 @@ "debugWithMessage": "ပြစ်ချက်ရှာဖွေချက် - {0}", "debuggingNotSupported": "ကုတ်ပြစ်ချက်ရှာဖွေမှုကို '{0}'မှ မပေးထားပါ", "noPlatformInstalledFor": "'{0}' အတွက် ပလက်ဖောင်းကို မထည့်သွင်းရသေးပါ", - "optimizeForDebugging": "ကုတ်ပြစ်ချက်ရှာဖွေရန်အတွက်ဦးစားပေးမည်" + "optimizeForDebugging": "ကုတ်ပြစ်ချက်ရှာဖွေရန်အတွက်ဦးစားပေးမည်", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "နောက်ထပ်မမေးပါနှင့်" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "ဝက်ဘ်ဆော့ကတ်သို့မချိတ်ဆက်နိုင်ပါ" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "ကွန်ရက်", @@ -352,6 +361,7 @@ "manualProxy": "ကိုယ်တိုင် ကြားခံကွန်ရက်ပြင်ဆင်ခြင်း", "network": "ကွန်ရက်", "newSketchbookLocation": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာအသစ်ရွေးမည်", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "ကြားခံကွန်ရက်မရှိ", "proxySettings": { "hostname": "အိမ်ရှင်အမည်", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "{0}၏ရှိနှင့်ပြီးဗားရှင်းကို အစားထိုးမည်လား။", "selectZip": "သင်ထည့်သွင်းချင်သော ကုတ်ကြည့်တိုက်ပါဝင်သည့်ဇစ်ဖိုင်လ်ရွေးပါ", "serial": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "ရွှေ့နေသည်", "movingMsg": "ဖိုင်လ် \"{0}\" သည် ကုတ်ဖိုင်လ်ဖိုလ်ဒါ \"{1}\"အတွင်းရှိရန်လိုသည်။\nဖိုလ်ဒါတည်ဆောက်ပြီးဖိုင်လ်ကိုရွှေ့မည်လား။", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "ဖိုလ်ဒါဖွင့်မည်", "openRecent": "လတ်တလောဖိုင်လ်ဖွင့်မည်", "openSketchInNewWindow": "ကုတ်ဖိုင်လ်ကို ဝင်းဒိုးအသစ်တွင်ဖွင့်မည်", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", "saveSketch": "သင်၏ကုတ်ဖိုင်လ်ကို နောင်အခါပြန်ကြည့်၍ရရန် မှတ်သားပါ။", "saveSketchAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", @@ -421,7 +443,7 @@ "verifyOrCompile": "စစ်ဆေး/ကုတ်ပေါင်း" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "ပယ်ဖျက်မည်", "enterField": "{0} ရိုက်သွင်းပါ", "upload": "အပ်လုတ်တင်မည်" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "ချဲ့မည်" }, "workspace": { - "deleteCurrentSketch": "လက်ရှိကုတ်ဖိုင်လ်ကို ဖျက်ပစ်ချင်ပါသလား။", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "ဖိုင်လ်အသစ်အတွက်အမည်", "invalidExtension": ".{0}သည် မှန်ကန်သော တိုးချဲ့အမှတ်အသားမဟုတ်ပါ", - "invalidFilename": "မမှန်ကန်သောဖိုင်လ်အမည်။", "newFileName": "ဖိုင်လ်အတွက်အမည်အသစ်" } } diff --git a/i18n/ne.json b/i18n/ne.json index 812efc8c0..f45c811aa 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, "board": { @@ -18,11 +18,12 @@ "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…", - "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}", @@ -31,13 +32,13 @@ "reselectLater": "Reselect later", "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Network", @@ -352,6 +361,7 @@ "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", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "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": { @@ -460,10 +493,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/nl.json b/i18n/nl.json index 54ed422f3..95f6f82c3 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Versie: {0}\nDatum: {1}{2}\nCLI versie: {3}{4} [{5}]\n\n{6} ", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Over {0}" }, "board": { @@ -18,11 +18,12 @@ "installNow": "De \"{0} {1}\" kern moet geïnstalleerd zijn om het huidige geselecteerde \"{2}\" bord. Wilt U dit nu installeren?", "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "De FQBN is niet beschikbaar voor het geselecteerde bord \"{0}\". Heeft U de bijhorende kern geïnstalleerd?", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "Geen poorten gevonden", "noPortsSelected": "Geen poorten geselecteerd voor bord: '{0}'.", + "nonSerialPort": "Non-serial port, can't obtain info.", "noneSelected": "Geen borden geselecteerd.", "openBoardsConfig": "Selecteer een ander bord en poort...", - "platformMissing": "Het platform voor het geselecteerde '{0}' bord is niet geïnstalleerd.", "pleasePickBoard": "Gelieve een bord te selecteren dat verbonden is met de door U gekozen poort.", "port": "Poort{0}", "portLabel": "Poort: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Later opnieuw selecteren", "searchBoard": "Bord zoeken", "selectBoard": "Selecteer Bord", - "selectBoardForInfo": "Selecteer een bord om bord informatie te bekomen.", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", "showAllAvailablePorts": "Toont alle beschikbare poorten indien ingeschakeld", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Platform {0}:{1} succesvol geïnstalleerd", "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Borden Beheerder", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Kies de zichtbaarheid van je Sketch:", + "cloudSketchbook": "Cload Schetsboek", "connected": "Verbonden", "continue": "Doorgaan", "donePulling": "Klaar met trekken van '{0}'.", @@ -108,10 +110,9 @@ "pushSketch": "Push Schets", "pushSketchMsg": "Dit is een openbare schets. Voordat u gaat pushen, moet u ervoor zorgen dat gevoelige informatie is gedefinieerd in arduino_secrets.h bestanden. U kunt een schets privé maken vanuit het deelvenster Delen.", "remote": "Op Afstand", - "remoteSketchbook": "Schetsboek op afstand", "share": "Delen...", "shareSketch": "Schets Delen", - "showHideRemoveSketchbook": "Toon/verberg schetsboek op afstand", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "INLOGGEN", "signInToCloud": "Aanmelden bij Arduino Cloud", "signOut": "Uitloggen", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Alle", @@ -157,6 +163,11 @@ "uninstallMsg": "Wil je {0} verwijderen?", "version": "Versie {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Bestand Toevoegen", "fileAdded": "Één bestand toegevoegd aan de schets.", @@ -186,7 +197,8 @@ "debugWithMessage": "Foutopsporing - {0}", "debuggingNotSupported": "Foutopsporing wordt niet ondersteund door '{0}'", "noPlatformInstalledFor": "Platform is niet geïnstalleerd voor '{0}'", - "optimizeForDebugging": "Optimaliseren voor foutopsporing" + "optimizeForDebugging": "Optimaliseren voor foutopsporing", + "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": "Niet meer vragen" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Kan geen verbinding maken met websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Netwerk", @@ -352,6 +361,7 @@ "manualProxy": "Manuele proxy configuratie", "network": "Netwerk", "newSketchbookLocation": "Selecteer een nieuwe schetsboeklocatie.", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Geen proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "De bestaande versie van {0} vervangen?", "selectZip": "Selecteer een zipbestand met de bibliotheek die U wilt toevoegen", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Archief '{0}' gemaakt.", "doneCompiling": "Klaar met compileren.", "doneUploading": "Klaar met uploaden.", + "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": "Gecompileerd binair bestand exporteren", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Verplaatsten", "movingMsg": "Het bestand \"{0}\" moet binnen een schetsmap met de naam \"{1}\" staan.\nMaak deze map, verplaats het bestand, en ga verder?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Map Openen", "openRecent": "Recentelijk geopend", "openSketchInNewWindow": "Schets openen in nieuw venster", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Sla de schets map op als...", "saveSketch": "Bewaar je schets om hem later weer te openen.", "saveSketchAs": "Sla de schetsmap op als...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verifiëren/Compileren" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Annuleer", "enterField": "Ga naar {0}", "upload": "Uploaden" + }, + "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": { @@ -460,10 +493,10 @@ "expand": "Uitvouwen" }, "workspace": { - "deleteCurrentSketch": "Wilt u de huidige schets verwijderen?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Naam voor nieuw bestand", "invalidExtension": ".{0} is geen geldige extensie", - "invalidFilename": "Ongeldige bestandsnaam.", "newFileName": "Nieuwe naam voor bestand" } } diff --git a/i18n/pl.json b/i18n/pl.json index 57565eb10..a57e4d7e5 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Wersja: {0}\nData: {1}{2}\nWersja CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "O {0}" }, "board": { @@ -15,29 +15,30 @@ "disconnected": "Rozłączony", "getBoardInfo": "Pobierz informacje o płytce", "inSketchbook": "(w Szkicowniku)", - "installNow": "Jądro \" 1{0} 2{1} \" musi zostać zainstalowane dla wybranej płytki \"{2}\". Czy chcesz zainstalować je teraz?", - "noBoardsFound": "Brak Znalezionych Płytek \"1{0}\"", - "noFQBN": "FQBN jest niedostępny dla wybranej płytki \" 1{0} \". Sprawdź czy zainstalowane jądro jest prawidłowe.", + "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...", - "platformMissing": "Platforma dla wybranej płytki '{0}' nie jest zainstalowana.", "pleasePickBoard": "Wybierz płytkę podłączoną do wybranego portu.", - "port": "Port 1{0}", - "portLabel": "Port: 1{0}", + "port": "Port{0}", + "portLabel": "Port: {0}", "ports": "Porty", "programmer": "Programator", "reselectLater": "Wybierz ponownie później", "searchBoard": "Szukaj płytki", "selectBoard": "Wybierz płytkę", - "selectBoardForInfo": "Wybierz płytkę, aby uzyskać o niej informacje.", "selectPortForInfo": "Wybierz port, aby uzyskać informacje o płytce.", "showAllAvailablePorts": "Po włączeniu pokazuje wszystkie dostępne porty", "showAllPorts": "Pokaż wszystkie dostępne porty", "succesfullyInstalledPlatform": "Pomyślnie zainstalowano platformę {0}:{1}", "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}", - "typeOfPorts": "1{0} Porty" + "typeOfPorts": "{0} Porty", + "unknownBoard": "Unknown board" }, "boardsManager": "Menedżer Płytek", "boardsType": { @@ -49,12 +50,12 @@ "doneBurningBootloader": "Zakończono wypalanie Bootloader'a" }, "burnBootloader": { - "error": "Błąd w czasie wypalania bootloader'a: 1{0}" + "error": "Błąd w czasie wypalania bootloader'a: {0}" }, "certificate": { "addNew": "Dodaj nowy", "addURL": "Dodaj adres URL, aby pobrać certyfikat SSL", - "boardAtPort": "1{0} w 2{1}", + "boardAtPort": "{0} w {1}", "certificatesUploaded": "Certyfikaty przesłane.", "enterURL": "Wprowadź adres URL", "noSupportedBoardConnected": "Podpięto nie wspieraną płytkę.", @@ -84,10 +85,11 @@ "cloud": { "account": "Konto", "chooseSketchVisibility": "Wybierz widoczność swojego Szkicu:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Połączony", "continue": "Kontynuuj", "donePulling": "Zakończono zaciąganie ‘{0}’.", - "donePushing": "Gotowe pchanie ‘{0}’.\n ", + "donePushing": "Gotowe pchanie ‘{0}’.", "embed": "Osadzić:", "emptySketchbook": "Twój Szkicownik jest pusty", "goToCloud": "Go to Cloud", @@ -108,10 +110,9 @@ "pushSketch": "Dodaj szkic", "pushSketchMsg": "To jest szkic publiczny. Przed wysłaniem upewnij się, że wszelkie poufne informacje są zdefiniowane w plikach arduino_secrets.h. Możesz ustawić szkic jako prywatny z panelu Udostępnij.", "remote": "Zdalny", - "remoteSketchbook": "Szkicownik zdalny", "share": "Udostępnij...", "shareSketch": "Udostępnij Szkic", - "showHideRemoveSketchbook": "Pokaż/Ukryj zdalny szkicownik", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ZALOGUJ SIĘ", "signInToCloud": "Zaloguj się do Arduino Cloud", "signOut": "Wyloguj się", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Odwiedź chmurę Arduino, aby tworzyć szkice w chmurze." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Wszytko", @@ -137,7 +143,7 @@ "processing": "Przetwarzanie", "recommended": "Zalecane", "retired": "Odosobniony", - "selectedOn": "na 1{0}", + "selectedOn": "na {0}", "serialMonitor": "Monitor portu szeregowego", "type": "Typ", "unknown": "Nieznany", @@ -157,6 +163,11 @@ "uninstallMsg": "Czy chcesz odinstalować {0}?", "version": "Wersja {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Dodaj plik", "fileAdded": "Jeden plik dodany do szkicu.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debuguj - {0}", "debuggingNotSupported": "Debugowanie nie jest wspierane przez '{0}'", "noPlatformInstalledFor": "Platforma nie jest zainstalowana dla '{0}'", - "optimizeForDebugging": "Optymalizuj pod kątem debugowania" + "optimizeForDebugging": "Optymalizuj pod kątem debugowania", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Nie pytaj ponownie" @@ -248,12 +260,12 @@ "goToDownloadButton": "Przejdź do pobierania", "goToDownloadPage": "Nie mogliśmy pobrać i zainstalować automatycznie aktualizacji Arduino IDE. Proszę pobrać najnowszą wersję ze strony pobierania.", "ideUpdaterDialog": "Aktualizacja oprogramowania", - "newVersionAvailable": "Dostępna jest nowa wersja Arduino IDE( 1{0} ).", + "newVersionAvailable": "Dostępna jest nowa wersja Arduino IDE ({0}).", "noUpdatesAvailable": "Brak nowych aktualizacji dla Arduino IDE.", "notNowButton": "Nie traz", "skipVersionButton": "Pomiń tą wersję.", "updateAvailable": "Dostępna aktualizacja.", - "versionDownloaded": "Pobrano Arduino IDE 1{0}" + "versionDownloaded": "Pobrano Arduino IDE {0}" }, "library": { "addZip": "Dodaj bibliotekę .ZIP...", @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Sieć", @@ -333,7 +342,7 @@ "cloud.sketchSyncEndpoint": "Punkt końcowy używany do wypychania i wyciągania szkiców z zaplecza. Domyślnie wskazuje na Arduino Cloud API.", "compile": "kompilacja", "compile.experimental": "Prawdziwy, jeśli IDE powinno obsługiwać wiele błędów kompilatora. Nieprawdziwy domyślnie", - "compile.revealRange": "Dostosowuje sposób ujawniania błędów kompilatora w edytorze po nieudanej weryfikacji/przesłaniu. Możliwe wartości: „auto”: Przewiń w pionie w razie potrzeby i odsłoń linię. 'środek': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie. „góra”: przewiń w pionie w razie potrzeby i odsłoń linię blisko górnej części widocznego obszaru, zoptymalizowaną pod kątem wyświetlania definicji kodu. 'centerIfOutsideViewport': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie tylko wtedy, gdy leży poza rzutnią. Domyślna wartość to '1{0}'.", + "compile.revealRange": "Dostosowuje sposób ujawniania błędów kompilatora w edytorze po nieudanej weryfikacji/przesłaniu. Możliwe wartości: „auto”: Przewiń w pionie w razie potrzeby i odsłoń linię. 'środek': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie. „góra”: przewiń w pionie w razie potrzeby i odsłoń linię blisko górnej części widocznego obszaru, zoptymalizowaną pod kątem wyświetlania definicji kodu. 'centerIfOutsideViewport': Przewiń w pionie w razie potrzeby i odsłoń linię wyśrodkowaną w pionie tylko wtedy, gdy leży poza rzutnią. Domyślna wartość to '{0}'.", "compile.verbose": "Prawda, aby pokazywać szczegółowe informacje podczas kompilacji. Fałsz jest wartością domyślną.", "compile.warnings": "Ustawia poziom ostrzeżeń w kompilatorze gcc. Domyślną wartością jest 'Brak'", "compilerWarnings": "Ostrzeżenia kompilatora", @@ -352,6 +361,7 @@ "manualProxy": "Konfiguracja ręczna proxy", "network": "Sieć", "newSketchbookLocation": "Wybierz nową lokalizację szkicownika", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Bez proxy", "proxySettings": { "hostname": "Nazwa Hosta", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Czy zamienić istniejącą wersję {0}?", "selectZip": "Wybierz plik ZIP zawierający bibliotekę, którą chcesz dodać", "serial": { @@ -391,20 +404,29 @@ }, "sketch": { "archiveSketch": "Archiwizuj szkic", - "cantOpen": "Folder \" 1{0} \" już istnieje. Nie można otworzyć szkicu.", + "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 ' 1{0} '.", + "createdArchive": "Stwórz archiwum '{0}'.", "doneCompiling": "Kompilacja zakończona.", "doneUploading": "Przesyłanie zakończone.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Eksportuj skompilowane binarnie", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Przenoszenie", "movingMsg": "Plik \"{0}\" musi znajdować się w folderze szkiców o nazwie \"{1}\".\nCzy utworzyć ten folder, przenieść podany plik i kontynuować?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Otwórz folder", "openRecent": "Otwórz ostatnie", "openSketchInNewWindow": "Otwórz szkic w nowym oknie.", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Zapisz folder szkicu jako...", "saveSketch": "Zapisz szkic, aby otworzyć go później.", "saveSketchAs": "Zapisz folder szkicu jako...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Weryfikuj/Kompiluj" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Anuluj", "enterField": "Kliknij {0}", "upload": "Prześlij" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "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": { @@ -460,10 +493,10 @@ "expand": "Rozwiń" }, "workspace": { - "deleteCurrentSketch": "Chcesz usunąć aktualny szkic?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Nazwa nowego pliku", "invalidExtension": ".{0} nie jest prawidłowym rozszerzeniem", - "invalidFilename": "Nieprawidłowa nazwa pliku.", "newFileName": "Nowa nazwa pliku" } } diff --git a/i18n/pt.json b/i18n/pt.json index 60c867fb3..8734ca9a3 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Versão: {0}\nData: {1}{2}\nVersão do CLI : {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Sobre {0}" }, "board": { @@ -18,11 +18,12 @@ "installNow": "O núcleo \"{0} {1}\" deve ser instalado para a placa \"{2}\" atualmente selecionada. Quer instalar agora?", "noBoardsFound": "No boards found for \"{0}\"", "noFQBN": "O FQBN não está disponível para a placa selecionada \"{0}\". Você tem o núcleo correspondente instalado?", + "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "Nenhuma porta detectada", "noPortsSelected": "Nenhuma porta selecionada para placa: '{0}'.", + "nonSerialPort": "Non-serial port, can't obtain info.", "noneSelected": "Nenhuma placa selecionada.", "openBoardsConfig": "Selecione outra placa e porta...", - "platformMissing": "A plataforma para a placa '{0}' selecionada não está instalada.", "pleasePickBoard": "Escolha uma placa conectada à porta que você selecionou.", "port": "Porta{0}", "portLabel": "Porta{0}", @@ -31,13 +32,13 @@ "reselectLater": "Selecionar novamente mais tarde", "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", - "selectBoardForInfo": "Selecione uma placa para obter informações sobre ela.", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", "showAllAvailablePorts": "Mostrar todas as portas disponíveis quando habilitado", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Plataforma instalada com sucesso {0}: {1}", "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Gerenciador de Placas", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Conta", "chooseSketchVisibility": "Escolha a visibilidade do seu Sketch:", + "cloudSketchbook": "Sketchbook na nuvem", "connected": "Conectado", "continue": "Continuar", "donePulling": "Terminou de baixar '{0}'.", @@ -108,10 +110,9 @@ "pushSketch": "Enviar Sketch", "pushSketchMsg": "Este é um Sketch Público. Antes de enviar, verifique qualquer informação sensível que esteja denifinda nos arquivos arduino_secrets.h. Você pode tornar um Sketch privado a partir do painel Compartilhar.", "remote": "Remoto", - "remoteSketchbook": "Sketchbook remoto", "share": "Compartilhar...", "shareSketch": "Compartilhar Sketch", - "showHideRemoveSketchbook": "Exibir/Ocultar Sketchbook remoto", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ENTRAR", "signInToCloud": "Faça login no Arduino Cloud", "signOut": "Sair", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visite Arduino Cloud para criar Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Deseja desinstalar {0}?", "version": "Versão {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Adicionar Arquivo", "fileAdded": "Um arquivo adicionado ao sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Depuração - {0}", "debuggingNotSupported": "A depuração não é suportada por '{0}'", "noPlatformInstalledFor": "A plataforma não está instalada para '{0}'", - "optimizeForDebugging": "Otimizar para Depuração" + "optimizeForDebugging": "Otimizar para Depuração", + "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": "Não perguntar novamente" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Impossível conectar ao websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Rede", @@ -333,7 +342,7 @@ "cloud.sketchSyncEndpoint": "O endpoint usado para enviar e baixar os sketches de um backend. Por padrão, ele aponta para a Arduino Cloud API.", "compile": "compilar", "compile.experimental": "Verdadeiro se o IDE deve trabalhar com múltiplos erros de compilação. Falso por padrão", - "compile.revealRange": "Ajusta como os erros do compilador são revelados no editor após uma falha na verificação/upload. Valores possíveis: 'auto': Role verticalmente conforme necessário e revele uma linha. 'center': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente. 'top': Role verticalmente conforme necessário e revele uma linha próxima ao topo da janela de visualização, otimizada para visualizar uma definição de código. 'centerIfOutsideViewport': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente somente se estiver fora da viewport. O valor padrão é ' {0}'.", + "compile.revealRange": "Ajusta como os erros do compilador são revelados no editor após uma falha na verificação/upload. Valores possíveis: 'auto': Role verticalmente conforme necessário e revele uma linha. 'center': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente. 'top': Role verticalmente conforme necessário e revele uma linha próxima ao topo da janela de visualização, otimizada para visualizar uma definição de código. 'centerIfOutsideViewport': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente somente se estiver fora da viewport. O valor padrão é '{0}'.", "compile.verbose": "Verdadeiro para saída de compilação detalhada. Falso é padrão", "compile.warnings": "Diz ao gcc qual nível de aviso usar. 'Nenhum' é padrão", "compilerWarnings": "Avisos do compilador", @@ -352,6 +361,7 @@ "manualProxy": "Configurações manuais de proxy", "network": "Rede", "newSketchbookLocation": "Escolher", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Sem proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Substituir a versão existente de {0}?", "selectZip": "Selecione um arquivo zip contendo a biblioteca que deseja adicionar", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Arquivo criado '{0}'.", "doneCompiling": "Compilação concluída.", "doneUploading": "Envio concluído.", + "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": "Exportar Binário Compilado", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Movendo", "movingMsg": "O ficheiro \"{0}\" tem que estar dentro de uma pasta de esboços chamada \"{1}\".\nCriar esta pasta, mover o ficheiro e continuar?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Abrir Pasta", "openRecent": "Abrir Recente", "openSketchInNewWindow": "Abrir sketch em uma nova janela", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Salvar a pasta de sketch como...", "saveSketch": "Salve seu sketch para abrí-lo novamente mais tarde", "saveSketchAs": "Salvar a pasta de sketch como...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verificar/Compilar" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Cancelar", "enterField": "Enter {0}", "upload": "Carregar" + }, + "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": { @@ -453,17 +486,17 @@ "quitTitle": "Você tem certeza que quer sair?" }, "editor": { - "unsavedTitle": "Não salvo – \"1{0}\"" + "unsavedTitle": "Sem Nome – {0}" }, "messages": { "collapse": "Recolher", "expand": "Expandir" }, "workspace": { - "deleteCurrentSketch": "Você deseja excluir o sketch atual?", + "deleteCloudSketch": "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": "Nome para o novo arquivo", "invalidExtension": "\".{0}\" não é uma extensão válida.", - "invalidFilename": "Nome de arquivo inválido.", "newFileName": "Novo nome para o arquivo" } } diff --git a/i18n/ro.json b/i18n/ro.json index 7b28ff048..bd5ef08fd 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Versiunea: {0}\nData: {1}{2}\nVersiunea CLI : {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Despre {0}" }, "board": { @@ -18,11 +18,12 @@ "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…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Portul{0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Re-selectează mai târziu", "searchBoard": "Search board", "selectBoard": "Selectează Placa", - "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", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Conectat", "continue": "Continuă", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "La distanță ", - "remoteSketchbook": "Remote Sketchbook", "share": "Partajați...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "CONECTARE", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Deconectare", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Dorești să dezinstalezi {0}?", "version": "Versiunea {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Adaugă Fișier", "fileAdded": "One file added to the sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Depanare - {0}", "debuggingNotSupported": "Depanarea nu este suportată de '{0}'", "noPlatformInstalledFor": "Platforma nu este instalată pentru '{0}'", - "optimizeForDebugging": "Optimizare pentru depanare" + "optimizeForDebugging": "Optimizare pentru depanare", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Nu mai întreba" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Rețea", @@ -352,6 +361,7 @@ "manualProxy": "Configurare manuală proxy", "network": "Rețea", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Fără proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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": "Deschide Folder", "openRecent": "Deschide Recente", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Anulează", "enterField": "Enter {0}", "upload": "Încarcă" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Extinde" }, "workspace": { - "deleteCurrentSketch": "Dorești sa ștergi schița curentă?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Nume pentru noul fișier", "invalidExtension": ".{0} nu este o extensie validă", - "invalidFilename": "Numele fișierului este invalid.", "newFileName": "Nume pentru noul fișier" } } diff --git a/i18n/ru.json b/i18n/ru.json index d2950977f..16d640bad 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Версия: {0}\nДата: {1}{2}\nВерсия CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "О программе {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "Выберите другую плату и порт...", - "platformMissing": "Платформа для выбранной платы '{0}' не установлена.", "pleasePickBoard": "Пожалуйста, выберите плату, подключенную к выбранному вами порту.", "port": "Порт{0}", "portLabel": "Порт:{0}", @@ -31,13 +32,13 @@ "reselectLater": "Перевыбрать позже", "searchBoard": "Search board", "selectBoard": "Выбор платы", - "selectBoardForInfo": "Пожалуйста, выберите плату в меню инструментов для получения информации с платы.", "selectPortForInfo": "Пожалуйста, выберите порт в меню инструментов для получения информации с платы.", "showAllAvailablePorts": "Показать все доступные порты при включении", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Платформа установлена успешно {0}:{1}", "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Менеджер плат", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Аккаунт", "chooseSketchVisibility": "Выберите видимость своего скетча:", + "cloudSketchbook": "Альбом в облаке", "connected": "Подключено", "continue": "Продолжить", "donePulling": "Закончить вытягивание ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Выдавить скетч", "pushSketchMsg": "Это Публичный скетч. Перед нажатием убедитесь, что любая конфиденциальная информация определена в файлах arduino_secrets.h. Вы можете сделать скетч приватным на панели общего доступа.", "remote": "Удаленный", - "remoteSketchbook": "Удалённый альбом", "share": "Поделиться...", "shareSketch": "Поделиться скетчем", - "showHideRemoveSketchbook": "Показать/скрыть удаленный альбом", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Войти", "signInToCloud": "Войдите в Arduino Cloud", "signOut": "Выйти", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Посетите Arduino Cloud, чтобы создать скетчи в облаке." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -154,9 +160,14 @@ "installed": "Installed", "moreInfo": "Дополнительная информация", "uninstall": "Удалить", - "uninstallMsg": "Вы хотите удалить {0}?", + "uninstallMsg": "Вы хотите удалить {0}?", "version": "Версия {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Добавить файл...", "fileAdded": "Один файл добавлен в скетч.", @@ -186,7 +197,8 @@ "debugWithMessage": "Отладка - {0}", "debuggingNotSupported": "Отладка не поддерживается '{0}'", "noPlatformInstalledFor": "Платформа не установлена для '{0}'", - "optimizeForDebugging": "Оптимизировать для отладки" + "optimizeForDebugging": "Оптимизировать для отладки", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Больше не спрашивать" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Не удается подключиться к веб-сокету." }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Сеть", @@ -352,6 +361,7 @@ "manualProxy": "Ручная настройка параметров прокси-сервера", "network": "Сеть", "newSketchbookLocation": "Выбрать новое расположение для альбома со скетчами", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Не использовать прокси-сервер", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Заменить имеющуюся версию {0}?", "selectZip": "Выберите zip-файл, содержащий библиотеку, которую вы хотите установить", "serial": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Переместить", "movingMsg": "Файл «{0}» должен быть в папке с именем скетча «{1}». \nСоздать эту папку, переместить файл и продолжить?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Открыть папку", "openRecent": "Открыть предыдущий", "openSketchInNewWindow": "Открыть скетч в новом окне", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Сохранить папку со скетчем как...", "saveSketch": "Сохраните свой скетч, чтобы открыть его позже.", "saveSketchAs": "Сохранить папку скетча как...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Проверить/Скомпилировать" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Отмена", "enterField": "Enter {0}", "upload": "Загрузка" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Развернуть" }, "workspace": { - "deleteCurrentSketch": "Вы хотите удалить текущий скетч?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Имя нового файла", "invalidExtension": "Файлы с расширением \".{0}\" не поддерживаются.", - "invalidFilename": "Неправильное имя файла", "newFileName": "Новое имя файла" } } diff --git a/i18n/sl.json b/i18n/sl.json new file mode 100644 index 000000000..8fd1a3a1b --- /dev/null +++ b/i18n/sl.json @@ -0,0 +1,503 @@ +{ + "arduino": { + "about": { + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "label": "About {0}" + }, + "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": { + "account": "Account", + "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", + "filterSearch": "Filter your search...", + "install": "Install", + "installed": "Installed", + "moreInfo": "More info", + "uninstall": "Uninstall", + "uninstallMsg": "Do you want to uninstall {0}?", + "version": "Version {0}" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "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." + }, + "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": { + "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", + "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 or number, 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 or number, 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." + }, + "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", + "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/sr.json b/i18n/sr.json index afbc123a6..b6d06fd8c 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Верзија: {0}\nДатум: {1}{2}\nCLI верзија: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "О {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "Одабери другу плочу и порт...", - "platformMissing": "Платформа за одабрану плочу '{0}' није инсталирана.", "pleasePickBoard": "Одабери плочу повезану са одабраним портом.", "port": "Порт{0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Одабери поново касније", "searchBoard": "Search board", "selectBoard": "Одабери плочу", - "selectBoardForInfo": "Одабери плочу да добијеш информације о њој.", "selectPortForInfo": "Одабери порт да добијеш информације о плочи", "showAllAvailablePorts": "Приказује све доступне портове када је укључено", "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Успјешно инсталирана платформа {0}:{1}", "succesfullyUninstalledPlatform": "Успјешно деинсталирана платформа {0}:{1}", - "typeOfPorts": "{0} ports" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Управљач плочама", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Одабери видљивост твог рада:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Повезан", "continue": "Наставите", "donePulling": "Готово повлачење ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Удаљени", - "remoteSketchbook": "Remote Sketchbook", "share": "Подјели...", "shareSketch": "Подјели рад", - "showHideRemoveSketchbook": "Прикажи/Сакриј удаљене радне свеске", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "ПРИЈАВИ СЕ", "signInToCloud": "Улогујте се на Arduino Cloud", "signOut": "Одјави се", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Да ли желиш да деинсталираш {0}? ", "version": "Верзија {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Додај датотеку", "fileAdded": "Датотека је додата у рад.", @@ -186,7 +197,8 @@ "debugWithMessage": "Отклањање грешака - {0}", "debuggingNotSupported": "'{0}' не подржава отклањање грешака", "noPlatformInstalledFor": "Платформа није инсталирана за '{0}'", - "optimizeForDebugging": "Оптимизовано за отклањање грешака" + "optimizeForDebugging": "Оптимизовано за отклањање грешака", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Не питај поново" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Мрежа", @@ -352,6 +361,7 @@ "manualProxy": "Ручно подешавање посредника", "network": "Мрежа", "newSketchbookLocation": "Одабери нову локацију радне свеске", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Без посредника", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Замјени тренутну верзију {0}?", "selectZip": "Одабери zip датотеку са библиотеком коју желиш да додаш", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Направљена архива '{0}'.", "doneCompiling": "Превођење завршено.", "doneUploading": "Спуштање завршено.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Премјешта се", "movingMsg": "Датотека \"{0}\" мора да буде унутар радног директоријума \"{1}\".\nКреирај овај директоријум, премјести датотеку, и настави?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Отвори директоријум", "openRecent": "Отвори недавно", "openSketchInNewWindow": "Отвори рад у новом прозору", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Сачувај радни директоријум као...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Сачувај радни фолдер као...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Провјери/Преведи" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Одустани", "enterField": "Enter {0}", "upload": "Спусти" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Прошири" }, "workspace": { - "deleteCurrentSketch": "Да ли желиш да обришеш тренутни рад?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Име за нову датотеку", "invalidExtension": ".{0} није валидна екстензија", - "invalidFilename": "Неважеће име датотеке.", "newFileName": "Ново име за датотеку" } } diff --git a/i18n/th.json b/i18n/th.json new file mode 100644 index 000000000..c9644f06d --- /dev/null +++ b/i18n/th.json @@ -0,0 +1,503 @@ +{ + "arduino": { + "about": { + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "label": "เกี่ยวกับ{0}" + }, + "board": { + "board": "บอร์ด{0}", + "boardConfigDialogTitle": "เลือกบอร์ดและพอร์ตอื่นๆ", + "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?", + "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": { + "account": "Account", + "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", + "filterSearch": "Filter your search...", + "install": "Install", + "installed": "Installed", + "moreInfo": "More info", + "uninstall": "Uninstall", + "uninstallMsg": "Do you want to uninstall {0}?", + "version": "Version {0}" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "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." + }, + "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": { + "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", + "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 or number, 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 or number, 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." + }, + "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", + "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/tr.json b/i18n/tr.json index 319e15f19..c319e02c6 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Versiyon: {0}\nDate: {1}{2}\nCLI Versiyonu: {3}{4} [{5}]\n\n{6}", + "detail": "Versiyon: {0}\nTarih: {1}{2}\nCLI Versiyonu: {3}\n\n{4}", "label": "{0} Hakkında" }, "board": { @@ -18,11 +18,12 @@ "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ç", - "platformMissing": "Seçili '{0}' kart için platform kurulmadı.", "pleasePickBoard": "Lütfen seçtiğiniz porta bağlı kartı seçin.", "port": "Port{0}", "portLabel": "Port{0}", @@ -31,13 +32,13 @@ "reselectLater": "Daha sonra tekrar seç", "searchBoard": "Kart ara", "selectBoard": "Kart Seç", - "selectBoardForInfo": "Kart bilgisi almak için lütfen bir kart seçin.", "selectPortForInfo": "Kart bilgisi almak için lütfen bir port seçin.", "showAllAvailablePorts": "Etkinleştirildiğinde tüm mevcut portları görüntüler", "showAllPorts": "Tüm portları göster", "succesfullyInstalledPlatform": "Platform başarıyla kuruldu {0}:{1}", "succesfullyUninstalledPlatform": "Platform başarıyla kaldırıldı {0}:{1}", - "typeOfPorts": "{0} portlar" + "typeOfPorts": "{0} portlar", + "unknownBoard": "Bilinmeyen kart" }, "boardsManager": "Kart Yöneticisi", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Hesap", "chooseSketchVisibility": "Eskizinizin görünürlüğünü seçin", + "cloudSketchbook": "Bulut Eskiz Defteri", "connected": "Bağlandı", "continue": "Devam et", "donePulling": "Çekme bitti: ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Eskizi Gönder", "pushSketchMsg": "Bu bir Herkese Açık Eskiz. Göndermeden önce tüm hassas bilgilerin arduino_secrets.h dosyaları içinde tanımlandığından emin olun. Eskizleri Paylaş panelinden gizli yapabilirsiniz.", "remote": "Uzak", - "remoteSketchbook": "Bulut Eskiz Defteri", "share": "Paylaş...", "shareSketch": "Eskizi Paylaş", - "showHideRemoveSketchbook": "Bulut Eskiz Defteri'ni Göster/Gizle", + "showHideSketchbook": "Bulut Eskiz Defteri'ni Göster/Gizle", "signIn": "GİRİŞ YAP", "signInToCloud": "Arduino Cloud'a giriş yap", "signOut": "Çıkış Yap", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Bulut Eskizleri oluşturmak için Arduino Cloud'u ziyaret edin." }, "cloudSketch": { - "creating": "Uzak eskiz '{0}' oluşturuluyor...", - "new": "Yeni Uzak Eskiz", - "synchronizing": "Eskiz defteri eşitleniyor, '{0}' çekiliyor..." + "alreadyExists": "'{0}' adlı bulut eskiz zaten mevcut.", + "creating": "Bulut eskiz '{0}' oluşturuluyor...", + "new": "Yeni Bulut Eskiz", + "notFound": "Bulut eskiz '{0}' çekilemedi. Böyle bir eskiz yok.", + "pulling": "Eskiz defteri eşitleniyor, '{0}' çekiliyor...", + "pushing": "Eskiz defteri eşitleniyor, '{0}' gönderiliyor...", + "renaming": "Bulut eskiz adı '{0}' dan '{1}''a değiştiriliyor...", + "synchronizingSketchbook": "Eskiz defteri eşitleniyor..." }, "common": { "all": "Tümü", @@ -157,6 +163,11 @@ "uninstallMsg": "{0} kaldırılsın mı?", "version": "Versiyon {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "'{0}': {1} konumundaki eskiz defterine erişilemedi" + } + }, "contributions": { "addFile": "Dosya Ekle", "fileAdded": "Eskize bir dosya eklendi.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debug '{0}' tarafından desteklenmiyor", "noPlatformInstalledFor": "'{0}' için platform kurulmadı", - "optimizeForDebugging": "Debug için Optimize et" + "optimizeForDebugging": "Debug için Optimize et", + "sketchIsNotCompiled": "Hata ayıklama -debug- oturumuna başlamadan önce '{0}' eskizi doğrulanmalıdır. Lütfen eskizi doğrulayın ve hata ayıklamayı yeniden başlatın. Eskizi şimdi doğrulamak ister misiniz?" }, "dialog": { "dontAskAgain": "Tekrar sorma" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Websocket'e bağlanılamadı" }, "newCloudSketch": { - "invalidSketchName": "İsim harfler, rakamlar veya altçizgiden oluşmalıdır. Azami uzunluk 36 karakterdir.", - "newSketchTitle": "Yeni bir Uzak Eskiz'in adı", - "notFound": "Uzak eskiz '{0}' çekilemedi. Böyle bir eskiz yok.", - "sketchAlreadyExists": "'{0}' adlı uzak eskiz zaten mevcut." + "newSketchTitle": "Yeni Bulut Eskiz'in adı" }, "portProtocol": { "network": "Ağ", @@ -352,6 +361,7 @@ "manualProxy": "Elle vekil ayarlama", "network": "Ağ", "newSketchbookLocation": "Yeni eskiz defteri konumu seç", + "noCliConfig": "CLI yapılandırması yüklenemedi", "noProxy": "Vekil yok", "proxySettings": { "hostname": "Host adı", @@ -375,6 +385,9 @@ "deprecationMessage": "Kullanımdan kalktı. Yerine 'window.zoomLevel' kullanın." } }, + "renameCloudSketch": { + "renameSketchTitle": "Bulut Eskiz'in yeni adı" + }, "replaceMsg": "{0}'un mevcut versiyonu değiştirilsin mi?", "selectZip": "Eklemek istediğiniz kütüphaneyi içeren ZIP dosyasını seçin", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "'{0}' arşivi oluşturuldu.", "doneCompiling": "Derleme bitti.", "doneUploading": "Yükleme bitti.", + "editInvalidSketchFolderLocationQuestion": "Eskizi farklı bir konuma kaydetmeyi denemek ister misiniz?", + "editInvalidSketchFolderQuestion": "Eskizi farklı bir isimle kaydetmeyi denemek ister misiniz?", "exportBinary": "Derlenmiş Dosyayı Dışa Aktar", + "invalidCloudSketchName": "İsim bir harf veya rakam ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 36 karakterdir.", + "invalidSketchFolderLocationDetails": "Bir eskizi kendi içindeki bir klasöre kaydedemezsiniz.", + "invalidSketchFolderLocationMessage": "Hatalı eskiz klasörü konumu: {0}", + "invalidSketchFolderNameMessage": "Hatalı eskiz klasörü adı: {0}", + "invalidSketchName": "İsim bir harf veya rakam ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 63 karakterdir.", "moving": "Taşınıyor", "movingMsg": "\"{0}\" dosyasının \"{1}\" isminde bir eskiz klasörünün içinde olması gerekiyor.\nKlasörü oluştur, dosyayı taşı ve devam et?", "new": "Yeni Eskiz", + "noTrailingPeriod": "Dosya adı nokta ile bitemez", "openFolder": "Klasörü Aç", "openRecent": "Yakın Geçmiş", "openSketchInNewWindow": "Eskizi Yeni Pencerede Aç", + "reservedFilename": "'{0}' rezerve bir isimdir, kullanılamaz.", "saveFolderAs": "Eskiz klasörünü farklı kaydet...", "saveSketch": "Daha sonra tekrar açmak için eskizinizi kaydedin.", "saveSketchAs": "Eskiz klasörünü farklı kaydet...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Doğrula/Derle" }, "sketchbook": { - "newRemoteSketch": "Yeni Uzak Eskiz", + "newCloudSketch": "Yeni Bulut Eskiz", "newSketch": "Yeni Eskiz" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "İptal", "enterField": "{0} gir", "upload": "Yükle" + }, + "validateSketch": { + "abortFixMessage": "Eskiz hala hatalı. Kalan sorunları çözmek ister misiniz? '{0}' butonuna tıklarsanız yeni bir eskiz açılır.", + "abortFixTitle": "Hatalı eskiz", + "renameSketchFileMessage": "'{0}' adlı eskiz kullanılamaz. {1} Eskiz dosyasını şimdi yeniden adlandırmak ister misiniz?", + "renameSketchFileTitle": "Hatalı eskiz dosya adı", + "renameSketchFolderMessage": "'{0}' eskizi kullanılamaz. {1} Bu mesajdan kurtulmak için eskizi yeniden adlandırın. Eskizi şimdi yeniden adlandırmak istiyor musunuz?", + "renameSketchFolderTitle": "Hatalı eskiz adı" + }, + "workspace": { + "alreadyExists": "'{0}' zaten mevcut." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Genişlet" }, "workspace": { - "deleteCurrentSketch": "Mevcut eskizi silmek istiyor musunuz?", + "deleteCloudSketch": "'{0}' bulut eskizi Arduino sunucularından ve yerel geçici saklamadan kalıcı olarak silinecek. Bu işlem geri alınamaz. Mevcut eskizi silmek istiyor musunuz?", + "deleteCurrentSketch": "'{0}' eskiz kalıcı olarak silinecek. Bu işlem geri alınamaz. Mevcut eskizi silmek istiyor musunuz?", "fileNewName": "Yeni dosya için isim", - "invalidExtension": ".{0} geçerli bir uzantı değil", - "invalidFilename": "Hatalı dosya adı.", + "invalidExtension": ".{0} geçerli bir uzantı değil", "newFileName": "Dosya için yeni isim" } } diff --git a/i18n/uk.json b/i18n/uk.json index e49b717b6..9c7ec97c1 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Версія: {0}\nДата:{1} {2}\nВерсія CLI:{3}{4}[{5}]\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Про {0}" }, "board": { @@ -18,11 +18,12 @@ "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": "Оберіть іншу плату або порт", - "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}", @@ -31,13 +32,13 @@ "reselectLater": "Reselect later", "searchBoard": "Шукати плату", "selectBoard": "Оберіть плату", - "selectBoardForInfo": "Виберіть плату, щоб отримати інформацію про плату.", "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" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Продовжити", "donePulling": "Done pulling ‘{0}’.", @@ -108,10 +110,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "Все", @@ -157,6 +163,11 @@ "uninstallMsg": "Do you want to uninstall {0}?", "version": "Version {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Додати Файл", "fileAdded": "One file added to the sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Не питати знову" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Мережа", @@ -352,6 +361,7 @@ "manualProxy": "Manual proxy configuration", "network": "Мережа", "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Нема проксі", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "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": { @@ -398,13 +411,22 @@ "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 or number, 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 or number, 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": "Відкрити папку", "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...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Відміна ", "enterField": "Enter {0}", "upload": "Завантажити" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -460,10 +493,10 @@ "expand": "Розгорнути " }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Ім'я для нового файлу", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Невірне ім'я файлу", "newFileName": "Нове ім'я файлу" } } diff --git a/i18n/vi.json b/i18n/vi.json index d0f697070..9f4cea759 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "Phiên bản: {0}\nNgày: {1}{2}\nPhiên bản CLI: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Về {0}" }, "board": { @@ -18,11 +18,12 @@ "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.", "openBoardsConfig": "Chọn bo mạch và cổng khác...", - "platformMissing": "Nền tảng cho bo mạch '{0}' được chọn chưa được cài đặt.", "pleasePickBoard": "Hãy chọn một bo mạch được kết nối tới cổng mà bạn đã chọn.", "port": "Cổng {0}", "portLabel": "Port: {0}", @@ -31,13 +32,13 @@ "reselectLater": "Chọn lại sau", "searchBoard": "Search board", "selectBoard": "Lựa chọn bo mạch", - "selectBoardForInfo": "Hãy chọn một bo mạch để lấy thông tin.", "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", "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" + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Trình quản lý bo mạch", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "Account", "chooseSketchVisibility": "Chọn khả năng hiển thị của Sketch của bạn:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Đã kết nối", "continue": "Tiếp tục", "donePulling": "Hoàn tất tải xuống '{0}'.", @@ -108,10 +110,9 @@ "pushSketch": "Đẩy sketch lên", "pushSketchMsg": "Đây là sketch công khai. Trước khi đẩy lên, đảm bảo rằng tất cả các thông tin nhậy cảm được xác định trong tệp arduino_secrets.h. Bạn có thể tạo một sketch riêng tư từ bảng Chia sẻ.", "remote": "Từ xa", - "remoteSketchbook": "Remote Sketchbook", "share": "Chia sẻ...", "shareSketch": "Chia sẻ sketch.", - "showHideRemoveSketchbook": "Hiển thị/Ẩn Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "Đăng Nhập", "signInToCloud": "Đăng nhập vào Arduino Cloud", "signOut": "Đăng Xuất", @@ -120,9 +121,14 @@ "visitArduinoCloud": "Truy cập Arduino Cloud để tạo Cloud Sketch." }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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", @@ -157,6 +163,11 @@ "uninstallMsg": "Bạn có muốn gỡ cài đặt {0}?", "version": "Phiên bản {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, "contributions": { "addFile": "Thêm tệp...", "fileAdded": "Một tệp đã được thêm vào sketch.", @@ -186,7 +197,8 @@ "debugWithMessage": "Sửa lỗi - {0}", "debuggingNotSupported": "Sửa lỗi không hỗ trợ bởi '{0}'", "noPlatformInstalledFor": "Nền tảng chưa được cài đặt cho '{0}'", - "optimizeForDebugging": "Tối ưu hóa cho sửa lỗi" + "optimizeForDebugging": "Tối ưu hóa cho sửa lỗi", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Đừng hỏi lại" @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "Unable to connect to websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "Mạng", @@ -352,6 +361,7 @@ "manualProxy": "Cấu hình proxy thủ công", "network": "Mạng", "newSketchbookLocation": "Chọn địa điểm lưu sketchbook mới", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "Không có proxy", "proxySettings": { "hostname": "Host name", @@ -375,6 +385,9 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, "replaceMsg": "Thay thế phiên bản hiện tại của {0}?", "selectZip": "Chọn một tệp zip chứa thư viện mà bạn muốn cài", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "Đã tạo tệp nén '{0]'.", "doneCompiling": "Biên dịch hoàn tất.", "doneUploading": "Nạp hoàn tất.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Xuất tệp nhị phân đã biên dịch", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, 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", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Mở thư mục", "openRecent": "Mở gần đây", "openSketchInNewWindow": "Mở sketch trong cửa sổ mới", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Lưu thư mục sketch như là...", "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Lưu thư mục sketch như là...", @@ -421,7 +443,7 @@ "verifyOrCompile": "Xác thực/Biên dịch" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -441,6 +463,17 @@ "cancel": "Hủy", "enterField": "Enter {0}", "upload": "Nạp" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "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": { @@ -460,10 +493,10 @@ "expand": "Mở rộng" }, "workspace": { - "deleteCurrentSketch": "Bạn có muốn xóa sketch hiện tại?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Tên cho tệp mới", "invalidExtension": ".{0} không phải đuôi mở rộng hợp lệ", - "invalidFilename": "Tên tệp không hợp lệ.", "newFileName": "Tên mới cho tệp" } } diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index 778914aa6..91ffe68e7 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -1,470 +1,503 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", - "label": "About {0}" + "detail": "版本: {0}\n日期: {1}{2}\n命令列版本: {3}\n\n{4}", + "label": "關於 {0}" }, "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?", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "showAllPorts": "Show all ports", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports" - }, - "boardsManager": "Boards Manager", + "board": "{0} 開發板", + "boardConfigDialogTitle": "選擇其他開發板和序列埠", + "boardInfo": "開發板資訊", + "boards": "開發板", + "configDialog1": "若要上傳草稿碼, 請選取開發板及連接埠", + "configDialog2": "如果只有選取開發板, 可以編譯但無法上傳草稿碼", + "couldNotFindPreviouslySelected": "在安装的平台{1}中沒有找到之前選取的開發板{0}。請手動選取要使用的開發板。現在要重新選取嗎?", + "disconnected": "已中斷連線", + "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": "序列埠", + "programmer": "燒錄器", + "reselectLater": "請稍後再選擇", + "searchBoard": "搜尋開發板", + "selectBoard": "選擇開發版", + "selectPortForInfo": "請選取序列埠以取得開發板的資訊", + "showAllAvailablePorts": "啟用時顯示所有可用的序列埠", + "showAllPorts": "顯示所有的序列埠", + "succesfullyInstalledPlatform": "已成功安装 {0}:{1} 平台", + "succesfullyUninstalledPlatform": "已成功移除 {0}:{1} 平台", + "typeOfPorts": "{0} 序列埠", + "unknownBoard": "Unknown board" + }, + "boardsManager": "開發板管理員", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "經 Arduino 認證" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "燒錄 Bootloader", + "burningBootloader": "正在燒錄 Bootloader", + "doneBurningBootloader": "Bootloader 燒錄完成" }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "燒錄 Bootloader 時出現錯誤:{0}" }, "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", + "addNew": "新增", + "addURL": "加入 URL 以提取 SSL 憑證", + "boardAtPort": "{0} 在 {1}", + "certificatesUploaded": "憑證已上傳", + "enterURL": "輸入網址", + "noSupportedBoardConnected": "不支援目前連接的開發板", "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." + "remove": "移除", + "selectBoard": "選擇開發板...", + "selectCertificateToUpload": "1. 選擇要上傳的憑證", + "selectDestinationBoardToUpload": "2. 選擇目標開發板並上傳憑證", + "upload": "上傳", + "uploadFailed": "上傳失敗, 請再試一次", + "uploadRootCertificates": "上傳 SSL 根憑證", + "uploadingCertificates": "正在上傳憑證" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "檢查 Arduino 更新", + "installAll": "全部安装", + "noUpdates": "沒有可用的最新更新。", + "promptUpdateBoards": "某些開發板有可用更新。", + "promptUpdateLibraries": "某些函式庫有可用更新。", + "updatingBoards": "更新開發板中...", + "updatingLibraries": "更新函式庫中..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" + "keyboardError": "找不到 'Keyboard', 請檢查草稿碼中是否有 '#include '?", + "mouseError": "找不到 'Mouse', 請檢查草稿碼中是否有 '#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", - "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", - "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." + "account": "帳戶", + "chooseSketchVisibility": "選擇草稿碼的能見度:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "已連線", + "continue": "繼續", + "donePulling": "已完成拉取 '{0}'。", + "donePushing": "已完成推送 '{0}'。", + "embed": "嵌入:", + "emptySketchbook": "您的草稿碼簿是空的", + "goToCloud": "前往 Cloud", + "learnMore": "了解更多", + "link": "連結:", + "notYetPulled": "尚未拉取, 無法推送到 Cloud。", + "offline": "離線", + "openInCloudEditor": "在 Cloud Editor 中開啟", + "options": "選項...", + "privateVisibility": "私人。只有你可以檢視草稿碼。", + "profilePicture": "頭像圖片", + "publicVisibility": "公開。擁有連結的人都可以檢視草稿碼。", + "pull": "拉取", + "pullFirst": "你必須先拉取才能推送至 Cloud。", + "pullSketch": "拉取草稿碼", + "pullSketchMsg": "從 Cloud 拉取這個草稿碼將會覆蓋本地的版本, 你確定要繼續嗎?", + "push": "推送", + "pushSketch": "推送草稿碼", + "pushSketchMsg": "這是公開的草稿碼, 推送前請確認所有敏感資訊都定義在arduino_secrets.h 中。你也可以在分享面板中將草稿碼設定為私人。", + "remote": "遠端", + "share": "分享......", + "shareSketch": "分享草稿碼", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "signIn": "登入", + "signInToCloud": "登入 Arduino Cloud", + "signOut": "登出", + "sync": "同步", + "syncEditSketches": "同步並編輯你的 Arduino Cloud 草稿碼", + "visitArduinoCloud": "前往 Arduino Cloud 建立雲端草稿碼。" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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..." }, "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", + "all": "全部", + "contributed": "已貢獻", + "installManually": "手動安裝", + "later": "稍後", + "noBoardSelected": "沒有選取開發版", + "notConnected": "[未連接]", + "offlineIndicator": "您目前處於離線狀態, 在沒有網路的情況下, Arduino 命令列介面將無法下載需要的資源, 並可能造成功能無法正常運作。請連接至網路並重新啟動程式。", + "oldFormat": "'{0}' 仍然使用舊的 `.pde` 格式, 是否要轉換成新的 `.ino` 副檔名?", + "partner": "協力伙伴", "processing": "Processing", - "recommended": "Recommended", - "retired": "Retired", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" + "recommended": "推薦", + "retired": "不再支援", + "selectedOn": "在 {0}", + "serialMonitor": "序列埠監控視窗", + "type": "類型", + "unknown": "未知", + "updateable": "可更新" }, "compile": { - "error": "Compilation error: {0}" + "error": "編譯錯誤:{0} " }, "component": { - "boardsIncluded": "Boards included in this package:", - "by": "by", - "filterSearch": "Filter your search...", - "install": "Install", - "installed": "Installed", - "moreInfo": "More info", - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "boardsIncluded": "包含在此套件的開發版:", + "by": "提供者:", + "filterSearch": "篩選搜尋結果...", + "install": "安裝", + "installed": "已安装", + "moreInfo": "詳細資訊", + "uninstall": "移除安裝", + "uninstallMsg": "你要移除 {0} 嗎?", + "version": "版本 {0}" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "無法存取位於 '{0}' :{1} 的草稿碼簿。" + } }, "contributions": { - "addFile": "Add File", - "fileAdded": "One file added to the sketch.", + "addFile": "加入檔案", + "fileAdded": "已加入一個檔案到草稿碼中", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "無法開啟序列埠繪圖家" }, - "replaceTitle": "Replace" + "replaceTitle": "替换" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "全部", + "default": "預設", + "more": "更多", + "none": "無" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "複製錯誤訊息", + "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取您的開發版" }, "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "重新啟動背景服務程式", + "start": "啟動背景服務程式", + "stop": "停止背景服務程式" }, "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "debugWithMessage": "除錯 - {0}", + "debuggingNotSupported": "'{0}' 不支援除錯功能。", + "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?" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "不要再詢問" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "autoFormat": "自動格式化", + "commentUncomment": "註解/取消註解", + "copyForForum": "複製到論壇使用 (Markdown 格式)", + "decreaseFontSize": "縮小字體", + "decreaseIndent": "減少縮排", + "increaseFontSize": "加大字體", + "increaseIndent": "增加縮排", + "nextError": "下一個錯誤", + "previousError": "上一個錯誤", + "revealError": "顯示錯誤" }, "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." + "couldNotSave": "無法儲存草稿, 請先將尚未存檔的內容複製到慣用的文字編輯器中, 再重新啟動 IDE。", + "unsavedChanges": "任何尚未儲存的修改都不會儲存。" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" + "builtInExamples": "內建範例", + "couldNotInitializeExamples": "無法初始內建的範例", + "customLibrary": "客製函式庫的範例", + "for": "{0} 的範例", + "forAny": "適用各種開發板的範例", + "menu": "範例" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "checkUpdates": "檢查更新", + "failedInstall": "安裝失敗, 請再試一次", + "install": "安裝", + "installingFirmware": "安裝韌體", + "overwriteSketch": "安裝會覆蓋掉開發板上的 草稿碼", + "selectBoard": "選擇開發版", + "selectVersion": "選擇韌體版本", + "successfullyInstalled": "成功安裝韌體", + "updater": "WiFi101 / WiFiNINA 韌體更新" }, "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" + "environment": "IDE 簡介", + "faq": "常見問答集", + "findInReference": "搜尋參考文件", + "gettingStarted": "入門教學", + "keyword": "鍵入關鍵字", + "privacyPolicy": "隱私政策", + "reference": "參考文件", + "search": "在 Arduino.cc 搜尋", + "troubleshooting": "移難排除", + "visit": "前往 Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." + "checkForUpdates": "檢查 Arduino IDE 更新", + "closeAndInstallButton": "關閉並安裝。", + "closeToInstallNotice": "關閉軟體並安裝更新。", + "downloadButton": "下載", + "downloadingNotice": "正在下載 Arduino IDE 的最新版本。", + "errorCheckingForUpdates": "檢查 Arduino IDE 更新時發生錯誤。\n{0}", + "goToDownloadButton": "前往下載", + "goToDownloadPage": "Arduino IDE 有更新版本, 但我們無法自動下載安裝, 請至下載頁面下載最新的版本。", + "ideUpdaterDialog": "軟體更新", + "newVersionAvailable": "Arduino IDE 有新版本({0})可供下载。", + "noUpdatesAvailable": "目前 Arduino IDE 没有可更新的版本。", + "notNowButton": "現在不要", + "skipVersionButton": "略過這個版本", + "updateAvailable": "有可用的更新。", + "versionDownloaded": "Arduino IDE{0}下載完成。" }, "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" + "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": "Topic" + "topic": "主題" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "通訊", + "dataProcessing": "資料處理", + "dataStorage": "資料儲存", + "deviceControl": "裝置控制", + "display": "顯示", + "other": "其他", + "sensors": "感測器", + "signalInputOutput": "訊號輸入/ 輸出", + "timing": "時序", + "uncategorized": "未分類" }, "libraryType": { - "installed": "Installed" + "installed": "已安装" }, "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" + "advanced": "進階", + "sketch": "草稿碼", + "tools": "工具" }, "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" + "unableToCloseWebSocket": "無法關閉 websocket", + "unableToConnectToWebSocket": "無法連線到 websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { - "network": "Network", - "serial": "Serial" + "network": "網路", + "serial": "序列" }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "additionalManagerURLs": "其他開發版管理器網址", + "auth.audience": "OAuth2 受眾", + "auth.clientID": "OAuth2 客户端 ID", + "auth.domain": "OAuth2 網域", + "auth.registerUri": "註冊新使用者的 URI", + "automatic": "自動", + "board.certificates": "可上傳至開發版的憑證清單", + "browse": "瀏覽", + "checkForUpdate": "接收有關 IDE、開發板和函式庫的可用更新通知, 預設為開啟。 更改設定後需要重新啟動 IDE 才會生效。", + "choose": "選取", + "cli.daemonDebug": "啟用對 Arduino CLI 的 gRPC 呼叫的除錯日誌記錄, 預設不啟用。若修改設定需要重新啟動 IDE 才能生效。", + "cloud.enabled": "設為 True 會啟用草稿碼同步功能, 預設為true。", + "cloud.pull.warn": "設為 True 會在拉取遠端草稿碼前警告用户, 預設為 True。", + "cloud.push.warn": "設為 True 會在推送草稿碼到雲端時警告用戶, 預設為 True。", + "cloud.pushpublic.warn": "設為 True 會在推送公開的草稿碼到雲端時警告用戶, 預設為 True。", + "cloud.sketchSyncEndpoint": "用來從後端推送或拉取草稿碼的端點, 預設指向 Arduino Cloud 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 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", + "compile.verbose": "設為 True 會輸出詳細編譯資訊, 預設為False", + "compile.warnings": "設定 gcc 警告等級, 預設為 'None'", + "compilerWarnings": "編譯器警告", + "editorFontSize": "編輯器字體大小", + "editorQuickSuggestions": "編輯器快速建議", + "enterAdditionalURLs": "輸入其他網址, 每列一個", + "files.inside.sketches": "顯示草稿碼中的檔案", + "ide.updateBaseUrl": "下載更新的網址, 預設為:'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "取得更新的版本釋出頻道, 'stable' 表示為穩定的版本, 'nightly' 則是最新的開發中版本。", + "interfaceScale": "使用者介面縮放比例", + "invalid.editorFontSize": "無效的編輯器字體大小, 必須是正整數。", + "invalid.sketchbook.location": "無效的草稿碼簿位置:{0}", + "invalid.theme": "無效的佈景主題。", + "language.log": "設為 True 表示 Arduino Language Server 要在草稿碼的資料夾中產生日誌檔, 預設為 False。", + "language.realTimeDiagnostics": "設為 true 表示 Arduino Language Server 要在編輯器中打字時提供及時診斷, 預設為 false。", + "manualProxy": "手動設定代理伺服器", + "network": "網路", + "newSketchbookLocation": "選取新的草稿碼簿位置", + "noCliConfig": "無法載入 CLI 設定", + "noProxy": "不使用代理伺服器", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "主機名稱", + "password": "密碼", + "port": "連接埠編號", + "username": "使用者名稱" }, - "showVerbose": "Show verbose output during", + "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 建立新草稿碼時的模版;如果沒有指定, 就會以 Arduino 預設的內容產生新的草稿碼。如果指定的路徑無法存取, 就會忽略指定的樣版檔。**修改此設定需要重新啟動 IDE** 才會生效。" }, - "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.", + "sketchbook.location": "草稿碼簿位置", + "sketchbook.showAllFiles": "設為 True 會顯示草稿碼內的所有檔案, 預設為 false。", + "survey.notification": "設為 true 會在有新的問卷時通知使用者, 預設為 true。", + "unofficialBoardSupport": "按一下可取得非官方支援開發板的網址的網址清單", + "upload": "上傳", + "upload.verbose": "設為 true 會在上傳時輸出詳細資訊, 預設是 false。", + "verifyAfterUpload": "上傳後驗證程式碼", + "window.autoScale": "設為 true 會依據字體大小自動縮放使用者介面", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "已棄用, 请改用 \"window.zoomLevel\"。" } }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "取代現有版本 {0}?", + "selectZip": "選擇包含你要加入的函式庫的 zip 檔", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "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" + "autoscroll": "自動捲動", + "carriageReturn": "歸位", + "message": "訊息 (按 Enter 將訊息發送連接到 {1} 的 {0})", + "newLine": "換行", + "newLineCarriageReturn": "換行加歸位", + "noLineEndings": "不加行結尾字元", + "notConnected": "沒有連接到開發板, 請選擇開發板與連接埠以便自動連接", + "openSerialPlotter": "序列埠繪圖家", + "timestamp": "時間戳記", + "toggleTimestamp": "切換是否加入時間戳記" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New Sketch", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", + "archiveSketch": "將草稿碼歸檔", + "cantOpen": "\"{0}\" 資料夾已存在, 無法開啟草稿碼。", + "close": "確定要關閉草稿碼嗎?", + "compile": "正在編譯草稿碼...", + "configureAndUpload": "設定並上傳", + "createdArchive": "已歸檔{0}。", + "doneCompiling": "編譯完成", + "doneUploading": "上傳完畢", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "會出編譯好的二進位檔", + "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "移動", + "movingMsg": "檔案{0}需要放在草稿碼資料夾內名稱為{1}的資料夾,\n要建立此資料夾, 搬移檔案再繼續嗎?", + "new": "建立新草稿碼", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "開啟資料夾", + "openRecent": "開啟最近的草稿碼", + "openSketchInNewWindow": "在新視窗開啟草稿碼", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "將草稿碼簿另存為...", + "saveSketch": "儲存草稿碼以便之後可以再開啟", + "saveSketchAs": " 將草稿碼簿另存為...", + "showFolder": "開啟草稿碼簿資料夾", + "sketch": "草稿碼", + "sketchbook": "草稿碼簿", + "titleLocalSketchbook": "本地的草稿碼簿", + "titleSketchbook": "草稿碼簿", + "upload": "上傳", + "uploadUsingProgrammer": "使用燒錄器上傳", + "uploading": "正在上傳...", "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" + "verify": "驗證", + "verifyOrCompile": "驗證/編譯" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "New Cloud Sketch", + "newSketch": "建立新草稿碼" }, "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": "請回答這個超簡短的問卷來幫助我們改進, 我們很重視社群,也希望能多了解我們的支持者。" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "更新索引", + "updateLibraryIndex": "更新函式庫索引", + "updatePackageIndex": "更新套件索引" }, "upload": { - "error": "{0} error: {1}" + "error": "{0} 錯誤:{1}" }, "userFields": { - "cancel": "Cancel", - "enterField": "Enter {0}", - "upload": "Upload" + "cancel": "取消", + "enterField": "輸入 {0}", + "upload": "上傳" + }, + "validateSketch": { + "abortFixMessage": "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", - "quitTitle": "Are you sure you want to quit?" + "cannotConnectBackend": "無法連接後端", + "cannotConnectDaemon": "無法連線到 CLI 背景服務程式", + "couldNotSave": "無法儲存草稿, 請先將尚未存檔的內容複製到慣用的文字編輯器中, 再重新啟動 IDE。", + "daemonOffline": "CLI 背景服務程式離線", + "offline": "離線", + "quitTitle": "你確定要退出嗎?" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "{0} – 尚未儲存" }, "messages": { - "collapse": "Collapse", - "expand": "Expand" + "collapse": "收和", + "expand": "展開" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", - "newFileName": "New name for file" + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", + "fileNewName": "新檔案的名稱", + "invalidExtension": ".{0} 不是符合規則的副檔名", + "newFileName": "新檔名" } } } diff --git a/i18n/zh.json b/i18n/zh.json index 33300d64d..4311c2ac5 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -1,7 +1,7 @@ { "arduino": { "about": { - "detail": "版本:{0}\n日期:{1}{2}\nCLI 版本:{3}{4}[{5}]{6}", + "detail": "版本:{0}\n日期:{1}{2}\nCLI 版本:{3}\n\n{4}", "label": "关于 {0}" }, "board": { @@ -18,11 +18,12 @@ "installNow": "必须为当前选定的 {2} 开发板板安装 “{0}{1}” 内核。你想现在安装吗?", "noBoardsFound": "没有找到 “{0}” 相关开发板", "noFQBN": "FQBN 不可用于所选开发板 “{0}”。你是否安装了相应的内核?", + "noNativeSerialPort": "本地串行端口,无法获取信息。", "noPortsDiscovered": "未发现端口", "noPortsSelected": "没有为开发板选择端口:‘{0}’。", + "nonSerialPort": "非串行端口,无法获取信息。", "noneSelected": "未选择任何开发板。", "openBoardsConfig": "选择其他开发板和接口......", - "platformMissing": "未安装所选 ‘{0}’ 开发板的平台。", "pleasePickBoard": "请选择要连接的开发板。", "port": "端口 {0}", "portLabel": "端口:{0}", @@ -31,13 +32,13 @@ "reselectLater": "稍后重新选择", "searchBoard": "搜索开发坂", "selectBoard": "选择开发板", - "selectBoardForInfo": "请选择一个开发板以获取开发板信息。", "selectPortForInfo": "请选择一个端口以获取开发板信息。", "showAllAvailablePorts": "启用时显示所有可用端口", "showAllPorts": "显示所有端口", "succesfullyInstalledPlatform": "已成功安装平台 {0}:{1}", "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}", - "typeOfPorts": "{0} 端口" + "typeOfPorts": "{0} 端口", + "unknownBoard": "未知开发板" }, "boardsManager": "开发板管理器", "boardsType": { @@ -84,6 +85,7 @@ "cloud": { "account": "账户", "chooseSketchVisibility": "选择项目的可见性:", + "cloudSketchbook": "云项目文件夹", "connected": "已连接", "continue": "继续", "donePulling": "已完成拉取 ‘{0}’。", @@ -108,10 +110,9 @@ "pushSketch": "推送项目", "pushSketchMsg": "这是公开的项目。推送前,确保在 arduino_secrets.h 中明确了所有敏感信息。可以从共享界面将项目设为私人项目。", "remote": "远程", - "remoteSketchbook": "远程项目文件夹", "share": "共享......", "shareSketch": "共享项目", - "showHideRemoveSketchbook": "显示/隐藏远程项目文件夹", + "showHideSketchbook": "显示 / 隐藏云端项目", "signIn": "登录", "signInToCloud": "登录 Arduino Cloud", "signOut": "退出登录", @@ -120,9 +121,14 @@ "visitArduinoCloud": "访问 Arduino Cloud 以创建云项目。" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "alreadyExists": "云端项目 '{0}' 已经存在。", + "creating": "正在创建云端项目 '{0}'...", + "new": "新的云端草图", + "notFound": "无法拉取云端项目 '{0}'。它并不存在。", + "pulling": "正在同步远程项目文件夹,拉取“{0}”中...", + "pushing": "同步项目中,正在推送 '{0}'...", + "renaming": "将云端项目从 '{0}' 重命名为 '{1}'...", + "synchronizingSketchbook": "同步项目中..." }, "common": { "all": "全部", @@ -157,6 +163,11 @@ "uninstallMsg": "是否要卸载 {0}?", "version": "版本 {0}" }, + "configuration": { + "cli": { + "inaccessibleDirectory": "无法访问位于 ‘{0}’ 的项目文件夹:{1}。" + } + }, "contributions": { "addFile": "添加文件", "fileAdded": "将一个文件添加到项目中。", @@ -186,7 +197,8 @@ "debugWithMessage": "调试 - {0}", "debuggingNotSupported": "‘{0}’ 不支持调试", "noPlatformInstalledFor": "‘{0}’ 平台未安装", - "optimizeForDebugging": "调试优化" + "optimizeForDebugging": "调试优化", + "sketchIsNotCompiled": "项目 '{0}' 在开始调试会话之前必须经过验证。请验证草图并重新开始调试。你现在要验证草图吗?" }, "dialog": { "dontAskAgain": "不要再请求" @@ -257,9 +269,9 @@ }, "library": { "addZip": "添加 .ZIP 库...", - "arduinoLibraries": "arduino 库", + "arduinoLibraries": "Arduino 库", "contributedLibraries": "贡献库", - "include": "包含库", + "include": "导入库", "installAll": "全部安装", "installLibraryDependencies": "安装库的依赖", "installMissingDependencies": "是否安装所有缺少的依赖?", @@ -293,7 +305,7 @@ "uncategorized": "未分类" }, "libraryType": { - "installed": "安装" + "installed": "已安装" }, "menu": { "advanced": "高级设置", @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "无法连接 websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "新云端项目的名称" }, "portProtocol": { "network": "网络", @@ -323,11 +332,11 @@ "automatic": " 自动调整", "board.certificates": "可上传到开发板的证书列表", "browse": "浏览", - "checkForUpdate": "接收 IDE、开发板和库的可用更新通知。更改后需要重启IDE。默认情况为开启。", + "checkForUpdate": "接收 IDE、开发板和库的可用更新通知。更改后需要重启 IDE。默认情况为开启。", "choose": "选择", "cli.daemonDebug": "启用对 Arduino CLI 的 gRPC 调用的调试记录。该设置需要重新启动 IDE 才能生效。默认不启用。", "cloud.enabled": "True 则启用项目同步功能。默认为 True。", - "cloud.pull.warn": "True 则在拉取cloud项目之前警告用户。默认为 True。", + "cloud.pull.warn": "True 则在拉取 cloud 项目之前警告用户。默认为 True。", "cloud.push.warn": "True 则在推送 cloud 项目之前警告用户。默认为 True。", "cloud.pushpublic.warn": "True 则将公开项目推送到 cloud 中之前警告用户。默认为 True。", "cloud.sketchSyncEndpoint": "用于从后台推送项目的端点。默认情况下,它指向 Arduino Cloud API。", @@ -352,6 +361,7 @@ "manualProxy": "手动配置代理", "network": "网络", "newSketchbookLocation": "选择新的项目文件夹地址", + "noCliConfig": "无法加载 CLI 配置", "noProxy": "无代理", "proxySettings": { "hostname": "主机名", @@ -372,9 +382,12 @@ "verifyAfterUpload": "上传后验证代码", "window.autoScale": "True 则用户界面随字体大小自动缩放。", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "已弃用。请改用“window.zoomLevel”。" } }, + "renameCloudSketch": { + "renameSketchTitle": "云端项目的新名称" + }, "replaceMsg": "是否替换 {0} 的现有版本?", "selectZip": "选择包含要添加的库的 zip 文件", "serial": { @@ -398,13 +411,22 @@ "createdArchive": "已创建存档 ‘{0}’。", "doneCompiling": "编译完成", "doneUploading": "上传完成", + "editInvalidSketchFolderLocationQuestion": "你想试试把项目保存到不同的位置吗?", + "editInvalidSketchFolderQuestion": "你想尝试用不同的名字保存项目吗?", "exportBinary": "导出已编译的二进制文件", + "invalidCloudSketchName": "名称必须以字母或数字开头,后面可以是字母、数字、破折号、点和下划线。最大长度为 36 个字符。", + "invalidSketchFolderLocationDetails": "你不能把一个项目保存到它本身的一个文件夹里。", + "invalidSketchFolderLocationMessage": "无效的项目文件夹位置: '{0}'", + "invalidSketchFolderNameMessage": "无效的项目文件夹名称:'{0}'", + "invalidSketchName": "名称必须以字母或数字开头,后面可以是字母、数字、破折号、点和下划线。最大长度为 63 个字符。", "moving": "移动", "movingMsg": "“{0}” 文件需要位于 “{1}” 项目文件夹中。\n创建此文件夹,移动文件,然后继续?", - "new": "New Sketch", + "new": "新建项目", + "noTrailingPeriod": "文件名不能以点结尾", "openFolder": "打开文件夹", "openRecent": "打开最近", "openSketchInNewWindow": "在新窗口打开项目", + "reservedFilename": "'{0}' 是一个保留的文件名。", "saveFolderAs": "将项目文件夹另存为。。。", "saveSketch": "保存你的项目,以便以后再次打开它。", "saveSketchAs": "将项目文件夹另存为。。。", @@ -421,8 +443,8 @@ "verifyOrCompile": "验证/编译" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "新的云端项目", + "newSketch": "新建项目" }, "survey": { "answerSurvey": "回答问卷", @@ -441,6 +463,17 @@ "cancel": "取消", "enterField": "输入 {0}", "upload": "上传" + }, + "validateSketch": { + "abortFixMessage": "项目仍然是无效的。你想解决剩下的问题吗?通过点击 '{0}',一个新的项目将被打开。", + "abortFixTitle": "无效的项目", + "renameSketchFileMessage": "项目文件 '{0}' 不能使用。{1} 你想现在重新命名项目文件吗?", + "renameSketchFileTitle": "无效的项目文件名", + "renameSketchFolderMessage": "不能使用项目 '{0}'。 '{1}' 要删除此消息,请重命名项目。 现在要重命名项目吗?", + "renameSketchFolderTitle": "无效的项目名" + }, + "workspace": { + "alreadyExists": "'{0}' 已经存在。" } }, "theia": { @@ -460,10 +493,10 @@ "expand": "扩展" }, "workspace": { - "deleteCurrentSketch": "是否要删除当前项目?", + "deleteCloudSketch": "云端项目 '{0}' 将从 Arduino 服务器和本地缓存中被永久删除。这个操作是不可逆的。你想删除当前的项目吗?", + "deleteCurrentSketch": "项目 '{0}' 将被永久删除。这个操作是不可逆的。你想删除当前的项目吗?", "fileNewName": "新文件的名称", "invalidExtension": ".{0} 不是有效扩展名", - "invalidFilename": "无效的文件名。", "newFileName": "文件的新名称" } } diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 64c8d6faf..fd5e14c65 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -1,11 +1,11 @@ { "arduino": { "about": { - "detail": "版本:1{0},日期:2{1},命令列版本:{3}{4}[{5}] {6}", - "label": "關於 1[0]" + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "label": "關於 {0}" }, "board": { - "board": "1{0} 開發板", + "board": "{0} 開發板", "boardConfigDialogTitle": "選擇其他開發板和埠", "boardInfo": "開發板資訊", "boards": "boards", @@ -15,29 +15,30 @@ "disconnected": "斷開連接", "getBoardInfo": "取得開發板資訊", "inSketchbook": "(在草稿資料夾中)", - "installNow": "必須為目前選定的 {2} 開發板安裝 1{0} 2{1} 核心程式,你要現在安裝嗎?", + "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": "選擇其他的電路板或埠...", - "platformMissing": "選擇的'{0}'開發版平台並未安裝", "pleasePickBoard": "請選擇要連接的開發版", - "port": "1{0} 埠", + "port": "{0} 埠", "portLabel": "端口: {0}", "ports": "ports", "programmer": "燒錄器", "reselectLater": "請稍後在選擇", "searchBoard": "搜尋開發板", "selectBoard": "選擇開發版", - "selectBoardForInfo": "請選擇電路板以取得板子的資訊", "selectPortForInfo": "請選定一個埠,以便能取得板子的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", "showAllPorts": "Show all ports", - "succesfullyInstalledPlatform": "平台已成功安裝 1[0]:2[1]", - "succesfullyUninstalledPlatform": "平台已成功移除 1[0]:2[1]", - "typeOfPorts": "{0} ports" + "succesfullyInstalledPlatform": "已成功卸载平台 {0}:{1}", + "succesfullyUninstalledPlatform": "平台已成功移除 {0}:{1}", + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "開發板管理器", "boardsType": { @@ -49,7 +50,7 @@ "doneBurningBootloader": "Bootloader 燒錄完成" }, "burnBootloader": { - "error": "燒錄 1{0} Bootloader 時出現錯誤" + "error": "燒錄 {0} Bootloader 時出現錯誤" }, "certificate": { "addNew": "加入新的", @@ -84,6 +85,7 @@ "cloud": { "account": "帳戶", "chooseSketchVisibility": "選擇草稿的能見度:", + "cloudSketchbook": "雲端草稿資料夾", "connected": "已連接", "continue": "繼續", "donePulling": "完成讀取'{0}'。", @@ -108,10 +110,9 @@ "pushSketch": "更改草稿", "pushSketchMsg": "這是一個公開草稿,在更改前,請確認所有敏感資訊都定義在arduino_secrets.h中。可以在分享介面設定為私人草稿。", "remote": "遠端", - "remoteSketchbook": "遠端資料夾", "share": "分享...", "shareSketch": "分享草稿", - "showHideRemoveSketchbook": "顯示/隱藏遠端草稿資料夾", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "登入", "signInToCloud": "登入Arduino Cloud", "signOut": "登出", @@ -120,9 +121,14 @@ "visitArduinoCloud": "前往Arduino Cloud建立雲端草稿。" }, "cloudSketch": { - "creating": "Creating remote sketch '{0}'...", - "new": "New Remote Sketch", - "synchronizing": "Synchronizing sketchbook, pulling '{0}'..." + "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": "所有", @@ -137,14 +143,14 @@ "processing": "資料處理中", "recommended": "推薦", "retired": "不在支援", - "selectedOn": "在 1{0}", + "selectedOn": "在 {0}", "serialMonitor": "序列埠監控", "type": "類型", "unknown": "未知", "updateable": "可更新" }, "compile": { - "error": "1{0} 編譯錯誤" + "error": "{0} 編譯錯誤" }, "component": { "boardsIncluded": "包含在此包的開發版:", @@ -154,8 +160,13 @@ "installed": "安裝", "moreInfo": "更多資訊", "uninstall": "移除安裝", - "uninstallMsg": "你要移除 1{0}?", - "version": "版本 1{0}" + "uninstallMsg": "你要移除 {0}?", + "version": "版本 {0}" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } }, "contributions": { "addFile": "加入檔案", @@ -186,7 +197,8 @@ "debugWithMessage": "除錯 - {0}", "debuggingNotSupported": "'{0}'不支援除錯。", "noPlatformInstalledFor": "未安裝'{0}'的平台", - "optimizeForDebugging": "除錯最佳化" + "optimizeForDebugging": "除錯最佳化", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "請勿再次請求" @@ -211,7 +223,7 @@ "builtInExamples": "內建範例", "couldNotInitializeExamples": "無法初始內建的範例", "customLibrary": "客製函式庫的範例", - "for": "1 {0} 的範例", + "for": "{0} 的範例", "forAny": "適用各種開發板的範例", "menu": "範例" }, @@ -265,16 +277,16 @@ "installMissingDependencies": "是否安裝所有缺少的附屬程式?", "installOneMissingDependency": "是否安裝缺少的附屬程式?", "installWithoutDependencies": "Install without dependencies", - "installedSuccessfully": "成功安裝 1{0}:2{1} 函式庫", + "installedSuccessfully": "成功安裝 {0}:{1} 函式庫", "libraryAlreadyExists": "函式庫已經存在,你要覆寫它嗎?", "manageLibraries": "管理函式庫", - "namedLibraryAlreadyExists": "函式庫的資料夾名稱 1{0} 已經存在,你要覆寫它嗎?", + "namedLibraryAlreadyExists": "函式庫的資料夾名稱 {0} 已經存在,你要覆寫它嗎?", "needsMultipleDependencies": "函式庫{0}:{1}需要一些未安装的附屬程式:", "needsOneDependency": "函式庫{0}:{1}需要一些未安装的附屬程式:", "overwriteExistingLibrary": "你要覆寫既有的函式庫嗎?", - "successfullyInstalledZipLibrary": "從 1{0} 歸檔成功安裝函式庫", + "successfullyInstalledZipLibrary": "從 {0} 歸檔成功安裝函式庫", "title": "函式庫管理器", - "uninstalledSuccessfully": "成功移除安裝的 1{0}:2{1} 函式庫", + "uninstalledSuccessfully": "成功移除安裝的 {0}:{1} 函式庫", "zipLibrary": "函式庫" }, "librarySearchProperty": { @@ -305,10 +317,7 @@ "unableToConnectToWebSocket": "無法連接到 websocket" }, "newCloudSketch": { - "invalidSketchName": "The name must consist of basic letters, numbers, or underscores. The maximum length is 36 characters.", - "newSketchTitle": "Name of a new Remote Sketch", - "notFound": "Could not pull the remote sketch '{0}'. It does not exist.", - "sketchAlreadyExists": "Remote sketch '{0}' already exists." + "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { "network": "網路", @@ -352,6 +361,7 @@ "manualProxy": "手動設置代理", "network": "網路", "newSketchbookLocation": "選取新的草稿資料夾位置", + "noCliConfig": "Could not load the CLI configuration", "noProxy": "無代理", "proxySettings": { "hostname": "Host name", @@ -375,7 +385,10 @@ "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." } }, - "replaceMsg": "取代 1{0} 的現有版本?", + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "取代 {0} 的現有版本?", "selectZip": "選擇要加入函示庫的zip檔案", "serial": { "autoscroll": "自動滾頁面", @@ -398,13 +411,22 @@ "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 or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "移動", "movingMsg": "\"{0}\"必須在命名為\"{1}\"的草稿資料夾中。建立這個資料夾,移動草稿並繼續?", "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "打開資料夾", "openRecent": "開啟最近的", "openSketchInNewWindow": "在新視窗開啟草稿", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "另存 Sketch 資料夾", "saveSketch": "保存您的項目,以便以後再次打開它。", "saveSketchAs": "另存 Sketch 資料夾", @@ -421,7 +443,7 @@ "verifyOrCompile": "驗證/編譯" }, "sketchbook": { - "newRemoteSketch": "New Remote Sketch", + "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, "survey": { @@ -435,12 +457,23 @@ "updatePackageIndex": "Update Package Index" }, "upload": { - "error": "1 [0] 錯誤:2 [1]" + "error": "{0} 錯誤:{1}" }, "userFields": { "cancel": "取消", "enterField": "輸入 {0}", "upload": "上傳" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "workspace": { + "alreadyExists": "'{0}' already exists." } }, "theia": { @@ -453,17 +486,17 @@ "quitTitle": "你確定要退出嗎?" }, "editor": { - "unsavedTitle": "1[0] –尚未儲存" + "unsavedTitle": "{0} – 尚未儲存" }, "messages": { "collapse": "崩潰", "expand": "延伸" }, "workspace": { - "deleteCurrentSketch": "你要刪除現行的草稿嗎?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "給予檔案新名稱", "invalidExtension": ".{0} 不是合法的副檔名", - "invalidFilename": "不合法的檔案名稱", "newFileName": "給予檔案新名稱" } } From f3d3d40c75f27b335beb884c7902dd50dbdc1bd2 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 27 Feb 2023 08:19:19 -0800 Subject: [PATCH 155/384] Bump version metadata post release On every startup, Arduino IDE checks for new versions of the IDE. If a newer version is available, a notification/dialog is shown offering an update. "Newer" is determined by comparing the version of the user's IDE to the latest available version on the update channel. This comparison is done according to the Semantic Versioning Specification ("SemVer"). In order to facilitate beta testing, builds are generated of the Arduino IDE at the current stage in development. These builds are given an identifying version of the following form: - -snapshot- - builds generated for every push and pull request that modifies relevant files - -nightly- - daily builds of the tip of the default branch In order to cause these builds to be correctly considered "newer" than the release version, the version metadata must be bumped immediately following each release. This will also serve as the metadata bump for the next release in the event that release is a minor release. In case it is instead a minor or major release, the version metadata will need to be updated once more before the release tag is created. --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index dd2959470..ad52691c0 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.0.4", + "version": "2.0.5", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 0c210263f..1ffc8860b 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.0.4", + "version": "2.0.5", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "1.31.1", "@theia/terminal": "1.31.1", "@theia/workspace": "1.31.1", - "arduino-ide-extension": "2.0.4" + "arduino-ide-extension": "2.0.5" }, "devDependencies": { "@theia/cli": "1.31.1", diff --git a/package.json b/package.json index 760e2a72d..8267afa70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.0.4", + "version": "2.0.5", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From bfec85c352a9a889f29dcc6af7beb6cfbd35353b Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 27 Feb 2023 14:26:46 +0100 Subject: [PATCH 156/384] fix: no unnecessary tree update on mouse over/out Closes #1766 Signed-off-by: Akos Kitta --- .../src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx | 1 - 1 file changed, 1 deletion(-) 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 1c3323227..ece7a1a20 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 @@ -116,7 +116,6 @@ export class SketchbookTreeWidget extends FileTreeWidget { protected hoveredNodeId: string | undefined; protected setHoverNodeId(id: string | undefined): void { this.hoveredNodeId = id; - this.update(); } protected override createNodeAttributes( From 77213507fbdd9467439e28daf790e41aa953b53f Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 22 Feb 2023 16:11:09 +0100 Subject: [PATCH 157/384] fix: encoding when reading a cloud sketch Closes #449 Closes #634 Signed-off-by: Akos Kitta --- .../src/browser/create/create-api.ts | 48 ++----------------- .../src/browser/create/create-fs-provider.ts | 3 +- arduino-ide-extension/src/common/utils.ts | 11 +++++ 3 files changed, 16 insertions(+), 46 deletions(-) diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 536e7f4bc..4c988f5df 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -2,6 +2,7 @@ import { MaybePromise } from '@theia/core/lib/common/types'; import { inject, injectable } from '@theia/core/shared/inversify'; import { fetch } from 'cross-fetch'; import { SketchesService } from '../../common/protocol'; +import { unit8ArrayToString } from '../../common/utils'; import { ArduinoPreferences } from '../arduino-preferences'; import { AuthenticationClientService } from '../auth/authentication-client-service'; import { SketchCache } from '../widgets/cloud-sketchbook/cloud-sketch-cache'; @@ -19,49 +20,6 @@ export namespace ResponseResultProvider { export const JSON: ResponseResultProvider = (response) => response.json(); } -// TODO: check if this is still needed: https://github.com/electron/electron/issues/18733 -// The original issue was reported for Electron 5.x and 6.x. Theia uses 15.x -export function Utf8ArrayToStr(array: Uint8Array): string { - let out, i, c; - let char2, char3; - - out = ''; - const len = array.length; - i = 0; - while (i < len) { - c = array[i++]; - switch (c >> 4) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - // 0xxxxxxx - out += String.fromCharCode(c); - break; - case 12: - case 13: - // 110x xxxx 10xx xxxx - char2 = array[i++]; - out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f)); - break; - case 14: - // 1110 xxxx 10xx xxxx 10xx xxxx - char2 = array[i++]; - char3 = array[i++]; - out += String.fromCharCode( - ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0) - ); - break; - } - } - - return out; -} - type ResourceType = 'f' | 'd'; @injectable() @@ -333,7 +291,7 @@ export class CreateApi { // parse the secret file const secrets = ( - typeof content === 'string' ? content : Utf8ArrayToStr(content) + typeof content === 'string' ? content : unit8ArrayToString(content) ) .split(/\r?\n/) .reduce((prev, curr) => { @@ -397,7 +355,7 @@ export class CreateApi { const headers = await this.headers(); let data: string = - typeof content === 'string' ? content : Utf8ArrayToStr(content); + typeof content === 'string' ? content : unit8ArrayToString(content); data = await this.toggleSecretsInclude(posixPath, data, 'remove'); const payload = { data: btoa(data) }; diff --git a/arduino-ide-extension/src/browser/create/create-fs-provider.ts b/arduino-ide-extension/src/browser/create/create-fs-provider.ts index 41ef5ab04..7908d0556 100644 --- a/arduino-ide-extension/src/browser/create/create-fs-provider.ts +++ b/arduino-ide-extension/src/browser/create/create-fs-provider.ts @@ -29,6 +29,7 @@ import { CreateUri } from './create-uri'; import { SketchesService } from '../../common/protocol'; import { ArduinoPreferences } from '../arduino-preferences'; import { Create } from './typings'; +import { stringToUint8Array } from '../../common/utils'; @injectable() export class CreateFsProvider @@ -154,7 +155,7 @@ export class CreateFsProvider async readFile(uri: URI): Promise { const content = await this.getCreateApi.readFile(uri.path.toString()); - return new TextEncoder().encode(content); + return stringToUint8Array(content); } async writeFile( diff --git a/arduino-ide-extension/src/common/utils.ts b/arduino-ide-extension/src/common/utils.ts index 3fbf98be9..994e02ec0 100644 --- a/arduino-ide-extension/src/common/utils.ts +++ b/arduino-ide-extension/src/common/utils.ts @@ -20,3 +20,14 @@ export function startsWithUpperCase(what: string): boolean { export function isNullOrUndefined(what: unknown): what is undefined | null { return what === undefined || what === null; } + +// Text encoder can crash in electron browser: https://github.com/arduino/arduino-ide/issues/634#issuecomment-1440039171 +export function unit8ArrayToString(uint8Array: Uint8Array): string { + return uint8Array.reduce( + (text, byte) => text + String.fromCharCode(byte), + '' + ); +} +export function stringToUint8Array(text: string): Uint8Array { + return Uint8Array.from(text, (char) => char.charCodeAt(0)); +} From fa9777e529b36c82a3a8bb9456782cb431c60f23 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 3 Mar 2023 08:41:05 +0100 Subject: [PATCH 158/384] fix: scroll to the bottom after the state update Closes #1736 Signed-off-by: Akos Kitta --- .../serial/monitor/serial-monitor-send-output.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx index 136180202..12142f654 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx @@ -65,11 +65,13 @@ export class SerialMonitorOutput extends React.Component< this.state.charCount ); const [lines, charCount] = truncateLines(newLines, totalCharCount); - this.setState({ - lines, - charCount, - }); - this.scrollToBottom(); + this.setState( + { + lines, + charCount, + }, + () => this.scrollToBottom() + ); }), this.props.clearConsoleEvent(() => this.setState({ lines: [], charCount: 0 }) From 24dc0bbc88bcfd083e03b0c8601cffb08e8d5728 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 3 Mar 2023 09:17:16 +0100 Subject: [PATCH 159/384] fix: update monitor output after widget show Closes #1724 Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-widget.tsx | 5 +++++ .../monitor/serial-monitor-send-output.tsx | 16 +++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index a5a25230c..ec83f5a0a 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -117,6 +117,11 @@ export class MonitorWidget extends ReactWidget { (this.focusNode || this.node).focus(); } + protected override onAfterShow(msg: Message): void { + super.onAfterShow(msg); + this.update(); + } + protected onFocusResolved = (element: HTMLElement | undefined) => { if (this.closing || !this.isAttached) { return; diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx index 12142f654..2ddd2c565 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx @@ -17,7 +17,7 @@ export class SerialMonitorOutput extends React.Component< * Do not touch it. It is used to be able to "follow" the serial monitor log. */ protected toDisposeBeforeUnmount = new DisposableCollection(); - private listRef: React.RefObject; + private listRef: React.RefObject; constructor(props: Readonly) { super(props); @@ -34,12 +34,10 @@ export class SerialMonitorOutput extends React.Component< { + private readonly scrollToBottom = () => { if (this.listRef.current && this.props.monitorModel.autoscroll) { this.listRef.current.scrollToItem(this.state.lines.length, 'end'); } - }).bind(this); + }; } const _Row = ({ From fb10de1446c7d3ed93a7bb30a0404ffbdc01f4a3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 10 Mar 2023 13:55:34 +0100 Subject: [PATCH 160/384] fix: jsonc parsing in the IDE2 backend Occurred when `settings.json` contained comments or a trailing comma. Closes #1945 Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 1 + .../src/node/arduino-daemon-impl.ts | 38 ++++--------- .../src/node/arduino-ide-backend-module.ts | 3 ++ .../src/node/settings-reader.ts | 53 +++++++++++++++++++ .../src/node/sketches-service-impl.ts | 33 ++---------- .../src/test/node/settings.reader.test.ts | 45 ++++++++++++++++ .../src/test/node/test-bindings.ts | 2 + 7 files changed, 118 insertions(+), 57 deletions(-) create mode 100644 arduino-ide-extension/src/node/settings-reader.ts create mode 100644 arduino-ide-extension/src/test/node/settings.reader.test.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index ad52691c0..11a8a6a3f 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -78,6 +78,7 @@ "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", "js-yaml": "^3.13.1", + "jsonc-parser": "^2.2.0", "just-diff": "^5.1.1", "jwt-decode": "^3.1.2", "keytar": "7.2.0", diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 3f2480d07..ec0e0cc31 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -1,5 +1,4 @@ import { join } from 'path'; -import { promises as fs } from 'fs'; import { inject, injectable, named } from '@theia/core/shared/inversify'; import { spawn, ChildProcess } from 'child_process'; import { FileUri } from '@theia/core/lib/node/file-uri'; @@ -16,7 +15,7 @@ import { BackendApplicationContribution } from '@theia/core/lib/node/backend-app import { ArduinoDaemon, NotificationServiceServer } from '../common/protocol'; import { CLI_CONFIG } from './cli-config'; import { getExecPath } from './exec-util'; -import { ErrnoException } from './utils/errors'; +import { SettingsReader } from './settings-reader'; @injectable() export class ArduinoDaemonImpl @@ -32,6 +31,9 @@ export class ArduinoDaemonImpl @inject(NotificationServiceServer) private readonly notificationService: NotificationServiceServer; + @inject(SettingsReader) + private readonly settingsReader: SettingsReader; + private readonly toDispose = new DisposableCollection(); private readonly onDaemonStartedEmitter = new Emitter(); private readonly onDaemonStoppedEmitter = new Emitter(); @@ -149,34 +151,12 @@ export class ArduinoDaemonImpl } private async debugDaemon(): Promise { - // Poor man's preferences on the backend. (https://github.com/arduino/arduino-ide/issues/1056#issuecomment-1153975064) - const configDirUri = await this.envVariablesServer.getConfigDirUri(); - const configDirPath = FileUri.fsPath(configDirUri); - try { - const raw = await fs.readFile(join(configDirPath, 'settings.json'), { - encoding: 'utf8', - }); - const json = this.tryParse(raw); - if (json) { - const value = json['arduino.cli.daemon.debug']; - return typeof value === 'boolean' && !!value; - } - return false; - } catch (error) { - if (ErrnoException.isENOENT(error)) { - return false; - } - throw error; - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private tryParse(raw: string): any | undefined { - try { - return JSON.parse(raw); - } catch { - return undefined; + const settings = await this.settingsReader.read(); + if (settings) { + const value = settings['arduino.cli.daemon.debug']; + return value === true; } + return false; } protected async spawnDaemonProcess(): Promise<{ 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 812761f77..5cd81f7c3 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -118,6 +118,7 @@ import { LocalDirectoryPluginDeployerResolverWithFallback, PluginDeployer_GH_12064, } from './theia/plugin-ext/plugin-deployer'; +import { SettingsReader } from './settings-reader'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -403,6 +404,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .toSelf() .inSingletonScope(); rebind(PluginDeployer).to(PluginDeployer_GH_12064).inSingletonScope(); + + bind(SettingsReader).toSelf().inSingletonScope(); }); function bindChildLogger(bind: interfaces.Bind, name: string): void { diff --git a/arduino-ide-extension/src/node/settings-reader.ts b/arduino-ide-extension/src/node/settings-reader.ts new file mode 100644 index 000000000..d6ab15811 --- /dev/null +++ b/arduino-ide-extension/src/node/settings-reader.ts @@ -0,0 +1,53 @@ +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { FileUri } from '@theia/core/lib/node/file-uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { promises as fs } from 'fs'; +import { + parse as parseJsonc, + ParseError, + printParseErrorCode, +} from 'jsonc-parser'; +import { join } from 'path'; +import { ErrnoException } from './utils/errors'; + +// Poor man's preferences on the backend. (https://github.com/arduino/arduino-ide/issues/1056#issuecomment-1153975064) +@injectable() +export class SettingsReader { + @inject(EnvVariablesServer) + private readonly envVariableServer: EnvVariablesServer; + + async read(): Promise | undefined> { + const configDirUri = await this.envVariableServer.getConfigDirUri(); + const configDirPath = FileUri.fsPath(configDirUri); + const settingsPath = join(configDirPath, 'settings.json'); + try { + const raw = await fs.readFile(settingsPath, { encoding: 'utf8' }); + return parse(raw); + } catch (err) { + if (ErrnoException.isENOENT(err)) { + return undefined; + } + } + } +} + +export function parse(raw: string): Record | undefined { + const errors: ParseError[] = []; + const settings = + parseJsonc(raw, errors, { + allowEmptyContent: true, + allowTrailingComma: true, + disallowComments: false, + }) ?? {}; + if (errors.length) { + console.error('Detected JSONC parser errors:'); + console.error('----- CONTENT START -----'); + console.error(raw); + console.error('----- CONTENT END -----'); + errors.forEach(({ error, offset }) => + console.error(` - ${printParseErrorCode(error)} at ${offset}`) + ); + return undefined; + } + return typeof settings === 'object' ? settings : undefined; +} diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 42ca3e9a3..f4ff29db2 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -43,6 +43,7 @@ import { firstToUpperCase, startsWithUpperCase, } from '../common/utils'; +import { SettingsReader } from './settings-reader'; const RecentSketches = 'recent-sketches.json'; const DefaultIno = `void setup() { @@ -86,6 +87,9 @@ export class SketchesServiceImpl @inject(IsTempSketch) private readonly isTempSketch: IsTempSketch; + @inject(SettingsReader) + private readonly settingsReader: SettingsReader; + async getSketches({ uri }: { uri?: string }): Promise { const root = await this.root(uri); if (!root) { @@ -631,38 +635,11 @@ export class SketchesServiceImpl return crypto.createHash('md5').update(path).digest('hex').toUpperCase(); } - // Returns the default.ino from the settings or from default folder. - private async readSettings(): Promise | undefined> { - const configDirUri = await this.envVariableServer.getConfigDirUri(); - const configDirPath = FileUri.fsPath(configDirUri); - - try { - const raw = await fs.readFile(join(configDirPath, 'settings.json'), { - encoding: 'utf8', - }); - - return this.tryParse(raw); - } catch (err) { - if (ErrnoException.isENOENT(err)) { - return undefined; - } - throw err; - } - } - - private tryParse(raw: string): Record | undefined { - try { - return JSON.parse(raw); - } catch { - return undefined; - } - } - // Returns the default.ino from the settings or from default folder. private async loadInoContent(): Promise { if (!this.inoContent) { this.inoContent = new Deferred(); - const settings = await this.readSettings(); + const settings = await this.settingsReader.read(); if (settings) { const inoBlueprintPath = settings['arduino.sketch.inoBlueprint']; if (inoBlueprintPath && typeof inoBlueprintPath === 'string') { diff --git a/arduino-ide-extension/src/test/node/settings.reader.test.ts b/arduino-ide-extension/src/test/node/settings.reader.test.ts new file mode 100644 index 000000000..65e6b7a7e --- /dev/null +++ b/arduino-ide-extension/src/test/node/settings.reader.test.ts @@ -0,0 +1,45 @@ +import { expect } from 'chai'; +import { parse } from '../../node/settings-reader'; + +describe('settings-reader', () => { + describe('parse', () => { + it('should handle comments', () => { + const actual = parse(` +{ + "alma": "korte", + // comment + "szilva": false +}`); + expect(actual).to.be.deep.equal({ + alma: 'korte', + szilva: false, + }); + }); + + it('should handle trailing comma', () => { + const actual = parse(` +{ + "alma": "korte", + "szilva": 123, +}`); + expect(actual).to.be.deep.equal({ + alma: 'korte', + szilva: 123, + }); + }); + + it('should parse empty', () => { + const actual = parse(''); + expect(actual).to.be.deep.equal({}); + }); + + it('should parse to undefined when parse has failed', () => { + const actual = parse(` +{ + alma:: 'korte' + trash +}`); + expect(actual).to.be.undefined; + }); + }); +}); diff --git a/arduino-ide-extension/src/test/node/test-bindings.ts b/arduino-ide-extension/src/test/node/test-bindings.ts index 1aef2ff72..19b99f3a3 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/test-bindings.ts @@ -51,6 +51,7 @@ import { MonitorServiceFactory, MonitorServiceFactoryOptions, } 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'; @@ -277,6 +278,7 @@ export function createBaseContainer( bind(IsTempSketch).toSelf().inSingletonScope(); bind(SketchesServiceImpl).toSelf().inSingletonScope(); bind(SketchesService).toService(SketchesServiceImpl); + bind(SettingsReader).toSelf().inSingletonScope(); if (containerCustomizations) { containerCustomizations(bind, rebind); } From d398ed13455428c5f1bbd12bdb98151572014831 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 12 Mar 2023 17:40:36 -0700 Subject: [PATCH 161/384] Add bundled tools version check step to release procedure The Arduino IDE release includes several tool dependencies. Unstable versions of these tools may be pinned provisionally for use with the development version of Arduino IDE, but production releases of Arduino IDE must use production releases of the tool dependencies. The release manager should check the tool versions before making a release, but previously this step was not mentioned in the release procedure documentation. --- docs/internal/release-procedure.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/internal/release-procedure.md b/docs/internal/release-procedure.md index 12afe0e26..fa043bf28 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -14,7 +14,15 @@ It will be shown in these search results: https://github.com/arduino/arduino-ide/pulls/app%2Fgithub-actions -### 2. 👀 Check version of packages +### 2. 🛠️ Check bundled tool versions + +The Arduino IDE release includes several tool dependencies. Unstable versions of these tools may be pinned provisionally for use with the development version of Arduino IDE, but production releases of Arduino IDE must use production releases of the tool dependencies. + +The tool versions are defined in the `arduino` object of [`arduino-ide-extension/package.json`](../../arduino-ide-extension/package.json). + +If any of the tools are pinned to a development version, ensure a suitable production release of the tool is available and then submit a PR to update the version in `arduino-ide-extension/package.json`. + +### 3. 👀 Check version of packages The [`version` field](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#version) of the project's `package.json` metadata files received a patch version bump (e.g., `2.0.1` -> `2.0.2`) at the time of the previous release. @@ -31,7 +39,7 @@ 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`. -### 3. 🚢 Create the release on GitHub +### 4. 🚢 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). @@ -46,13 +54,13 @@ 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. -### 4. ⬆️ Bump version metadata of packages +### 5. ⬆️ 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). -### 5. 📄 Create the changelog +### 6. 📄 Create the changelog **Create GitHub issues for the known issues** that we haven't solved in the current release: @@ -71,7 +79,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. -### 6. ✎ Update the "**Software**" Page +### 7. ✎ 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. @@ -88,7 +96,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 -### 7. 😎 Brag about it +### 8. 😎 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).
From ec24b6813da2fcdd252ae4b05e31335d009e3094 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 10 Mar 2023 13:07:25 +0100 Subject: [PATCH 162/384] fix: use text `--format` for the CLI `Can't write debug log: available only in text format` error is thrown by the CLI if the `--debug` flag is present. Ref: arduino/arduino-cli#2003 Closes #1942 Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 6 +- .../src/node/arduino-daemon-impl.ts | 41 ++-- .../cli/commands/v1/commands_grpc_pb.js | 2 - .../arduino/cli/commands/v1/commands_pb.d.ts | 32 +++ .../cc/arduino/cli/commands/v1/commands_pb.js | 193 ++++++++++++++++++ .../cc/arduino/cli/commands/v1/core_pb.d.ts | 17 ++ .../cc/arduino/cli/commands/v1/core_pb.js | 123 +++++++++++ 7 files changed, 389 insertions(+), 25 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 11a8a6a3f..393eb1380 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -164,7 +164,11 @@ ], "arduino": { "cli": { - "version": "0.31.0" + "version": { + "owner": "arduino", + "repo": "arduino-cli", + "commitish": "6992de7" + } }, "fwuploader": { "version": "2.2.2" diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index ec0e0cc31..327544555 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -136,8 +136,6 @@ export class ArduinoDaemonImpl const cliConfigPath = join(FileUri.fsPath(configDirUri), CLI_CONFIG); const args = [ 'daemon', - '--format', - 'jsonmini', '--port', '0', '--config-file', @@ -177,26 +175,6 @@ export class ArduinoDaemonImpl daemon.stdout.on('data', (data) => { const message = data.toString(); - - let port = ''; - let address = ''; - message - .split('\n') - .filter((line: string) => line.length) - .forEach((line: string) => { - try { - const parsedLine = JSON.parse(line); - if ('Port' in parsedLine) { - port = parsedLine.Port; - } - if ('IP' in parsedLine) { - address = parsedLine.IP; - } - } catch (err) { - // ignore - } - }); - this.onData(message); if (!grpcServerIsReady) { const error = DaemonError.parse(message); @@ -205,6 +183,25 @@ export class ArduinoDaemonImpl return; } + let port = ''; + let address = ''; + message + .split('\n') + .filter((line: string) => line.length) + .forEach((line: string) => { + try { + const parsedLine = JSON.parse(line); + if ('Port' in parsedLine) { + port = parsedLine.Port; + } + if ('IP' in parsedLine) { + address = parsedLine.IP; + } + } catch (err) { + // ignore + } + }); + if (port.length && address.length) { grpcServerIsReady = true; ready.resolve({ daemon, port }); 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 887ef6b04..49ec3d019 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 @@ -1333,5 +1333,3 @@ enumerateMonitorPortSettings: { }, }; -// BOOTSTRAP COMMANDS -// ------------------- diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts index ecfeeb4ff..fc1c8b525 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 @@ -172,6 +172,31 @@ 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; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: FailedInstanceInitError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): FailedInstanceInitError; + static deserializeBinaryFromReader(message: FailedInstanceInitError, reader: jspb.BinaryReader): FailedInstanceInitError; +} + +export namespace FailedInstanceInitError { + export type AsObject = { + reason: FailedInstanceInitReason, + message: string, + } +} + export class DestroyRequest extends jspb.Message { hasInstance(): boolean; @@ -528,3 +553,10 @@ export namespace ArchiveSketchResponse { export type AsObject = { } } + +export enum FailedInstanceInitReason { + FAILED_INSTANCE_INIT_REASON_UNSPECIFIED = 0, + FAILED_INSTANCE_INIT_REASON_INVALID_INDEX_URL = 1, + FAILED_INSTANCE_INIT_REASON_INDEX_LOAD_ERROR = 2, + FAILED_INSTANCE_INIT_REASON_TOOL_LOAD_ERROR = 3, +} 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 9d688b4f4..62c15ec81 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 @@ -37,6 +37,8 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateRequest', null, global goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DestroyRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DestroyResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.FailedInstanceInitError', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitResponse.MessageCase', null, global); @@ -156,6 +158,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.InitResponse.Progress.displayName = 'proto.cc.arduino.cli.commands.v1.InitResponse.Progress'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.FailedInstanceInitError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.displayName = 'proto.cc.arduino.cli.commands.v1.FailedInstanceInitError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -1398,6 +1421,166 @@ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.hasProfile = function() +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.FailedInstanceInitError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.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.FailedInstanceInitError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.toObject = function(includeInstance, msg) { + var f, obj = { + reason: jspb.Message.getFieldWithDefault(msg, 1, 0), + message: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.FailedInstanceInitError; + return proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} */ (reader.readEnum()); + msg.setReason(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.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.FailedInstanceInitError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getReason(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional FailedInstanceInitReason reason = 1; + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.getReason = function() { + return /** @type {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason} value + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} returns this + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.setReason = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.FailedInstanceInitError} returns this + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitError.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -3699,4 +3882,14 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter = }; +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason = { + FAILED_INSTANCE_INIT_REASON_UNSPECIFIED: 0, + FAILED_INSTANCE_INIT_REASON_INVALID_INDEX_URL: 1, + FAILED_INSTANCE_INIT_REASON_INDEX_LOAD_ERROR: 2, + FAILED_INSTANCE_INIT_REASON_TOOL_LOAD_ERROR: 3 +}; + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts index 30792fd12..dc8d8b97c 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 @@ -82,6 +82,23 @@ export namespace PlatformInstallResponse { } } +export class PlatformLoadingError extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PlatformLoadingError.AsObject; + static toObject(includeInstance: boolean, msg: PlatformLoadingError): PlatformLoadingError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: PlatformLoadingError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformLoadingError; + static deserializeBinaryFromReader(message: PlatformLoadingError, reader: jspb.BinaryReader): PlatformLoadingError; +} + +export namespace PlatformLoadingError { + export type AsObject = { + } +} + export class PlatformDownloadRequest extends jspb.Message { hasInstance(): boolean; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js index 093656172..f1f3b7793 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 @@ -24,6 +24,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallRequest', nul goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformListRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformListResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformLoadingError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest', null, global); @@ -72,6 +73,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformInstallResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformLoadingError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformLoadingError.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformLoadingError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -809,6 +831,107 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.hasTaskProgre +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.PlatformLoadingError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformLoadingError.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.PlatformLoadingError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformLoadingError; + return proto.cc.arduino.cli.commands.v1.PlatformLoadingError.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformLoadingError.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformLoadingError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformLoadingError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. From 58aac236bf51532313db1855298294348c0abeb0 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 12 Mar 2023 20:48:47 -0700 Subject: [PATCH 163/384] Allow leading underscore in sketch filenames The Arduino Sketch Specification defines the allowed format of sketch folder names and sketch code filenames. Arduino IDE enforces compliance with the specification in order to ensure sketches created with Arduino IDE can be used with any other Arduino development tool. The Arduino Sketch Specification has been changed to allow a leading underscore in sketch folder names and sketch code filenames so IDE's sketch name validation must be updated accordingly. --- .../src/common/protocol/sketches-service.ts | 20 ++++-------- .../test/browser/workspace-commands.test.ts | 10 +++--- .../src/test/common/sketches-service.test.ts | 32 ++++++++----------- i18n/en.json | 4 +-- 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index df25a34f3..7953be720 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -157,8 +157,6 @@ export namespace Sketch { // (non-API) exported for the tests export const defaultSketchFolderName = 'sketch'; // (non-API) exported for the tests - export const defaultFallbackFirstChar = '0'; - // (non-API) exported for the tests export const defaultFallbackChar = '_'; // (non-API) exported for the tests export function reservedFilename(name: string): string { @@ -176,11 +174,11 @@ export namespace Sketch { // (non-API) exported for the tests export const invalidSketchFolderNameMessage = nls.localize( 'arduino/sketch/invalidSketchName', - 'The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.' + 'The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.' ); const invalidCloudSketchFolderNameMessage = nls.localize( 'arduino/sketch/invalidCloudSketchName', - 'The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.' + 'The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.' ); /** * `undefined` if the candidate sketch folder name is valid. Otherwise, the validation error message. @@ -193,7 +191,7 @@ export namespace Sketch { if (validFilenameError) { return validFilenameError; } - return /^[0-9a-zA-Z]{1}[0-9a-zA-Z_\.-]{0,62}$/.test(candidate) + return /^[0-9a-zA-Z_]{1}[0-9a-zA-Z_\.-]{0,62}$/.test(candidate) ? undefined : invalidSketchFolderNameMessage; } @@ -208,7 +206,7 @@ export namespace Sketch { if (validFilenameError) { return validFilenameError; } - return /^[0-9a-zA-Z]{1}[0-9a-zA-Z_\.-]{0,35}$/.test(candidate) + return /^[0-9a-zA-Z_]{1}[0-9a-zA-Z_\.-]{0,35}$/.test(candidate) ? undefined : invalidCloudSketchFolderNameMessage; } @@ -252,10 +250,7 @@ export namespace Sketch { return defaultSketchFolderName; } const validName = candidate - ? candidate - .replace(/^[^0-9a-zA-Z]{1}/g, defaultFallbackFirstChar) - .replace(/[^0-9a-zA-Z_]/g, defaultFallbackChar) - .slice(0, 63) + ? candidate.replace(/[^0-9a-zA-Z_]/g, defaultFallbackChar).slice(0, 63) : defaultSketchFolderName; if (appendTimestampSuffix) { return `${validName.slice(0, 63 - timestampSuffixLength)}${ @@ -283,10 +278,7 @@ export namespace Sketch { return defaultSketchFolderName; } return candidate - ? candidate - .replace(/^[^0-9a-zA-Z]{1}/g, defaultFallbackFirstChar) - .replace(/[^0-9a-zA-Z_]/g, defaultFallbackChar) - .slice(0, 36) + ? candidate.replace(/[^0-9a-zA-Z_]/g, defaultFallbackChar).slice(0, 36) : defaultSketchFolderName; } 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 234515e76..0676ed77a 100644 --- a/arduino-ide-extension/src/test/browser/workspace-commands.test.ts +++ b/arduino-ide-extension/src/test/browser/workspace-commands.test.ts @@ -171,22 +171,22 @@ describe('workspace-commands', () => { }); it('code files cannot start with number (no extension)', async () => { - const actual = await testMe('_invalid'); + const actual = await testMe('-invalid'); expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); }); it('code files cannot start with number (trailing dot)', async () => { - const actual = await testMe('_invalid.'); + const actual = await testMe('-invalid.'); expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); }); it('code files cannot start with number (trailing dot)', async () => { - const actual = await testMe('_invalid.cpp'); + const actual = await testMe('-invalid.cpp'); expect(actual).to.be.equal(Sketch.invalidSketchFolderNameMessage); }); it('should warn about invalid extension first', async () => { - const actual = await testMe('_invalid.xxx'); + const actual = await testMe('-invalid.xxx'); expect(actual).to.be.equal(invalidExtensionMessage('.xxx')); }); @@ -196,7 +196,7 @@ describe('workspace-commands', () => { }); it('should ignore non-code filename validation from the spec', async () => { - const actual = await testMe('_invalid.json'); + const actual = await testMe('-invalid.json'); expect(actual).to.be.empty; }); diff --git a/arduino-ide-extension/src/test/common/sketches-service.test.ts b/arduino-ide-extension/src/test/common/sketches-service.test.ts index 917155e58..ae9f2481c 100644 --- a/arduino-ide-extension/src/test/common/sketches-service.test.ts +++ b/arduino-ide-extension/src/test/common/sketches-service.test.ts @@ -43,7 +43,7 @@ describe('sketch', () => { ['trailing.dots...', false], ['no.trailing.dots.._', true], ['No Spaces', false], - ['_invalidToStartWithUnderscore', false], + ['_validToStartWithUnderscore', true], ['Invalid+Char.ino', false], ['', false], ['/', false], @@ -81,7 +81,7 @@ describe('sketch', () => { ['can.contain.dots', true], ['-cannot-start-with-dash', false], ['.cannot.start.with.dash', false], - ['_cannot_start_with_underscore', false], + ['_can_start_with_underscore', true], ['No Spaces', false], ['Invalid+Char.ino', false], ['', false], @@ -108,14 +108,14 @@ describe('sketch', () => { describe('toValidSketchFolderName', () => { [ ['', Sketch.defaultSketchFolderName], - [' ', Sketch.defaultFallbackFirstChar], - [' ', Sketch.defaultFallbackFirstChar + Sketch.defaultFallbackChar], + [' ', Sketch.defaultFallbackChar], + [' ', Sketch.defaultFallbackChar + Sketch.defaultFallbackChar], [ '0123456789012345678901234567890123456789012345678901234567890123', '012345678901234567890123456789012345678901234567890123456789012', ], ['foo bar', 'foo_bar'], - ['_foobar', '0foobar'], + ['-foobar', '_foobar'], ['vAlid', 'vAlid'], ['COM1', Sketch.defaultSketchFolderName], ['COM1.', 'COM1_'], @@ -130,20 +130,18 @@ describe('sketch', () => { const epochSuffix = Sketch.timestampSuffix(epoch); [ ['', Sketch.defaultSketchFolderName + epochSuffix], - [' ', Sketch.defaultFallbackFirstChar + epochSuffix], + [' ', Sketch.defaultFallbackChar + epochSuffix], [ ' ', - Sketch.defaultFallbackFirstChar + - Sketch.defaultFallbackChar + - epochSuffix, + Sketch.defaultFallbackChar + Sketch.defaultFallbackChar + epochSuffix, ], [ '0123456789012345678901234567890123456789012345678901234567890123', '0123456789012345678901234567890123456789012' + epochSuffix, ], ['foo bar', 'foo_bar' + epochSuffix], - ['.foobar', '0foobar' + epochSuffix], - ['-fooBar', '0fooBar' + epochSuffix], + ['.foobar', '_foobar' + epochSuffix], + ['-fooBar', '_fooBar' + epochSuffix], ['foobar.', 'foobar_' + epochSuffix], ['fooBar-', 'fooBar_' + epochSuffix], ['fooBar+', 'fooBar_' + epochSuffix], @@ -164,19 +162,17 @@ describe('sketch', () => { ['only_underscore-is+ok.ino', 'only_underscore_is_ok_ino'], ['regex++', 'regex__'], ['dots...', 'dots___'], - ['.dots...', '0dots___'], - ['-dashes---', '0dashes___'], - ['_underscore___', '0underscore___'], + ['.dots...', '_dots___'], + ['-dashes---', '_dashes___'], ['No Spaces', 'No_Spaces'], - ['_startsWithUnderscore', '0startsWithUnderscore'], ['Invalid+Char.ino', 'Invalid_Char_ino'], ['', 'sketch'], - ['/', '0'], + ['/', '_'], [ '/-1////////////////////+//////////////-/', - '0_1_________________________________', + '__1_________________________________', ], - ['//trash/', '0_trash_'], + ['//trash/', '__trash_'], [ '63Length_012345678901234567890123456789012345678901234567890123', '63Length_012345678901234567890123456', diff --git a/i18n/en.json b/i18n/en.json index e02f7eeb4..b24a89cd4 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -419,11 +419,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", From 2aad0e3b163f27c51b15b58a6f35aab757a643fb Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 1 Mar 2023 18:02:45 +0100 Subject: [PATCH 164/384] feat: new UX for the boards/library manager widgets Closes #19 Closes #781 Closes #1591 Closes #1607 Closes #1697 Closes #1707 Closes #1924 Closes #1941 Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 2 - .../browser/arduino-ide-frontend-module.ts | 7 +- .../browser/boards/boards-auto-installer.ts | 2 +- .../src/browser/contributions/examples.ts | 130 ++- .../browser/library/library-list-widget.ts | 22 +- .../src/browser/menu/arduino-menus.ts | 16 +- .../browser/style/boards-config-dialog.css | 2 +- .../src/browser/style/dialogs.css | 6 +- .../src/browser/style/fonts.css | 5 + .../src/browser/style/ide-updater-dialog.css | 4 +- .../src/browser/style/index.css | 18 +- .../src/browser/style/list-widget.css | 166 +++- .../src/browser/style/main.css | 8 +- .../component-list/component-list-item.tsx | 90 +- .../widgets/component-list/component-list.tsx | 154 +--- .../filterable-list-container.tsx | 52 +- .../component-list/list-item-renderer.tsx | 858 +++++++++++++++--- .../widgets/component-list/list-widget.tsx | 43 +- .../src/common/protocol/arduino-component.ts | 33 +- .../src/common/protocol/examples-service.ts | 4 + .../src/common/protocol/installable.ts | 40 + .../src/common/protocol/library-service.ts | 14 +- .../src/node/examples-service-impl.ts | 10 + .../src/node/library-service-impl.ts | 10 +- .../src/test/browser/fixtures/boards.ts | 1 - .../src/test/common/installable.test.ts | 99 ++ i18n/en.json | 10 +- package.json | 4 - yarn.lock | 55 +- 29 files changed, 1385 insertions(+), 480 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 393eb1380..3cf6e2c6e 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -58,7 +58,6 @@ "@types/p-queue": "^2.3.1", "@types/ps-tree": "^1.1.0", "@types/react-tabs": "^2.3.2", - "@types/react-virtualized": "^9.21.21", "@types/temp": "^0.8.34", "@types/which": "^1.3.1", "@vscode/debugprotocol": "^1.51.0", @@ -96,7 +95,6 @@ "react-perfect-scrollbar": "^1.5.8", "react-select": "^5.6.0", "react-tabs": "^3.1.2", - "react-virtualized": "^9.22.3", "react-window": "^1.8.6", "semver": "^7.3.2", "string-natural-compare": "^2.0.3", 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 7dd6fc1b9..73ed052e9 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -79,7 +79,10 @@ import { ProblemManager as TheiaProblemManager } from '@theia/markers/lib/browse import { ProblemManager } from './theia/markers/problem-manager'; import { BoardsAutoInstaller } from './boards/boards-auto-installer'; import { ShellLayoutRestorer } from './theia/core/shell-layout-restorer'; -import { ListItemRenderer } from './widgets/component-list/list-item-renderer'; +import { + ArduinoComponentContextMenuRenderer, + ListItemRenderer, +} from './widgets/component-list/list-item-renderer'; import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; import { @@ -1021,4 +1024,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(SidebarBottomMenuWidget).toSelf(); rebind(TheiaSidebarBottomMenuWidget).toService(SidebarBottomMenuWidget); + + bind(ArduinoComponentContextMenuRenderer).toSelf().inSingletonScope(); }); diff --git a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts index f516258f6..6d95ea661 100644 --- a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts +++ b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts @@ -174,7 +174,7 @@ export class BoardsAutoInstaller implements FrontendApplicationContribution { // CLI returns the packages already sorted with the deprecated ones at the end of the list // in order to ensure the new ones are preferred const candidates = packagesForBoard.filter( - ({ installable, installedVersion }) => installable && !installedVersion + ({ installedVersion }) => !installedVersion ); return candidates[0]; diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index a87c58860..02c19694d 100644 --- a/arduino-ide-extension/src/browser/contributions/examples.ts +++ b/arduino-ide-extension/src/browser/contributions/examples.ts @@ -1,6 +1,6 @@ import * as PQueue from 'p-queue'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { CommandHandler } from '@theia/core/lib/common/command'; +import { CommandHandler, CommandService } from '@theia/core/lib/common/command'; import { MenuPath, CompositeMenuNode, @@ -11,7 +11,11 @@ import { DisposableCollection, } from '@theia/core/lib/common/disposable'; import { OpenSketch } from './open-sketch'; -import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus'; +import { + ArduinoMenus, + examplesLabel, + PlaceholderMenuNode, +} from '../menu/arduino-menus'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ExamplesService } from '../../common/protocol/examples-service'; import { @@ -25,11 +29,73 @@ import { SketchRef, SketchContainer, SketchesError, - Sketch, CoreService, + SketchesService, + Sketch, } from '../../common/protocol'; -import { nls } from '@theia/core/lib/common'; +import { nls } from '@theia/core/lib/common/nls'; import { unregisterSubmenu } from '../menu/arduino-menus'; +import { MaybePromise } from '@theia/core/lib/common/types'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; + +/** + * Creates a cloned copy of the example sketch and opens it in a new window. + */ +export async function openClonedExample( + uri: string, + services: { + sketchesService: SketchesService; + commandService: CommandService; + }, + onError: { + onDidFailClone?: ( + err: ApplicationError< + number, + { + uri: string; + } + >, + uri: string + ) => MaybePromise; + onDidFailOpen?: ( + err: ApplicationError< + number, + { + uri: string; + } + >, + sketch: Sketch + ) => MaybePromise; + } = {} +): Promise { + const { sketchesService, commandService } = services; + const { onDidFailClone, onDidFailOpen } = onError; + try { + const sketch = await sketchesService.cloneExample(uri); + try { + await commandService.executeCommand( + OpenSketch.Commands.OPEN_SKETCH.id, + sketch + ); + } catch (openError) { + if (SketchesError.NotFound.is(openError)) { + if (onDidFailOpen) { + await onDidFailOpen(openError, sketch); + return; + } + } + throw openError; + } + } catch (cloneError) { + if (SketchesError.NotFound.is(cloneError)) { + if (onDidFailClone) { + await onDidFailClone(cloneError, uri); + return; + } + } + throw cloneError; + } +} @injectable() export abstract class Examples extends SketchContribution { @@ -94,7 +160,7 @@ export abstract class Examples extends SketchContribution { // TODO: unregister submenu? https://github.com/eclipse-theia/theia/issues/7300 registry.registerSubmenu( ArduinoMenus.FILE__EXAMPLES_SUBMENU, - nls.localize('arduino/examples/menu', 'Examples'), + examplesLabel, { order: '4', } @@ -174,47 +240,33 @@ export abstract class Examples extends SketchContribution { } protected createHandler(uri: string): CommandHandler { + const forceUpdate = () => + this.update({ + board: this.boardsServiceClient.boardsConfig.selectedBoard, + forceRefresh: true, + }); return { execute: async () => { - const sketch = await this.clone(uri); - if (sketch) { - try { - return this.commandService.executeCommand( - OpenSketch.Commands.OPEN_SKETCH.id, - sketch - ); - } catch (err) { - if (SketchesError.NotFound.is(err)) { + await openClonedExample( + uri, + { + sketchesService: this.sketchesService, + commandService: this.commandRegistry, + }, + { + onDidFailClone: () => { // Do not toast the error message. It's handled by the `Open Sketch` command. - this.update({ - board: this.boardsServiceClient.boardsConfig.selectedBoard, - forceRefresh: true, - }); - } else { - throw err; - } + forceUpdate(); + }, + onDidFailOpen: (err) => { + this.messageService.error(err.message); + forceUpdate(); + }, } - } + ); }, }; } - - private async clone(uri: string): Promise { - try { - const sketch = await this.sketchesService.cloneExample(uri); - return sketch; - } catch (err) { - if (SketchesError.NotFound.is(err)) { - this.messageService.error(err.message); - this.update({ - board: this.boardsServiceClient.boardsConfig.selectedBoard, - forceRefresh: true, - }); - } else { - throw err; - } - } - } } @injectable() diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 4a0318d26..050783816 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -12,7 +12,10 @@ import { LibrarySearch, LibraryService, } from '../../common/protocol/library-service'; -import { ListWidget } from '../widgets/component-list/list-widget'; +import { + ListWidget, + UserAbortError, +} from '../widgets/component-list/list-widget'; import { Installable } from '../../common/protocol'; import { ListItemRenderer } from '../widgets/component-list/list-item-renderer'; import { nls } from '@theia/core/lib/common'; @@ -141,6 +144,8 @@ export class LibraryListWidget extends ListWidget< // All installDependencies = true; } + } else { + throw new UserAbortError(); } } else { // The lib does not have any dependencies. @@ -235,6 +240,21 @@ class MessageBoxDialog extends AbstractDialog { this.response = 0; super.handleEnter(event); } + + protected override onAfterAttach(message: Message): void { + super.onAfterAttach(message); + let buttonToFocus: HTMLButtonElement | undefined = undefined; + for (const child of Array.from(this.controlPanel.children)) { + if (child instanceof HTMLButtonElement) { + if (child.classList.contains('main')) { + buttonToFocus = child; + break; + } + buttonToFocus = child; + } + } + buttonToFocus?.focus(); + } } export namespace MessageBoxDialog { export interface Options extends DialogProps { diff --git a/arduino-ide-extension/src/browser/menu/arduino-menus.ts b/arduino-ide-extension/src/browser/menu/arduino-menus.ts index 18b52b32c..9ecfec550 100644 --- a/arduino-ide-extension/src/browser/menu/arduino-menus.ts +++ b/arduino-ide-extension/src/browser/menu/arduino-menus.ts @@ -1,4 +1,3 @@ -import { isOSX } from '@theia/core/lib/common/os'; import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution'; import { MAIN_MENU_BAR, @@ -7,6 +6,8 @@ import { MenuPath, SubMenuOptions, } from '@theia/core/lib/common/menu'; +import { nls } from '@theia/core/lib/common/nls'; +import { isOSX } from '@theia/core/lib/common/os'; export namespace ArduinoMenus { // Main menu @@ -173,6 +174,17 @@ export namespace ArduinoMenus { '3_sign_out', ]; + // Context menu from the library and boards manager widget + export const ARDUINO_COMPONENT__CONTEXT = ['arduino-component--context']; + export const ARDUINO_COMPONENT__CONTEXT__INFO_GROUP = [ + ...ARDUINO_COMPONENT__CONTEXT, + '0_info', + ]; + export const ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP = [ + ...ARDUINO_COMPONENT__CONTEXT, + '1_action', + ]; + // -- ROOT SSL CERTIFICATES export const ROOT_CERTIFICATES__CONTEXT = [ 'arduino-root-certificates--context', @@ -230,3 +242,5 @@ export class PlaceholderMenuNode implements MenuNode { return [...this.menuPath, 'placeholder'].join('-'); } } + +export const examplesLabel = nls.localize('arduino/examples/menu', 'Examples'); diff --git a/arduino-ide-extension/src/browser/style/boards-config-dialog.css b/arduino-ide-extension/src/browser/style/boards-config-dialog.css index 59633efb4..a7c474e8d 100644 --- a/arduino-ide-extension/src/browser/style/boards-config-dialog.css +++ b/arduino-ide-extension/src/browser/style/boards-config-dialog.css @@ -165,7 +165,7 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { border: 1px solid var(--theia-arduino-toolbar-dropdown-border); display: flex; gap: 10px; - height: 28px; + height: var(--arduino-button-height); margin: 0 4px; overflow: hidden; padding: 0 10px; diff --git a/arduino-ide-extension/src/browser/style/dialogs.css b/arduino-ide-extension/src/browser/style/dialogs.css index f48e7e25b..cb73abd60 100644 --- a/arduino-ide-extension/src/browser/style/dialogs.css +++ b/arduino-ide-extension/src/browser/style/dialogs.css @@ -12,7 +12,7 @@ min-width: 424px; max-height: 560px; - padding: 0 28px; + padding: 0 var(--arduino-button-height); } .p-Widget.dialogOverlay .dialogBlock .dialogTitle { @@ -35,7 +35,7 @@ } .p-Widget.dialogOverlay .dialogBlock .dialogContent > input { - margin-bottom: 28px; + margin-bottom: var(--arduino-button-height); } .p-Widget.dialogOverlay .dialogBlock .dialogContent > div { @@ -43,7 +43,7 @@ } .p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection { - margin-top: 28px; + margin-top: var(--arduino-button-height); } .p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection:first-child { margin-top: 0; diff --git a/arduino-ide-extension/src/browser/style/fonts.css b/arduino-ide-extension/src/browser/style/fonts.css index 2e243103e..65ab9f337 100644 --- a/arduino-ide-extension/src/browser/style/fonts.css +++ b/arduino-ide-extension/src/browser/style/fonts.css @@ -1,5 +1,10 @@ @font-face { font-family: 'Open Sans'; + src: url('fonts/OpenSans-Regular-webfont.woff') format('woff'); +} + +@font-face { + font-family: 'Open Sans Bold'; src: url('fonts/OpenSans-Bold-webfont.woff') format('woff'); } diff --git a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css index abdf2eec6..5bd5fac44 100644 --- a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css +++ b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css @@ -15,7 +15,7 @@ } .ide-updater-dialog--logo-container { - margin-right: 28px; + margin-right: var(--arduino-button-height); } .ide-updater-dialog--logo { @@ -76,7 +76,7 @@ .ide-updater-dialog .buttons-container { display: flex; justify-content: flex-end; - margin-top: 28px; + margin-top: var(--arduino-button-height); } .ide-updater-dialog .buttons-container a.theia-button { diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index 6aa967304..d0ac1e45e 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -20,6 +20,10 @@ @import './progress-bar.css'; @import './settings-step-input.css'; +:root { + --arduino-button-height: 28px; +} + /* Revive of the `--theia-icon-loading`. The variable has been removed from Theia while IDE2 still uses is. */ /* The SVG icons are still part of Theia (1.31.1) */ /* https://github.com/arduino/arduino-ide/pull/1662#issuecomment-1324997134 */ @@ -64,9 +68,9 @@ body.theia-dark { /* Makes the sidepanel a bit wider when opening the widget */ .p-DockPanel-widget { - min-width: 200px; + min-width: 220px; min-height: 20px; - height: 200px; + height: 220px; } /* Overrule the default Theia CSS button styles. */ @@ -74,9 +78,9 @@ button.theia-button, .theia-button { align-items: center; display: flex; - font-family: 'Open Sans',sans-serif; + font-family: 'Open Sans Bold',sans-serif; font-style: normal; - font-weight: 700; + font-weight: 700; font-size: 14px; justify-content: center; cursor: pointer; @@ -95,7 +99,7 @@ button.theia-button, } button.theia-button { - height: 28px; + height: var(--arduino-button-height); max-width: none; } @@ -154,10 +158,6 @@ button.theia-button.message-box-dialog-button { font-size: 14px; } -.uppercase { - text-transform: uppercase; -} - /* High Contrast Theme rules */ /* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ .hc-black.hc-theia.theia-hc button.theia-button:hover, diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index c77820d6f..0ce86919c 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -44,102 +44,152 @@ height: 100%; /* This has top be 100% down to the `scrollContainer`. */ } -.filterable-list-container .items-container > div > div:nth-child(odd) { - background-color: var(--theia-sideBar-background); - filter: contrast(105%); +.component-list-item { + padding: 20px 15px 25px; } -.filterable-list-container .items-container > div > div:nth-child(even) { - background-color: var(--theia-sideBar-background); - filter: contrast(95%); +.component-list-item .header { + padding-bottom: 2px; + min-height: var(--theia-statusBar-height); } -.filterable-list-container .items-container > div > div:hover { - background-color: var(--theia-sideBar-background); - filter: contrast(90%); +.component-list-item .header > div { + display: flex; } -.component-list-item { - padding: 10px 10px 10px 15px; - font-size: var(--theia-ui-font-size1); +.component-list-item .header > div .p-TabBar-toolbar { + align-self: start; + padding: unset; + margin-right: unset; } -.component-list-item:hover { - cursor: pointer; +.component-list-item:hover .header > div .p-TabBar-toolbar > div { + visibility: visible; } -.component-list-item .header { - padding-bottom: 2px; - display: flex; - flex-direction: column; +.component-list-item .header > div .p-TabBar-toolbar > div { + visibility: hidden; +} + +.component-list-item .header .title { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + white-space: normal; + overflow: hidden; + text-overflow: ellipsis; + flex: 1 1 auto; } -.component-list-item .header .version-info { +.component-list-item .header .title .name { + font-family: 'Open Sans Bold'; + font-style: normal; + font-weight: 700; + font-size: 14px; +} + +.component-list-item .header .version { display: flex; justify-content: space-between; align-items: center; } -.component-list-item .header .name { - font-weight: bold; -} - .component-list-item .header .author { - font-weight: bold; color: var(--theia-panelTitle-inactiveForeground); } -.component-list-item:hover .header .author { - color: var(--theia-foreground); -} - .component-list-item .header .version { color: var(--theia-panelTitle-inactiveForeground); + padding-top: 4px; } .component-list-item .footer .theia-button.install { height: auto; /* resets the default Theia button height in the filterable list widget */ } -.component-list-item .header .installed:before { - margin-left: 4px; +.component-list-item .header .installed-version:before { + min-width: 79px; display: inline-block; justify-self: end; - background-color: var(--theia-button-background); + text-align: center; + background-color: var(--theia-arduino-toolbar-dropdown-option-backgroundHover); padding: 2px 4px 2px 4px; - font-size: 10px; - font-weight: bold; + font-size: 12px; max-height: calc(1em + 4px); - color: var(--theia-button-foreground); - content: attr(install); + color: var(--theia-button-background); + content: attr(version); + cursor: pointer; + border-radius: 4px; } -.component-list-item .header .installed:hover:before { - background-color: var(--theia-button-foreground); - color: var(--theia-button-background); - content: attr(uninstall); +.component-list-item .header .installed-version:hover:before { + content: attr(remove); + text-transform: uppercase; } -.component-list-item[min-width~="170px"] .footer { - padding: 5px 5px 0px 0px; - min-height: 35px; +.component-list-item .content { display: flex; - flex-direction: row-reverse; + flex-direction: column; + padding-top: 4px; + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + font-size: 12px; +} + +.component-list-item .content > p { + margin-block-start: unset; + margin-block-end: unset; + + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + white-space: normal; + overflow: hidden; + text-overflow: ellipsis; +} + +.component-list-item .content > .info { + white-space: nowrap; } .component-list-item .footer { flex-direction: column-reverse; + padding-top: 8px; } .component-list-item .footer > * { display: inline-block; - margin: 5px 0px 0px 10px; +} + +.filterable-list-container .separator { + display: flex; + flex-direction: row; +} + +.filterable-list-container .separator :last-child, +.filterable-list-container .separator :first-child { + min-height: 8px; + max-height: 8px; + min-width: 8px; + max-width: 8px; +} + +div.filterable-list-container > div > div > div > div:nth-child(1) > div.separator :first-child, +div.filterable-list-container > div > div > div > div:nth-child(1) > div.separator :last-child { + display: none; +} + +.filterable-list-container .separator .line { + max-height: 1px; + height: 1px; + background-color: var(--theia-activityBar-inactiveForeground); + flex: 1 1 auto; } .component-list-item:hover .footer > label { display: inline-block; align-self: center; - margin: 5px 0px 0px 10px; } .component-list-item .info a { @@ -151,13 +201,33 @@ text-decoration: underline; } +.component-list-item .theia-button.secondary.no-border { + border: 2px solid var(--theia-button-foreground) +} + +.component-list-item .theia-button.secondary.no-border:hover { + border: 2px solid var(--theia-secondaryButton-foreground) +} + +.component-list-item .theia-button { + margin-left: 12px; +} + +.component-list-item .theia-select { + height: var(--arduino-button-height); + min-height: var(--arduino-button-height); + width: 65px; + min-width: 65px; +} + /* High Contrast Theme rules */ /* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .component-list-item .header .installed:hover:before { +.hc-black.hc-theia.theia-hc .component-list-item .header .installed-version:hover:before { background-color: transparent; - outline: 1px dashed var(--theia-focusBorder); + outline: 1px dashed var(--theia-focusBorder); } -.hc-black.hc-theia.theia-hc .component-list-item .header .installed:before { +.hc-black.hc-theia.theia-hc .component-list-item .header .installed-version:before { + color: var(--theia-button-background); border: 1px solid var(--theia-button-border); } diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 438277dee..fa98d63f3 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -28,8 +28,8 @@ display: flex; justify-content: center; align-items: center; - height: 28px; - width: 28px; + height: var(--arduino-button-height); + width: var(--arduino-button-height); } .p-TabBar-toolbar .item.arduino-tool-item .arduino-upload-sketch--toolbar, @@ -66,8 +66,8 @@ } .arduino-tool-icon { - height: 28px; - width: 28px; + height: var(--arduino-button-height); + width: var(--arduino-button-height); } .arduino-verify-sketch--toolbar-icon { 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 121c01e03..83b0dea71 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,60 +1,76 @@ import * as React from '@theia/core/shared/react'; +import type { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { Installable } from '../../../common/protocol/installable'; -import { ArduinoComponent } from '../../../common/protocol/arduino-component'; -import { ListItemRenderer } from './list-item-renderer'; +import type { ListItemRenderer } from './list-item-renderer'; +import { UserAbortError } from './list-widget'; export class ComponentListItem< T extends ArduinoComponent > extends React.Component, ComponentListItem.State> { constructor(props: ComponentListItem.Props) { super(props); - if (props.item.installable) { - const version = props.item.availableVersions.filter( - (version) => version !== props.item.installedVersion - )[0]; - this.state = { - selectedVersion: version, - }; - } + this.state = {}; } override render(): React.ReactNode { const { item, itemRenderer } = this.props; + const selectedVersion = + this.props.edited?.item.name === item.name + ? this.props.edited.selectedVersion + : this.latestVersion; return ( <> - {itemRenderer.renderItem( - Object.assign(this.state, { item }), - this.install.bind(this), - this.uninstall.bind(this), - this.onVersionChange.bind(this) - )} + {itemRenderer.renderItem({ + item, + selectedVersion, + inProgress: this.state.inProgress, + install: (item) => this.install(item), + uninstall: (item) => this.uninstall(item), + onVersionChange: (version) => this.onVersionChange(version), + })} ); } private async install(item: T): Promise { - const toInstall = this.state.selectedVersion; - const version = this.props.item.availableVersions.filter( - (version) => version !== this.state.selectedVersion - )[0]; - this.setState({ - selectedVersion: version, - }); - try { - await this.props.install(item, toInstall); - } catch { - this.setState({ - selectedVersion: toInstall, - }); - } + await this.withState('installing', () => + this.props.install( + item, + this.props.edited?.item.name === item.name + ? this.props.edited.selectedVersion + : Installable.latest(this.props.item.availableVersions) + ) + ); } private async uninstall(item: T): Promise { - await this.props.uninstall(item); + await this.withState('uninstalling', () => this.props.uninstall(item)); + } + + private async withState( + inProgress: 'installing' | 'uninstalling', + task: () => Promise + ): Promise { + this.setState({ inProgress }); + try { + await task(); + } catch (err) { + if (err instanceof UserAbortError) { + // No state update when user cancels the task + return; + } + throw err; + } finally { + this.setState({ inProgress: undefined }); + } } private onVersionChange(version: Installable.Version): void { - this.setState({ selectedVersion: version }); + this.props.onItemEdit(this.props.item, version); + } + + private get latestVersion(): Installable.Version | undefined { + return Installable.latest(this.props.item.availableVersions); } } @@ -63,10 +79,18 @@ export namespace ComponentListItem { readonly item: T; readonly install: (item: T, version?: Installable.Version) => Promise; readonly uninstall: (item: T) => Promise; + readonly edited?: { + item: T; + selectedVersion: Installable.Version; + }; + readonly onItemEdit: ( + item: T, + selectedVersion: Installable.Version + ) => void; readonly itemRenderer: ListItemRenderer; } export interface State { - selectedVersion?: Installable.Version; + inProgress?: 'installing' | 'uninstalling' | undefined; } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx b/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx index 0f0dc9430..86f4d3df7 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,148 +1,32 @@ -import 'react-virtualized/styles.css'; import * as React from '@theia/core/shared/react'; -import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer'; -import { - CellMeasurer, - CellMeasurerCache, -} from 'react-virtualized/dist/commonjs/CellMeasurer'; -import type { - ListRowProps, - ListRowRenderer, -} from 'react-virtualized/dist/commonjs/List'; -import List from 'react-virtualized/dist/commonjs/List'; +import { Virtuoso } from '@theia/core/shared/react-virtuoso'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { Installable } from '../../../common/protocol/installable'; import { ComponentListItem } from './component-list-item'; import { ListItemRenderer } from './list-item-renderer'; -function sameAs( - left: T[], - right: T[], - ...compareProps: (keyof T)[] -): boolean { - if (left === right) { - return true; - } - const leftLength = left.length; - if (leftLength !== right.length) { - return false; - } - for (let i = 0; i < leftLength; i++) { - for (const prop of compareProps) { - const leftValue = left[i][prop]; - const rightValue = right[i][prop]; - if (leftValue !== rightValue) { - return false; - } - } - } - return true; -} - export class ComponentList extends React.Component< ComponentList.Props > { - private readonly cache: CellMeasurerCache; - private resizeAllFlag: boolean; - private list: List | undefined; - private mostRecentWidth: number | undefined; - - constructor(props: ComponentList.Props) { - super(props); - this.cache = new CellMeasurerCache({ - defaultHeight: 140, - fixedWidth: true, - }); - } - override render(): React.ReactNode { return ( - - {({ width, height }) => { - if (this.mostRecentWidth && this.mostRecentWidth !== width) { - this.resizeAllFlag = true; - setTimeout(() => this.clearAll(), 0); - } - this.mostRecentWidth = width; - return ( - ` won't be visible even if the mouse cursor is over the `
`. - // See https://github.com/bvaughn/react-virtualized/blob/005be24a608add0344284053dae7633be86053b2/source/Grid/Grid.js#L38-L42 - scrollingResetTimeInterval={0} - /> - ); - }} - - ); - } - - override componentDidUpdate(prevProps: ComponentList.Props): void { - if ( - this.resizeAllFlag || - !sameAs(this.props.items, prevProps.items, 'name', 'installedVersion') - ) { - this.clearAll(true); - } - } - - private readonly setListRef = (ref: List | null): void => { - this.list = ref || undefined; - }; - - private clearAll(scrollToTop = false): void { - this.resizeAllFlag = false; - this.cache.clearAll(); - if (this.list) { - this.list.recomputeRowHeights(); - if (scrollToTop) { - this.list.scrollToPosition(0); - } - } - } - - private readonly createItem: ListRowRenderer = ({ - index, - parent, - key, - style, - }: ListRowProps): React.ReactNode => { - const item = this.props.items[index]; - return ( - - {({ registerChild }) => ( - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore -
- - key={this.props.itemLabel(item)} - item={item} - itemRenderer={this.props.itemRenderer} - install={this.props.install} - uninstall={this.props.uninstall} - /> -
+ ( + + key={this.props.itemLabel(item)} + item={item} + itemRenderer={this.props.itemRenderer} + install={this.props.install} + uninstall={this.props.uninstall} + edited={this.props.edited} + onItemEdit={this.props.onItemEdit} + /> )} -
+ /> ); - }; + } } - export namespace ComponentList { export interface Props { readonly items: T[]; @@ -150,5 +34,13 @@ export namespace ComponentList { readonly itemRenderer: ListItemRenderer; readonly install: (item: T, version?: Installable.Version) => Promise; readonly uninstall: (item: T) => Promise; + readonly edited?: { + item: T; + selectedVersion: Installable.Version; + }; + readonly onItemEdit: ( + item: T, + selectedVersion: Installable.Version + ) => void; } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index 07a1379ef..05e0e95be 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 @@ -15,6 +15,7 @@ import { ListItemRenderer } from './list-item-renderer'; import { ResponseServiceClient } from '../../../common/protocol'; import { nls } from '@theia/core/lib/common'; import { FilterRenderer } from './filter-renderer'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; export class FilterableListContainer< T extends ArduinoComponent, @@ -23,21 +24,30 @@ export class FilterableListContainer< FilterableListContainer.Props, FilterableListContainer.State > { + private readonly toDispose: DisposableCollection; + constructor(props: Readonly>) { super(props); this.state = { searchOptions: props.defaultSearchOptions, items: [], }; + this.toDispose = new DisposableCollection(); } override componentDidMount(): void { this.search = debounce(this.search, 500, { trailing: true }); this.search(this.state.searchOptions); - this.props.searchOptionsDidChange((newSearchOptions) => { - const { searchOptions } = this.state; - this.setSearchOptionsAndUpdate({ ...searchOptions, ...newSearchOptions }); - }); + this.toDispose.pushAll([ + this.props.searchOptionsDidChange((newSearchOptions) => { + const { searchOptions } = this.state; + this.setSearchOptionsAndUpdate({ + ...searchOptions, + ...newSearchOptions, + }); + }), + this.props.onDidShow(() => this.setState({ edited: undefined })), + ]); } override componentDidUpdate(): void { @@ -46,6 +56,10 @@ export class FilterableListContainer< this.props.container.updateScrollBar(); } + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + override render(): React.ReactNode { return (
@@ -90,11 +104,13 @@ export class FilterableListContainer< itemRenderer={itemRenderer} install={this.install.bind(this)} uninstall={this.uninstall.bind(this)} + edited={this.state.edited} + onItemEdit={this.onItemEdit.bind(this)} /> ); } - protected handlePropChange = (prop: keyof S, value: S[keyof S]): void => { + private handlePropChange = (prop: keyof S, value: S[keyof S]): void => { const searchOptions = { ...this.state.searchOptions, [prop]: value, @@ -106,15 +122,14 @@ export class FilterableListContainer< this.setState({ searchOptions }, () => this.search(searchOptions)); } - protected search(searchOptions: S): void { + private search(searchOptions: S): void { const { searchable } = this.props; - searchable.search(searchOptions).then((items) => this.setState({ items })); + searchable + .search(searchOptions) + .then((items) => this.setState({ items, edited: undefined })); } - protected async install( - item: T, - version: Installable.Version - ): Promise { + private async install(item: T, version: Installable.Version): Promise { const { install, searchable } = this.props; await ExecuteWithProgress.doWithProgress({ ...this.props, @@ -124,10 +139,10 @@ export class FilterableListContainer< run: ({ progressId }) => install({ item, progressId, version }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items }); + this.setState({ items, edited: undefined }); } - protected async uninstall(item: T): Promise { + private async uninstall(item: T): Promise { const ok = await new ConfirmDialog({ title: nls.localize('arduino/component/uninstall', 'Uninstall'), msg: nls.localize( @@ -152,7 +167,11 @@ export class FilterableListContainer< run: ({ progressId }) => uninstall({ item, progressId }), }); const items = await searchable.search(this.state.searchOptions); - this.setState({ items }); + this.setState({ items, edited: undefined }); + } + + private onItemEdit(item: T, selectedVersion: Installable.Version): void { + this.setState({ edited: { item, selectedVersion } }); } } @@ -171,6 +190,7 @@ export namespace FilterableListContainer { readonly searchOptionsDidChange: Event | undefined>; readonly messageService: MessageService; readonly responseService: ResponseServiceClient; + readonly onDidShow: Event; readonly install: ({ item, progressId, @@ -193,5 +213,9 @@ export namespace FilterableListContainer { export interface State { searchOptions: S; items: T[]; + edited?: { + item: T; + selectedVersion: Installable.Version; + }; } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx index 4e6d56364..945b563dc 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx @@ -1,137 +1,783 @@ -import * as React from '@theia/core/shared/react'; -import { inject, injectable } from '@theia/core/shared/inversify'; +import { ApplicationError } from '@theia/core'; +import { + Anchor, + ContextMenuRenderer, +} from '@theia/core/lib/browser/context-menu-renderer'; +import { TabBarToolbar } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; +import { codicon } from '@theia/core/lib/browser/widgets/widget'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { Installable } from '../../../common/protocol/installable'; -import { ArduinoComponent } from '../../../common/protocol/arduino-component'; -import { ComponentListItem } from './component-list-item'; -import { nls } from '@theia/core/lib/common'; +import { + CommandHandler, + CommandRegistry, + CommandService, +} from '@theia/core/lib/common/command'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { + MenuModelRegistry, + MenuPath, + SubMenuOptions, +} from '@theia/core/lib/common/menu'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import * as React from '@theia/core/shared/react'; import { Unknown } from '../../../common/nls'; +import { + CoreService, + ExamplesService, + LibraryPackage, + Sketch, + SketchContainer, + SketchesService, + SketchRef, +} from '../../../common/protocol'; +import type { ArduinoComponent } from '../../../common/protocol/arduino-component'; +import { Installable } from '../../../common/protocol/installable'; +import { openClonedExample } from '../../contributions/examples'; +import { + ArduinoMenus, + examplesLabel, + unregisterSubmenu, +} from '../../menu/arduino-menus'; + +const moreInfoLabel = nls.localize('arduino/component/moreInfo', 'More info'); +const otherVersionsLabel = nls.localize( + 'arduino/component/otherVersions', + 'Other Versions' +); +const installLabel = nls.localize('arduino/component/install', 'Install'); +const installLatestLabel = nls.localize( + 'arduino/component/installLatest', + 'Install Latest' +); +function installVersionLabel(selectedVersion: string) { + return nls.localize( + 'arduino/component/installVersion', + 'Install {0}', + selectedVersion + ); +} +const updateLabel = nls.localize('arduino/component/update', 'Update'); +const removeLabel = nls.localize('arduino/component/remove', 'Remove'); +const byLabel = nls.localize('arduino/component/by', 'by'); +function nameAuthorLabel(name: string, author: string) { + return nls.localize('arduino/component/title', '{0} by {1}', name, author); +} +function installedLabel(installedVersion: string) { + return nls.localize( + 'arduino/component/installed', + '{0} installed', + installedVersion + ); +} +function clickToOpenInBrowserLabel(href: string): string | undefined { + return nls.localize( + 'arduino/component/clickToOpen', + 'Click to open in browser: {0}', + href + ); +} + +interface MenuTemplate { + readonly menuLabel: string; +} +interface MenuActionTemplate extends MenuTemplate { + readonly menuPath: MenuPath; + readonly handler: CommandHandler; + /** + * If not defined the insertion oder will be the order string. + */ + readonly order?: string; +} +interface SubmenuTemplate extends MenuTemplate { + readonly menuLabel: string; + readonly submenuPath: MenuPath; + readonly options?: SubMenuOptions; +} +function isMenuTemplate(arg: unknown): arg is MenuTemplate { + return ( + typeof arg === 'object' && + (arg as MenuTemplate).menuLabel !== undefined && + typeof (arg as MenuTemplate).menuLabel === 'string' + ); +} +function isMenuActionTemplate(arg: MenuTemplate): arg is MenuActionTemplate { + return ( + isMenuTemplate(arg) && + (arg as MenuActionTemplate).handler !== undefined && + typeof (arg as MenuActionTemplate).handler === 'object' && + (arg as MenuActionTemplate).menuPath !== undefined && + Array.isArray((arg as MenuActionTemplate).menuPath) + ); +} + +@injectable() +export class ArduinoComponentContextMenuRenderer { + @inject(CommandRegistry) + private readonly commandRegistry: CommandRegistry; + @inject(MenuModelRegistry) + private readonly menuRegistry: MenuModelRegistry; + @inject(ContextMenuRenderer) + private readonly contextMenuRenderer: ContextMenuRenderer; + + private readonly toDisposeBeforeRender = new DisposableCollection(); + private menuIndexCounter = 0; + + async render( + anchor: Anchor, + ...templates: (MenuActionTemplate | SubmenuTemplate)[] + ): Promise { + this.toDisposeBeforeRender.dispose(); + this.toDisposeBeforeRender.pushAll([ + Disposable.create(() => (this.menuIndexCounter = 0)), + ...templates.map((template) => this.registerMenu(template)), + ]); + const options = { + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + anchor, + showDisabled: true, + }; + this.contextMenuRenderer.render(options); + } + + private registerMenu( + template: MenuActionTemplate | SubmenuTemplate + ): Disposable { + if (isMenuActionTemplate(template)) { + const { menuLabel, menuPath, handler, order } = template; + const id = this.generateCommandId(menuLabel, menuPath); + const index = this.menuIndexCounter++; + return new DisposableCollection( + this.commandRegistry.registerCommand({ id }, handler), + this.menuRegistry.registerMenuAction(menuPath, { + commandId: id, + label: menuLabel, + order: typeof order === 'string' ? order : String(index).padStart(4), + }) + ); + } else { + const { menuLabel, submenuPath, options } = template; + return new DisposableCollection( + this.menuRegistry.registerSubmenu(submenuPath, menuLabel, options), + Disposable.create(() => + unregisterSubmenu(submenuPath, this.menuRegistry) + ) + ); + } + } + + private generateCommandId(menuLabel: string, menuPath: MenuPath): string { + return `arduino--component-context-${menuPath.join('-')}-${menuLabel}`; + } +} + +interface ListItemRendererParams { + readonly item: T; + readonly selectedVersion: Installable.Version | undefined; + readonly inProgress?: 'installing' | 'uninstalling' | undefined; + readonly install: (item: T) => Promise; + readonly uninstall: (item: T) => Promise; + readonly onVersionChange: (version: Installable.Version) => void; +} + +interface ListItemRendererServices { + readonly windowService: WindowService; + readonly messagesService: MessageService; + readonly commandService: CommandService; + readonly coreService: CoreService; + readonly examplesService: ExamplesService; + readonly sketchesService: SketchesService; + readonly contextMenuRenderer: ArduinoComponentContextMenuRenderer; +} @injectable() export class ListItemRenderer { @inject(WindowService) - protected windowService: WindowService; + private readonly windowService: WindowService; + @inject(MessageService) + private readonly messageService: MessageService; + @inject(CommandService) + private readonly commandService: CommandService; + @inject(CoreService) + private readonly coreService: CoreService; + @inject(ExamplesService) + private readonly examplesService: ExamplesService; + @inject(SketchesService) + private readonly sketchesService: SketchesService; + @inject(ArduinoComponentContextMenuRenderer) + private readonly contextMenuRenderer: ArduinoComponentContextMenuRenderer; - protected onMoreInfoClick = ( - event: React.SyntheticEvent - ): void => { - const { target } = event.nativeEvent; - if (target instanceof HTMLAnchorElement) { - this.windowService.openNewWindow(target.href, { external: true }); - event.nativeEvent.preventDefault(); + private readonly onMoreInfo = (href: string | undefined): void => { + if (href) { + this.windowService.openNewWindow(href, { external: true }); } }; - renderItem( - input: ComponentListItem.State & { item: T }, - install: (item: T) => Promise, - uninstall: (item: T) => Promise, - onVersionChange: (version: Installable.Version) => void - ): React.ReactNode { - const { item } = input; - let nameAndAuthor: JSX.Element; - if (item.name && item.author) { - const name = {item.name}; - const author = {item.author}; - nameAndAuthor = ( - - {name} {nls.localize('arduino/component/by', 'by')} {author} - + renderItem(params: ListItemRendererParams): React.ReactNode { + const action = this.action(params); + return ( + <> + +
+
+ +
+
+ + ); + } + + private action(params: ListItemRendererParams): Installable.Action { + const { + item: { installedVersion, availableVersions }, + selectedVersion, + } = params; + return Installable.action({ + installed: installedVersion, + available: availableVersions, + selected: selectedVersion, + }); + } + + private get services(): ListItemRendererServices { + return { + windowService: this.windowService, + messagesService: this.messageService, + commandService: this.commandService, + coreService: this.coreService, + sketchesService: this.sketchesService, + examplesService: this.examplesService, + contextMenuRenderer: this.contextMenuRenderer, + }; + } +} + +class Separator extends React.Component { + override render(): React.ReactNode { + return ( +
+
+
+
+
+ ); + } +} + +class Header extends React.Component< + Readonly<{ + params: ListItemRendererParams; + action: Installable.Action; + services: ListItemRendererServices; + onMoreInfo: (href: string | undefined) => void; + }> +> { + override render(): React.ReactNode { + return ( +
+
+ + <Toolbar {...this.props} /> + </div> + <InstalledVersion {...this.props} /> + </div> + ); + } +} + +class Toolbar<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + services: ListItemRendererServices; + onMoreInfo: (href: string | undefined) => void; + }> +> { + private readonly onClick = (event: React.MouseEvent): void => { + event.stopPropagation(); + event.preventDefault(); + const anchor = this.toAnchor(event); + this.showContextMenu(anchor); + }; + + override render(): React.ReactNode { + return ( + <div className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR}> + <div className={`${TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM} enabled`}> + <div + id="__more__" + className={codicon('ellipsis', true)} + title={nls.localizeByDefault('More Actions...')} + onClick={this.onClick} + /> + </div> + </div> + ); + } + + private toAnchor(event: React.MouseEvent): Anchor { + const itemBox = event.currentTarget + .closest('.' + TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM) + ?.getBoundingClientRect(); + return itemBox + ? { + y: itemBox.bottom + itemBox.height / 2, + x: itemBox.left, + } + : event.nativeEvent; + } + + private async showContextMenu(anchor: Anchor): Promise<void> { + this.props.services.contextMenuRenderer.render( + anchor, + this.moreInfo, + ...(await this.examples), + ...this.otherVersions, + ...this.actions + ); + } + + private get moreInfo(): MenuActionTemplate { + const { + params: { + item: { moreInfoLink }, + }, + } = this.props; + return { + menuLabel: moreInfoLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + handler: { + execute: () => this.props.onMoreInfo(moreInfoLink), + isEnabled: () => Boolean(moreInfoLink), + }, + }; + } + + private get examples(): Promise<(MenuActionTemplate | SubmenuTemplate)[]> { + const { + params: { + item, + item: { installedVersion, name }, + }, + services: { examplesService }, + } = this.props; + // TODO: `LibraryPackage.is` should not be here but it saves one extra `lib list` + // gRPC equivalent call with the name of a platform which will result an empty array. + if (!LibraryPackage.is(item) || !installedVersion) { + return Promise.resolve([]); + } + const submenuPath = [ + ...ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + 'examples', + ]; + return examplesService.find({ libraryName: name }).then((containers) => [ + { + submenuPath, + menuLabel: examplesLabel, + options: { order: String(0) }, + }, + ...containers + .map((container) => this.flattenContainers(container, submenuPath)) + .reduce((acc, curr) => acc.concat(curr), []), + ]); + } + + private flattenContainers( + container: SketchContainer, + menuPath: MenuPath, + depth = 0 + ): (MenuActionTemplate | SubmenuTemplate)[] { + const templates: (MenuActionTemplate | SubmenuTemplate)[] = []; + const { label } = container; + if (depth > 0) { + menuPath = [...menuPath, label]; + templates.push({ + submenuPath: menuPath, + menuLabel: label, + options: { order: label.toLocaleLowerCase() }, + }); + } + return templates + .concat( + ...container.sketches.map((sketch) => + this.sketchToMenuTemplate(sketch, menuPath) + ) + ) + .concat( + container.children + .map((childContainer) => + this.flattenContainers(childContainer, menuPath, ++depth) + ) + .reduce((acc, curr) => acc.concat(curr), []) ); - } else if (item.name) { - nameAndAuthor = <span className="name">{item.name}</span>; - } else if ((item as any).id) { - nameAndAuthor = <span className="name">{(item as any).id}</span>; - } else { - nameAndAuthor = <span className="name">{Unknown}</span>; + } + + private sketchToMenuTemplate( + sketch: SketchRef, + menuPath: MenuPath + ): MenuActionTemplate { + const { name, uri } = sketch; + const { sketchesService, commandService } = this.props.services; + return { + menuLabel: name, + menuPath, + handler: { + execute: () => + openClonedExample( + uri, + { sketchesService, commandService }, + this.onExampleOpenError + ), + }, + order: name.toLocaleLowerCase(), + }; + } + + private get onExampleOpenError(): { + onDidFailClone: ( + err: ApplicationError<number, unknown>, + uri: string + ) => unknown; + onDidFailOpen: ( + err: ApplicationError<number, unknown>, + sketch: Sketch + ) => unknown; + } { + const { + services: { messagesService, coreService }, + } = this.props; + const handle = async (err: ApplicationError<number, unknown>) => { + messagesService.error(err.message); + return coreService.refresh(); + }; + return { + onDidFailClone: handle, + onDidFailOpen: handle, + }; + } + + private get otherVersions(): (MenuActionTemplate | SubmenuTemplate)[] { + const { + params: { + item: { availableVersions }, + selectedVersion, + onVersionChange, + }, + } = this.props; + const submenuPath = [ + ...ArduinoMenus.ARDUINO_COMPONENT__CONTEXT, + 'other-versions', + ]; + return [ + { + submenuPath, + menuLabel: otherVersionsLabel, + options: { order: String(1) }, + }, + ...availableVersions + .filter((version) => version !== selectedVersion) + .map((version) => ({ + menuPath: submenuPath, + menuLabel: version, + handler: { + execute: () => onVersionChange(version), + }, + })), + ]; + } + + private get actions(): MenuActionTemplate[] { + const { + action, + params: { + item, + item: { availableVersions, installedVersion }, + install, + uninstall, + selectedVersion, + }, + } = this.props; + const removeAction = { + menuLabel: removeLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => uninstall(item), + }, + }; + const installAction = { + menuLabel: installVersionLabel( + selectedVersion ?? Installable.latest(availableVersions) ?? '' + ), + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => install(item), + }, + }; + const installLatestAction = { + menuLabel: installLatestLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => install(item), + }, + }; + const updateAction = { + menuLabel: updateLabel, + menuPath: ArduinoMenus.ARDUINO_COMPONENT__CONTEXT__ACTION_GROUP, + handler: { + execute: () => install(item), + }, + }; + switch (action) { + case 'unknown': + return []; + case 'remove': { + return [removeAction]; + } + case 'update': { + return [removeAction, updateAction]; + } + case 'installLatest': + return [ + ...(Boolean(installedVersion) ? [removeAction] : []), + installLatestAction, + ]; + case 'installSelected': { + return [ + ...(Boolean(installedVersion) ? [removeAction] : []), + installAction, + ]; + } } - const onClickUninstall = () => uninstall(item); - const installedVersion = !!item.installedVersion && ( - <div className="version-info"> - <span className="version"> - {nls.localize( - 'arduino/component/version', - 'Version {0}', - item.installedVersion - )} - </span> - <span - className="installed uppercase" - onClick={onClickUninstall} - {...{ - install: nls.localize('arduino/component/installed', 'Installed'), - uninstall: nls.localize('arduino/component/uninstall', 'Uninstall'), - }} - /> + } +} + +class Title<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + }> +> { + override render(): React.ReactNode { + const { name, author } = this.props.params.item; + const title = + name && author ? nameAuthorLabel(name, author) : name ? name : Unknown; + return ( + <div className="title" title={title}> + {name && author ? ( + <> + {<span className="name">{name}</span>}{' '} + {<span className="author">{`${byLabel} ${author}`}</span>} + </> + ) : name ? ( + <span className="name">{name}</span> + ) : ( + <span className="name">{Unknown}</span> + )} </div> ); + } +} - const summary = <div className="summary">{item.summary}</div>; - const description = <div className="summary">{item.description}</div>; +class InstalledVersion<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + }> +> { + private readonly onClick = (): void => { + this.props.params.uninstall(this.props.params.item); + }; - const moreInfo = !!item.moreInfoLink && ( - <a href={item.moreInfoLink} onClick={this.onMoreInfoClick}> - {nls.localize('arduino/component/moreInfo', 'More info')} - </a> + override render(): React.ReactNode { + const { installedVersion } = this.props.params.item; + return ( + installedVersion && ( + <div className="version"> + <span + className="installed-version" + onClick={this.onClick} + {...{ + version: installedLabel(installedVersion), + remove: removeLabel, + }} + /> + </div> + ) ); - const onClickInstall = () => install(item); - const installButton = item.installable && ( - <button - className="theia-button secondary install uppercase" - onClick={onClickInstall} - > - {nls.localize('arduino/component/install', 'Install')} - </button> + } +} + +class Content<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + onMoreInfo: (href: string | undefined) => void; + }> +> { + override render(): React.ReactNode { + const { + params: { + item: { summary, description }, + }, + } = this.props; + const content = [summary, description].filter(Boolean).join(' '); + return ( + <div className="content" title={content}> + <p>{content}</p> + <MoreInfo {...this.props} /> + </div> ); + } +} - const onSelectChange = (event: React.ChangeEvent<HTMLSelectElement>) => { - const version = event.target.value; - if (version) { - onVersionChange(version); - } - }; +class MoreInfo<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + onMoreInfo: (href: string | undefined) => void; + }> +> { + private readonly onClick = ( + event: React.SyntheticEvent<HTMLAnchorElement, Event> + ): void => { + const { target } = event.nativeEvent; + if (target instanceof HTMLAnchorElement) { + this.props.onMoreInfo(target.href); + event.nativeEvent.preventDefault(); + } + }; - const versions = (() => { - const { availableVersions } = item; - if (availableVersions.length === 0) { - return undefined; - } else if (availableVersions.length === 1) { - return <label>{availableVersions[0]}</label>; - } else { + override render(): React.ReactNode { + const { + params: { + item: { moreInfoLink: href }, + }, + } = this.props; + return ( + href && ( + <div className="info" title={clickToOpenInBrowserLabel(href)}> + <a href={href} onClick={this.onClick}> + {moreInfoLabel} + </a> + </div> + ) + ); + } +} + +class Footer<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + }> +> { + override render(): React.ReactNode { + return ( + <div className="footer"> + <SelectVersion {...this.props} /> + <Button {...this.props} /> + </div> + ); + } +} + +class SelectVersion<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + }> +> { + private readonly onChange = ( + event: React.ChangeEvent<HTMLSelectElement> + ): void => { + const version = event.target.value; + if (version) { + this.props.params.onVersionChange(version); + } + }; + + override render(): React.ReactNode { + const { + selectedVersion, + item: { availableVersions }, + } = this.props.params; + switch (this.props.action) { + case 'installLatest': // fall-through + case 'installSelected': // fall-through + case 'update': // fall-through + case 'remove': return ( <select className="theia-select" - value={input.selectedVersion} - onChange={onSelectChange} + value={selectedVersion} + onChange={this.onChange} > - {item.availableVersions - .filter((version) => version !== item.installedVersion) // Filter the version that is currently installed. - .map((version) => ( - <option value={version} key={version}> - {version} - </option> - ))} + {availableVersions.map((version) => ( + <option value={version} key={version}> + {version} + </option> + ))} </select> ); - } - })(); + case 'unknown': + return undefined; + } + } +} +class Button<T extends ArduinoComponent> extends React.Component< + Readonly<{ + params: ListItemRendererParams<T>; + action: Installable.Action; + }> +> { + override render(): React.ReactNode { + const { + params: { item, install, uninstall, inProgress: state }, + } = this.props; + const classNames = ['theia-button install uppercase']; + let onClick; + let label; + switch (this.props.action) { + case 'unknown': + return undefined; + case 'installLatest': { + classNames.push('primary'); + label = installLabel; + onClick = () => install(item); + break; + } + case 'installSelected': { + classNames.push('secondary'); + label = installLabel; + onClick = () => install(item); + break; + } + case 'update': { + classNames.push('secondary'); + label = updateLabel; + onClick = () => install(item); + break; + } + case 'remove': { + classNames.push('secondary', 'no-border'); + label = removeLabel; + onClick = () => uninstall(item); + break; + } + } return ( - <div className="component-list-item noselect"> - <div className="header"> - {nameAndAuthor} - {installedVersion} - </div> - <div className="content"> - {summary} - {description} - </div> - <div className="info">{moreInfo}</div> - <div className="footer"> - {versions} - {installButton} - </div> - </div> + <button + className={classNames.join(' ')} + onClick={onClick} + disabled={Boolean(state)} + > + {label} + </button> ); } } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index a6cf5ffbf..ca340a01f 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 @@ -29,29 +29,27 @@ export abstract class ListWidget< > extends ReactWidget { @inject(MessageService) protected readonly messageService: MessageService; - - @inject(CommandService) - protected readonly commandService: CommandService; - - @inject(ResponseServiceClient) - protected readonly responseService: ResponseServiceClient; - @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; + @inject(CommandService) + private readonly commandService: CommandService; + @inject(ResponseServiceClient) + private readonly responseService: ResponseServiceClient; /** * Do not touch or use it. It is for setting the focus on the `input` after the widget activation. */ - protected focusNode: HTMLElement | undefined; + private focusNode: HTMLElement | undefined; private readonly didReceiveFirstFocus = new Deferred(); - protected readonly searchOptionsChangeEmitter = new Emitter< + private readonly searchOptionsChangeEmitter = new Emitter< Partial<S> | undefined >(); + private readonly onDidShowEmitter = new Emitter<void>(); /** * Instead of running an `update` from the `postConstruct` `init` method, * we use this variable to track first activate, then run. */ - protected firstActivate = true; + private firstUpdate = true; constructor(protected options: ListWidget.Options<T, S>) { super(); @@ -64,7 +62,10 @@ export abstract class ListWidget< this.addClass('arduino-list-widget'); this.node.tabIndex = 0; // To be able to set the focus on the widget. this.scrollOptions = undefined; - this.toDispose.push(this.searchOptionsChangeEmitter); + this.toDispose.pushAll([ + this.searchOptionsChangeEmitter, + this.onDidShowEmitter, + ]); } @postConstruct() @@ -81,12 +82,14 @@ export abstract class ListWidget< protected override onAfterShow(message: Message): void { this.maybeUpdateOnFirstRender(); super.onAfterShow(message); + this.onDidShowEmitter.fire(); } private maybeUpdateOnFirstRender() { - if (this.firstActivate) { - this.firstActivate = false; + if (this.firstUpdate) { + this.firstUpdate = false; this.update(); + this.didReceiveFirstFocus.promise.then(() => this.focusNode?.focus()); } } @@ -106,7 +109,9 @@ export abstract class ListWidget< this.updateScrollBar(); } - protected onFocusResolved = (element: HTMLElement | undefined): void => { + private readonly onFocusResolved = ( + element: HTMLElement | undefined + ): void => { this.focusNode = element; this.didReceiveFirstFocus.resolve(); }; @@ -133,7 +138,7 @@ export abstract class ListWidget< return this.options.installable.uninstall({ item, progressId }); } - render(): React.ReactNode { + override render(): React.ReactNode { return ( <FilterableListContainer<T, S> defaultSearchOptions={this.options.defaultSearchOptions} @@ -149,6 +154,7 @@ export abstract class ListWidget< messageService={this.messageService} commandService={this.commandService} responseService={this.responseService} + onDidShow={this.onDidShowEmitter.event} /> ); } @@ -186,3 +192,10 @@ export namespace ListWidget { readonly defaultSearchOptions: S; } } + +export class UserAbortError extends Error { + constructor(message = 'User abort') { + super(message); + Object.setPrototypeOf(this, UserAbortError.prototype); + } +} diff --git a/arduino-ide-extension/src/common/protocol/arduino-component.ts b/arduino-ide-extension/src/common/protocol/arduino-component.ts index 20d49f9be..298708e12 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-component.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-component.ts @@ -1,34 +1,35 @@ -import { Installable } from './installable'; +import type { Installable } from './installable'; export interface ArduinoComponent { readonly name: string; - readonly deprecated?: boolean; readonly author: string; readonly summary: string; readonly description: string; - readonly moreInfoLink?: string; readonly availableVersions: Installable.Version[]; - readonly installable: boolean; readonly installedVersion?: Installable.Version; /** * This is the `Type` in IDE (1.x) UI. */ readonly types: string[]; + readonly deprecated?: boolean; + readonly moreInfoLink?: string; } export namespace ArduinoComponent { - export function is(arg: any): arg is ArduinoComponent { + export function is(arg: unknown): arg is ArduinoComponent { return ( - !!arg && - 'name' in arg && - typeof arg['name'] === 'string' && - 'author' in arg && - typeof arg['author'] === 'string' && - 'summary' in arg && - typeof arg['summary'] === 'string' && - 'description' in arg && - typeof arg['description'] === 'string' && - 'installable' in arg && - typeof arg['installable'] === 'boolean' + typeof arg === 'object' && + (<ArduinoComponent>arg).name !== undefined && + typeof (<ArduinoComponent>arg).name === 'string' && + (<ArduinoComponent>arg).author !== undefined && + typeof (<ArduinoComponent>arg).author === 'string' && + (<ArduinoComponent>arg).summary !== undefined && + typeof (<ArduinoComponent>arg).summary === 'string' && + (<ArduinoComponent>arg).description !== undefined && + typeof (<ArduinoComponent>arg).description === 'string' && + (<ArduinoComponent>arg).availableVersions !== undefined && + Array.isArray((<ArduinoComponent>arg).availableVersions) && + (<ArduinoComponent>arg).types !== undefined && + Array.isArray((<ArduinoComponent>arg).types) ); } } diff --git a/arduino-ide-extension/src/common/protocol/examples-service.ts b/arduino-ide-extension/src/common/protocol/examples-service.ts index 8194e57e4..db16a66f0 100644 --- a/arduino-ide-extension/src/common/protocol/examples-service.ts +++ b/arduino-ide-extension/src/common/protocol/examples-service.ts @@ -9,4 +9,8 @@ export interface ExamplesService { current: SketchContainer[]; any: SketchContainer[]; }>; + /** + * Finds example sketch containers for the installed library. + */ + find(options: { libraryName: string }): Promise<SketchContainer[]>; } diff --git a/arduino-ide-extension/src/common/protocol/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index f311f8202..962f52aec 100644 --- a/arduino-ide-extension/src/common/protocol/installable.ts +++ b/arduino-ide-extension/src/common/protocol/installable.ts @@ -51,6 +51,46 @@ export namespace Installable { }; } + export const ActionLiterals = [ + 'installLatest', + 'installSelected', + 'update', + 'remove', + 'unknown', + ] as const; + export type Action = typeof ActionLiterals[number]; + + export function action(params: { + installed?: Version | undefined; + available: Version[]; + selected?: Version; + }): Action { + const { installed, available } = params; + const latest = Installable.latest(available); + if (!latest || (installed && !available.includes(installed))) { + return 'unknown'; + } + const selected = params.selected ?? latest; + if (installed === selected) { + return 'remove'; + } + if (installed) { + return selected === latest && installed !== latest + ? 'update' + : 'installSelected'; + } else { + return selected === latest ? 'installLatest' : 'installSelected'; + } + } + + export function latest(versions: Version[]): Version | undefined { + if (!versions.length) { + return undefined; + } + const ordered = versions.slice().sort(Installable.Version.COMPARATOR); + return ordered[ordered.length - 1]; + } + export const Installed = <T extends ArduinoComponent>({ installedVersion, }: T): boolean => { diff --git a/arduino-ide-extension/src/common/protocol/library-service.ts b/arduino-ide-extension/src/common/protocol/library-service.ts index 4a20aae21..e8a32d901 100644 --- a/arduino-ide-extension/src/common/protocol/library-service.ts +++ b/arduino-ide-extension/src/common/protocol/library-service.ts @@ -198,6 +198,10 @@ export namespace LibraryService { export namespace List { export interface Options { readonly fqbn?: string | undefined; + /** + * The name of the library to filter to. + */ + readonly libraryName?: string | undefined; } } } @@ -241,11 +245,15 @@ export interface LibraryPackage extends ArduinoComponent { readonly category: string; } export namespace LibraryPackage { - export function is(arg: any): arg is LibraryPackage { + export function is(arg: unknown): arg is LibraryPackage { return ( ArduinoComponent.is(arg) && - 'includes' in arg && - Array.isArray(arg['includes']) + (<LibraryPackage>arg).includes !== undefined && + Array.isArray((<LibraryPackage>arg).includes) && + (<LibraryPackage>arg).exampleUris !== undefined && + Array.isArray((<LibraryPackage>arg).exampleUris) && + (<LibraryPackage>arg).location !== undefined && + typeof (<LibraryPackage>arg).location === 'number' ); } diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index 63860c555..83cca1e1a 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -118,6 +118,16 @@ export class ExamplesServiceImpl implements ExamplesService { return { user, current, any }; } + async find(options: { libraryName: string }): Promise<SketchContainer[]> { + const { libraryName } = options; + const packages = await this.libraryService.list({ libraryName }); + return Promise.all( + packages + .filter(({ location }) => location === LibraryLocation.USER) + .map((pkg) => this.tryGroupExamples(pkg)) + ); + } + /** * The CLI provides direct FS paths to the examples so that menus and menu groups cannot be built for the UI by traversing the * folder hierarchy. This method tries to workaround it by falling back to the `installDirUri` and manually creating the diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index 9d345b2d6..bd5eb8cb1 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -103,7 +103,6 @@ export class LibraryServiceImpl return toLibrary( { name: item.getName(), - installable: true, installedVersion, }, item.getLatest()!, @@ -154,8 +153,10 @@ export class LibraryServiceImpl async list({ fqbn, + libraryName, }: { fqbn?: string | undefined; + libraryName?: string | undefined; }): Promise<LibraryPackage[]> { const coreClient = await this.coreClient; const { client, instance } = coreClient; @@ -166,6 +167,9 @@ export class LibraryServiceImpl req.setAll(true); // https://github.com/arduino/arduino-ide/pull/303#issuecomment-815556447 req.setFqbn(fqbn); } + if (libraryName) { + req.setName(libraryName); + } const resp = await new Promise<LibraryListResponse | undefined>( (resolve, reject) => { @@ -219,7 +223,6 @@ export class LibraryServiceImpl { name: library.getName(), installedVersion, - installable: true, description: library.getSentence(), summary: library.getParagraph(), moreInfoLink: library.getWebsite(), @@ -455,8 +458,7 @@ function toLibrary( return { name: '', exampleUris: [], - installable: false, - location: 0, + location: LibraryLocation.BUILTIN, ...pkg, author: lib.getAuthor(), diff --git a/arduino-ide-extension/src/test/browser/fixtures/boards.ts b/arduino-ide-extension/src/test/browser/fixtures/boards.ts index 0cedb5b77..16256f3ab 100644 --- a/arduino-ide-extension/src/test/browser/fixtures/boards.ts +++ b/arduino-ide-extension/src/test/browser/fixtures/boards.ts @@ -49,7 +49,6 @@ export const aPackage: BoardsPackage = { deprecated: false, description: 'Some Arduino Board, Some Other Arduino Board', id: 'some:arduinoCoreId', - installable: true, moreInfoLink: 'http://www.some-url.lol/', name: 'Some Arduino Package', summary: 'Boards included in this package:', diff --git a/arduino-ide-extension/src/test/common/installable.test.ts b/arduino-ide-extension/src/test/common/installable.test.ts index 4047f37f1..ed89e799a 100644 --- a/arduino-ide-extension/src/test/common/installable.test.ts +++ b/arduino-ide-extension/src/test/common/installable.test.ts @@ -2,6 +2,16 @@ import { expect } from 'chai'; import { Installable } from '../../common/protocol/installable'; describe('installable', () => { + const latest = '2.0.0'; + // shuffled versions + const available: Installable.Version[] = [ + '1.4.1', + '1.0.0', + latest, + '2.0.0-beta.1', + '1.5', + ]; + describe('compare', () => { const testMe = Installable.Version.COMPARATOR; @@ -39,4 +49,93 @@ describe('installable', () => { }); }); }); + + describe('latest', () => { + it('should get the latest version from a shuffled array', () => { + const copy = available.slice(); + expect(Installable.latest(copy)).to.be.equal(latest); + expect(available).to.be.deep.equal(copy); + }); + }); + + describe('action', () => { + const installLatest: Installable.Action = 'installLatest'; + const installSelected: Installable.Action = 'installSelected'; + const update: Installable.Action = 'update'; + const remove: Installable.Action = 'remove'; + const unknown: Installable.Action = 'unknown'; + const notAvailable = '0.0.0'; + + it("should result 'unknown' if available is empty", () => { + expect(Installable.action({ available: [] })).to.be.equal(unknown); + }); + it("should result 'unknown' if installed is not in available", () => { + expect( + Installable.action({ available, installed: notAvailable }) + ).to.be.equal(unknown); + }); + + it("should result 'installLatest' if not installed and not selected", () => { + expect(Installable.action({ available })).to.be.equal(installLatest); + }); + it("should result 'installLatest' if not installed and latest is selected", () => { + expect(Installable.action({ available, selected: latest })).to.be.equal( + installLatest + ); + }); + + it("should result 'installSelected' if not installed and not latest is selected", () => { + available + .filter((version) => version !== latest) + .forEach((selected) => + expect( + Installable.action({ + available, + selected, + }) + ).to.be.equal(installSelected) + ); + }); + it("should result 'installSelected' if installed and the selected is neither the latest nor the installed", () => { + available.forEach((installed) => + available + .filter((selected) => selected !== latest && selected !== installed) + .forEach((selected) => + expect( + Installable.action({ + installed, + available, + selected, + }) + ).to.be.equal(installSelected) + ) + ); + }); + + it("should result 'update' if the installed version is not the latest and the latest is selected", () => { + available + .filter((installed) => installed !== latest) + .forEach((installed) => + expect( + Installable.action({ + installed, + available, + selected: latest, + }) + ).to.be.equal(update) + ); + }); + + it("should result 'remove' if the selected version equals the installed version", () => { + available.forEach((version) => + expect( + Installable.action({ + installed: version, + available, + selected: version, + }) + ).to.be.equal(remove) + ); + }); + }); }); diff --git a/i18n/en.json b/i18n/en.json index b24a89cd4..b6e67e855 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -160,13 +160,19 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { diff --git a/package.json b/package.json index 8267afa70..266f0feac 100644 --- a/package.json +++ b/package.json @@ -36,10 +36,6 @@ "typescript": "~4.5.5", "xhr2": "^0.2.1" }, - "resolutions": { - "@types/react": "18.0.0", - "@types/react-dom": "18.0.0" - }, "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", diff --git a/yarn.lock b/yarn.lock index e77dd480d..3ed199799 100644 --- a/yarn.lock +++ b/yarn.lock @@ -898,13 +898,6 @@ dependencies: regenerator-runtime "^0.13.10" -"@babel/runtime@^7.7.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== - 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" @@ -3535,10 +3528,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@18.0.0", "@types/react-dom@^18.0.6": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141" - integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg== +"@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== dependencies: "@types/react" "*" @@ -3556,14 +3549,6 @@ dependencies: "@types/react" "*" -"@types/react-virtualized@^9.21.21": - version "9.21.21" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.21.tgz#65c96f25314f0fb3d40536929dc78112753b49e1" - integrity sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA== - dependencies: - "@types/prop-types" "*" - "@types/react" "^17" - "@types/react-window@^1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" @@ -3571,7 +3556,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@18.0.0", "@types/react@^17", "@types/react@^18.0.15": +"@types/react@*": version "18.0.0" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.0.tgz#4be8aa3a2d04afc3ac2cc1ca43d39b0bd412890c" integrity sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw== @@ -3580,6 +3565,15 @@ "@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== + 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" @@ -5542,7 +5536,7 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -clsx@^1.0.4, clsx@^1.1.0: +clsx@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -6436,7 +6430,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-helpers@^5.0.1, dom-helpers@^5.1.3: +dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -12322,11 +12316,6 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - react-markdown@^8.0.0: version "8.0.3" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.3.tgz#e8aba0d2f5a1b2124d476ee1fff9448a2f57e4b3" @@ -12397,18 +12386,6 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react-virtualized@^9.22.3: - version "9.22.3" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== - dependencies: - "@babel/runtime" "^7.7.2" - clsx "^1.0.4" - dom-helpers "^5.1.3" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.4" - react-virtuoso@^2.17.0: version "2.19.1" resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-2.19.1.tgz#a660a5c3cafcc7a84b59dfc356e1916e632c1e3a" From b09ae485361b29db47374b497227bdeecb563592 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 20:02:34 +0000 Subject: [PATCH 165/384] build(deps): Bump actions/setup-go from 3 to 4 Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 4. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 52af464a6..d26c26def 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,7 +69,7 @@ jobs: python-version: '3.x' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 9e65dbdb3..d4bb68bb6 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -36,7 +36,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 708262c7f..a2c649593 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -23,7 +23,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 5b7337cf1..435d1e572 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -23,7 +23,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 8c735d938..a236db537 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -25,7 +25,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} From 0ab28266dfe1859eb4e1c88502452f419b667099 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 15 Feb 2023 18:03:37 +0100 Subject: [PATCH 166/384] feat: introduced cloud state in sketchbook view Closes #1879 Closes #1876 Closes #1899 Closes #1878 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/arduino-icons.json | 2 +- arduino-ide-extension/package.json | 5 +- .../browser/arduino-ide-frontend-module.ts | 12 +- .../src/browser/contributions/account.ts | 18 +- .../contributions/cloud-contribution.ts | 2 +- .../src/browser/contributions/contribution.ts | 5 +- .../contributions/create-cloud-copy.ts | 118 ++++++ .../browser/contributions/new-cloud-sketch.ts | 59 ++- .../contributions/rename-cloud-sketch.ts | 2 +- .../browser/contributions/save-as-sketch.ts | 108 +++--- .../src/browser/create/create-api.ts | 11 +- .../src/browser/create/create-features.ts | 55 ++- .../arduino-cloud-download.svg} | 0 .../icons/arduino-cloud-filled-offline.svg | 4 + .../browser/icons/arduino-cloud-filled.svg | 3 + .../browser/icons/arduino-cloud-offline.svg | 4 + .../arduino-cloud-upload.svg} | 0 .../src/browser/icons/arduino-cloud.svg | 3 + .../src/browser/style/account-icon.svg | 1 - .../src/browser/style/cloud-sketchbook.css | 34 +- .../src/browser/style/fonts.css | 24 +- .../src/browser/style/fonts/FontAwesome.svg | 6 + .../src/browser/style/fonts/FontAwesome.ttf | Bin 43180 -> 45416 bytes .../src/browser/style/fonts/FontAwesome.woff | Bin 43256 -> 45492 bytes .../src/browser/style/main.css | 6 +- .../src/browser/style/sketch-folder-icon.svg | 4 - .../src/browser/style/sketchbook.css | 7 - .../theia/core/connection-status-service.ts | 342 ++++++++++++++--- .../theia/core/sidebar-bottom-menu-widget.tsx | 20 +- .../theia/core/window-title-updater.ts | 74 +++- .../theia/messages/notifications-manager.ts | 8 - .../cloud-sketchbook-commands.ts | 88 +++++ .../cloud-sketchbook-composite-widget.tsx | 7 +- .../cloud-sketchbook-contributions.ts | 362 +++++++++++------- .../cloud-sketchbook-tree-model.ts | 14 +- .../cloud-sketchbook-tree-widget.tsx | 29 +- .../cloud-sketchbook/cloud-sketchbook-tree.ts | 216 +++++++---- ...cloud-user-status.tsx => cloud-status.tsx} | 58 +-- .../widgets/sketchbook/sketchbook-commands.ts | 3 - .../sketchbook/sketchbook-tree-widget.tsx | 27 +- .../widgets/sketchbook/sketchbook-tree.ts | 18 +- .../sketchbook-widget-contribution.ts | 18 +- .../src/common/protocol/sketches-service.ts | 13 +- arduino-ide-extension/src/common/utils.ts | 9 +- .../src/node/sketches-service-impl.ts | 178 ++++----- .../browser/connection-status-service.test.ts | 46 +++ .../node/boards-service-impl.slow-test.ts | 20 +- .../test/node/core-service-impl.slow-test.ts | 18 +- .../node/library-service-impl.slow-test.ts | 18 +- .../node/sketches-service-impl.slow-test.ts | 262 +++++++++++++ .../src/test/node/test-bindings.ts | 16 +- i18n/en.json | 12 +- yarn.lock | 245 +++++++++++- 53 files changed, 1963 insertions(+), 651 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts rename arduino-ide-extension/src/browser/{style/pull-sketch-icon.svg => icons/arduino-cloud-download.svg} (100%) create mode 100644 arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg create mode 100644 arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg create mode 100644 arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg rename arduino-ide-extension/src/browser/{style/push-sketch-icon.svg => icons/arduino-cloud-upload.svg} (100%) create mode 100644 arduino-ide-extension/src/browser/icons/arduino-cloud.svg delete mode 100644 arduino-ide-extension/src/browser/style/account-icon.svg delete mode 100644 arduino-ide-extension/src/browser/style/sketch-folder-icon.svg create mode 100644 arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-commands.ts rename arduino-ide-extension/src/browser/widgets/cloud-sketchbook/{cloud-user-status.tsx => cloud-status.tsx} (62%) create mode 100644 arduino-ide-extension/src/test/browser/connection-status-service.test.ts create mode 100644 arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts diff --git a/arduino-ide-extension/arduino-icons.json b/arduino-ide-extension/arduino-icons.json index d109db94f..7c510e9cf 100644 --- a/arduino-ide-extension/arduino-icons.json +++ b/arduino-ide-extension/arduino-icons.json @@ -1 +1 @@ -{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M558.545 1024c-23.818 0-47.637-9.095-65.819-27.276l-465.454-465.453c-36.363-36.363-36.363-95.273 0-131.636s95.273-36.363 131.637 0l399.636 399.636 772.003-772c36.361-36.363 95.269-36.363 131.631 0s36.361 95.273 0 131.637l-837.815 837.815c-18.182 18.181-42 27.276-65.818 27.276z"],"attrs":[{}],"width":1489,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-verify"]},"attrs":[{}],"properties":{"order":12,"id":192,"name":"arduino-verify","prevSize":28,"code":59659},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M1072.469 526.509l-409.603 409.598c-13.65 12.971-30.717 19.804-48.467 19.804s-34.817-6.833-48.467-19.804c-26.625-26.617-26.625-70.315 0-96.932l293.551-292.866h-791.217c-37.55 0-68.267-30.717-68.267-68.267s30.717-68.267 68.267-68.267h791.217l-293.551-292.866c-26.625-26.616-26.625-70.317 0-96.934 26.616-26.634 70.317-26.634 96.933 0l409.603 409.6c26.624 26.616 26.624 70.317 0 96.934v0z"],"attrs":[{}],"width":1161,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-upload"]},"attrs":[{}],"properties":{"order":11,"id":191,"name":"arduino-upload","prevSize":28,"code":59660},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M651.891 890.88c-92.835 0-179.095-28.493-250.5-77.197l-129.659 129.658c-22.494 22.496-58.964 22.496-81.458 0s-22.494-58.963 0-81.459l124.954-124.954c-67.75-78.157-108.777-180.090-108.777-291.489 0-245.759 199.68-445.439 445.44-445.439s445.44 199.679 445.44 445.439c0 245.761-199.68 445.441-445.44 445.441zM651.891 153.6c-161.28 0-291.84 130.559-291.84 291.839s130.56 291.841 291.84 291.841c160.512 0 291.84-130.561 291.84-291.841 0-160.511-130.56-291.839-291.84-291.839zM1149.562 478.091c0 35.423 28.717 64.138 64.141 64.138s64.134-28.716 64.134-64.138c0-35.423-28.71-64.139-64.134-64.139s-64.141 28.716-64.141 64.139zM64.064 542.237c-35.382 0-64.064-28.682-64.064-64.063s28.682-64.064 64.064-64.064c35.381 0 64.064 28.682 64.064 64.064s-28.683 64.063-64.064 64.063zM1458.707 542.229c-35.418 0-64.134-28.716-64.134-64.138s28.717-64.139 64.134-64.139c35.424 0 64.141 28.716 64.141 64.139s-28.717 64.138-64.141 64.138zM652.659 526.847c-44.961 0-81.408-36.447-81.408-81.407s36.447-81.408 81.408-81.408c44.96 0 81.408 36.447 81.408 81.408s-36.448 81.407-81.408 81.407z"],"attrs":[{}],"width":1536,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-monitor"]},"attrs":[{}],"properties":{"order":10,"id":190,"name":"arduino-monitor","prevSize":28,"code":59661},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M511.998 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z","M923.433 603.432c50.494 0 91.432-40.936 91.432-91.432s-40.937-91.432-91.432-91.432c-50.494 0-91.432 40.936-91.432 91.432s40.937 91.432 91.432 91.432z","M100.565 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-sketch-tabs-menu"]},"attrs":[{},{},{}],"properties":{"order":9,"id":189,"name":"arduino-sketch-tabs-menu","prevSize":28,"code":59662},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M323.368 970.208c-20.263 0-39-11.42-48.21-29.788l-146.789-293.581h-74.474c-29.789 0-53.895-24.107-53.895-53.895s24.105-53.895 53.895-53.895h107.789c20.421 0 39.053 11.528 48.21 29.788l96.527 193.056 180.263-720.949c5.842-23.579 26.737-40.263 51-40.842 23.947-1.579 45.893 15.158 52.894 38.421l150.162 500.526h67.681c29.788 0 53.895 24.107 53.895 53.895s-24.107 53.895-53.895 53.895h-107.789c-23.789 0-44.787-15.629-51.631-38.422l-105.316-351.104-168.052 672.053c-5.474 21.897-23.948 38.055-46.368 40.529-2 0.21-3.947 0.313-5.895 0.313h-0.001z"],"attrs":[{}],"width":862,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-plotter"]},"attrs":[{}],"properties":{"order":8,"id":188,"name":"arduino-plotter","prevSize":28,"code":59663},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M416.006 800c-4.211 0.026-8.386-0.787-12.285-2.374-3.899-1.594-7.445-3.942-10.435-6.906l-224-224.002c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l201.28 201.602 425.281-425.602c6.022-6.026 14.195-9.411 22.72-9.411 8.518 0 16.691 3.386 22.72 9.411 6.022 6.026 9.408 14.198 9.408 22.72s-3.386 16.694-9.408 22.72l-448.001 448.002c-2.99 2.963-6.536 5.312-10.435 6.906-3.899 1.587-8.074 2.4-12.285 2.374z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fa-check"],"grid":14},"attrs":[{}],"properties":{"order":722,"id":0,"name":"fa-check","prevSize":28,"code":59658},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M864 128h-576c-8.484 0.062-16.618 3.385-22.72 9.28l-128 128c-5.969 6.052-9.305 14.219-9.28 22.72v576c0.024 8.48 3.404 16.602 9.4 22.598s14.121 9.376 22.6 9.402h576c8.486-0.038 16.634-3.36 22.72-9.28l128-128c5.894-6.099 9.216-14.234 9.28-22.72v-576c-0.026-8.479-3.405-16.605-9.402-22.6s-14.118-9.375-22.598-9.4zM704 832h-512v-512h512v512zM722.56 256h-485.12l63.68-64h485.44l-64 64zM832 722.88l-64 63.68v-485.12l64-64v485.44z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-3dimensionscube"],"grid":14},"attrs":[{}],"properties":{"order":717,"id":1,"name":"arduino-technology-3dimensionscube","prevSize":28,"code":59654},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M848 224v96c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-16v96c-0.019 5.909-1.67 11.699-4.781 16.725-3.104 5.027-7.539 9.096-12.819 11.755l-238.4 119.36v242.88c16.845 7.354 30.644 20.282 39.079 36.608 8.435 16.333 10.989 35.066 7.233 53.056s-13.59 34.144-27.852 45.734c-14.262 11.597-32.081 17.92-50.46 17.92s-36.198-6.323-50.46-17.92c-14.262-11.59-24.097-27.744-27.852-45.734s-1.201-36.723 7.233-53.056c8.435-16.326 22.234-29.254 39.079-36.608v-82.88l-238.4-119.36c-5.277-2.659-9.715-6.728-12.822-11.755s-4.76-10.816-4.778-16.725v-102.72c-16.845-7.352-30.644-20.279-39.079-36.609s-10.988-35.066-7.233-53.057c3.755-17.992 13.59-34.141 27.852-45.734s32.081-17.921 50.46-17.921c18.38 0 36.198 6.328 50.46 17.921s24.097 27.743 27.852 45.734c3.756 17.992 1.201 36.727-7.233 53.057s-22.234 29.257-39.079 36.609v82.88l192 96v-524.16h-32c-6.372 0.032-12.609-1.839-17.91-5.374s-9.428-8.572-11.85-14.466c-2.41-5.858-3.028-12.3-1.775-18.509s4.321-11.907 8.815-16.371l64-64c2.975-2.999 6.514-5.38 10.413-7.005s8.083-2.461 12.307-2.461c4.225 0 8.407 0.836 12.307 2.461s7.439 4.005 10.413 7.005l64 64c4.44 4.5 7.448 10.214 8.644 16.422s0.526 12.63-1.924 18.458c-2.401 5.844-6.477 10.846-11.716 14.377s-11.406 5.432-17.724 5.463h-32v364.16l192-96v-76.16h-16c-8.486 0-16.627-3.372-22.63-9.373-5.997-6.001-9.37-14.14-9.37-22.627v-96c0-8.487 3.373-16.627 9.37-22.627 6.003-6.001 14.144-9.373 22.63-9.373h96c8.486 0 16.627 3.372 22.63 9.373 5.997 6.001 9.37 14.14 9.37 22.627z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-usb"],"grid":14},"attrs":[{}],"properties":{"order":715,"id":2,"name":"arduino-technology-usb","prevSize":28,"code":59655},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M512 832c35.346 0 64-28.653 64-64s-28.654-64-64-64c-35.346 0-64 28.653-64 64s28.654 64 64 64z","M647.699 664.32c-8.442-0.122-16.493-3.571-22.401-9.6-14.863-14.9-32.519-26.721-51.957-34.787s-40.277-12.218-61.323-12.218c-21.046 0-41.884 4.152-61.323 12.218s-37.094 19.887-51.957 34.787c-5.996 5.958-14.106 9.306-22.56 9.306s-16.564-3.347-22.56-9.306c-5.96-5.997-9.306-14.106-9.306-22.559s3.345-16.564 9.306-22.56c20.801-20.803 45.495-37.304 72.673-48.563s56.308-17.053 85.727-17.053c29.418 0 58.548 5.795 85.726 17.053s51.875 27.761 72.675 48.563c4.512 4.476 7.59 10.194 8.838 16.426 1.254 6.232 0.614 12.695-1.818 18.562-2.438 5.875-6.573 10.886-11.866 14.4-5.299 3.514-11.52 5.37-17.875 5.331z","M919.373 392.639c-4.269 0.195-8.538-0.47-12.55-1.954s-7.686-3.757-10.81-6.686c-101.965-101.613-240.045-158.669-383.997-158.669-143.951 0-282.035 57.056-384 158.669-6.026 5.983-14.181 9.328-22.673 9.298s-16.623-3.432-22.607-9.458c-5.983-6.026-9.327-14.181-9.298-22.673s3.432-16.623 9.458-22.607c114.009-113.924 268.588-177.918 429.76-177.918 161.175 0 315.754 63.994 429.757 177.918 3.002 2.975 5.382 6.514 7.008 10.413s2.458 8.083 2.458 12.307c0 4.225-0.832 8.407-2.458 12.307s-4.006 7.439-7.008 10.413c-3.078 2.89-6.701 5.14-10.656 6.623-3.949 1.483-8.16 2.168-12.384 2.017z","M783.706 528.316c-4.211 0.024-8.384-0.783-12.288-2.375-3.898-1.592-7.443-3.939-10.432-6.905-32.691-32.703-71.501-58.646-114.221-76.346-42.715-17.7-88.501-26.81-134.74-26.81s-92.025 9.11-134.742 26.81c-42.717 17.7-81.529 43.643-114.218 76.346-6.122 5.242-13.996 7.982-22.049 7.671s-15.693-3.65-21.393-9.349c-5.699-5.699-9.037-13.338-9.348-21.392s2.428-15.928 7.67-22.050c78.009-77.968 183.788-121.767 294.080-121.767s216.072 43.799 294.081 121.767c5.958 5.996 9.306 14.106 9.306 22.56s-3.347 16.564-9.306 22.56c-5.958 5.912-14.003 9.245-22.4 9.28z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-connection"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":714,"id":3,"name":"arduino-technology-connection","prevSize":28,"code":59656},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M512.006 991.994c-4.198 0.109-8.362-0.768-12.16-2.56-5.844-2.4-10.846-6.477-14.377-11.712-3.53-5.242-5.431-11.405-5.463-17.728v-370.877l-169.28 169.597c-2.984 2.989-6.525 5.35-10.424 6.97-3.898 1.613-8.077 2.445-12.296 2.445s-8.397-0.832-12.296-2.445c-3.898-1.619-7.441-3.981-10.424-6.97-2.984-2.982-5.35-6.522-6.965-10.419s-2.445-8.077-2.445-12.301c0-4.218 0.831-8.397 2.445-12.294s3.981-7.437 6.965-10.426l201.6-201.277-201.6-201.28c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l169.28 169.6v-370.88c0.032-6.318 1.933-12.485 5.463-17.724s8.533-9.316 14.377-11.716c5.828-2.451 12.25-3.12 18.458-1.924s11.922 4.204 16.422 8.644l224.001 224c3.002 2.975 5.382 6.514 7.002 10.413 1.626 3.9 2.464 8.082 2.464 12.307s-0.838 8.407-2.464 12.307c-1.619 3.9-4 7.439-7.002 10.413l-201.601 201.28 201.601 201.277c3.002 2.976 5.382 6.515 7.002 10.419 1.626 3.898 2.464 8.077 2.464 12.301 0 4.23-0.838 8.41-2.464 12.307-1.619 3.904-4 7.443-7.002 10.413l-224.001 224c-2.99 2.97-6.536 5.318-10.435 6.906-3.899 1.594-8.074 2.4-12.285 2.374zM544.006 589.117v293.757l146.881-146.88-146.881-146.877zM544.006 141.117v293.76l146.881-146.88-146.881-146.88z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-bluetooth"],"grid":14},"attrs":[{}],"properties":{"order":713,"id":4,"name":"arduino-technology-bluetooth","prevSize":28,"code":59657},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M613.86 663.104c-8.983 0.005-17.72-2.956-24.841-8.429-7.126-5.474-12.241-13.144-14.55-21.825s-1.685-17.883 1.778-26.173c3.463-8.29 9.57-15.202 17.366-19.661l304.621-173.965-488.052-278.887v296.386c0 10.801-4.291 21.16-11.929 28.799-7.638 7.636-17.997 11.927-28.799 11.927s-21.16-4.291-28.799-11.927c-7.638-7.638-11.929-17.997-11.929-28.799v-366.545c-0.004-7.135 1.867-14.146 5.426-20.33s8.681-11.324 14.852-14.905c6.171-3.581 13.175-5.477 20.31-5.499s14.15 1.832 20.343 5.376l610.91 349.045c6.232 3.561 11.413 8.707 15.020 14.917 3.603 6.21 5.502 13.261 5.502 20.441s-1.899 14.232-5.502 20.441c-3.607 6.21-8.788 11.356-15.020 14.917l-366.545 209.324c-6.135 3.528-13.089 5.381-20.163 5.371z","M491.636 797.094c10.803 0 21.16-4.291 28.798-11.93s11.93-17.994 11.93-28.798c0-10.803-4.291-21.16-11.93-28.798s-17.994-11.93-28.798-11.93h-43.173c-1.991-17.389-5.534-34.56-10.589-51.316l41.949-41.951c3.798-3.793 6.81-8.304 8.867-13.265 2.053-4.962 3.109-10.277 3.109-15.649s-1.057-10.687-3.109-15.649c-2.057-4.962-5.069-9.467-8.867-13.265s-8.304-6.81-13.265-8.867c-4.961-2.053-10.279-3.114-15.649-3.114s-10.688 1.061-15.649 3.114c-4.961 2.057-9.47 5.069-13.267 8.867l-21.585 21.583c-14.553-22.109-34.216-40.387-57.327-53.285-23.11-12.902-48.988-20.052-75.444-20.838-26.456 0.787-52.334 7.936-75.444 20.838s-42.774 31.181-57.327 53.29l-21.585-21.588c-7.669-7.671-18.070-11.976-28.915-11.976s-21.247 4.305-28.916 11.976c-7.669 7.666-11.978 18.069-11.978 28.914s4.308 21.248 11.977 28.914l41.949 41.951c-5.055 16.756-8.599 33.927-10.589 51.316h-43.171c-10.802 0-21.161 4.291-28.799 11.93s-11.929 17.994-11.929 28.798c0 10.803 4.291 21.16 11.929 28.798s17.997 11.93 28.799 11.93h43.173c1.991 17.389 5.534 34.56 10.589 51.316l-1.222 1.224-40.727 40.727c-7.631 7.685-11.913 18.078-11.913 28.914 0 10.831 4.282 21.225 11.913 28.914 7.72 7.568 18.102 11.813 28.915 11.813s21.194-4.245 28.915-11.813l21.585-21.588c14.553 22.109 34.216 40.387 57.327 53.29s48.989 20.052 75.445 20.838c26.456-0.787 52.334-7.936 75.444-20.838s42.774-31.181 57.327-53.29l21.585 21.588c7.72 7.573 18.102 11.813 28.915 11.813s21.194-4.24 28.916-11.813c7.629-7.689 11.911-18.083 11.911-28.914 0-10.836-4.282-21.229-11.911-28.914l-41.95-41.951c5.055-16.756 8.599-33.927 10.589-51.316h43.174zM267.636 593.458c37.058 0 69.644 32.991 87.564 81.455h-175.127c17.92-48.463 50.506-81.455 87.564-81.455zM267.636 919.276c-55.389 0-101.818-74.533-101.818-162.909h203.636c0 88.376-46.429 162.909-101.818 162.909z"],"attrs":[{},{}],"tags":["arduino-debugger"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{},{}],"properties":{"order":696,"id":5,"name":"arduino-debugger","prevSize":28,"code":59653},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M1011.905 953.837l-286.249-286.249c66.349-81.248 98.942-184.882 91.034-289.478-7.903-104.597-55.702-202.157-133.511-272.506-77.804-70.35-179.671-108.111-284.533-105.473s-204.701 45.47-278.874 119.643c-74.172 74.172-117.006 174.012-119.643 278.874s35.123 206.729 105.473 284.537c70.35 77.804 167.91 125.604 272.506 133.506 104.597 7.907 208.231-24.685 289.479-91.034l286.249 286.249c3.8 3.832 8.323 6.874 13.305 8.95s10.328 3.145 15.727 3.145c5.398 0 10.745-1.071 15.727-3.145 4.986-2.075 9.506-5.117 13.31-8.95 3.832-3.804 6.874-8.323 8.95-13.31 2.075-4.982 3.145-10.328 3.145-15.727s-1.071-10.739-3.145-15.727c-2.075-4.982-5.117-9.506-8.95-13.305v0zM410.372 737.512c-64.702 0-127.952-19.184-181.75-55.132-53.798-35.944-95.728-87.038-120.49-146.816s-31.239-125.554-18.616-189.013c12.623-63.459 43.78-121.751 89.532-167.502s104.043-76.909 167.502-89.532c63.459-12.623 129.235-6.145 189.013 18.616s110.868 66.691 146.816 120.489c35.948 53.798 55.132 117.048 55.132 181.75 0 86.766-34.467 169.972-95.815 231.325-61.353 61.349-144.564 95.815-231.326 95.815v0z"],"attrs":[{}],"tags":["arduino-search"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{}],"properties":{"order":689,"id":6,"name":"arduino-search","prevSize":28,"code":59649},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M997.684 728.889c0 11.506-4.572 22.538-12.707 30.67s-19.165 12.707-30.67 12.707h-433.777c-11.506 0-22.538-4.572-30.673-12.707s-12.705-19.165-12.705-30.67 4.571-22.538 12.705-30.67c8.136-8.134 19.166-12.707 30.673-12.707h433.777c11.506 0 22.538 4.572 30.67 12.707s12.707 19.165 12.707 30.67z","M1201.991 351.068l-74.173-73.742v-199.104c0-11.503-4.572-22.539-12.707-30.673s-19.165-12.705-30.67-12.705h-910.933c-11.503 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v130.133h-86.756c-11.504 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v216.89c0 11.503 4.571 22.539 12.705 30.673s19.168 12.705 30.673 12.705h86.756v433.777c0 11.506 4.571 22.538 12.705 30.67s19.168 12.707 30.673 12.707h910.933c5.71 0.034 11.368-1.062 16.653-3.216 5.285-2.161 10.092-5.342 14.143-9.365l86.756-86.756c4.020-4.052 7.203-8.859 9.365-14.143 2.157-5.285 3.253-10.94 3.216-16.653v-477.156c0.034-5.708-1.062-11.369-3.216-16.654-2.161-5.285-5.342-10.092-9.365-14.145zM86.751 425.243v-130.133h216.89v130.133h-216.89zM1127.818 841.24l-61.159 61.159h-849.774v-390.4h130.133c11.503 0 22.539-4.571 30.673-12.705s12.705-19.168 12.705-30.673v-216.89c0-11.503-4.571-22.539-12.705-30.673s-19.168-12.705-30.673-12.705h-130.133v-86.756h824.177v173.51c-0.034 5.708 1.062 11.369 3.216 16.654 2.161 5.285 5.342 10.092 9.365 14.145l74.173 73.742v441.589z"],"width":1214.5714285714287,"attrs":[{},{}],"tags":["arduino-boards"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{},{}],"properties":{"order":7,"id":7,"name":"arduino-boards","prevSize":28,"code":59650},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M1021.954 918.445l-171.299-652.491c-2.901-9.738-9.491-17.956-18.363-22.903-8.876-4.946-19.333-6.228-29.138-3.571l-141.319 35.427v-230.085c0-10.325-4.102-20.227-11.403-27.529s-17.201-11.403-27.528-11.403h-155.725c-10.327 0-20.226 4.101-27.529 11.403-7.301 7.302-11.403 17.203-11.403 27.529v116.794h-155.725v-77.863c0-10.325-4.101-20.227-11.403-27.529s-17.203-11.403-27.529-11.403h-194.658c-10.325 0-20.227 4.101-27.529 11.403s-11.403 17.203-11.403 27.529v895.424c0 10.327 4.101 20.226 11.403 27.528s17.203 11.403 27.529 11.403h583.972c10.327 0 20.226-4.102 27.528-11.403s11.403-17.201 11.403-27.528v-454.332l119.909 456.668c2.207 8.565 7.265 16.124 14.34 21.433 7.079 5.308 15.751 8.044 24.591 7.764 3.364 0.379 6.758 0.379 10.123 0l164.678-43.212c9.975-2.589 18.518-9.032 23.75-17.908 2.581-4.721 4.156-9.926 4.627-15.288 0.467-5.361-0.178-10.759-1.9-15.857v0zM194.659 940.247h-116.794v-817.56h116.794v817.56zM428.248 940.247h-155.725v-700.766h155.725v700.766zM583.973 940.247h-77.863v-856.491h77.863v856.491zM847.15 923.896l-151.442-576.964 89.543-23.748 151.442 578.132-89.543 22.58z"],"attrs":[{}],"tags":["arduino-library"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{}],"properties":{"order":691,"id":8,"name":"arduino-library","prevSize":28,"code":59651},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M1189.198 204.801h-542.21l-189.437-189.951c-4.784-4.746-10.457-8.499-16.696-11.048s-12.918-3.84-19.656-3.801h-358.398c-13.579 0-26.602 5.394-36.204 14.997s-14.997 22.624-14.997 36.204v921.597c0 13.581 5.394 26.601 14.997 36.203s22.624 14.998 36.204 14.998h1126.397c13.581 0 26.601-5.395 36.203-14.998s14.998-22.621 14.998-36.203v-716.798c0-13.579-5.395-26.602-14.998-36.204s-22.621-14.997-36.203-14.997zM114.001 102.4h286.208l102.4 102.4h-388.606v-102.4zM1137.998 921.598h-1023.998v-614.398h1023.998v614.398z"],"width":1252,"attrs":[{}],"tags":["arduino-folder"],"grid":14,"isMulticolor":false,"isMulticolor2":false},"attrs":[{}],"properties":{"order":692,"id":9,"name":"arduino-folder","prevSize":28,"code":59652},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M512.083 959.936c118.817 0 232.769-47.2 316.781-131.213 84.019-84.019 131.219-197.969 131.219-316.785 0-8.487-3.373-16.627-9.376-22.628-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.372-22.63 9.373c-5.997 6.001-9.37 14.141-9.37 22.627-0.019 87.81-30.131 172.959-85.318 241.26s-132.115 115.622-217.962 134.086c-85.848 18.458-175.428 6.931-253.811-32.646-78.383-39.584-140.833-104.832-176.941-184.87-36.108-80.045-43.693-170.045-21.49-255.001s72.852-159.737 143.505-211.878c70.653-52.141 157.042-78.492 244.768-74.662s171.487 37.612 237.33 95.712h-158.081c-8.487 0-16.626 3.372-22.627 9.373s-9.373 14.141-9.373 22.627c0 8.487 3.372 16.627 9.373 22.628s14.14 9.372 22.627 9.372h224.001c8.486 0 16.627-3.371 22.624-9.372 6.003-6.001 9.376-14.141 9.376-22.628v-224c0-8.487-3.373-16.626-9.376-22.627-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.371-22.63 9.373c-5.997 6.001-9.37 14.14-9.37 22.627v136.96c-55.162-46.332-120.678-78.68-191.002-94.301s-143.375-14.052-212.963 4.571c-69.588 18.623-133.659 53.753-186.78 102.41s-93.725 109.405-118.369 177.096c-24.644 67.69-32.602 140.324-23.199 211.745 9.404 71.419 35.891 139.521 77.216 198.523 41.325 59.008 96.27 107.174 160.174 140.422s134.885 50.598 206.922 50.573v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}]},"tags":["reload"],"grid":14},"attrs":[{}],"properties":{"order":681,"id":10,"name":"reload","prevSize":28,"code":59648},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M846.857 600c34.857 20 46.857 65.143 26.857 100l-36.571 62.857c-20 34.857-65.143 46.857-100 26.857l-152-87.429v175.429c0 40-33.143 73.143-73.143 73.143h-73.143c-40 0-73.143-33.143-73.143-73.143v-175.429l-152 87.429c-34.857 20-80 8-100-26.857l-36.571-62.857c-20-34.857-8-80 26.857-100l152-88-152-88c-34.857-20-46.857-65.143-26.857-100l36.571-62.857c20-34.857 65.143-46.857 100-26.857l152 87.429v-175.429c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v175.429l152-87.429c34.857-20 80-8 100 26.857l36.571 62.857c20 34.857 8 80-26.857 100l-152 88z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["asterisk"],"defaultCode":61545,"grid":14},"attrs":[],"properties":{"name":"asterisk","id":11,"order":679,"prevSize":28,"code":61545},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v237.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h237.714v-237.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857v237.714h237.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["plus"],"defaultCode":61543,"grid":14},"attrs":[],"properties":{"name":"plus","id":12,"order":3,"prevSize":28,"code":61543},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M402.286 717.714v137.143c0 12.571-10.286 22.857-22.857 22.857h-137.143c-12.571 0-22.857-10.286-22.857-22.857v-137.143c0-12.571 10.286-22.857 22.857-22.857h137.143c12.571 0 22.857 10.286 22.857 22.857zM582.857 374.857c0 108.571-73.714 150.286-128 180.571-33.714 19.429-54.857 58.857-54.857 75.429v0c0 12.571-9.714 27.429-22.857 27.429h-137.143c-12.571 0-20.571-19.429-20.571-32v-25.714c0-69.143 68.571-128.571 118.857-151.429 44-20 62.286-38.857 62.286-75.429 0-32-41.714-60.571-88-60.571-25.714 0-49.143 8-61.714 16.571-13.714 9.714-27.429 23.429-61.143 65.714-4.571 5.714-11.429 9.143-17.714 9.143-5.143 0-9.714-1.714-14.286-4.571l-93.714-71.429c-9.714-7.429-12-20-5.714-30.286 61.714-102.286 148.571-152 265.143-152 122.286 0 259.429 97.714 259.429 228.571z"],"width":634.88,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["question"],"defaultCode":61736,"grid":14},"attrs":[],"properties":{"name":"question","id":13,"order":4,"prevSize":28,"code":61736},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-694.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h694.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["minus"],"defaultCode":61544,"grid":14},"attrs":[],"properties":{"name":"minus","id":14,"order":5,"prevSize":28,"code":61544},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M877.714 128v640c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-306.857l-438.857 135.429v405.143c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-552.571c0-24 16-45.143 38.857-52.571l475.429-146.286c5.143-1.714 10.286-2.286 16-2.286 30.286 0 54.857 24.571 54.857 54.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["music"],"defaultCode":61441,"grid":14},"attrs":[],"properties":{"name":"music","id":15,"order":7,"prevSize":28,"code":61441},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40-33.143 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["search"],"defaultCode":61442,"grid":14},"attrs":[],"properties":{"name":"search","id":16,"order":8,"prevSize":28,"code":61442},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M950.857 859.429v-438.857c-12 13.714-25.143 26.286-39.429 37.714-81.714 62.857-164 126.857-243.429 193.143-42.857 36-96 80-155.429 80h-1.143c-59.429 0-112.571-44-155.429-80-79.429-66.286-161.714-130.286-243.429-193.143-14.286-11.429-27.429-24-39.429-37.714v438.857c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM950.857 258.857c0-14.286 3.429-39.429-18.286-39.429h-841.143c-9.714 0-18.286 8.571-18.286 18.286 0 65.143 32.571 121.714 84 162.286 76.571 60 153.143 120.571 229.143 181.143 30.286 24.571 85.143 77.143 125.143 77.143h1.143c40 0 94.857-52.571 125.143-77.143 76-60.571 152.571-121.143 229.143-181.143 37.143-29.143 84-92.571 84-141.143zM1024 237.714v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["envelope-o"],"defaultCode":61443,"grid":14},"attrs":[],"properties":{"name":"envelope-o","id":17,"order":9,"prevSize":28,"code":61443},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M512 950.857c-9.143 0-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429 0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["heart"],"defaultCode":61444,"grid":14},"attrs":[],"properties":{"name":"heart","id":18,"order":10,"prevSize":28,"code":61444},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 14.857-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star"],"defaultCode":61445,"grid":14},"attrs":[],"properties":{"name":"star","id":19,"order":11,"prevSize":28,"code":61445},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M649.714 573.714l174.857-169.714-241.143-35.429-108-218.286-108 218.286-241.143 35.429 174.857 169.714-41.714 240.571 216-113.714 215.429 113.714zM950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 15.429-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star-o"],"defaultCode":61446,"grid":14},"attrs":[],"properties":{"name":"star-o","id":20,"order":12,"prevSize":28,"code":61446},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M731.429 799.429c0 83.429-54.857 151.429-121.714 151.429h-488c-66.857 0-121.714-68-121.714-151.429 0-150.286 37.143-324 186.857-324 46.286 45.143 109.143 73.143 178.857 73.143s132.571-28 178.857-73.143c149.714 0 186.857 173.714 186.857 324zM585.143 292.571c0 121.143-98.286 219.429-219.429 219.429s-219.429-98.286-219.429-219.429 98.286-219.429 219.429-219.429 219.429 98.286 219.429 219.429z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["user"],"defaultCode":61447,"grid":14},"attrs":[],"properties":{"name":"user","id":21,"order":13,"prevSize":28,"code":61447},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M219.429 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 914.286v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM219.429 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 475.429v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM1024 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1097.143 164.571v768c0 50.286-41.143 91.429-91.429 91.429h-914.286c-50.286 0-91.429-41.143-91.429-91.429v-768c0-50.286 41.143-91.429 91.429-91.429h914.286c50.286 0 91.429 41.143 91.429 91.429z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["film"],"defaultCode":61448,"grid":14},"attrs":[],"properties":{"name":"film","id":22,"order":14,"prevSize":28,"code":61448},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M438.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM438.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["th-large"],"defaultCode":61449,"grid":14},"attrs":[],"properties":{"name":"th-large","id":23,"order":15,"prevSize":28,"code":61449},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["th"],"defaultCode":61450,"grid":14},"attrs":[],"properties":{"name":"th","id":24,"order":16,"prevSize":28,"code":61450},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["th-list"],"defaultCode":61451,"grid":14},"attrs":[],"properties":{"name":"th-list","id":25,"order":17,"prevSize":28,"code":61451},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M725.322 782.343c3.477 3.448 6.237 7.547 8.118 12.069 1.885 4.515 2.853 9.364 2.853 14.259s-0.967 9.744-2.853 14.266c-1.881 4.515-4.641 8.623-8.118 12.069-3.448 3.472-7.547 6.232-12.069 8.118-4.515 1.881-9.364 2.848-14.259 2.848s-9.744-0.967-14.266-2.848c-4.522-1.885-8.623-4.646-12.069-8.118l-270.371-270.375-270.372 270.375c-3.448 3.472-7.549 6.232-12.069 8.118-4.519 1.881-9.366 2.848-14.263 2.848s-9.744-0.967-14.263-2.848c-4.519-1.885-8.622-4.646-12.069-8.118-3.474-3.448-6.235-7.555-8.118-12.069-1.884-4.522-2.853-9.37-2.853-14.266s0.97-9.744 2.853-14.259c1.884-4.522 4.643-8.623 8.118-12.069l270.372-270.375-270.372-270.372c-3.456-3.456-6.201-7.565-8.072-12.082s-2.835-9.36-2.835-14.25c0-4.891 0.964-9.732 2.835-14.25s4.617-8.626 8.072-12.081c3.456-3.456 7.564-6.201 12.081-8.072s9.361-2.835 14.25-2.835c4.891 0 9.732 0.964 14.25 2.835s8.626 4.617 12.081 8.072l270.372 270.372 270.371-270.372c6.984-6.983 16.455-10.909 26.335-10.909 9.875 0 19.347 3.923 26.33 10.909s10.909 16.456 10.909 26.333c0 9.877-3.923 19.348-10.909 26.333l-270.371 270.372 270.371 270.375z"],"width":804.5714285714286,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}]},"tags":["close","remove","times"],"defaultCode":61453,"grid":14},"attrs":[{}],"properties":{"name":"close, remove, times","id":26,"order":19,"prevSize":28,"code":61453},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-128v128c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-128h-128c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h128v-128c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286v128h128c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["search-plus"],"defaultCode":61454,"grid":14},"attrs":[],"properties":{"name":"search-plus","id":27,"order":20,"prevSize":28,"code":61454},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-329.143c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h329.143c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["search-minus"],"defaultCode":61456,"grid":14},"attrs":[],"properties":{"name":"search-minus","id":28,"order":21,"prevSize":28,"code":61456},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857s-438.857-197.143-438.857-438.857c0-138.857 64-266.857 175.429-350.286 32.571-24.571 78.286-18.286 102.286 14.286 24.571 32 17.714 78.286-14.286 102.286-74.286 56-117.143 141.143-117.143 233.714 0 161.143 131.429 292.571 292.571 292.571s292.571-131.429 292.571-292.571c0-92.571-42.857-177.714-117.143-233.714-32-24-38.857-70.286-14.286-102.286 24-32.571 70.286-38.857 102.286-14.286 111.429 83.429 175.429 211.429 175.429 350.286zM512 73.143v365.714c0 40-33.143 73.143-73.143 73.143s-73.143-33.143-73.143-73.143v-365.714c0-40 33.143-73.143 73.143-73.143s73.143 33.143 73.143 73.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["power-off"],"defaultCode":61457,"grid":14},"attrs":[],"properties":{"name":"power-off","id":29,"order":22,"prevSize":28,"code":61457},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M146.286 822.857v109.714c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM365.714 749.714v182.857c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM585.143 603.429v329.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM804.571 384v548.571c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-548.571c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM1024 91.429v841.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-841.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["signal"],"defaultCode":61458,"grid":14},"attrs":[],"properties":{"name":"signal","id":30,"order":23,"prevSize":28,"code":61458},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M585.143 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM877.714 449.714v126.857c0 8.571-6.857 18.857-16 20.571l-105.714 16c-6.286 18.286-13.143 35.429-22.286 52 19.429 28 40 53.143 61.143 78.857 3.429 4 5.714 9.143 5.714 14.286s-1.714 9.143-5.143 13.143c-13.714 18.286-90.857 102.286-110.286 102.286-5.143 0-10.286-2.286-14.857-5.143l-78.857-61.714c-16.571 8.571-34.286 16-52 21.714-4 34.857-7.429 72-16.571 106.286-2.286 9.143-10.286 16-20.571 16h-126.857c-10.286 0-19.429-7.429-20.571-17.143l-16-105.143c-17.714-5.714-34.857-12.571-51.429-21.143l-80.571 61.143c-4 3.429-9.143 5.143-14.286 5.143s-10.286-2.286-14.286-6.286c-30.286-27.429-70.286-62.857-94.286-96-2.857-4-4-8.571-4-13.143 0-5.143 1.714-9.143 4.571-13.143 19.429-26.286 40.571-51.429 60-78.286-9.714-18.286-17.714-37.143-23.429-56.571l-104.571-15.429c-9.714-1.714-16.571-10.857-16.571-20.571v-126.857c0-8.571 6.857-18.857 15.429-20.571l106.286-16c5.714-18.286 13.143-35.429 22.286-52.571-19.429-27.429-40-53.143-61.143-78.857-3.429-4-5.714-8.571-5.714-13.714s2.286-9.143 5.143-13.143c13.714-18.857 90.857-102.286 110.286-102.286 5.143 0 10.286 2.286 14.857 5.714l78.857 61.143c16.571-8.571 34.286-16 52-21.714 4-34.857 7.429-72 16.571-106.286 2.286-9.143 10.286-16 20.571-16h126.857c10.286 0 19.429 7.429 20.571 17.143l16 105.143c17.714 5.714 34.857 12.571 51.429 21.143l81.143-61.143c3.429-3.429 8.571-5.143 13.714-5.143s10.286 2.286 14.286 5.714c30.286 28 70.286 63.429 94.286 97.143 2.857 3.429 4 8 4 12.571 0 5.143-1.714 9.143-4.571 13.143-19.429 26.286-40.571 51.429-60 78.286 9.714 18.286 17.714 37.143 23.429 56l104.571 16c9.714 1.714 16.571 10.857 16.571 20.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["cog","gear"],"defaultCode":61459,"grid":14},"attrs":[],"properties":{"name":"cog, gear","id":31,"order":24,"prevSize":28,"code":61459},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M292.571 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM438.857 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM585.143 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM658.286 834.286v-541.714h-512v541.714c0 27.429 15.429 43.429 18.286 43.429h475.429c2.857 0 18.286-16 18.286-43.429zM274.286 219.429h256l-27.429-66.857c-1.714-2.286-6.857-5.714-9.714-6.286h-181.143c-3.429 0.571-8 4-9.714 6.286zM804.571 237.714v36.571c0 10.286-8 18.286-18.286 18.286h-54.857v541.714c0 62.857-41.143 116.571-91.429 116.571h-475.429c-50.286 0-91.429-51.429-91.429-114.286v-544h-54.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h176.571l40-95.429c11.429-28 45.714-50.857 76-50.857h182.857c30.286 0 64.571 22.857 76 50.857l40 95.429h176.571c10.286 0 18.286 8 18.286 18.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["trash-o"],"defaultCode":61460,"grid":14},"attrs":[],"properties":{"name":"trash-o","id":32,"order":25,"prevSize":28,"code":61460},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M804.571 566.857v274.286c0 20-16.571 36.571-36.571 36.571h-219.429v-219.429h-146.286v219.429h-219.429c-20 0-36.571-16.571-36.571-36.571v-274.286c0-1.143 0.571-2.286 0.571-3.429l328.571-270.857 328.571 270.857c0.571 1.143 0.571 2.286 0.571 3.429zM932 527.429l-35.429 42.286c-2.857 3.429-7.429 5.714-12 6.286h-1.714c-4.571 0-8.571-1.143-12-4l-395.429-329.714-395.429 329.714c-4 2.857-8.571 4.571-13.714 4-4.571-0.571-9.143-2.857-12-6.286l-35.429-42.286c-6.286-7.429-5.143-19.429 2.286-25.714l410.857-342.286c24-20 62.857-20 86.857 0l139.429 116.571v-111.429c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v233.143l125.143 104c7.429 6.286 8.571 18.286 2.286 25.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["home"],"defaultCode":61461,"grid":14},"attrs":[],"properties":{"name":"home","id":33,"order":26,"prevSize":28,"code":61461},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["file-o"],"defaultCode":61462,"grid":14},"attrs":[],"properties":{"name":"file-o","id":34,"order":27,"prevSize":28,"code":61462},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M512 310.857v256c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h128v-201.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["clock-o"],"defaultCode":61463,"grid":14},"attrs":[],"properties":{"name":"clock-o","id":35,"order":28,"prevSize":28,"code":61463},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M731.429 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 640v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h265.714l77.143 77.714c21.143 20.571 48.571 32 77.714 32s56.571-11.429 77.714-32l77.714-77.714h265.143c30.286 0 54.857 24.571 54.857 54.857zM765.143 314.857c5.714 13.714 2.857 29.714-8 40l-256 256c-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-256-256c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h146.286v-256c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571v256h146.286c14.857 0 28 9.143 33.714 22.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["download"],"defaultCode":61465,"grid":14},"attrs":[],"properties":{"name":"download","id":36,"order":30,"prevSize":28,"code":61465},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M640 530.286c0 5.143-2.286 9.714-5.714 13.714l-182.286 182.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143l-182.857-182.857c-5.143-5.714-6.857-13.143-4-20s9.714-11.429 17.143-11.429h109.714v-201.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v201.143h109.714c10.286 0 18.286 8 18.286 18.286zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-o-down"],"defaultCode":61466,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-down","id":37,"order":31,"prevSize":28,"code":61466},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M638.857 500.571c-2.857 6.857-9.714 11.429-17.143 11.429h-109.714v201.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-201.143h-109.714c-10.286 0-18.286-8-18.286-18.286 0-5.143 2.286-9.714 5.714-13.714l182.286-182.286c4-3.429 8.571-5.143 13.143-5.143s9.143 1.714 13.143 5.143l182.857 182.857c5.143 5.714 6.857 13.143 4 20zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-o-up"],"defaultCode":61467,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-up","id":38,"order":32,"prevSize":28,"code":61467},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M584.571 548.571h180.571c-1.143-2.857-1.714-6.286-2.857-9.143l-121.143-283.429h-404.571l-121.143 283.429c-1.143 2.857-1.714 6.286-2.857 9.143h180.571l54.286 109.714h182.857zM877.714 565.714v275.429c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-275.429c0-20.571 6.286-50.857 14.286-70.286l136-315.429c8-18.857 30.857-33.714 50.857-33.714h475.429c20 0 42.857 14.857 50.857 33.714l136 315.429c8 19.429 14.286 49.714 14.286 70.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["inbox"],"defaultCode":61468,"grid":14},"attrs":[],"properties":{"name":"inbox","id":39,"order":33,"prevSize":28,"code":61468},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M676.571 512c0 13.143-6.857 25.143-18.286 31.429l-310.857 182.857c-5.714 3.429-12 5.143-18.286 5.143s-12.571-1.714-18.286-4.571c-11.429-6.857-18.286-18.857-18.286-32v-365.714c0-13.143 6.857-25.143 18.286-32 11.429-6.286 25.714-6.286 36.571 0.571l310.857 182.857c11.429 6.286 18.286 18.286 18.286 31.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["play-circle-o"],"defaultCode":61469,"grid":14},"attrs":[],"properties":{"name":"play-circle-o","id":40,"order":34,"prevSize":28,"code":61469},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l78.857-78.857c-53.714-49.714-124.571-78.286-199.429-78.286-161.143 0-292.571 131.429-292.571 292.571s131.429 292.571 292.571 292.571c90.857 0 174.857-41.143 230.857-113.714 2.857-4 8-6.286 13.143-6.857 5.143 0 10.286 1.714 14.286 5.143l78.286 78.857c6.857 6.286 6.857 17.143 1.143 24.571-83.429 100.571-206.857 158.286-337.714 158.286-241.714 0-438.857-197.143-438.857-438.857s197.143-438.857 438.857-438.857c112.571 0 221.714 45.143 302.286 121.143l74.286-73.714c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["repeat","rotate-right"],"defaultCode":61470,"grid":14},"attrs":[],"properties":{"name":"repeat, rotate-right","id":41,"order":35,"prevSize":28,"code":61470},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M863.429 603.429c0 1.143 0 2.857-0.571 4-48.571 202.286-215.429 343.429-426.286 343.429-111.429 0-219.429-44-300.571-121.143l-73.714 73.714c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-78.286 78.286c53.714 50.286 125.143 78.857 198.857 78.857 101.714 0 196-52.571 249.143-139.429 13.714-22.286 20.571-44 30.286-66.857 2.857-8 8.571-13.143 17.143-13.143h109.714c10.286 0 18.286 8.571 18.286 18.286zM877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l78.857-78.857c-54.286-50.286-125.714-78.286-199.429-78.286-101.714 0-196 52.571-249.143 139.429-13.714 22.286-20.571 44-30.286 66.857-2.857 8-8.571 13.143-17.143 13.143h-113.714c-10.286 0-18.286-8.571-18.286-18.286v-4c49.143-202.857 217.714-343.429 428.571-343.429 112 0 221.143 44.571 302.286 121.143l74.286-73.714c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["refresh"],"defaultCode":61473,"grid":14},"attrs":[],"properties":{"name":"refresh","id":42,"order":36,"prevSize":28,"code":61473},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M219.429 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM950.857 786.286v-475.429c0-9.714-8.571-18.286-18.286-18.286h-841.143c-9.714 0-18.286 8.571-18.286 18.286v475.429c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM1024 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list-alt"],"defaultCode":61474,"grid":14},"attrs":[],"properties":{"name":"list-alt","id":43,"order":37,"prevSize":28,"code":61474},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M182.857 438.857h292.571v-109.714c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286v109.714zM658.286 493.714v329.143c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-329.143c0-30.286 24.571-54.857 54.857-54.857h18.286v-109.714c0-140.571 115.429-256 256-256s256 115.429 256 256v109.714h18.286c30.286 0 54.857 24.571 54.857 54.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["lock"],"defaultCode":61475,"grid":14},"attrs":[],"properties":{"name":"lock","id":44,"order":38,"prevSize":28,"code":61475},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["volume-off"],"defaultCode":61478,"grid":14},"attrs":[],"properties":{"name":"volume-off","id":45,"order":41,"prevSize":28,"code":61478},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["volume-down"],"defaultCode":61479,"grid":14},"attrs":[],"properties":{"name":"volume-down","id":46,"order":42,"prevSize":28,"code":61479},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286zM804.571 512c0 116-69.714 224-177.143 269.143-4.571 1.714-9.714 2.857-14.286 2.857-20.571 0-37.143-16.571-37.143-36.571 0-16 9.143-26.857 22.286-33.714 15.429-8 29.714-14.857 43.429-25.143 56.571-41.143 89.714-106.857 89.714-176.571s-33.143-135.429-89.714-176.571c-13.714-10.286-28-17.143-43.429-25.143-13.143-6.857-22.286-17.714-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 107.429 45.143 177.143 153.143 177.143 269.143zM950.857 512c0 175.429-104.571 334.286-265.714 403.429-4.571 1.714-9.714 2.857-14.857 2.857-20 0-36.571-16.571-36.571-36.571 0-16.571 8.571-25.714 22.286-33.714 8-4.571 17.143-7.429 25.714-12 16-8.571 32-18.286 46.857-29.143 93.714-69.143 149.143-178.286 149.143-294.857s-55.429-225.714-149.143-294.857c-14.857-10.857-30.857-20.571-46.857-29.143-8.571-4.571-17.714-7.429-25.714-12-13.714-8-22.286-17.143-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 161.143 69.143 265.714 228 265.714 403.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["volume-up"],"defaultCode":61480,"grid":14},"attrs":[],"properties":{"name":"volume-up","id":47,"order":43,"prevSize":28,"code":61480},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M219.429 658.286v73.143h-73.143v-73.143h73.143zM219.429 219.429v73.143h-73.143v-73.143h73.143zM658.286 219.429v73.143h-73.143v-73.143h73.143zM73.143 804h219.429v-218.857h-219.429v218.857zM73.143 365.714h219.429v-219.429h-219.429v219.429zM512 365.714h219.429v-219.429h-219.429v219.429zM365.714 512v365.714h-365.714v-365.714h365.714zM658.286 804.571v73.143h-73.143v-73.143h73.143zM804.571 804.571v73.143h-73.143v-73.143h73.143zM804.571 512v219.429h-219.429v-73.143h-73.143v219.429h-73.143v-365.714h219.429v73.143h73.143v-73.143h73.143zM365.714 73.143v365.714h-365.714v-365.714h365.714zM804.571 73.143v365.714h-365.714v-365.714h365.714z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["qrcode"],"defaultCode":61481,"grid":14},"attrs":[],"properties":{"name":"qrcode","id":48,"order":44,"prevSize":28,"code":61481},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["tag"],"defaultCode":61483,"grid":14},"attrs":[],"properties":{"name":"tag","id":49,"order":46,"prevSize":28,"code":61483},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52zM1085.143 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143-29.714 0-44.571-13.714-64-33.714l268.571-268.571c13.143-13.143 21.143-32 21.143-51.429s-8-38.286-21.143-52l-408.571-408c-29.143-29.143-84.571-52-125.143-52h128c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":1085.1474285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["tags"],"defaultCode":61484,"grid":14},"attrs":[],"properties":{"name":"tags","id":50,"order":47,"prevSize":28,"code":61484},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M936.571 273.143c14.286 20.571 18.286 47.429 10.286 73.714l-157.143 517.714c-14.286 48.571-64.571 86.286-113.714 86.286h-527.429c-58.286 0-120.571-46.286-141.714-105.714-9.143-25.714-9.143-50.857-1.143-72.571 1.143-11.429 3.429-22.857 4-36.571 0.571-9.143-4.571-16.571-3.429-23.429 2.286-13.714 14.286-23.429 23.429-38.857 17.143-28.571 36.571-74.857 42.857-104.571 2.857-10.857-2.857-23.429 0-33.143 2.857-10.857 13.714-18.857 19.429-29.143 15.429-26.286 35.429-77.143 38.286-104 1.143-12-4.571-25.143-1.143-34.286 4-13.143 16.571-18.857 25.143-30.286 13.714-18.857 36.571-73.143 40-103.429 1.143-9.714-4.571-19.429-2.857-29.714 2.286-10.857 16-22.286 25.143-35.429 24-35.429 28.571-113.714 101.143-93.143l-0.571 1.714c9.714-2.286 19.429-5.143 29.143-5.143h434.857c26.857 0 50.857 12 65.143 32 14.857 20.571 18.286 47.429 10.286 74.286l-156.571 517.714c-26.857 88-41.714 107.429-114.286 107.429h-496.571c-7.429 0-16.571 1.714-21.714 8.571-4.571 6.857-5.143 12-0.571 24.571 11.429 33.143 50.857 40 82.286 40h527.429c21.143 0 45.714-12 52-32.571l171.429-564c3.429-10.857 3.429-22.286 2.857-32.571 13.143 5.143 25.143 13.143 33.714 24.571zM328.571 274.286c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286zM281.143 420.571c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["book"],"defaultCode":61485,"grid":14},"attrs":[],"properties":{"name":"book","id":51,"order":48,"prevSize":28,"code":61485},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M219.429 877.714h512v-146.286h-512v146.286zM219.429 512h512v-219.429h-91.429c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-365.714v365.714zM877.714 548.571c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 548.571v237.714c0 9.714-8.571 18.286-18.286 18.286h-128v91.429c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-128c-9.714 0-18.286-8.571-18.286-18.286v-237.714c0-60 49.714-109.714 109.714-109.714h36.571v-310.857c0-30.286 24.571-54.857 54.857-54.857h384c30.286 0 72 17.143 93.714 38.857l86.857 86.857c21.714 21.714 38.857 63.429 38.857 93.714v146.286h36.571c60 0 109.714 49.714 109.714 109.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["print"],"defaultCode":61487,"grid":14},"attrs":[],"properties":{"name":"print","id":52,"order":50,"prevSize":28,"code":61487},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M996.571 804.571c25.143 0 33.143 16 17.714 36l-72 92.571c-15.429 20-40.571 20-56 0l-72-92.571c-15.429-20-7.429-36 17.714-36h45.714v-585.143h-45.714c-25.143 0-33.143-16-17.714-36l72-92.571c15.429-20 40.571-20 56 0l72 92.571c15.429 20 7.429 36-17.714 36h-45.714v585.143h45.714zM46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 41.143 0 81.714 0.571 122.857 0.571h167.429c22.857 0 36 5.143 51.429-16.571l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-17.714-88.571-18.857-89.714-12-14.857-25.143-12-42.857-12-52 0-106.286-2.286-157.714 4-2.857 25.143-5.143 52-4.571 77.714 0.571 160.571 2.286 321.143 2.286 481.714 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 12.571-28 10.857-182.857 10.857-218.857 0-115.429-3.429-230.857-3.429-346.286v-66.857c0-10.286 2.286-51.429-4.571-59.429-8-8.571-82.857-6.857-92.571-6.857-21.143 0-82.286 9.714-98.857 21.714-27.429 18.857-27.429 133.143-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857z"],"width":1029.7051428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["text-height"],"defaultCode":61492,"grid":14},"attrs":[],"properties":{"name":"text-height","id":53,"order":694,"prevSize":28,"code":61492},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 151.429 0 304.571-3.429 456 1.714 12.571 0.571 24.571-7.429 32-17.714l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20.571 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-18.286-88.571-18.857-89.714-4-5.143-9.143-8.571-15.429-10.857-4.571-1.714-32-1.143-37.714-1.143-70.286 0-151.429-4-220.571 4-2.857 25.143-5.143 52-4.571 77.714l0.571 86.857v-29.714c0.571 93.143 1.714 185.714 1.714 278.286 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 14.286-32 10.286-302.286 10.286-352.571 0-8-2.857-16.571-2.857-25.143 0-23.429 4-157.714-4.571-167.429-8-8.571-82.857-6.857-92.571-6.857-24 0-158.286 12.571-172 21.714-26.857 17.714-27.429 132.571-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857zM748.571 806.286c20 0 96 68 111.429 80 8.571 6.857 14.857 16.571 14.857 28s-6.286 21.143-14.857 28c-15.429 12-91.429 80-111.429 80-26.286 0-17.143-61.143-17.143-71.429h-585.143c0 10.286 9.143 71.429-17.143 71.429-20 0-96-68-111.429-80-8.571-6.857-14.857-16.571-14.857-28s6.286-21.143 14.857-28c15.429-12 91.429-80 111.429-80 26.286 0 17.143 61.143 17.143 71.429h585.143c0-10.286-9.143-71.429 17.143-71.429z"],"width":878.2994285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["text-width"],"defaultCode":61493,"grid":14},"attrs":[],"properties":{"name":"text-width","id":54,"order":695,"prevSize":28,"code":61493},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-left"],"defaultCode":61494,"grid":14},"attrs":[],"properties":{"name":"align-left","id":55,"order":57,"prevSize":28,"code":61494},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-365.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h365.714c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-center"],"defaultCode":61495,"grid":14},"attrs":[],"properties":{"name":"align-center","id":56,"order":58,"prevSize":28,"code":61495},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-right"],"defaultCode":61496,"grid":14},"attrs":[],"properties":{"name":"align-right","id":57,"order":59,"prevSize":28,"code":61496},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["align-justify"],"defaultCode":61497,"grid":14},"attrs":[],"properties":{"name":"align-justify","id":58,"order":60,"prevSize":28,"code":61497},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M146.286 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM146.286 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list"],"defaultCode":61498,"grid":14},"attrs":[],"properties":{"name":"list","id":59,"order":61,"prevSize":28,"code":61498},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M219.429 310.857v329.143c0 9.714-8.571 18.286-18.286 18.286-4.571 0-9.714-1.714-13.143-5.143l-164.571-164.571c-3.429-3.429-5.143-8.571-5.143-13.143s1.714-9.714 5.143-13.143l164.571-164.571c3.429-3.429 8.571-5.143 13.143-5.143 9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["dedent","outdent"],"defaultCode":61499,"grid":14},"attrs":[],"properties":{"name":"dedent, outdent","id":60,"order":62,"prevSize":28,"code":61499},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M201.143 475.429c0 4.571-1.714 9.714-5.143 13.143l-164.571 164.571c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-329.143c0-9.714 8.571-18.286 18.286-18.286 4.571 0 9.714 1.714 13.143 5.143l164.571 164.571c3.429 3.429 5.143 8.571 5.143 13.143zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["indent"],"defaultCode":61500,"grid":14},"attrs":[],"properties":{"name":"indent","id":61,"order":63,"prevSize":28,"code":61500},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M207.429 877.714l52-52-134.286-134.286-52 52v61.143h73.143v73.143h61.143zM506.286 347.429c0-7.429-5.143-12.571-12.571-12.571-3.429 0-6.857 1.143-9.714 4l-309.714 309.714c-2.857 2.857-4 6.286-4 9.714 0 7.429 5.143 12.571 12.571 12.571 3.429 0 6.857-1.143 9.714-4l309.714-309.714c2.857-2.857 4-6.286 4-9.714zM475.429 237.714l237.714 237.714-475.429 475.429h-237.714v-237.714zM865.714 292.571c0 19.429-8 38.286-21.143 51.429l-94.857 94.857-237.714-237.714 94.857-94.286c13.143-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l134.286 133.714c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["pencil"],"defaultCode":61504,"grid":14},"attrs":[],"properties":{"name":"pencil","id":62,"order":66,"prevSize":28,"code":61504},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M438.857 822.857v-621.714c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["adjust"],"defaultCode":61506,"grid":14},"attrs":[],"properties":{"name":"adjust","id":63,"order":68,"prevSize":28,"code":61506},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M507.429 676.571l66.286-66.286-86.857-86.857-66.286 66.286v32h54.857v54.857h32zM758.857 265.143c-5.143-5.143-13.714-4.571-18.857 0.571l-200 200c-5.143 5.143-5.714 13.714-0.571 18.857s13.714 4.571 18.857-0.571l200-200c5.143-5.143 5.714-13.714 0.571-18.857zM804.571 604.571v108.571c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-5.143 5.143-12 6.857-18.286 4.571-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-72c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c5.714-5.714 13.143-6.857 20-4s11.429 9.143 11.429 16.571zM749.714 182.857l164.571 164.571-384 384h-164.571v-164.571zM1003.429 258.286l-52.571 52.571-164.571-164.571 52.571-52.571c21.143-21.143 56.571-21.143 77.714 0l86.857 86.857c21.143 21.143 21.143 56.571 0 77.714z"],"width":1024.5851428571427,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["edit","pencil-square-o"],"defaultCode":61508,"grid":14},"attrs":[],"properties":{"name":"edit, pencil-square-o","id":64,"order":70,"prevSize":28,"code":61508},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M804.571 565.143v148c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h145.714c9.714 0 18.286 8 18.286 18.286 0 9.143-6.286 16.571-14.857 18.286-28.571 9.714-54.286 21.143-76 34.286-2.857 1.143-5.714 2.286-9.143 2.286h-64c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-122.286c0-6.857 4-13.143 10.286-16.571 11.429-5.143 21.714-12.571 30.857-21.143 5.143-5.143 13.143-7.429 20-4.571s12 9.143 12 16.571zM940 281.714l-219.429 219.429c-6.857 7.429-16 10.857-25.714 10.857-4.571 0-9.714-1.143-14.286-2.857-13.143-5.714-22.286-18.857-22.286-33.714v-109.714h-91.429c-125.714 0-205.714 24-250.286 74.857-46.286 53.143-60 138.857-42.286 270.286 1.143 8-4 16-11.429 19.429-2.286 0.571-4.571 1.143-6.857 1.143-5.714 0-11.429-2.857-14.857-7.429-4-5.714-94.857-134.286-94.857-248.571 0-153.143 48-329.143 420.571-329.143h91.429v-109.714c0-14.857 9.143-28 22.286-33.714 4.571-1.714 9.714-2.857 14.286-2.857 9.714 0 18.857 4 25.714 10.857l219.429 219.429c14.286 14.286 14.286 37.143 0 51.429z"],"width":954.2948571428572,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["share-square-o"],"defaultCode":61509,"grid":14},"attrs":[],"properties":{"name":"share-square-o","id":65,"order":71,"prevSize":28,"code":61509},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M804.571 531.429v181.714c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-3.429 3.429-8.571 5.714-13.143 5.714-1.714 0-3.429-0.571-5.143-1.143-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-145.143c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c4-4 8.571-5.714 13.143-5.714 2.286 0 4.571 0.571 6.857 1.714 6.857 2.857 11.429 9.143 11.429 16.571zM936.571 252l-465.143 465.143c-18.286 18.286-46.857 18.286-65.143 0l-245.714-245.714c-18.286-18.286-18.286-46.857 0-65.143l62.857-62.857c18.286-18.286 46.857-18.286 65.143 0l150.286 150.286 369.714-369.714c18.286-18.286 46.857-18.286 65.143 0l62.857 62.857c18.286 18.286 18.286 46.857 0 65.143z"],"width":954.8799999999999,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["check-square-o"],"defaultCode":61510,"grid":14},"attrs":[],"properties":{"name":"check-square-o","id":66,"order":719,"prevSize":28,"code":61510},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-219.429v219.429h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-219.429h-219.429v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h219.429v-219.429h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-73.143v219.429h219.429v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows"],"defaultCode":61511,"grid":14},"attrs":[],"properties":{"name":"arrows","id":67,"order":73,"prevSize":28,"code":61511},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M559.429 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["step-backward"],"defaultCode":61512,"grid":14},"attrs":[],"properties":{"name":"step-backward","id":68,"order":74,"prevSize":28,"code":61512},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M998.286 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["fast-backward"],"defaultCode":61513,"grid":14},"attrs":[],"properties":{"name":"fast-backward","id":69,"order":75,"prevSize":28,"code":61513},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M925.143 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-14.286-14.286-14.286-37.143 0-51.429l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1017.1245714285715,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["backward"],"defaultCode":61514,"grid":14},"attrs":[],"properties":{"name":"backward","id":70,"order":76,"prevSize":28,"code":61514},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M790.857 529.714l-758.857 421.714c-17.714 9.714-32 1.143-32-18.857v-841.143c0-20 14.286-28.571 32-18.857l758.857 421.714c17.714 9.714 17.714 25.714 0 35.429z"],"width":808.5942857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["play"],"defaultCode":61515,"grid":14},"attrs":[],"properties":{"name":"play","id":71,"order":77,"prevSize":28,"code":61515},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571zM365.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["pause"],"defaultCode":61516,"grid":14},"attrs":[],"properties":{"name":"pause","id":72,"order":78,"prevSize":28,"code":61516},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["stop"],"defaultCode":61517,"grid":14},"attrs":[],"properties":{"name":"stop","id":73,"order":79,"prevSize":28,"code":61517},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c14.286 14.286 14.286 37.143 0 51.429l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":884.5897142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["forward"],"defaultCode":61518,"grid":14},"attrs":[],"properties":{"name":"forward","id":74,"order":80,"prevSize":28,"code":61518},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["fast-forward"],"defaultCode":61520,"grid":14},"attrs":[],"properties":{"name":"fast-forward","id":75,"order":81,"prevSize":28,"code":61520},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["step-forward"],"defaultCode":61521,"grid":14},"attrs":[],"properties":{"name":"step-forward","id":76,"order":82,"prevSize":28,"code":61521},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M8 559.429l405.714-405.714c14.286-14.286 37.143-14.286 51.429 0l405.714 405.714c14.286 14.286 9.143 25.714-10.857 25.714h-841.143c-20 0-25.143-11.429-10.857-25.714zM841.714 877.714h-804.571c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571v146.286c0 20-16.571 36.571-36.571 36.571z"],"width":878.8845714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["eject"],"defaultCode":61522,"grid":14},"attrs":[],"properties":{"name":"eject","id":77,"order":83,"prevSize":28,"code":61522},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M669.143 172l-303.429 303.429 303.429 303.429c14.286 14.286 14.286 37.143 0 51.429l-94.857 94.857c-14.286 14.286-37.143 14.286-51.429 0l-424-424c-14.286-14.286-14.286-37.143 0-51.429l424-424c14.286-14.286 37.143-14.286 51.429 0l94.857 94.857c14.286 14.286 14.286 37.143 0 51.429z"],"width":768,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-left"],"defaultCode":61523,"grid":14},"attrs":[],"properties":{"name":"chevron-left","id":78,"order":84,"prevSize":28,"code":61523},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M632.571 501.143l-424 424c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.857c-14.286-14.286-14.286-37.143 0-51.429l303.429-303.429-303.429-303.429c-14.286-14.286-14.286-37.143 0-51.429l94.857-94.857c14.286-14.286 37.143-14.286 51.429 0l424 424c14.286 14.286 14.286 37.143 0 51.429z"],"width":694.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-right"],"defaultCode":61524,"grid":14},"attrs":[],"properties":{"name":"chevron-right","id":79,"order":85,"prevSize":28,"code":61524},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-146.286v-146.286c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v146.286h-146.286c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h146.286v146.286c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-146.286h146.286c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["plus-circle"],"defaultCode":61525,"grid":14},"attrs":[],"properties":{"name":"plus-circle","id":80,"order":86,"prevSize":28,"code":61525},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["minus-circle"],"defaultCode":61526,"grid":14},"attrs":[],"properties":{"name":"minus-circle","id":81,"order":87,"prevSize":28,"code":61526},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M656.571 641.143c0-9.714-4-18.857-10.857-25.714l-103.429-103.429 103.429-103.429c6.857-6.857 10.857-16 10.857-25.714s-4-19.429-10.857-26.286l-51.429-51.429c-6.857-6.857-16.571-10.857-26.286-10.857s-18.857 4-25.714 10.857l-103.429 103.429-103.429-103.429c-6.857-6.857-16-10.857-25.714-10.857s-19.429 4-26.286 10.857l-51.429 51.429c-6.857 6.857-10.857 16.571-10.857 26.286s4 18.857 10.857 25.714l103.429 103.429-103.429 103.429c-6.857 6.857-10.857 16-10.857 25.714s4 19.429 10.857 26.286l51.429 51.429c6.857 6.857 16.571 10.857 26.286 10.857s18.857-4 25.714-10.857l103.429-103.429 103.429 103.429c6.857 6.857 16 10.857 25.714 10.857s19.429-4 26.286-10.857l51.429-51.429c6.857-6.857 10.857-16.571 10.857-26.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["times-circle"],"defaultCode":61527,"grid":14},"attrs":[],"properties":{"name":"times-circle","id":82,"order":88,"prevSize":28,"code":61527},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M733.714 419.429c0-9.714-3.429-19.429-10.286-26.286l-52-51.429c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-233.143 232.571-129.143-129.143c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 51.429c-6.857 6.857-10.286 16.571-10.286 26.286s3.429 18.857 10.286 25.714l206.857 206.857c6.857 6.857 16.571 10.857 25.714 10.857 9.714 0 19.429-4 26.286-10.857l310.286-310.286c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["check-circle"],"defaultCode":61528,"grid":14},"attrs":[],"properties":{"name":"check-circle","id":83,"order":89,"prevSize":28,"code":61528},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M512 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM658.286 402.286c0-104.571-109.714-182.857-208-182.857-93.143 0-162.857 40-212 121.714-5.143 8-2.857 18.286 4.571 24l75.429 57.143c2.857 2.286 6.857 3.429 10.857 3.429 5.143 0 10.857-2.286 14.286-6.857 26.857-34.286 38.286-44.571 49.143-52.571 9.714-6.857 28.571-13.714 49.143-13.714 36.571 0 70.286 23.429 70.286 48.571 0 29.714-15.429 44.571-50.286 60.571-40.571 18.286-96 65.714-96 121.143v20.571c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286v0c0-13.143 16.571-41.143 43.429-56.571 43.429-24.571 102.857-57.714 102.857-144.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["question-circle"],"defaultCode":61529,"grid":14},"attrs":[],"properties":{"name":"question-circle","id":84,"order":90,"prevSize":28,"code":61529},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M585.143 786.286v-91.429c0-10.286-8-18.286-18.286-18.286h-54.857v-292.571c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h54.857v182.857h-54.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h256c10.286 0 18.286-8 18.286-18.286zM512 274.286v-91.429c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["info-circle"],"defaultCode":61530,"grid":14},"attrs":[],"properties":{"name":"info-circle","id":85,"order":91,"prevSize":28,"code":61530},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M684 585.143h-62.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h62.286c-24.571-82.286-89.714-147.429-172-172v62.286c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-62.286c-82.286 24.571-147.429 89.714-172 172h62.286c20 0 36.571 16.571 36.571 36.571v73.143c0 20-16.571 36.571-36.571 36.571h-62.286c24.571 82.286 89.714 147.429 172 172v-62.286c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v62.286c82.286-24.571 147.429-89.714 172-172zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-81.714c-28 122.857-124.571 219.429-247.429 247.429v81.714c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-81.714c-122.857-28-219.429-124.571-247.429-247.429h-81.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h81.714c28-122.857 124.571-219.429 247.429-247.429v-81.714c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v81.714c122.857 28 219.429 124.571 247.429 247.429h81.714c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["crosshairs"],"defaultCode":61531,"grid":14},"attrs":[],"properties":{"name":"crosshairs","id":86,"order":92,"prevSize":28,"code":61531},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M626.857 616.571l-83.429 83.429c-7.429 7.429-18.857 7.429-26.286 0l-78.286-78.286-78.286 78.286c-7.429 7.429-18.857 7.429-26.286 0l-83.429-83.429c-7.429-7.429-7.429-18.857 0-26.286l78.286-78.286-78.286-78.286c-7.429-7.429-7.429-18.857 0-26.286l83.429-83.429c7.429-7.429 18.857-7.429 26.286 0l78.286 78.286 78.286-78.286c7.429-7.429 18.857-7.429 26.286 0l83.429 83.429c7.429 7.429 7.429 18.857 0 26.286l-78.286 78.286 78.286 78.286c7.429 7.429 7.429 18.857 0 26.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["times-circle-o"],"defaultCode":61532,"grid":14},"attrs":[],"properties":{"name":"times-circle-o","id":87,"order":93,"prevSize":28,"code":61532},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M669.143 464.571l-241.143 241.143c-14.286 14.286-37.143 14.286-51.429 0l-168-168c-14.286-14.286-14.286-37.143 0-51.429l58.286-58.286c14.286-14.286 37.143-14.286 51.429 0l84 84 157.143-157.143c14.286-14.286 37.143-14.286 51.429 0l58.286 58.286c14.286 14.286 14.286 37.143 0 51.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["check-circle-o"],"defaultCode":61533,"grid":14},"attrs":[],"properties":{"name":"check-circle-o","id":88,"order":94,"prevSize":28,"code":61533},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M749.714 510.286c0-62.286-18.286-120-49.714-168.571l-430.857 430.286c49.143 32 107.429 50.857 169.714 50.857 171.429 0 310.857-140 310.857-312.571zM178.857 681.143l431.429-430.857c-49.143-33.143-108-52-171.429-52-171.429 0-310.857 140-310.857 312 0 63.429 18.857 121.714 50.857 170.857zM877.714 510.286c0 243.429-196.571 440.571-438.857 440.571s-438.857-197.143-438.857-440.571c0-242.857 196.571-440 438.857-440s438.857 197.143 438.857 440z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["ban"],"defaultCode":61534,"grid":14},"attrs":[],"properties":{"name":"ban","id":89,"order":95,"prevSize":28,"code":61534},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M877.714 512v73.143c0 38.857-25.714 73.143-66.857 73.143h-402.286l167.429 168c13.714 13.143 21.714 32 21.714 51.429s-8 38.286-21.714 51.429l-42.857 43.429c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-372-372.571c-13.143-13.143-21.143-32-21.143-51.429s8-38.286 21.143-52l372-371.429c13.714-13.714 32.571-21.714 52-21.714s37.714 8 51.429 21.714l42.857 42.286c13.714 13.714 21.714 32.571 21.714 52s-8 38.286-21.714 52l-167.429 167.429h402.286c41.143 0 66.857 34.286 66.857 73.143z"],"width":914.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-left"],"defaultCode":61536,"grid":14},"attrs":[],"properties":{"name":"arrow-left","id":90,"order":96,"prevSize":28,"code":61536},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M841.143 548.571c0 19.429-7.429 38.286-21.143 52l-372 372c-13.714 13.143-32.571 21.143-52 21.143s-37.714-8-51.429-21.143l-42.857-42.857c-13.714-13.714-21.714-32.571-21.714-52s8-38.286 21.714-52l167.429-167.429h-402.286c-41.143 0-66.857-34.286-66.857-73.143v-73.143c0-38.857 25.714-73.143 66.857-73.143h402.286l-167.429-168c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-51.429l42.857-42.857c13.714-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l372 372c13.714 13.143 21.143 32 21.143 51.429z"],"width":841.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-right"],"defaultCode":61537,"grid":14},"attrs":[],"properties":{"name":"arrow-right","id":91,"order":97,"prevSize":28,"code":61537},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M920.571 554.857c0 19.429-8 37.714-21.143 51.429l-42.857 42.857c-13.714 13.714-32.571 21.714-52 21.714s-38.286-8-51.429-21.714l-168-167.429v402.286c0 41.143-34.286 66.857-73.143 66.857h-73.143c-38.857 0-73.143-25.714-73.143-66.857v-402.286l-168 167.429c-13.143 13.714-32 21.714-51.429 21.714s-38.286-8-51.429-21.714l-42.857-42.857c-13.714-13.714-21.714-32-21.714-51.429s8-38.286 21.714-52l372-372c13.143-13.714 32-21.143 51.429-21.143s38.286 7.429 52 21.143l372 372c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-up"],"defaultCode":61538,"grid":14},"attrs":[],"properties":{"name":"arrow-up","id":92,"order":98,"prevSize":28,"code":61538},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M920.571 475.429c0 19.429-8 38.286-21.143 51.429l-372 372.571c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-372-372.571c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l42.286-42.857c13.714-13.143 32.571-21.143 52-21.143s38.286 8 51.429 21.143l168 168v-402.286c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v402.286l168-168c13.143-13.143 32-21.143 51.429-21.143s38.286 8 52 21.143l42.857 42.857c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-down"],"defaultCode":61539,"grid":14},"attrs":[],"properties":{"name":"arrow-down","id":93,"order":99,"prevSize":28,"code":61539},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M1024 365.714c0 9.714-4 18.857-10.857 25.714l-292.571 292.571c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-146.286h-128c-246.286 0-408 47.429-408 320 0 23.429 1.143 46.857 2.857 70.286 0.571 9.143 2.857 19.429 2.857 28.571 0 10.857-6.857 20-18.286 20-8 0-12-4-16-9.714-8.571-12-14.857-30.286-21.143-43.429-32.571-73.143-72.571-177.714-72.571-257.714 0-64 6.286-129.714 30.286-190.286 79.429-197.143 312.571-230.286 500-230.286h128v-146.286c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l292.571 292.571c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["mail-forward","share"],"defaultCode":61540,"grid":14},"attrs":[],"properties":{"name":"mail-forward, share","id":94,"order":100,"prevSize":28,"code":61540},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M431.429 603.429c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143zM877.714 109.714v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["expand"],"defaultCode":61541,"grid":14},"attrs":[],"properties":{"name":"expand","id":95,"order":101,"prevSize":28,"code":61541},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M438.857 548.571v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571zM870.286 164.571c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["compress"],"defaultCode":61542,"grid":14},"attrs":[],"properties":{"name":"compress","id":96,"order":102,"prevSize":28,"code":61542},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M438.857 73.143c242.286 0 438.857 196.571 438.857 438.857s-196.571 438.857-438.857 438.857-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857zM512 785.714v-108.571c0-10.286-8-18.857-17.714-18.857h-109.714c-10.286 0-18.857 8.571-18.857 18.857v108.571c0 10.286 8.571 18.857 18.857 18.857h109.714c9.714 0 17.714-8.571 17.714-18.857zM510.857 589.143l10.286-354.857c0-4-1.714-8-5.714-10.286-3.429-2.857-8.571-4.571-13.714-4.571h-125.714c-5.143 0-10.286 1.714-13.714 4.571-4 2.286-5.714 6.286-5.714 10.286l9.714 354.857c0 8 8.571 14.286 19.429 14.286h105.714c10.286 0 18.857-6.286 19.429-14.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["exclamation-circle"],"defaultCode":61546,"grid":14},"attrs":[],"properties":{"name":"exclamation-circle","id":97,"order":103,"prevSize":28,"code":61546},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M950.857 548.571c-54.286-84-128.571-156-217.714-201.714 22.857 38.857 34.857 83.429 34.857 128.571 0 141.143-114.857 256-256 256s-256-114.857-256-256c0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 97.714 150.857 255.429 256 438.857 256s341.143-105.143 438.857-256zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.143 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM1024 548.571c0 14.286-4.571 27.429-11.429 39.429-105.143 173.143-297.714 289.714-500.571 289.714s-395.429-117.143-500.571-289.714c-6.857-12-11.429-25.143-11.429-39.429s4.571-27.429 11.429-39.429c105.143-172.571 297.714-289.714 500.571-289.714s395.429 117.143 500.571 289.714c6.857 12 11.429 25.143 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["eye"],"defaultCode":61550,"grid":14},"attrs":[],"properties":{"name":"eye","id":98,"order":107,"prevSize":28,"code":61550},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M317.143 762.857l44.571-80.571c-66.286-48-105.714-125.143-105.714-206.857 0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 59.429 92 143.429 169.143 244 214.286zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.714 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM746.857 220c0 1.143 0 4-0.571 5.143-120.571 215.429-240 432-360.571 647.429l-28 50.857c-3.429 5.714-9.714 9.143-16 9.143-10.286 0-64.571-33.143-76.571-40-5.714-3.429-9.143-9.143-9.143-16 0-9.143 19.429-40 25.143-49.714-110.857-50.286-204-136-269.714-238.857-7.429-11.429-11.429-25.143-11.429-39.429 0-13.714 4-28 11.429-39.429 113.143-173.714 289.714-289.714 500.571-289.714 34.286 0 69.143 3.429 102.857 9.714l30.857-55.429c3.429-5.714 9.143-9.143 16-9.143 10.286 0 64 33.143 76 40 5.714 3.429 9.143 9.143 9.143 15.429zM768 475.429c0 106.286-65.714 201.143-164.571 238.857l160-286.857c2.857 16 4.571 32 4.571 48zM1024 548.571c0 14.857-4 26.857-11.429 39.429-17.714 29.143-40 57.143-62.286 82.857-112 128.571-266.286 206.857-438.286 206.857l42.286-75.429c166.286-14.286 307.429-115.429 396.571-253.714-42.286-65.714-96.571-123.429-161.143-168l36-64c70.857 47.429 142.286 118.857 186.857 192.571 7.429 12.571 11.429 24.571 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["eye-slash"],"defaultCode":61552,"grid":14},"attrs":[],"properties":{"name":"eye-slash","id":99,"order":108,"prevSize":28,"code":61552},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M585.143 785.714v-108.571c0-10.286-8-18.857-18.286-18.857h-109.714c-10.286 0-18.286 8.571-18.286 18.857v108.571c0 10.286 8 18.857 18.286 18.857h109.714c10.286 0 18.286-8.571 18.286-18.857zM584 572l10.286-262.286c0-3.429-1.714-8-5.714-10.857-3.429-2.857-8.571-6.286-13.714-6.286h-125.714c-5.143 0-10.286 3.429-13.714 6.286-4 2.857-5.714 8.571-5.714 12l9.714 261.143c0 7.429 8.571 13.143 19.429 13.143h105.714c10.286 0 18.857-5.714 19.429-13.143zM576 38.286l438.857 804.571c12.571 22.286 12 49.714-1.143 72s-37.143 36-62.857 36h-877.714c-25.714 0-49.714-13.714-62.857-36s-13.714-49.714-1.143-72l438.857-804.571c12.571-23.429 37.143-38.286 64-38.286s51.429 14.857 64 38.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["exclamation-triangle","warning"],"defaultCode":61553,"grid":14},"attrs":[],"properties":{"name":"exclamation-triangle, warning","id":100,"order":109,"prevSize":28,"code":61553},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M73.143 950.857h164.571v-164.571h-164.571v164.571zM274.286 950.857h182.857v-164.571h-182.857v164.571zM73.143 749.714h164.571v-182.857h-164.571v182.857zM274.286 749.714h182.857v-182.857h-182.857v182.857zM73.143 530.286h164.571v-164.571h-164.571v164.571zM493.714 950.857h182.857v-164.571h-182.857v164.571zM274.286 530.286h182.857v-164.571h-182.857v164.571zM713.143 950.857h164.571v-164.571h-164.571v164.571zM493.714 749.714h182.857v-182.857h-182.857v182.857zM292.571 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM713.143 749.714h164.571v-182.857h-164.571v182.857zM493.714 530.286h182.857v-164.571h-182.857v164.571zM713.143 530.286h164.571v-164.571h-164.571v164.571zM731.429 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM950.857 219.429v731.429c0 40-33.143 73.143-73.143 73.143h-804.571c-40 0-73.143-33.143-73.143-73.143v-731.429c0-40 33.143-73.143 73.143-73.143h73.143v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h219.429v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h73.143c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["calendar"],"defaultCode":61555,"grid":14},"attrs":[],"properties":{"name":"calendar","id":101,"order":111,"prevSize":28,"code":61555},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M380.571 274.857c-32 49.143-55.429 102.286-78.286 156-33.143-69.143-69.714-138.286-156-138.286h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c101.714 0 176.571 47.429 234.286 128.571zM1024 731.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-109.714c-169.714 0-274.286 20-380-128.571 31.429-49.143 54.857-102.286 77.714-156 33.143 69.143 69.714 138.286 156 138.286h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143zM1024 219.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8-18.286-18.286v-109.714h-146.286c-76 0-112 52-144 113.714-16.571 32-30.857 65.143-44.571 97.714-63.429 147.429-137.714 300.571-323.429 300.571h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c76 0 112-52 144-113.714 16.571-32 30.857-65.143 44.571-97.714 63.429-147.429 137.714-300.571 323.429-300.571h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["random"],"defaultCode":61556,"grid":14},"attrs":[],"properties":{"name":"random","id":102,"order":112,"prevSize":28,"code":61556},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M1024 512c0 202.286-229.143 365.714-512 365.714-28 0-56-1.714-82.857-4.571-74.857 66.286-164 113.143-262.857 138.286-20.571 5.714-42.857 9.714-65.143 12.571-12.571 1.143-24.571-8-27.429-21.714v-0.571c-2.857-14.286 6.857-22.857 15.429-33.143 36-40.571 77.143-74.857 104-170.286-117.714-66.857-193.143-170.286-193.143-286.286 0-201.714 229.143-365.714 512-365.714s512 163.429 512 365.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["comment"],"defaultCode":61557,"grid":14},"attrs":[],"properties":{"name":"comment","id":103,"order":113,"prevSize":28,"code":61557},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M961.714 760.571l-94.857 94.286c-14.286 14.286-37.143 14.286-51.429 0l-303.429-303.429-303.429 303.429c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.286c-14.286-14.286-14.286-37.714 0-52l424-423.429c14.286-14.286 37.143-14.286 51.429 0l424 423.429c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-up"],"defaultCode":61559,"grid":14},"attrs":[],"properties":{"name":"chevron-up","id":104,"order":115,"prevSize":28,"code":61559},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M961.714 461.714l-424 423.429c-14.286 14.286-37.143 14.286-51.429 0l-424-423.429c-14.286-14.286-14.286-37.714 0-52l94.857-94.286c14.286-14.286 37.143-14.286 51.429 0l303.429 303.429 303.429-303.429c14.286-14.286 37.143-14.286 51.429 0l94.857 94.286c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-down"],"defaultCode":61560,"grid":14},"attrs":[],"properties":{"name":"chevron-down","id":105,"order":116,"prevSize":28,"code":61560},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M731.429 859.429c0 9.714-8.571 18.286-18.286 18.286h-548.571c-21.143 0-18.286-22.286-18.286-36.571v-329.143h-109.714c-20 0-36.571-16.571-36.571-36.571 0-8.571 2.857-17.143 8.571-23.429l182.857-219.429c6.857-8 17.143-12.571 28-12.571s21.143 4.571 28 12.571l182.857 219.429c5.714 6.286 8.571 14.857 8.571 23.429 0 20-16.571 36.571-36.571 36.571h-109.714v219.429h329.143c5.143 0 10.857 2.286 14.286 6.286l91.429 109.714c2.286 3.429 4 8 4 12zM1097.143 621.714c0 8.571-2.857 17.143-8.571 23.429l-182.857 219.429c-6.857 8-17.143 13.143-28 13.143s-21.143-5.143-28-13.143l-182.857-219.429c-5.714-6.286-8.571-14.857-8.571-23.429 0-20 16.571-36.571 36.571-36.571h109.714v-219.429h-329.143c-5.143 0-10.857-2.286-14.286-6.857l-91.429-109.714c-2.286-2.857-4-7.429-4-11.429 0-9.714 8.571-18.286 18.286-18.286h548.571c21.143 0 18.286 22.286 18.286 36.571v329.143h109.714c20 0 36.571 16.571 36.571 36.571z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["retweet"],"defaultCode":61561,"grid":14},"attrs":[],"properties":{"name":"retweet","id":106,"order":117,"prevSize":28,"code":61561},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder"],"defaultCode":61563,"grid":14},"attrs":[],"properties":{"name":"folder","id":107,"order":119,"prevSize":28,"code":61563},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M1073.714 544c0 13.714-8.571 27.429-17.714 37.714l-192 226.286c-33.143 38.857-100.571 69.714-150.857 69.714h-621.714c-20.571 0-49.714-6.286-49.714-32 0-13.714 8.571-27.429 17.714-37.714l192-226.286c33.143-38.857 100.571-69.714 150.857-69.714h621.714c20.571 0 49.714 6.286 49.714 32zM877.714 347.429v91.429h-475.429c-71.429 0-160 40.571-206.286 95.429l-195.429 229.714c0-4.571-0.571-9.714-0.571-14.286v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128z"],"width":1073.7371428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder-open"],"defaultCode":61564,"grid":14},"attrs":[],"properties":{"name":"folder-open","id":108,"order":120,"prevSize":28,"code":61564},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M402.286 182.857c0 20-16.571 36.571-36.571 36.571h-73.143v585.143h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-585.143h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows-v"],"defaultCode":61565,"grid":14},"attrs":[],"properties":{"name":"arrows-v","id":109,"order":121,"prevSize":28,"code":61565},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-585.143v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h585.143v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows-h"],"defaultCode":61566,"grid":14},"attrs":[],"properties":{"name":"arrows-h","id":110,"order":122,"prevSize":28,"code":61566},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M512 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM950.857 804.571c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM950.857 219.429c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM731.429 460v105.714c0 7.429-5.714 16-13.143 17.143l-88.571 13.714c-4.571 14.857-10.857 29.143-18.286 43.429 16 22.857 33.143 44 51.429 65.714 2.286 3.429 4 6.857 4 11.429 0 4-1.143 8-4 10.857-11.429 15.429-75.429 85.143-92 85.143-4.571 0-8.571-1.714-12-4l-65.714-51.429c-14.286 7.429-28.571 13.143-44 17.714-2.857 29.143-5.714 60.571-13.143 88.571-2.286 8-9.143 13.714-17.143 13.714h-106.286c-8 0-16-6.286-17.143-14.286l-13.143-87.429c-14.857-4.571-29.143-10.857-42.857-17.714l-67.429 50.857c-2.857 2.857-7.429 4-11.429 4-4.571 0-8.571-1.714-12-4.571-14.857-13.714-82.286-74.857-82.286-91.429 0-4 1.714-7.429 4-10.857 16.571-21.714 33.714-42.857 50.286-65.143-8-15.429-14.857-30.857-20-46.857l-86.857-13.714c-8-1.143-13.714-8.571-13.714-16.571v-105.714c0-7.429 5.714-16 13.143-17.143l88.571-13.714c4.571-14.857 10.857-29.143 18.286-43.429-16-22.857-33.143-44-51.429-65.714-2.286-3.429-4-7.429-4-11.429s1.143-8 4-11.429c11.429-15.429 75.429-84.571 92-84.571 4.571 0 8.571 1.714 12 4l65.714 51.429c14.286-7.429 28.571-13.143 44-18.286 2.857-28.571 5.714-60 13.143-88 2.286-8 9.143-13.714 17.143-13.714h106.286c8 0 16 6.286 17.143 14.286l13.143 87.429c14.857 4.571 29.143 10.857 42.857 17.714l67.429-50.857c3.429-2.857 7.429-4 11.429-4 4.571 0 8.571 1.714 12 4.571 14.857 13.714 82.286 75.429 82.286 91.429 0 4-1.714 7.429-4 10.857-16.571 22.286-33.714 42.857-49.714 65.143 7.429 15.429 14.286 30.857 19.429 46.857l86.857 13.143c8 1.714 13.714 9.143 13.714 17.143zM1097.143 764.571v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714zM1097.143 179.429v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["cogs","gears"],"defaultCode":61573,"grid":14},"attrs":[],"properties":{"name":"cogs, gears","id":111,"order":128,"prevSize":28,"code":61573},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M475.429 18.286v765.143l-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429v0z"],"width":475.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star-half"],"defaultCode":61577,"grid":14},"attrs":[],"properties":{"name":"star-half","id":112,"order":132,"prevSize":28,"code":61577},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M950.857 340.571c0-160.571-108.571-194.286-200-194.286-85.143 0-181.143 92-210.857 127.429-13.714 16.571-42.286 16.571-56 0-29.714-35.429-125.714-127.429-210.857-127.429-91.429 0-200 33.714-200 194.286 0 104.571 105.714 201.714 106.857 202.857l332 320 331.429-319.429c1.714-1.714 107.429-98.857 107.429-203.429zM1024 340.571c0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286s-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["heart-o"],"defaultCode":61578,"grid":14},"attrs":[],"properties":{"name":"heart-o","id":113,"order":133,"prevSize":28,"code":61578},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M365.714 822.857c0 16 7.429 54.857-18.286 54.857h-182.857c-90.857 0-164.571-73.714-164.571-164.571v-402.286c0-90.857 73.714-164.571 164.571-164.571h182.857c9.714 0 18.286 8.571 18.286 18.286 0 16 7.429 54.857-18.286 54.857h-182.857c-50.286 0-91.429 41.143-91.429 91.429v402.286c0 50.286 41.143 91.429 91.429 91.429h164.571c14.286 0 36.571-2.857 36.571 18.286zM896 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714z"],"width":896,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sign-out"],"defaultCode":61579,"grid":14},"attrs":[],"properties":{"name":"sign-out","id":114,"order":134,"prevSize":28,"code":61579},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M274.286 493.714v-256c0-10.286-8-18.286-18.286-18.286s-18.286 8-18.286 18.286v256c0 10.286 8 18.286 18.286 18.286s18.286-8 18.286-18.286zM658.286 694.857c0 20-16.571 36.571-36.571 36.571h-245.143l-29.143 276c-1.143 9.143-8.571 16.571-17.714 16.571h-0.571c-9.143 0-16.571-6.286-18.286-15.429l-43.429-277.143h-230.857c-20 0-36.571-16.571-36.571-36.571 0-93.714 70.857-182.857 146.286-182.857v-292.571c-40 0-73.143-33.143-73.143-73.143s33.143-73.143 73.143-73.143h365.714c40 0 73.143 33.143 73.143 73.143s-33.143 73.143-73.143 73.143v292.571c75.429 0 146.286 89.143 146.286 182.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["thumb-tack"],"defaultCode":61581,"grid":14},"attrs":[],"properties":{"name":"thumb-tack","id":115,"order":136,"prevSize":28,"code":61581},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M804.571 530.286v182.857c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-182.857c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM1024 36.571v292.571c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-100.571-100.571-372.571 372.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l372.571-372.571-100.571-100.571c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["external-link"],"defaultCode":61582,"grid":14},"attrs":[],"properties":{"name":"external-link","id":116,"order":137,"prevSize":28,"code":61582},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M676.571 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714zM877.714 310.857v402.286c0 90.857-73.714 164.571-164.571 164.571h-182.857c-9.714 0-18.286-8.571-18.286-18.286 0-16-7.429-54.857 18.286-54.857h182.857c50.286 0 91.429-41.143 91.429-91.429v-402.286c0-50.286-41.143-91.429-91.429-91.429h-164.571c-14.286 0-36.571 2.857-36.571-18.286 0-16-7.429-54.857 18.286-54.857h182.857c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sign-in"],"defaultCode":61584,"grid":14},"attrs":[],"properties":{"name":"sign-in","id":117,"order":138,"prevSize":28,"code":61584},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M731.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 713.143v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h244c15.429 42.286 56 73.143 103.429 73.143h146.286c47.429 0 88-30.857 103.429-73.143h244c30.286 0 54.857 24.571 54.857 54.857zM765.143 342.857c-5.714 13.714-18.857 22.857-33.714 22.857h-146.286v256c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-256h-146.286c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l256-256c6.857-7.429 16.571-10.857 25.714-10.857s18.857 3.429 25.714 10.857l256 256c10.857 10.286 13.714 26.286 8 39.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["upload"],"defaultCode":61587,"grid":14},"attrs":[],"properties":{"name":"upload","id":118,"order":141,"prevSize":28,"code":61587},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M640 146.286h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-475.429c0-50.286-41.143-91.429-91.429-91.429zM804.571 237.714v475.429c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c90.857 0 164.571 73.714 164.571 164.571z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["square-o"],"defaultCode":61590,"grid":14},"attrs":[],"properties":{"name":"square-o","id":119,"order":144,"prevSize":28,"code":61590},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M658.286 146.286h-585.143v709.714l292.571-280.571 50.857 48.571 241.714 232v-709.714zM665.143 73.143c8.571 0 17.143 1.714 25.143 5.143 25.143 9.714 41.143 33.143 41.143 58.857v736.571c0 25.714-16 49.143-41.143 58.857-8 3.429-16.571 4.571-25.143 4.571-17.714 0-34.286-6.286-47.429-18.286l-252-242.286-252 242.286c-13.143 12-29.714 18.857-47.429 18.857-8.571 0-17.143-1.714-25.143-5.143-25.143-9.714-41.143-33.143-41.143-58.857v-736.571c0-25.714 16-49.143 41.143-58.857 8-3.429 16.571-5.143 25.143-5.143h598.857z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["bookmark-o"],"defaultCode":61591,"grid":14},"attrs":[],"properties":{"name":"bookmark-o","id":120,"order":145,"prevSize":28,"code":61591},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M594.286 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM740.571 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM804.571 786.286v-182.857c0-9.714-8.571-18.286-18.286-18.286h-694.857c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h694.857c9.714 0 18.286-8.571 18.286-18.286zM101.714 512h674.286l-89.714-275.429c-2.857-9.714-13.714-17.143-24-17.143h-446.857c-10.286 0-21.143 7.429-24 17.143zM877.714 603.429v182.857c0 50.286-41.143 91.429-91.429 91.429h-694.857c-50.286 0-91.429-41.143-91.429-91.429v-182.857c0-15.429 4.571-28.571 9.143-42.857l112.571-346.286c13.143-40 51.429-68 93.714-68h446.857c42.286 0 80.571 28 93.714 68l112.571 346.286c4.571 14.286 9.143 27.429 9.143 42.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["hdd-o"],"defaultCode":61600,"grid":14},"attrs":[],"properties":{"name":"hdd-o","id":121,"order":153,"prevSize":28,"code":61600},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M521.143 969.143c0-5.143-4-9.143-9.143-9.143-45.143 0-82.286-37.143-82.286-82.286 0-5.143-4-9.143-9.143-9.143s-9.143 4-9.143 9.143c0 55.429 45.143 100.571 100.571 100.571 5.143 0 9.143-4 9.143-9.143zM140.571 804.571h742.857c-102.286-115.429-152-272-152-475.429 0-73.714-69.714-182.857-219.429-182.857s-219.429 109.143-219.429 182.857c0 203.429-49.714 360-152 475.429zM987.429 804.571c0 40-33.143 73.143-73.143 73.143h-256c0 80.571-65.714 146.286-146.286 146.286s-146.286-65.714-146.286-146.286h-256c-40 0-73.143-33.143-73.143-73.143 84.571-71.429 182.857-199.429 182.857-475.429 0-109.714 90.857-229.714 242.286-252-2.857-6.857-4.571-14.286-4.571-22.286 0-30.286 24.571-54.857 54.857-54.857s54.857 24.571 54.857 54.857c0 8-1.714 15.429-4.571 22.286 151.429 22.286 242.286 142.286 242.286 252 0 276 98.286 404 182.857 475.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["bell-o"],"defaultCode":61602,"grid":14},"attrs":[],"properties":{"name":"bell-o","id":122,"order":686,"prevSize":28,"code":61602},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M786.286 512l78.857 77.143c10.857 10.286 14.857 25.714 11.429 40-4 14.286-15.429 25.714-29.714 29.143l-107.429 27.429 30.286 106.286c4 14.286 0 29.714-10.857 40-10.286 10.857-25.714 14.857-40 10.857l-106.286-30.286-27.429 107.429c-3.429 14.286-14.857 25.714-29.143 29.714-3.429 0.571-7.429 1.143-10.857 1.143-10.857 0-21.714-4.571-29.143-12.571l-77.143-78.857-77.143 78.857c-10.286 10.857-25.714 14.857-40 11.429-14.857-4-25.714-15.429-29.143-29.714l-27.429-107.429-106.286 30.286c-14.286 4-29.714 0-40-10.857-10.857-10.286-14.857-25.714-10.857-40l30.286-106.286-107.429-27.429c-14.286-3.429-25.714-14.857-29.714-29.143-3.429-14.286 0.571-29.714 11.429-40l78.857-77.143-78.857-77.143c-10.857-10.286-14.857-25.714-11.429-40 4-14.286 15.429-25.714 29.714-29.143l107.429-27.429-30.286-106.286c-4-14.286 0-29.714 10.857-40 10.286-10.857 25.714-14.857 40-10.857l106.286 30.286 27.429-107.429c3.429-14.286 14.857-25.714 29.143-29.143 14.286-4 29.714 0 40 10.857l77.143 79.429 77.143-79.429c10.286-10.857 25.143-14.857 40-10.857 14.286 3.429 25.714 14.857 29.143 29.143l27.429 107.429 106.286-30.286c14.286-4 29.714 0 40 10.857 10.857 10.286 14.857 25.714 10.857 40l-30.286 106.286 107.429 27.429c14.286 3.429 25.714 14.857 29.714 29.143 3.429 14.286-0.571 29.714-11.429 40z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["certificate"],"defaultCode":61603,"grid":14},"attrs":[],"properties":{"name":"certificate","id":123,"order":687,"prevSize":28,"code":61603},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-286.857l108-108c6.857-6.857 10.857-16 10.857-25.714s-4-18.857-10.857-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l52-52c6.857-6.857 10.286-16 10.286-25.714s-3.429-18.857-10.286-25.714l-108-108h286.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-left"],"defaultCode":61608,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-left","id":124,"order":161,"prevSize":28,"code":61608},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M734.286 512c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l108 108h-286.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h286.857l-108 108c-6.857 6.857-10.857 16-10.857 25.714s4 18.857 10.857 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-right"],"defaultCode":61609,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-right","id":125,"order":162,"prevSize":28,"code":61609},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M733.714 511.429c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l108-108v286.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-286.857l108 108c6.857 6.857 16 10.857 25.714 10.857s18.857-4 25.714-10.857l52-52c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-up"],"defaultCode":61610,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-up","id":126,"order":163,"prevSize":28,"code":61610},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M733.714 512.571c0-9.714-3.429-18.857-10.286-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-108 108v-286.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v286.857l-108-108c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrow-circle-down"],"defaultCode":61611,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-down","id":127,"order":164,"prevSize":28,"code":61611},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M219.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM587.429 601.143l-389.714 389.714c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-60.571-61.714c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l389.143-389.143c29.714 74.857 89.714 134.857 164.571 164.571zM949.714 352.571c0 18.857-6.857 42.286-13.143 60.571-36 101.714-133.714 172-241.714 172-141.143 0-256-114.857-256-256s114.857-256 256-256c41.714 0 96 12.571 130.857 36 5.714 4 9.143 9.143 9.143 16 0 6.286-4 12.571-9.143 16l-167.429 96.571v128l110.286 61.143c18.857-10.857 151.429-94.286 162.857-94.286s18.286 8.571 18.286 20z"],"width":961.6822857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["wrench"],"defaultCode":61613,"grid":14},"attrs":[],"properties":{"name":"wrench","id":128,"order":166,"prevSize":28,"code":61613},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M585.143 804.571h365.714v-73.143h-365.714v73.143zM365.714 512h585.143v-73.143h-585.143v73.143zM731.429 219.429h219.429v-73.143h-219.429v73.143zM1024 694.857v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 402.286v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["tasks"],"defaultCode":61614,"grid":14},"attrs":[],"properties":{"name":"tasks","id":129,"order":167,"prevSize":28,"code":61614},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M801.714 168.571c5.714 13.714 2.857 29.714-8 40l-281.714 281.714v424c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714v-277.714l-281.714-281.714c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h731.429c14.857 0 28 9.143 33.714 22.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["filter"],"defaultCode":61616,"grid":14},"attrs":[],"properties":{"name":"filter","id":130,"order":168,"prevSize":28,"code":61616},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M365.714 146.286h292.571v-73.143h-292.571v73.143zM1024 512v274.286c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-274.286h384v91.429c0 20 16.571 36.571 36.571 36.571h182.857c20 0 36.571-16.571 36.571-36.571v-91.429h384zM585.143 512v73.143h-146.286v-73.143h146.286zM1024 237.714v219.429h-1024v-219.429c0-50.286 41.143-91.429 91.429-91.429h201.143v-91.429c0-30.286 24.571-54.857 54.857-54.857h329.143c30.286 0 54.857 24.571 54.857 54.857v91.429h201.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["briefcase"],"defaultCode":61617,"grid":14},"attrs":[],"properties":{"name":"briefcase","id":131,"order":169,"prevSize":28,"code":61617},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M733.143 309.143l-202.857 202.857 202.857 202.857 82.286-82.286c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l82.286-82.286-202.857-202.857-202.857 202.857 82.286 82.286c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l82.286 82.286 202.857-202.857-202.857-202.857-82.286 82.286c-6.857 6.857-16 10.857-25.714 10.857-4.571 0-9.714-1.143-13.714-2.857-13.714-5.714-22.857-18.857-22.857-33.714v-256c0-20 16.571-36.571 36.571-36.571h256c14.857 0 28 9.143 33.714 22.857 5.714 13.143 2.857 29.143-8 39.429l-82.286 82.286 202.857 202.857 202.857-202.857-82.286-82.286c-10.857-10.286-13.714-26.286-8-39.429 5.714-13.714 18.857-22.857 33.714-22.857h256c20 0 36.571 16.571 36.571 36.571v256c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-4-25.714-10.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["arrows-alt"],"defaultCode":61618,"grid":14},"attrs":[],"properties":{"name":"arrows-alt","id":132,"order":170,"prevSize":28,"code":61618},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M1097.143 658.286c0 121.143-98.286 219.429-219.429 219.429h-621.714c-141.143 0-256-114.857-256-256 0-102.286 60.571-190.857 147.429-231.429-0.571-8-1.143-16.571-1.143-24.571 0-161.714 130.857-292.571 292.571-292.571 122.286 0 226.857 74.857 270.857 181.714 25.143-22.286 58.286-35.429 94.857-35.429 80.571 0 146.286 65.714 146.286 146.286 0 29.143-8.571 56-23.429 78.857 97.143 22.857 169.714 109.714 169.714 213.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["cloud"],"defaultCode":61634,"grid":14},"attrs":[],"properties":{"name":"cloud","id":133,"order":173,"prevSize":28,"code":61634},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M969.143 219.429c30.286 0 54.857 24.571 54.857 54.857v694.857c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-164.571h-310.857c-30.286 0-54.857-24.571-54.857-54.857v-384c0-30.286 17.714-72.571 38.857-93.714l233.143-233.143c21.143-21.143 63.429-38.857 93.714-38.857h237.714c30.286 0 54.857 24.571 54.857 54.857v187.429c22.286-13.143 50.857-22.857 73.143-22.857h237.714zM658.286 341.143l-170.857 170.857h170.857v-170.857zM292.571 121.714l-170.857 170.857h170.857v-170.857zM404.571 491.429l180.571-180.571v-237.714h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h292.571v-146.286c0-30.286 17.714-72.571 38.857-93.714zM950.857 950.857v-658.286h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h512z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["copy","files-o"],"defaultCode":61637,"grid":14},"attrs":[],"properties":{"name":"copy, files-o","id":134,"order":176,"prevSize":28,"code":61637},"setIdx":0,"setId":1,"iconIdx":139},{"icon":{"paths":["M219.429 877.714h438.857v-219.429h-438.857v219.429zM731.429 877.714h73.143v-512c0-10.857-9.714-34.286-17.143-41.714l-160.571-160.571c-8-8-30.286-17.143-41.714-17.143v237.714c0 30.286-24.571 54.857-54.857 54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-73.143v731.429h73.143v-237.714c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857v237.714zM512 347.429v-182.857c0-9.714-8.571-18.286-18.286-18.286h-109.714c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h109.714c9.714 0 18.286-8.571 18.286-18.286zM877.714 365.714v530.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-768c0-30.286 24.571-54.857 54.857-54.857h530.286c30.286 0 72 17.143 93.714 38.857l160 160c21.714 21.714 38.857 63.429 38.857 93.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["floppy-o","save"],"defaultCode":61639,"grid":14},"attrs":[],"properties":{"name":"floppy-o, save","id":135,"order":178,"prevSize":28,"code":61639},"setIdx":0,"setId":1,"iconIdx":140},{"icon":{"paths":["M877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["square"],"defaultCode":61640,"grid":14},"attrs":[],"properties":{"name":"square","id":136,"order":179,"prevSize":28,"code":61640},"setIdx":0,"setId":1,"iconIdx":141},{"icon":{"paths":["M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["bars","navicon","reorder"],"defaultCode":61641,"grid":14},"attrs":[],"properties":{"name":"bars, navicon, reorder","id":137,"order":180,"prevSize":28,"code":61641},"setIdx":0,"setId":1,"iconIdx":142},{"icon":{"paths":["M219.429 804.571c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM219.429 512c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM219.429 219.429c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list-ul"],"defaultCode":61642,"grid":14},"attrs":[],"properties":{"name":"list-ul","id":138,"order":181,"prevSize":28,"code":61642},"setIdx":0,"setId":1,"iconIdx":143},{"icon":{"paths":["M217.714 925.714c0 62.857-49.143 98.286-108.571 98.286-36 0-72.571-12-98.286-37.714l32.571-50.286c15.429 14.286 38.857 25.714 60.571 25.714 20 0 41.143-9.714 41.143-32.571 0-32-36.571-33.714-60-32l-14.857-32c20.571-26.286 39.429-55.429 64-77.714v-0.571c-18.286 0-37.143 1.143-55.429 1.143v30.286h-60.571v-86.857h190.286v50.286l-54.286 65.714c38.286 9.143 63.429 38.857 63.429 78.286zM218.857 567.429v90.857h-206.857c-1.714-10.286-3.429-20.571-3.429-30.857 0-105.714 129.143-121.714 129.143-169.714 0-19.429-12-29.714-30.857-29.714-20 0-36.571 17.143-46.286 33.143l-48.571-33.714c18.857-39.429 57.714-61.714 101.143-61.714 53.143 0 98.857 31.429 98.857 88 0 84.571-124 103.429-125.714 148h72.571v-34.286h60zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM219.429 236v56.571h-191.429v-56.571h61.143c0-46.286 0.571-92.571 0.571-138.857v-6.857h-1.143c-6.286 12.571-17.714 21.143-28.571 30.857l-40.571-43.429 77.714-72.571h60.571v230.857h61.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1032.5577142857144,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["list-ol"],"defaultCode":61643,"grid":14},"attrs":[],"properties":{"name":"list-ol","id":139,"order":182,"prevSize":28,"code":61643},"setIdx":0,"setId":1,"iconIdx":144},{"icon":{"paths":["M292.571 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM950.857 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["table"],"defaultCode":61646,"grid":14},"attrs":[],"properties":{"name":"table","id":140,"order":185,"prevSize":28,"code":61646},"setIdx":0,"setId":1,"iconIdx":145},{"icon":{"paths":["M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-down"],"defaultCode":61655,"grid":14},"attrs":[],"properties":{"name":"caret-down","id":141,"order":193,"prevSize":28,"code":61655},"setIdx":0,"setId":1,"iconIdx":146},{"icon":{"paths":["M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-up"],"defaultCode":61656,"grid":14},"attrs":[],"properties":{"name":"caret-up","id":142,"order":194,"prevSize":28,"code":61656},"setIdx":0,"setId":1,"iconIdx":147},{"icon":{"paths":["M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":402.2857142857143,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-left"],"defaultCode":61657,"grid":14},"attrs":[],"properties":{"name":"caret-left","id":143,"order":195,"prevSize":28,"code":61657},"setIdx":0,"setId":1,"iconIdx":148},{"icon":{"paths":["M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":329.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["caret-right"],"defaultCode":61658,"grid":14},"attrs":[],"properties":{"name":"caret-right","id":144,"order":196,"prevSize":28,"code":61658},"setIdx":0,"setId":1,"iconIdx":149},{"icon":{"paths":["M91.429 877.714h347.429v-658.286h-365.714v640c0 9.714 8.571 18.286 18.286 18.286zM877.714 859.429v-640h-365.714v658.286h347.429c9.714 0 18.286-8.571 18.286-18.286zM950.857 164.571v694.857c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-694.857c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["columns"],"defaultCode":61659,"grid":14},"attrs":[],"properties":{"name":"columns","id":145,"order":197,"prevSize":28,"code":61659},"setIdx":0,"setId":1,"iconIdx":150},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sort","unsorted"],"defaultCode":61660,"grid":14},"attrs":[],"properties":{"name":"sort, unsorted","id":146,"order":198,"prevSize":28,"code":61660},"setIdx":0,"setId":1,"iconIdx":151},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sort-desc","sort-down"],"defaultCode":61661,"grid":14},"attrs":[],"properties":{"name":"sort-desc, sort-down","id":147,"order":199,"prevSize":28,"code":61661},"setIdx":0,"setId":1,"iconIdx":152},{"icon":{"paths":["M585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["sort-asc","sort-up"],"defaultCode":61662,"grid":14},"attrs":[],"properties":{"name":"sort-asc, sort-up","id":148,"order":200,"prevSize":28,"code":61662},"setIdx":0,"setId":1,"iconIdx":153},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857-130.857 0-254.286-57.714-337.714-158.286-5.714-7.429-5.143-18.286 1.143-24.571l78.286-78.857c4-3.429 9.143-5.143 14.286-5.143 5.143 0.571 10.286 2.857 13.143 6.857 56 72.571 140 113.714 230.857 113.714 161.143 0 292.571-131.429 292.571-292.571s-131.429-292.571-292.571-292.571c-74.857 0-145.714 28.571-198.857 78.286l78.286 78.857c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l74.286 73.714c80.571-76 189.714-121.143 302.286-121.143 241.714 0 438.857 197.143 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["rotate-left","undo"],"defaultCode":61666,"grid":14},"attrs":[],"properties":{"name":"rotate-left, undo","id":149,"order":203,"prevSize":28,"code":61666},"setIdx":0,"setId":1,"iconIdx":154},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429zM219.429 457.143c0-10.286 8-18.286 18.286-18.286h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571zM640 585.143c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286zM640 731.429c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["file-text-o"],"defaultCode":61686,"grid":14},"attrs":[],"properties":{"name":"file-text-o","id":150,"order":222,"prevSize":28,"code":61686},"setIdx":0,"setId":1,"iconIdx":155},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-182.857v-182.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v182.857h-182.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h182.857v182.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-182.857h182.857c20 0 36.571-16.571 36.571-36.571zM877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["plus-square"],"defaultCode":61694,"grid":14},"attrs":[],"properties":{"name":"plus-square","id":151,"order":230,"prevSize":28,"code":61694},"setIdx":0,"setId":1,"iconIdx":156},{"icon":{"paths":["M358.286 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143zM577.714 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":603.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-left"],"defaultCode":61696,"grid":14},"attrs":[],"properties":{"name":"angle-double-left","id":152,"order":231,"prevSize":28,"code":61696},"setIdx":0,"setId":1,"iconIdx":157},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM559.429 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":566.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-right"],"defaultCode":61697,"grid":14},"attrs":[],"properties":{"name":"angle-double-right","id":153,"order":232,"prevSize":28,"code":61697},"setIdx":0,"setId":1,"iconIdx":158},{"icon":{"paths":["M614.286 749.714c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 530.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-up"],"defaultCode":61698,"grid":14},"attrs":[],"properties":{"name":"angle-double-up","id":154,"order":233,"prevSize":28,"code":61698},"setIdx":0,"setId":1,"iconIdx":159},{"icon":{"paths":["M614.286 493.714c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 274.286c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-double-down"],"defaultCode":61699,"grid":14},"attrs":[],"properties":{"name":"angle-double-down","id":155,"order":234,"prevSize":28,"code":61699},"setIdx":0,"setId":1,"iconIdx":160},{"icon":{"paths":["M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z"],"width":384,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-left"],"defaultCode":61700,"grid":14},"attrs":[],"properties":{"name":"angle-left","id":156,"order":235,"prevSize":28,"code":61700},"setIdx":0,"setId":1,"iconIdx":161},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":347.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-right"],"defaultCode":61701,"grid":14},"attrs":[],"properties":{"name":"angle-right","id":157,"order":236,"prevSize":28,"code":61701},"setIdx":0,"setId":1,"iconIdx":162},{"icon":{"paths":["M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-up"],"defaultCode":61702,"grid":14},"attrs":[],"properties":{"name":"angle-up","id":158,"order":237,"prevSize":28,"code":61702},"setIdx":0,"setId":1,"iconIdx":163},{"icon":{"paths":["M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["angle-down"],"defaultCode":61703,"grid":14},"attrs":[],"properties":{"name":"angle-down","id":159,"order":238,"prevSize":28,"code":61703},"setIdx":0,"setId":1,"iconIdx":164},{"icon":{"paths":["M438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["circle-o"],"defaultCode":61708,"grid":14},"attrs":[],"properties":{"name":"circle-o","id":160,"order":243,"prevSize":28,"code":61708},"setIdx":0,"setId":1,"iconIdx":165},{"icon":{"paths":["M300.571 796.571c0 40-32.571 73.143-73.143 73.143-40 0-73.143-33.143-73.143-73.143 0-40.571 33.143-73.143 73.143-73.143 40.571 0 73.143 32.571 73.143 73.143zM585.143 914.286c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM182.857 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM869.714 796.571c0 40-33.143 73.143-73.143 73.143-40.571 0-73.143-33.143-73.143-73.143 0-40.571 32.571-73.143 73.143-73.143 40 0 73.143 32.571 73.143 73.143zM318.857 227.429c0 50.286-41.143 91.429-91.429 91.429s-91.429-41.143-91.429-91.429 41.143-91.429 91.429-91.429 91.429 41.143 91.429 91.429zM987.429 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM621.714 109.714c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM924.571 227.429c0 70.857-57.714 128-128 128-70.857 0-128-57.143-128-128 0-70.286 57.143-128 128-128 70.286 0 128 57.714 128 128z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["spinner"],"defaultCode":61712,"grid":14},"attrs":[],"properties":{"name":"spinner","id":161,"order":246,"prevSize":28,"code":61712},"setIdx":0,"setId":1,"iconIdx":166},{"icon":{"paths":["M877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["circle"],"defaultCode":61713,"grid":14},"attrs":[],"properties":{"name":"circle","id":162,"order":247,"prevSize":28,"code":61713},"setIdx":0,"setId":1,"iconIdx":167},{"icon":{"paths":["M1024 640c0 80-40 184.571-72.571 257.714-6.286 13.143-12.571 31.429-21.143 43.429-4 5.714-8 9.714-16 9.714-11.429 0-18.286-9.143-18.286-20 0-9.143 2.286-19.429 2.857-28.571 1.714-23.429 2.857-46.857 2.857-70.286 0-272.571-161.714-320-408-320h-128v146.286c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-292.571-292.571c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l292.571-292.571c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v146.286h128c187.429 0 420.571 33.143 500 230.286 24 60.571 30.286 126.286 30.286 190.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["mail-reply","reply"],"defaultCode":61714,"grid":14},"attrs":[],"properties":{"name":"mail-reply, reply","id":163,"order":248,"prevSize":28,"code":61714},"setIdx":0,"setId":1,"iconIdx":168},{"icon":{"paths":["M877.714 749.714v-402.286c0-30.286-24.571-54.857-54.857-54.857h-402.286c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v548.571c0 30.286 24.571 54.857 54.857 54.857h694.857c30.286 0 54.857-24.571 54.857-54.857zM950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder-o"],"defaultCode":61716,"grid":14},"attrs":[],"properties":{"name":"folder-o","id":164,"order":250,"prevSize":28,"code":61716},"setIdx":0,"setId":1,"iconIdx":169},{"icon":{"paths":["M1017.714 532c0-16-17.714-20-30.286-20h-621.714c-30.286 0-70.286 18.857-89.714 42.286l-168 207.429c-5.143 6.857-10.286 14.286-10.286 22.857 0 16 17.714 20 30.286 20h621.714c30.286 0 70.286-18.857 89.714-42.857l168-207.429c5.143-6.286 10.286-13.714 10.286-22.286zM365.714 438.857h438.857v-91.429c0-30.286-24.571-54.857-54.857-54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v487.429l146.286-180c33.143-40.571 94.286-69.714 146.286-69.714zM1090.857 532c0 25.143-10.857 49.143-26.286 68.571l-168.571 207.429c-32.571 40-94.857 69.714-146.286 69.714h-621.714c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128v91.429h109.714c38.857 0 77.714 17.714 94.857 54.286 5.714 12 8.571 25.143 8.571 38.857z"],"width":1090.8525714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["folder-open-o"],"defaultCode":61717,"grid":14},"attrs":[],"properties":{"name":"folder-open-o","id":165,"order":251,"prevSize":28,"code":61717},"setIdx":0,"setId":1,"iconIdx":170},{"icon":{"paths":["M219.429 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM292.571 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h128c5.143 0 9.143 4 9.143 9.143zM219.429 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-493.714c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h493.714c5.143 0 9.143 4 9.143 9.143zM438.857 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM365.714 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM585.143 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM512 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM731.429 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM658.286 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 374.857v201.143c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h64v-137.143c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM1024 804.571v-512h-950.857v512h950.857zM1097.143 292.571v512c0 40.571-32.571 73.143-73.143 73.143h-950.857c-40.571 0-73.143-32.571-73.143-73.143v-512c0-40.571 32.571-73.143 73.143-73.143h950.857c40.571 0 73.143 32.571 73.143 73.143z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["keyboard-o"],"defaultCode":61724,"grid":14},"attrs":[],"properties":{"name":"keyboard-o","id":166,"order":256,"prevSize":28,"code":61724},"setIdx":0,"setId":1,"iconIdx":171},{"icon":{"paths":["M334.286 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286zM950.857 822.857v36.571c0 10.286-8 18.286-18.286 18.286h-548.571c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h548.571c10.286 0 18.286 8 18.286 18.286z"],"width":956.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["terminal"],"defaultCode":61728,"grid":14},"attrs":[],"properties":{"name":"terminal","id":167,"order":259,"prevSize":28,"code":61728},"setIdx":0,"setId":1,"iconIdx":172},{"icon":{"paths":["M352.571 799.429l-28.571 28.571c-7.429 7.429-18.857 7.429-26.286 0l-266.286-266.286c-7.429-7.429-7.429-18.857 0-26.286l266.286-266.286c7.429-7.429 18.857-7.429 26.286 0l28.571 28.571c7.429 7.429 7.429 18.857 0 26.286l-224.571 224.571 224.571 224.571c7.429 7.429 7.429 18.857 0 26.286zM690.286 189.714l-213.143 737.714c-2.857 9.714-13.143 15.429-22.286 12.571l-35.429-9.714c-9.714-2.857-15.429-13.143-12.571-22.857l213.143-737.714c2.857-9.714 13.143-15.429 22.286-12.571l35.429 9.714c9.714 2.857 15.429 13.143 12.571 22.857zM1065.714 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["code"],"defaultCode":61729,"grid":14},"attrs":[],"properties":{"name":"code","id":168,"order":684,"prevSize":28,"code":61729},"setIdx":0,"setId":1,"iconIdx":173},{"icon":{"paths":["M365.714 618.286v40c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v39.429l-226.857 227.429c-14.286 14.286-14.286 37.143 0 51.429zM1024 640c0 118.857-89.714 293.714-93.714 301.143-2.857 6.286-9.143 9.714-16 9.714-1.714 0-3.429 0-5.143-0.571-8.571-2.857-13.714-10.857-13.143-19.429 16.571-156-2.857-258.857-60.571-322.857-48.571-54.286-127.429-83.429-250.286-93.143v143.429c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v149.714c157.714 10.857 270.286 52.571 342.286 126.286 86.286 88.571 96.571 208.571 96.571 290.857z"],"width":1020.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["mail-reply-all","reply-all"],"defaultCode":61730,"grid":14},"attrs":[],"properties":{"name":"mail-reply-all, reply-all","id":169,"order":685,"prevSize":28,"code":61730},"setIdx":0,"setId":1,"iconIdx":174},{"icon":{"paths":["M677.714 546.857l146.857-142.857-241.143-35.429-17.143-34.286-90.857-184v550.286l33.714 17.714 181.714 96-34.286-202.857-6.857-37.714zM936 397.143l-207.429 202.286 49.143 285.714c4 25.143-5.143 40-22.857 40-6.286 0-14.286-2.286-22.857-6.857l-256.571-134.857-256.571 134.857c-8.571 4.571-16.571 6.857-22.857 6.857-17.714 0-26.857-14.857-22.857-40l49.143-285.714-208-202.286c-24.571-24.571-16.571-48.571 17.714-53.714l286.857-41.714 128.571-260c7.429-15.429 17.714-23.429 28-23.429v0c10.286 0 20 8 28 23.429l128.571 260 286.857 41.714c34.286 5.143 42.286 29.143 17.143 53.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["star-half-empty","star-half-full","star-half-o"],"defaultCode":61731,"grid":14},"attrs":[],"properties":{"name":"star-half-empty, star-half-full, star-half-o","id":170,"order":262,"prevSize":28,"code":61731},"setIdx":0,"setId":1,"iconIdx":175},{"icon":{"paths":["M318.286 731.429h340v-340zM292.571 705.714l340-340h-340v340zM950.857 749.714v109.714c0 10.286-8 18.286-18.286 18.286h-128v128c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-128h-493.714c-10.286 0-18.286-8-18.286-18.286v-493.714h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128v-128c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v128h486.286l140.571-141.143c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286l-141.143 140.571v486.286h128c10.286 0 18.286 8 18.286 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["crop"],"defaultCode":61733,"grid":14},"attrs":[],"properties":{"name":"crop","id":171,"order":264,"prevSize":28,"code":61733},"setIdx":0,"setId":1,"iconIdx":176},{"icon":{"paths":["M164.571 841.143c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM164.571 182.857c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM530.286 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM585.143 256c0 40.571-22.286 76-54.857 94.857-1.714 206.286-148 252-245.143 282.857-90.857 28.571-120.571 42.286-120.571 97.714v14.857c32.571 18.857 54.857 54.286 54.857 94.857 0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714c0-40.571 22.286-76 54.857-94.857v-468.571c-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714c0 40.571-22.286 76-54.857 94.857v284c29.143-14.286 60-24 88-32.571 106.286-33.714 166.857-58.857 168-178.286-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["code-fork"],"defaultCode":61734,"grid":14},"attrs":[],"properties":{"name":"code-fork","id":172,"order":265,"prevSize":28,"code":61734},"setIdx":0,"setId":1,"iconIdx":177},{"icon":{"paths":["M250.857 726.286l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286zM347.429 749.714v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM219.429 621.714c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM941.714 694.857c0 44-17.143 85.143-48.571 116l-84 83.429c-30.857 30.857-72 47.429-116 47.429s-85.714-17.143-116.571-48.571l-190.857-191.429c-9.714-9.714-17.143-20.571-24-32l136.571-10.286 156 156.571c20.571 20.571 57.143 21.143 77.714 0.571l84-83.429c10.286-10.286 16-24 16-38.286 0-14.857-5.714-28.571-16-38.857l-156.571-157.143 10.286-136.571c11.429 6.857 22.286 14.286 32 24l192 192c30.857 31.429 48 72.571 48 116.571zM589.143 281.143l-136.571 10.286-156-156.571c-10.286-10.286-24-16-38.857-16s-28.571 5.714-38.857 15.429l-84 83.429c-10.286 10.286-16 24-16 38.286 0 14.857 5.714 28.571 16 38.857l156.571 156.571-10.286 137.143c-11.429-6.857-22.286-14.286-32-24l-192-192c-30.857-31.429-48-72.571-48-116.571s17.143-85.143 48.571-116l84-83.429c30.857-30.857 72-47.429 116-47.429s85.714 17.143 116.571 48.571l190.857 191.429c9.714 9.714 17.143 20.571 24 32zM950.857 329.143c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM640 18.286v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM872.571 104.571l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chain-broken","unlink"],"defaultCode":61735,"grid":14},"attrs":[],"properties":{"name":"chain-broken, unlink","id":173,"order":266,"prevSize":28,"code":61735},"setIdx":0,"setId":1,"iconIdx":178},{"icon":{"paths":["M511.999 960c-88.606 0-175.222-26.276-248.895-75.5-73.673-49.229-131.095-119.199-165.002-201.057-33.908-81.864-42.78-171.94-25.494-258.844s59.954-166.729 122.608-229.383c62.654-62.654 142.48-105.322 229.383-122.608s176.98-8.414 258.844 25.494c81.859 33.908 151.828 91.329 201.057 165.002 49.224 73.673 75.5 160.29 75.5 248.895 0 118.815-47.201 232.765-131.215 316.785-84.019 84.014-197.97 131.215-316.785 131.215zM511.999 128c-75.948 0-150.19 22.521-213.339 64.716s-112.367 102.167-141.431 172.334c-29.064 70.167-36.668 147.375-21.852 221.866 14.817 74.486 51.389 142.909 105.093 196.613s122.126 90.276 196.615 105.093c74.488 14.817 151.699 7.214 221.863-21.852 70.17-29.066 130.14-78.285 172.334-141.43 42.194-63.15 64.717-137.39 64.717-213.34 0-101.843-40.458-199.515-112.471-271.529s-169.687-112.471-271.529-112.471z","M495.999 352c26.511 0 48-21.49 48-48s-21.489-48-48-48c-26.51 0-48 21.49-48 48s21.49 48 48 48z","M671.999 704c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375h-256c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625s3.372-16.625 9.373-22.625c6.001-6.006 14.14-9.375 22.627-9.375h96v-192h-64c-8.487 0-16.626-3.372-22.627-9.373s-9.373-14.14-9.373-22.627c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373h96c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224h96c8.489 0 16.625 3.369 22.625 9.375 6.006 6.001 9.375 14.136 9.375 22.625z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["info"],"defaultCode":61737,"grid":14},"attrs":[],"properties":{"name":"info","id":174,"order":678,"prevSize":28,"code":61737},"setIdx":0,"setId":1,"iconIdx":179},{"icon":{"paths":["M917.119 944.34h-812.798c-5.469-0.020-10.84-1.444-15.602-4.137-4.762-2.688-8.755-6.554-11.598-11.223-2.809-4.864-4.287-10.383-4.287-16s1.479-11.136 4.287-16l406.4-799.999c2.685-5.242 6.765-9.64 11.79-12.712s10.8-4.697 16.688-4.697c5.893 0 11.668 1.625 16.691 4.697 5.028 3.072 9.103 7.471 11.791 12.712l406.4 799.999c2.806 4.864 4.285 10.383 4.285 16s-1.48 11.136-4.285 16c-3.057 5.059-7.46 9.175-12.713 11.884-5.253 2.714-11.151 3.917-17.050 3.476zM156.481 880.34h708.481l-354.243-697.279-354.238 697.279z","M510.709 816.34c26.511 0 48-21.489 48-48s-21.489-48-48-48c-26.51 0-48 21.489-48 48s21.49 48 48 48z","M510.709 656.34c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625v-224c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["exclamation"],"defaultCode":61738,"grid":14},"attrs":[],"properties":{"name":"exclamation","id":175,"order":268,"prevSize":28,"code":61738},"setIdx":0,"setId":1,"iconIdx":180},{"icon":{"paths":["M822.857 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM950.857 91.429c0 189.714-52.571 316-188 452-33.143 32.571-70.857 66.286-111.429 100.571l-11.429 216.571c-0.571 5.714-4 11.429-9.143 14.857l-219.429 128c-2.857 1.714-5.714 2.286-9.143 2.286-4.571 0-9.143-1.714-13.143-5.143l-36.571-36.571c-4.571-5.143-6.286-12-4.571-18.286l48.571-157.714-160.571-160.571-157.714 48.571c-1.714 0.571-3.429 0.571-5.143 0.571-4.571 0-9.714-1.714-13.143-5.143l-36.571-36.571c-5.714-6.286-6.857-15.429-2.857-22.286l128-219.429c3.429-5.143 9.143-8.571 14.857-9.143l216.571-11.429c34.286-40.571 68-78.286 100.571-111.429 142.857-142.286 252-188 450.857-188 10.286 0 19.429 8 19.429 18.286z"],"width":967.4605714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["rocket"],"defaultCode":61749,"grid":14},"attrs":[],"properties":{"name":"rocket","id":176,"order":682,"prevSize":28,"code":61749},"setIdx":0,"setId":1,"iconIdx":181},{"icon":{"paths":["M997.143 441.714l-93.714 436h-190.857l101.714-475.429c4.571-20 1.714-38.286-8.571-50.286-9.714-12-26.857-18.857-47.429-18.857h-96.571l-116.571 544.571h-190.857l116.571-544.571h-163.429l-116.571 544.571h-190.857l116.571-544.571-87.429-186.857h729.143c77.143 0 147.429 32 192.571 88 45.714 56 62.286 132 46.286 207.429z"],"width":1013.1748571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["maxcdn"],"defaultCode":61750,"grid":14},"attrs":[],"properties":{"name":"maxcdn","id":177,"order":683,"prevSize":28,"code":61750},"setIdx":0,"setId":1,"iconIdx":182},{"icon":{"paths":["M519.429 797.143l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-175.429-175.429 175.429-175.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-left"],"defaultCode":61751,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-left","id":178,"order":280,"prevSize":28,"code":61751},"setIdx":0,"setId":1,"iconIdx":183},{"icon":{"paths":["M409.714 797.143l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l175.429 175.429-175.429 175.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-right"],"defaultCode":61752,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-right","id":179,"order":281,"prevSize":28,"code":61752},"setIdx":0,"setId":1,"iconIdx":184},{"icon":{"paths":["M665.714 650.857l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0l175.429-175.429 175.429 175.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-up"],"defaultCode":61753,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-up","id":180,"order":282,"prevSize":28,"code":61753},"setIdx":0,"setId":1,"iconIdx":185},{"icon":{"paths":["M464.571 742.286l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-175.429 175.429-175.429-175.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["chevron-circle-down"],"defaultCode":61754,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-down","id":181,"order":283,"prevSize":28,"code":61754},"setIdx":0,"setId":1,"iconIdx":186},{"icon":{"paths":["M219.429 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM512 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["ellipsis-h"],"defaultCode":61761,"grid":14},"attrs":[],"properties":{"name":"ellipsis-h","id":182,"order":289,"prevSize":28,"code":61761},"setIdx":0,"setId":1,"iconIdx":187},{"icon":{"paths":["M437.143 742.286c2.857 6.857 1.714 14.286-2.857 20l-200 219.429c-3.429 3.429-8 5.714-13.143 5.714v0c-5.143 0-10.286-2.286-13.714-5.714l-202.857-219.429c-4.571-5.714-5.714-13.143-2.857-20 2.857-6.286 9.143-10.857 16.571-10.857h128v-713.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v713.143h128c7.429 0 13.714 4 16.571 10.857z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-down"],"defaultCode":61813,"grid":14},"attrs":[],"properties":{"name":"long-arrow-down","id":183,"order":338,"prevSize":28,"code":61813},"setIdx":0,"setId":1,"iconIdx":188},{"icon":{"paths":["M437.143 281.714c-2.857 6.286-9.143 10.857-16.571 10.857h-128v713.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-713.143h-128c-7.429 0-13.714-4-16.571-10.857s-1.714-14.286 2.857-20l200-219.429c3.429-3.429 8-5.714 13.143-5.714v0c5.143 0 10.286 2.286 13.714 5.714l202.857 219.429c4.571 5.714 5.714 13.143 2.857 20z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-up"],"defaultCode":61814,"grid":14},"attrs":[],"properties":{"name":"long-arrow-up","id":184,"order":339,"prevSize":28,"code":61814},"setIdx":0,"setId":1,"iconIdx":189},{"icon":{"paths":["M1024 457.143v109.714c0 10.286-8 18.286-18.286 18.286h-713.143v128c0 7.429-4 13.714-10.857 16.571s-14.286 1.714-20-2.857l-219.429-200c-3.429-3.429-5.714-8-5.714-13.143v0c0-5.143 2.286-10.286 5.714-13.714l219.429-202.286c5.714-5.143 13.143-6.286 20-3.429 6.286 2.857 10.857 9.143 10.857 16.571v128h713.143c10.286 0 18.286 8 18.286 18.286z"],"width":1060.5714285714284,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-left"],"defaultCode":61815,"grid":14},"attrs":[],"properties":{"name":"long-arrow-left","id":185,"order":340,"prevSize":28,"code":61815},"setIdx":0,"setId":1,"iconIdx":190},{"icon":{"paths":["M987.429 510.286c0 5.143-2.286 10.286-5.714 13.714l-219.429 202.286c-5.714 5.143-13.143 6.286-20 3.429-6.286-2.857-10.857-9.143-10.857-16.571v-128h-713.143c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h713.143v-128c0-7.429 4-13.714 10.857-16.571s14.286-1.714 20 2.857l219.429 200c3.429 3.429 5.714 8 5.714 13.143v0z"],"width":987.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["long-arrow-right"],"defaultCode":61816,"grid":14},"attrs":[],"properties":{"name":"long-arrow-right","id":186,"order":341,"prevSize":28,"code":61816},"setIdx":0,"setId":1,"iconIdx":191},{"icon":{"paths":["M109.714 731.429v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 585.143v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 438.857v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 292.571v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 146.286v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM731.429 54.857v841.143c0 30.286-24.571 54.857-54.857 54.857h-475.429c-30.286 0-54.857-24.571-54.857-54.857v-841.143c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857zM877.714 758.857v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 612.571v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 466.286v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 320v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 173.714v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[]},"tags":["microchip"],"defaultCode":62171,"grid":14},"attrs":[],"properties":{"name":"microchip","id":187,"order":693,"prevSize":28,"code":62171},"setIdx":0,"setId":1,"iconIdx":192}],"height":1024,"metadata":{"name":"FontAwesome"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"fa-","metadata":{"fontFamily":"FontAwesome","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"noie8":true,"ie7":false,"showSelector":false,"selector":"i","showMetrics":false,"showMetadata":false,"showVersion":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} \ No newline at end of file +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M684.256 793.966l-146.286 146.286c-6.932 6.802-16.255 10.606-25.964 10.606s-19.032-3.803-25.964-10.606l-146.286-146.286c-3.41-3.41-6.115-7.458-7.96-11.913s-2.796-9.23-2.796-14.052c-0.001-9.738 3.868-19.079 10.754-25.965s16.226-10.756 25.964-10.756c4.822 0 9.597 0.949 14.052 2.795s8.504 4.549 11.914 7.959l83.749 84.107v-423.856c0-9.699 3.853-19.002 10.712-25.86s16.16-10.712 25.86-10.712c9.699 0 19.001 3.853 25.86 10.712s10.712 16.16 10.712 25.86v423.856l83.749-84.107c6.886-6.886 16.227-10.756 25.966-10.756s19.079 3.869 25.966 10.756c6.886 6.886 10.755 16.227 10.755 25.966s-3.869 19.079-10.755 25.966z","M786.286 658.285h-128c-9.699 0-19.001-3.852-25.86-10.711s-10.712-16.161-10.712-25.86c0-9.699 3.853-19.001 10.712-25.86s16.16-10.712 25.86-10.712h128c32.768-0.031 64.285-12.618 88.057-35.172 23.779-22.554 38.005-53.361 39.76-86.085s-9.092-64.877-30.318-89.846c-21.219-24.97-51.207-40.858-83.785-44.396-8.316-0.882-16.084-4.59-21.994-10.505-5.917-5.914-9.626-13.678-10.503-21.996-3.35-31.449-18.235-60.542-41.784-81.652-23.551-21.11-54.092-32.737-85.719-32.634-23.597-0.154-46.754 6.384-66.785 18.857-6.953 4.363-15.168 6.269-23.332 5.414s-15.805-4.42-21.704-10.128c-33.699-32.745-78.905-50.956-125.893-50.714-44.461 0.011-87.395 16.221-120.77 45.598s-54.9 69.908-60.551 114.009c-0.856 6.825-3.618 13.27-7.971 18.595s-10.119 9.315-16.636 11.512c-28.688 9.795-52.969 29.455-68.519 55.477s-21.361 56.718-16.396 86.623c4.964 29.905 20.381 57.078 43.504 76.68s52.454 30.362 82.768 30.363h128c9.699 0 19.002 3.853 25.86 10.712s10.711 16.16 10.711 25.86c0 9.699-3.853 19.002-10.711 25.86s-16.161 10.711-25.86 10.711h-128c-45.726-0.010-90.084-15.596-125.767-44.191s-60.559-68.491-70.532-113.116c-9.973-44.625-4.447-91.317 15.667-132.381s53.618-74.052 94.989-93.527c12.401-57.159 43.982-108.357 89.498-145.089s102.228-56.789 160.717-56.839c56.689-0.21 111.801 18.659 156.464 53.571 26.825-11.769 55.891-17.556 85.178-16.958s58.092 7.565 84.415 20.419c26.323 12.854 49.532 31.284 68.007 54.012 18.483 22.728 31.795 49.208 39.007 77.598 47.587 12.004 89.154 40.98 116.875 81.479 27.728 40.499 39.702 89.732 33.675 138.44-6.034 48.708-29.645 93.536-66.406 126.054s-84.136 50.488-133.215 50.527z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-download"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":723,"id":198,"name":"arduino-cloud-download","prevSize":28,"code":59664},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M854.72 246.726l-671.997 672.001c-6.066 5.946-14.223 9.28-22.719 9.28s-16.653-3.334-22.719-9.28c-5.996-6.042-9.361-14.208-9.361-22.72s3.365-16.678 9.361-22.72l107.52-107.52c-37.22-5.818-71.592-23.424-98.059-50.234s-43.632-61.402-48.97-98.694c-5.338-37.292 1.432-75.312 19.315-108.469s45.935-59.7 80.029-75.724c7.995-36.965 25.219-71.304 50.068-99.816s56.512-50.267 92.038-63.237c35.526-12.971 73.758-16.735 111.132-10.941s72.672 20.956 102.604 44.074c23.899-10.368 49.78-15.369 75.821-14.651 26.038 0.718 51.606 7.138 74.896 18.807l105.6-105.596c6.029-6.026 14.202-9.411 22.72-9.411 8.525 0 16.698 3.385 22.72 9.411 6.029 6.026 9.414 14.198 9.414 22.72s-3.386 16.694-9.414 22.72v0z","M928 592.030c-0.083 46.653-18.65 91.375-51.642 124.36-32.986 32.986-77.702 51.558-124.358 51.642h-322.563l361.283-361.282c1.6 4.797 2.88 9.6 4.166 14.398 38.093 9.509 71.904 31.506 96.032 62.48s37.184 69.139 37.082 108.402v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-filled-offline"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":724,"id":197,"name":"arduino-cloud-filled-offline","prevSize":28,"code":59665},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M928 591.998c-0.083 46.653-18.65 91.375-51.635 124.36-32.992 32.992-77.709 51.558-124.365 51.642h-479.998c-40.017-0.013-78.836-13.658-110.060-38.688-31.224-25.024-52.989-59.942-61.71-98.999-8.721-39.055-3.876-79.916 13.736-115.849s46.94-64.794 83.151-81.826c7.995-36.965 25.22-71.304 50.068-99.816s56.513-50.266 92.038-63.237c35.526-12.971 73.759-16.735 111.132-10.941s72.672 20.956 102.604 44.074c22.414-9.744 46.599-14.755 71.040-14.72 39.262-0.102 77.425 12.954 108.401 37.083s52.973 57.94 62.483 96.035c38.093 9.508 71.904 31.506 96.032 62.48s37.184 69.14 37.082 108.403z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-filled"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":725,"id":196,"name":"arduino-cloud-filled","prevSize":28,"code":59666},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M794.88 421.148c-1.28-4.797-2.56-9.601-4.16-14.398l-53.12 53.125c2.080 5.548 5.67 10.404 10.362 14.022 4.698 3.618 10.304 5.853 16.198 6.454 28.493 3.153 54.701 17.094 73.235 38.963 18.541 21.868 28 50.003 26.445 78.628s-14.016 55.569-34.81 75.3c-20.8 19.725-48.365 30.746-77.030 30.79h-258.563l-64 64h322.563c42.944-0.026 84.403-15.744 116.57-44.198s52.832-67.68 58.099-110.301c5.267-42.621-5.216-85.699-29.491-121.13-24.269-35.43-60.646-60.771-102.298-71.254v0z","M854.72 201.3c-6.042-5.997-14.208-9.363-22.72-9.363s-16.678 3.366-22.714 9.363l-105.606 105.595c-23.29-11.669-48.858-18.089-74.898-18.806s-51.923 4.284-75.821 14.652c-29.932-23.118-65.23-38.28-102.604-44.074s-75.606-2.029-111.132 10.941c-35.526 12.971-67.19 34.726-92.039 63.237s-42.073 62.851-50.068 99.816c-34.093 16.024-62.145 42.566-80.028 75.723s-24.653 71.177-19.315 108.468c5.338 37.292 22.502 71.884 48.968 98.693s60.837 44.416 98.057 50.234l-107.52 107.52c-5.996 6.042-9.361 14.208-9.361 22.72s3.364 16.678 9.361 22.72c6.065 5.946 14.223 9.28 22.719 9.28s16.653-3.334 22.719-9.28l672.001-672.001c5.997-6.040 9.357-14.207 9.363-22.718 0-8.511-3.366-16.678-9.363-22.719v0zM306.564 704.019h-34.563c-26.523 0.013-52.188-9.395-72.423-26.541s-33.725-40.92-38.067-67.085c-4.342-26.165 0.747-53.022 14.36-75.785s34.865-39.954 59.97-48.51c5.716-1.953 10.763-5.483 14.557-10.184s6.18-10.379 6.883-16.379c5.021-38.555 23.892-73.968 53.095-99.638s66.744-39.843 105.625-39.878c41.119-0.243 80.673 15.741 110.078 44.484 5.176 4.951 11.848 8.045 18.97 8.797s14.294-0.88 20.39-4.641c17.553-10.974 37.86-16.744 58.562-16.641 10.271 0.061 20.492 1.458 30.399 4.156l-347.836 347.843z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-offline"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":726,"id":195,"name":"arduino-cloud-offline","prevSize":28,"code":59667},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M684.258 537.965c-6.932 6.799-16.255 10.607-25.964 10.607s-19.032-3.809-25.964-10.607l-83.751-84.118v423.867c0 9.699-3.853 19.003-10.711 25.856-6.859 6.861-16.161 10.715-25.86 10.715s-19.001-3.855-25.86-10.715c-6.859-6.853-10.712-16.157-10.712-25.856v-423.867l-83.749 84.118c-6.886 6.886-16.227 10.756-25.966 10.756s-19.079-3.869-25.966-10.756c-6.886-6.886-10.755-16.227-10.755-25.966s3.869-19.079 10.755-25.966l146.286-146.286c6.903-6.854 16.236-10.701 25.964-10.701s19.062 3.847 25.964 10.701l146.286 146.286c6.853 6.904 10.7 16.237 10.701 25.965s-3.845 19.062-10.698 25.966z","M786.286 694.856h-128c-9.699 0-19.001-3.852-25.86-10.711s-10.712-16.161-10.712-25.86c0-9.699 3.853-19.001 10.712-25.86s16.16-10.712 25.86-10.712h128c32.768-0.031 64.285-12.618 88.057-35.172 23.779-22.554 38.005-53.361 39.76-86.085s-9.092-64.877-30.318-89.846c-21.219-24.97-51.207-40.858-83.785-44.396-8.316-0.882-16.084-4.59-21.994-10.505-5.917-5.914-9.626-13.678-10.503-21.996-3.35-31.449-18.235-60.542-41.784-81.652-23.551-21.11-54.092-32.737-85.719-32.634-23.597-0.154-46.754 6.384-66.785 18.857-6.954 4.362-15.168 6.268-23.331 5.413s-15.805-4.419-21.705-10.127c-33.699-32.745-78.905-50.956-125.893-50.714-44.461 0.011-87.395 16.221-120.77 45.598s-54.9 69.908-60.551 114.009c-0.856 6.825-3.618 13.27-7.971 18.595s-10.119 9.315-16.636 11.512c-28.688 9.795-52.969 29.455-68.519 55.477s-21.361 56.718-16.396 86.623c4.964 29.905 20.381 57.078 43.504 76.68s52.454 30.362 82.768 30.363h128c9.699 0 19.002 3.853 25.86 10.712s10.711 16.16 10.711 25.86c0 9.699-3.853 19.002-10.711 25.86s-16.161 10.711-25.86 10.711h-128c-45.726-0.010-90.084-15.596-125.767-44.191s-60.559-68.491-70.532-113.116c-9.973-44.625-4.447-91.317 15.667-132.381s53.618-74.052 94.989-93.527c12.401-57.159 43.982-108.357 89.498-145.089s102.228-56.789 160.717-56.839c56.689-0.21 111.801 18.659 156.464 53.571 26.825-11.769 55.891-17.556 85.178-16.958s58.092 7.565 84.415 20.419c26.323 12.854 49.532 31.284 68.007 54.012 18.483 22.728 31.795 49.208 39.007 77.598 47.587 12.004 89.154 40.98 116.875 81.479 27.728 40.499 39.702 89.732 33.675 138.44-6.034 48.708-29.645 93.536-66.406 126.054s-84.136 50.488-133.215 50.527z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud-upload"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":727,"id":194,"name":"arduino-cloud-upload","prevSize":28,"code":59668},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M752 768h-480c-40.010-0.006-78.824-13.645-110.046-38.662-31.222-25.024-52.989-59.93-61.716-98.98-8.726-39.047-3.891-79.902 13.709-115.833s46.915-64.796 83.115-81.836c10.851-50.014 38.484-94.812 78.31-126.953s89.45-49.69 140.627-49.734c49.603-0.184 97.826 16.327 136.906 46.875 23.472-10.298 48.904-15.361 74.531-14.838s50.829 6.62 73.862 17.866c23.034 11.247 43.341 27.374 59.507 47.261 16.173 19.887 27.821 43.056 34.131 67.898 41.638 10.504 78.010 35.857 102.266 71.294 24.262 35.437 34.739 78.515 29.466 121.135-5.28 42.623-25.939 81.842-58.106 110.296s-73.619 44.179-116.563 44.211zM416 320.001c-38.904 0.010-76.471 14.193-105.674 39.899s-48.038 61.169-52.982 99.757c-0.749 5.972-3.166 11.611-6.975 16.271s-8.853 8.151-14.556 10.073c-25.102 8.571-46.348 25.773-59.954 48.542s-18.691 49.628-14.347 75.795c4.344 26.167 17.833 49.943 38.066 67.095s45.897 26.566 72.422 26.566h480c28.672-0.026 56.25-11.040 77.050-30.778 20.806-19.731 33.254-46.688 34.79-75.321s-7.955-56.767-26.528-78.616c-18.566-21.848-44.806-35.75-73.312-38.847-7.277-0.772-14.074-4.016-19.245-9.191-5.178-5.176-8.422-11.969-9.19-19.247-2.931-27.518-15.955-52.974-36.563-71.445-20.602-18.471-47.328-28.645-75.002-28.555-20.647-0.135-40.909 5.587-58.437 16.5-6.084 3.816-13.272 5.484-20.415 4.737s-13.83-3.868-18.992-8.861c-29.487-28.652-69.042-44.586-110.156-44.375v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-cloud"],"colorPermutations":{"12714014111291321":[]}},"attrs":[],"properties":{"order":728,"id":193,"name":"arduino-cloud","prevSize":28,"code":59669},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M558.545 1024c-23.818 0-47.637-9.095-65.819-27.276l-465.454-465.453c-36.363-36.363-36.363-95.273 0-131.636s95.273-36.363 131.637 0l399.636 399.636 772.003-772c36.361-36.363 95.269-36.363 131.631 0s36.361 95.273 0 131.637l-837.815 837.815c-18.182 18.181-42 27.276-65.818 27.276z"],"attrs":[{}],"width":1489,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-verify"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":12,"id":192,"name":"arduino-verify","prevSize":28,"code":59659},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M1072.469 526.509l-409.603 409.598c-13.65 12.971-30.717 19.804-48.467 19.804s-34.817-6.833-48.467-19.804c-26.625-26.617-26.625-70.315 0-96.932l293.551-292.866h-791.217c-37.55 0-68.267-30.717-68.267-68.267s30.717-68.267 68.267-68.267h791.217l-293.551-292.866c-26.625-26.616-26.625-70.317 0-96.934 26.616-26.634 70.317-26.634 96.933 0l409.603 409.6c26.624 26.616 26.624 70.317 0 96.934v0z"],"attrs":[{}],"width":1161,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-upload"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":11,"id":191,"name":"arduino-upload","prevSize":28,"code":59660},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M651.891 890.88c-92.835 0-179.095-28.493-250.5-77.197l-129.659 129.658c-22.494 22.496-58.964 22.496-81.458 0s-22.494-58.963 0-81.459l124.954-124.954c-67.75-78.157-108.777-180.090-108.777-291.489 0-245.759 199.68-445.439 445.44-445.439s445.44 199.679 445.44 445.439c0 245.761-199.68 445.441-445.44 445.441zM651.891 153.6c-161.28 0-291.84 130.559-291.84 291.839s130.56 291.841 291.84 291.841c160.512 0 291.84-130.561 291.84-291.841 0-160.511-130.56-291.839-291.84-291.839zM1149.562 478.091c0 35.423 28.717 64.138 64.141 64.138s64.134-28.716 64.134-64.138c0-35.423-28.71-64.139-64.134-64.139s-64.141 28.716-64.141 64.139zM64.064 542.237c-35.382 0-64.064-28.682-64.064-64.063s28.682-64.064 64.064-64.064c35.381 0 64.064 28.682 64.064 64.064s-28.683 64.063-64.064 64.063zM1458.707 542.229c-35.418 0-64.134-28.716-64.134-64.138s28.717-64.139 64.134-64.139c35.424 0 64.141 28.716 64.141 64.139s-28.717 64.138-64.141 64.138zM652.659 526.847c-44.961 0-81.408-36.447-81.408-81.407s36.447-81.408 81.408-81.408c44.96 0 81.408 36.447 81.408 81.408s-36.448 81.407-81.408 81.407z"],"attrs":[{}],"width":1536,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-monitor"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":10,"id":190,"name":"arduino-monitor","prevSize":28,"code":59661},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M511.998 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z","M923.433 603.432c50.494 0 91.432-40.936 91.432-91.432s-40.937-91.432-91.432-91.432c-50.494 0-91.432 40.936-91.432 91.432s40.937 91.432 91.432 91.432z","M100.565 603.432c50.495 0 91.432-40.936 91.432-91.432s-40.936-91.432-91.432-91.432c-50.495 0-91.432 40.936-91.432 91.432s40.936 91.432 91.432 91.432z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-sketch-tabs-menu"],"colorPermutations":{"12714014111291321":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":9,"id":189,"name":"arduino-sketch-tabs-menu","prevSize":28,"code":59662},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M323.368 970.208c-20.263 0-39-11.42-48.21-29.788l-146.789-293.581h-74.474c-29.789 0-53.895-24.107-53.895-53.895s24.105-53.895 53.895-53.895h107.789c20.421 0 39.053 11.528 48.21 29.788l96.527 193.056 180.263-720.949c5.842-23.579 26.737-40.263 51-40.842 23.947-1.579 45.893 15.158 52.894 38.421l150.162 500.526h67.681c29.788 0 53.895 24.107 53.895 53.895s-24.107 53.895-53.895 53.895h-107.789c-23.789 0-44.787-15.629-51.631-38.422l-105.316-351.104-168.052 672.053c-5.474 21.897-23.948 38.055-46.368 40.529-2 0.21-3.947 0.313-5.895 0.313h-0.001z"],"attrs":[{}],"width":862,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["arduino-plotter"],"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":8,"id":188,"name":"arduino-plotter","prevSize":28,"code":59663},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M416.006 800c-4.211 0.026-8.386-0.787-12.285-2.374-3.899-1.594-7.445-3.942-10.435-6.906l-224-224.002c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l201.28 201.602 425.281-425.602c6.022-6.026 14.195-9.411 22.72-9.411 8.518 0 16.691 3.386 22.72 9.411 6.022 6.026 9.408 14.198 9.408 22.72s-3.386 16.694-9.408 22.72l-448.001 448.002c-2.99 2.963-6.536 5.312-10.435 6.906-3.899 1.587-8.074 2.4-12.285 2.374z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fa-check"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":722,"id":0,"name":"fa-check","prevSize":28,"code":59658},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M864 128h-576c-8.484 0.062-16.618 3.385-22.72 9.28l-128 128c-5.969 6.052-9.305 14.219-9.28 22.72v576c0.024 8.48 3.404 16.602 9.4 22.598s14.121 9.376 22.6 9.402h576c8.486-0.038 16.634-3.36 22.72-9.28l128-128c5.894-6.099 9.216-14.234 9.28-22.72v-576c-0.026-8.479-3.405-16.605-9.402-22.6s-14.118-9.375-22.598-9.4zM704 832h-512v-512h512v512zM722.56 256h-485.12l63.68-64h485.44l-64 64zM832 722.88l-64 63.68v-485.12l64-64v485.44z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-3dimensionscube"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":717,"id":1,"name":"arduino-technology-3dimensionscube","prevSize":28,"code":59654},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M848 224v96c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-16v96c-0.019 5.909-1.67 11.699-4.781 16.725-3.104 5.027-7.539 9.096-12.819 11.755l-238.4 119.36v242.88c16.845 7.354 30.644 20.282 39.079 36.608 8.435 16.333 10.989 35.066 7.233 53.056s-13.59 34.144-27.852 45.734c-14.262 11.597-32.081 17.92-50.46 17.92s-36.198-6.323-50.46-17.92c-14.262-11.59-24.097-27.744-27.852-45.734s-1.201-36.723 7.233-53.056c8.435-16.326 22.234-29.254 39.079-36.608v-82.88l-238.4-119.36c-5.277-2.659-9.715-6.728-12.822-11.755s-4.76-10.816-4.778-16.725v-102.72c-16.845-7.352-30.644-20.279-39.079-36.609s-10.988-35.066-7.233-53.057c3.755-17.992 13.59-34.141 27.852-45.734s32.081-17.921 50.46-17.921c18.38 0 36.198 6.328 50.46 17.921s24.097 27.743 27.852 45.734c3.756 17.992 1.201 36.727-7.233 53.057s-22.234 29.257-39.079 36.609v82.88l192 96v-524.16h-32c-6.372 0.032-12.609-1.839-17.91-5.374s-9.428-8.572-11.85-14.466c-2.41-5.858-3.028-12.3-1.775-18.509s4.321-11.907 8.815-16.371l64-64c2.975-2.999 6.514-5.38 10.413-7.005s8.083-2.461 12.307-2.461c4.225 0 8.407 0.836 12.307 2.461s7.439 4.005 10.413 7.005l64 64c4.44 4.5 7.448 10.214 8.644 16.422s0.526 12.63-1.924 18.458c-2.401 5.844-6.477 10.846-11.716 14.377s-11.406 5.432-17.724 5.463h-32v364.16l192-96v-76.16h-16c-8.486 0-16.627-3.372-22.63-9.373-5.997-6.001-9.37-14.14-9.37-22.627v-96c0-8.487 3.373-16.627 9.37-22.627 6.003-6.001 14.144-9.373 22.63-9.373h96c8.486 0 16.627 3.372 22.63 9.373 5.997 6.001 9.37 14.14 9.37 22.627z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-usb"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":715,"id":2,"name":"arduino-technology-usb","prevSize":28,"code":59655},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M512 832c35.346 0 64-28.653 64-64s-28.654-64-64-64c-35.346 0-64 28.653-64 64s28.654 64 64 64z","M647.699 664.32c-8.442-0.122-16.493-3.571-22.401-9.6-14.863-14.9-32.519-26.721-51.957-34.787s-40.277-12.218-61.323-12.218c-21.046 0-41.884 4.152-61.323 12.218s-37.094 19.887-51.957 34.787c-5.996 5.958-14.106 9.306-22.56 9.306s-16.564-3.347-22.56-9.306c-5.96-5.997-9.306-14.106-9.306-22.559s3.345-16.564 9.306-22.56c20.801-20.803 45.495-37.304 72.673-48.563s56.308-17.053 85.727-17.053c29.418 0 58.548 5.795 85.726 17.053s51.875 27.761 72.675 48.563c4.512 4.476 7.59 10.194 8.838 16.426 1.254 6.232 0.614 12.695-1.818 18.562-2.438 5.875-6.573 10.886-11.866 14.4-5.299 3.514-11.52 5.37-17.875 5.331z","M919.373 392.639c-4.269 0.195-8.538-0.47-12.55-1.954s-7.686-3.757-10.81-6.686c-101.965-101.613-240.045-158.669-383.997-158.669-143.951 0-282.035 57.056-384 158.669-6.026 5.983-14.181 9.328-22.673 9.298s-16.623-3.432-22.607-9.458c-5.983-6.026-9.327-14.181-9.298-22.673s3.432-16.623 9.458-22.607c114.009-113.924 268.588-177.918 429.76-177.918 161.175 0 315.754 63.994 429.757 177.918 3.002 2.975 5.382 6.514 7.008 10.413s2.458 8.083 2.458 12.307c0 4.225-0.832 8.407-2.458 12.307s-4.006 7.439-7.008 10.413c-3.078 2.89-6.701 5.14-10.656 6.623-3.949 1.483-8.16 2.168-12.384 2.017z","M783.706 528.316c-4.211 0.024-8.384-0.783-12.288-2.375-3.898-1.592-7.443-3.939-10.432-6.905-32.691-32.703-71.501-58.646-114.221-76.346-42.715-17.7-88.501-26.81-134.74-26.81s-92.025 9.11-134.742 26.81c-42.717 17.7-81.529 43.643-114.218 76.346-6.122 5.242-13.996 7.982-22.049 7.671s-15.693-3.65-21.393-9.349c-5.699-5.699-9.037-13.338-9.348-21.392s2.428-15.928 7.67-22.050c78.009-77.968 183.788-121.767 294.080-121.767s216.072 43.799 294.081 121.767c5.958 5.996 9.306 14.106 9.306 22.56s-3.347 16.564-9.306 22.56c-5.958 5.912-14.003 9.245-22.4 9.28z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-connection"],"grid":14,"colorPermutations":{"12714014111291321":[{},{},{},{}]}},"attrs":[{},{},{},{}],"properties":{"order":714,"id":3,"name":"arduino-technology-connection","prevSize":28,"code":59656},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M512.006 991.994c-4.198 0.109-8.362-0.768-12.16-2.56-5.844-2.4-10.846-6.477-14.377-11.712-3.53-5.242-5.431-11.405-5.463-17.728v-370.877l-169.28 169.597c-2.984 2.989-6.525 5.35-10.424 6.97-3.898 1.613-8.077 2.445-12.296 2.445s-8.397-0.832-12.296-2.445c-3.898-1.619-7.441-3.981-10.424-6.97-2.984-2.982-5.35-6.522-6.965-10.419s-2.445-8.077-2.445-12.301c0-4.218 0.831-8.397 2.445-12.294s3.981-7.437 6.965-10.426l201.6-201.277-201.6-201.28c-6.026-6.026-9.411-14.198-9.411-22.72s3.385-16.694 9.411-22.72c6.026-6.026 14.198-9.411 22.72-9.411s16.694 3.386 22.72 9.411l169.28 169.6v-370.88c0.032-6.318 1.933-12.485 5.463-17.724s8.533-9.316 14.377-11.716c5.828-2.451 12.25-3.12 18.458-1.924s11.922 4.204 16.422 8.644l224.001 224c3.002 2.975 5.382 6.514 7.002 10.413 1.626 3.9 2.464 8.082 2.464 12.307s-0.838 8.407-2.464 12.307c-1.619 3.9-4 7.439-7.002 10.413l-201.601 201.28 201.601 201.277c3.002 2.976 5.382 6.515 7.002 10.419 1.626 3.898 2.464 8.077 2.464 12.301 0 4.23-0.838 8.41-2.464 12.307-1.619 3.904-4 7.443-7.002 10.413l-224.001 224c-2.99 2.97-6.536 5.318-10.435 6.906-3.899 1.594-8.074 2.4-12.285 2.374zM544.006 589.117v293.757l146.881-146.88-146.881-146.877zM544.006 141.117v293.76l146.881-146.88-146.881-146.88z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["technology-bluetooth"],"grid":14,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":713,"id":4,"name":"arduino-technology-bluetooth","prevSize":28,"code":59657},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M613.86 663.104c-8.983 0.005-17.72-2.956-24.841-8.429-7.126-5.474-12.241-13.144-14.55-21.825s-1.685-17.883 1.778-26.173c3.463-8.29 9.57-15.202 17.366-19.661l304.621-173.965-488.052-278.887v296.386c0 10.801-4.291 21.16-11.929 28.799-7.638 7.636-17.997 11.927-28.799 11.927s-21.16-4.291-28.799-11.927c-7.638-7.638-11.929-17.997-11.929-28.799v-366.545c-0.004-7.135 1.867-14.146 5.426-20.33s8.681-11.324 14.852-14.905c6.171-3.581 13.175-5.477 20.31-5.499s14.15 1.832 20.343 5.376l610.91 349.045c6.232 3.561 11.413 8.707 15.020 14.917 3.603 6.21 5.502 13.261 5.502 20.441s-1.899 14.232-5.502 20.441c-3.607 6.21-8.788 11.356-15.020 14.917l-366.545 209.324c-6.135 3.528-13.089 5.381-20.163 5.371z","M491.636 797.094c10.803 0 21.16-4.291 28.798-11.93s11.93-17.994 11.93-28.798c0-10.803-4.291-21.16-11.93-28.798s-17.994-11.93-28.798-11.93h-43.173c-1.991-17.389-5.534-34.56-10.589-51.316l41.949-41.951c3.798-3.793 6.81-8.304 8.867-13.265 2.053-4.962 3.109-10.277 3.109-15.649s-1.057-10.687-3.109-15.649c-2.057-4.962-5.069-9.467-8.867-13.265s-8.304-6.81-13.265-8.867c-4.961-2.053-10.279-3.114-15.649-3.114s-10.688 1.061-15.649 3.114c-4.961 2.057-9.47 5.069-13.267 8.867l-21.585 21.583c-14.553-22.109-34.216-40.387-57.327-53.285-23.11-12.902-48.988-20.052-75.444-20.838-26.456 0.787-52.334 7.936-75.444 20.838s-42.774 31.181-57.327 53.29l-21.585-21.588c-7.669-7.671-18.070-11.976-28.915-11.976s-21.247 4.305-28.916 11.976c-7.669 7.666-11.978 18.069-11.978 28.914s4.308 21.248 11.977 28.914l41.949 41.951c-5.055 16.756-8.599 33.927-10.589 51.316h-43.171c-10.802 0-21.161 4.291-28.799 11.93s-11.929 17.994-11.929 28.798c0 10.803 4.291 21.16 11.929 28.798s17.997 11.93 28.799 11.93h43.173c1.991 17.389 5.534 34.56 10.589 51.316l-1.222 1.224-40.727 40.727c-7.631 7.685-11.913 18.078-11.913 28.914 0 10.831 4.282 21.225 11.913 28.914 7.72 7.568 18.102 11.813 28.915 11.813s21.194-4.245 28.915-11.813l21.585-21.588c14.553 22.109 34.216 40.387 57.327 53.29s48.989 20.052 75.445 20.838c26.456-0.787 52.334-7.936 75.444-20.838s42.774-31.181 57.327-53.29l21.585 21.588c7.72 7.573 18.102 11.813 28.915 11.813s21.194-4.24 28.916-11.813c7.629-7.689 11.911-18.083 11.911-28.914 0-10.836-4.282-21.229-11.911-28.914l-41.95-41.951c5.055-16.756 8.599-33.927 10.589-51.316h43.174zM267.636 593.458c37.058 0 69.644 32.991 87.564 81.455h-175.127c17.92-48.463 50.506-81.455 87.564-81.455zM267.636 919.276c-55.389 0-101.818-74.533-101.818-162.909h203.636c0 88.376-46.429 162.909-101.818 162.909z"],"attrs":[{},{}],"tags":["arduino-debugger"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{},{}]}},"attrs":[{},{}],"properties":{"order":696,"id":5,"name":"arduino-debugger","prevSize":28,"code":59653},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M1011.905 953.837l-286.249-286.249c66.349-81.248 98.942-184.882 91.034-289.478-7.903-104.597-55.702-202.157-133.511-272.506-77.804-70.35-179.671-108.111-284.533-105.473s-204.701 45.47-278.874 119.643c-74.172 74.172-117.006 174.012-119.643 278.874s35.123 206.729 105.473 284.537c70.35 77.804 167.91 125.604 272.506 133.506 104.597 7.907 208.231-24.685 289.479-91.034l286.249 286.249c3.8 3.832 8.323 6.874 13.305 8.95s10.328 3.145 15.727 3.145c5.398 0 10.745-1.071 15.727-3.145 4.986-2.075 9.506-5.117 13.31-8.95 3.832-3.804 6.874-8.323 8.95-13.31 2.075-4.982 3.145-10.328 3.145-15.727s-1.071-10.739-3.145-15.727c-2.075-4.982-5.117-9.506-8.95-13.305v0zM410.372 737.512c-64.702 0-127.952-19.184-181.75-55.132-53.798-35.944-95.728-87.038-120.49-146.816s-31.239-125.554-18.616-189.013c12.623-63.459 43.78-121.751 89.532-167.502s104.043-76.909 167.502-89.532c63.459-12.623 129.235-6.145 189.013 18.616s110.868 66.691 146.816 120.489c35.948 53.798 55.132 117.048 55.132 181.75 0 86.766-34.467 169.972-95.815 231.325-61.353 61.349-144.564 95.815-231.326 95.815v0z"],"attrs":[{}],"tags":["arduino-search"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":689,"id":6,"name":"arduino-search","prevSize":28,"code":59649},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M997.684 728.889c0 11.506-4.572 22.538-12.707 30.67s-19.165 12.707-30.67 12.707h-433.777c-11.506 0-22.538-4.572-30.673-12.707s-12.705-19.165-12.705-30.67 4.571-22.538 12.705-30.67c8.136-8.134 19.166-12.707 30.673-12.707h433.777c11.506 0 22.538 4.572 30.67 12.707s12.707 19.165 12.707 30.67z","M1201.991 351.068l-74.173-73.742v-199.104c0-11.503-4.572-22.539-12.707-30.673s-19.165-12.705-30.67-12.705h-910.933c-11.503 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v130.133h-86.756c-11.504 0-22.539 4.571-30.673 12.705s-12.705 19.168-12.705 30.673v216.89c0 11.503 4.571 22.539 12.705 30.673s19.168 12.705 30.673 12.705h86.756v433.777c0 11.506 4.571 22.538 12.705 30.67s19.168 12.707 30.673 12.707h910.933c5.71 0.034 11.368-1.062 16.653-3.216 5.285-2.161 10.092-5.342 14.143-9.365l86.756-86.756c4.020-4.052 7.203-8.859 9.365-14.143 2.157-5.285 3.253-10.94 3.216-16.653v-477.156c0.034-5.708-1.062-11.369-3.216-16.654-2.161-5.285-5.342-10.092-9.365-14.145zM86.751 425.243v-130.133h216.89v130.133h-216.89zM1127.818 841.24l-61.159 61.159h-849.774v-390.4h130.133c11.503 0 22.539-4.571 30.673-12.705s12.705-19.168 12.705-30.673v-216.89c0-11.503-4.571-22.539-12.705-30.673s-19.168-12.705-30.673-12.705h-130.133v-86.756h824.177v173.51c-0.034 5.708 1.062 11.369 3.216 16.654 2.161 5.285 5.342 10.092 9.365 14.145l74.173 73.742v441.589z"],"width":1214.5714285714287,"attrs":[{},{}],"tags":["arduino-boards"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{},{}]}},"attrs":[{},{}],"properties":{"order":7,"id":7,"name":"arduino-boards","prevSize":28,"code":59650},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M1021.954 918.445l-171.299-652.491c-2.901-9.738-9.491-17.956-18.363-22.903-8.876-4.946-19.333-6.228-29.138-3.571l-141.319 35.427v-230.085c0-10.325-4.102-20.227-11.403-27.529s-17.201-11.403-27.528-11.403h-155.725c-10.327 0-20.226 4.101-27.529 11.403-7.301 7.302-11.403 17.203-11.403 27.529v116.794h-155.725v-77.863c0-10.325-4.101-20.227-11.403-27.529s-17.203-11.403-27.529-11.403h-194.658c-10.325 0-20.227 4.101-27.529 11.403s-11.403 17.203-11.403 27.529v895.424c0 10.327 4.101 20.226 11.403 27.528s17.203 11.403 27.529 11.403h583.972c10.327 0 20.226-4.102 27.528-11.403s11.403-17.201 11.403-27.528v-454.332l119.909 456.668c2.207 8.565 7.265 16.124 14.34 21.433 7.079 5.308 15.751 8.044 24.591 7.764 3.364 0.379 6.758 0.379 10.123 0l164.678-43.212c9.975-2.589 18.518-9.032 23.75-17.908 2.581-4.721 4.156-9.926 4.627-15.288 0.467-5.361-0.178-10.759-1.9-15.857v0zM194.659 940.247h-116.794v-817.56h116.794v817.56zM428.248 940.247h-155.725v-700.766h155.725v700.766zM583.973 940.247h-77.863v-856.491h77.863v856.491zM847.15 923.896l-151.442-576.964 89.543-23.748 151.442 578.132-89.543 22.58z"],"attrs":[{}],"tags":["arduino-library"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":691,"id":8,"name":"arduino-library","prevSize":28,"code":59651},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M1189.198 204.801h-542.21l-189.437-189.951c-4.784-4.746-10.457-8.499-16.696-11.048s-12.918-3.84-19.656-3.801h-358.398c-13.579 0-26.602 5.394-36.204 14.997s-14.997 22.624-14.997 36.204v921.597c0 13.581 5.394 26.601 14.997 36.203s22.624 14.998 36.204 14.998h1126.397c13.581 0 26.601-5.395 36.203-14.998s14.998-22.621 14.998-36.203v-716.798c0-13.579-5.395-26.602-14.998-36.204s-22.621-14.997-36.203-14.997zM114.001 102.4h286.208l102.4 102.4h-388.606v-102.4zM1137.998 921.598h-1023.998v-614.398h1023.998v614.398z"],"width":1252,"attrs":[{}],"tags":["arduino-folder"],"grid":14,"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"12714014111291321":[{}]}},"attrs":[{}],"properties":{"order":692,"id":9,"name":"arduino-folder","prevSize":28,"code":59652},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M512.083 959.936c118.817 0 232.769-47.2 316.781-131.213 84.019-84.019 131.219-197.969 131.219-316.785 0-8.487-3.373-16.627-9.376-22.628-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.372-22.63 9.373c-5.997 6.001-9.37 14.141-9.37 22.627-0.019 87.81-30.131 172.959-85.318 241.26s-132.115 115.622-217.962 134.086c-85.848 18.458-175.428 6.931-253.811-32.646-78.383-39.584-140.833-104.832-176.941-184.87-36.108-80.045-43.693-170.045-21.49-255.001s72.852-159.737 143.505-211.878c70.653-52.141 157.042-78.492 244.768-74.662s171.487 37.612 237.33 95.712h-158.081c-8.487 0-16.626 3.372-22.627 9.373s-9.373 14.141-9.373 22.627c0 8.487 3.372 16.627 9.373 22.628s14.14 9.372 22.627 9.372h224.001c8.486 0 16.627-3.371 22.624-9.372 6.003-6.001 9.376-14.141 9.376-22.628v-224c0-8.487-3.373-16.626-9.376-22.627-5.997-6.001-14.138-9.373-22.624-9.373s-16.627 3.371-22.63 9.373c-5.997 6.001-9.37 14.14-9.37 22.627v136.96c-55.162-46.332-120.678-78.68-191.002-94.301s-143.375-14.052-212.963 4.571c-69.588 18.623-133.659 53.753-186.78 102.41s-93.725 109.405-118.369 177.096c-24.644 67.69-32.602 140.324-23.199 211.745 9.404 71.419 35.891 139.521 77.216 198.523 41.325 59.008 96.27 107.174 160.174 140.422s134.885 50.598 206.922 50.573v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}],"12714014111291321":[{}]},"tags":["reload"],"grid":14},"attrs":[{}],"properties":{"order":681,"id":10,"name":"reload","prevSize":28,"code":59648},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M846.857 600c34.857 20 46.857 65.143 26.857 100l-36.571 62.857c-20 34.857-65.143 46.857-100 26.857l-152-87.429v175.429c0 40-33.143 73.143-73.143 73.143h-73.143c-40 0-73.143-33.143-73.143-73.143v-175.429l-152 87.429c-34.857 20-80 8-100-26.857l-36.571-62.857c-20-34.857-8-80 26.857-100l152-88-152-88c-34.857-20-46.857-65.143-26.857-100l36.571-62.857c20-34.857 65.143-46.857 100-26.857l152 87.429v-175.429c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v175.429l152-87.429c34.857-20 80-8 100 26.857l36.571 62.857c20 34.857 8 80-26.857 100l-152 88z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["asterisk"],"defaultCode":61545,"grid":14},"attrs":[],"properties":{"name":"asterisk","id":11,"order":679,"prevSize":28,"code":61545},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v237.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h237.714v-237.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857v237.714h237.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["plus"],"defaultCode":61543,"grid":14},"attrs":[],"properties":{"name":"plus","id":12,"order":3,"prevSize":28,"code":61543},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M402.286 717.714v137.143c0 12.571-10.286 22.857-22.857 22.857h-137.143c-12.571 0-22.857-10.286-22.857-22.857v-137.143c0-12.571 10.286-22.857 22.857-22.857h137.143c12.571 0 22.857 10.286 22.857 22.857zM582.857 374.857c0 108.571-73.714 150.286-128 180.571-33.714 19.429-54.857 58.857-54.857 75.429v0c0 12.571-9.714 27.429-22.857 27.429h-137.143c-12.571 0-20.571-19.429-20.571-32v-25.714c0-69.143 68.571-128.571 118.857-151.429 44-20 62.286-38.857 62.286-75.429 0-32-41.714-60.571-88-60.571-25.714 0-49.143 8-61.714 16.571-13.714 9.714-27.429 23.429-61.143 65.714-4.571 5.714-11.429 9.143-17.714 9.143-5.143 0-9.714-1.714-14.286-4.571l-93.714-71.429c-9.714-7.429-12-20-5.714-30.286 61.714-102.286 148.571-152 265.143-152 122.286 0 259.429 97.714 259.429 228.571z"],"width":634.88,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["question"],"defaultCode":61736,"grid":14},"attrs":[],"properties":{"name":"question","id":13,"order":4,"prevSize":28,"code":61736},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-694.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h694.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["minus"],"defaultCode":61544,"grid":14},"attrs":[],"properties":{"name":"minus","id":14,"order":5,"prevSize":28,"code":61544},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M877.714 128v640c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-306.857l-438.857 135.429v405.143c0 80.571-120.571 109.714-182.857 109.714s-182.857-29.143-182.857-109.714 120.571-109.714 182.857-109.714c37.714 0 75.429 6.857 109.714 22.286v-552.571c0-24 16-45.143 38.857-52.571l475.429-146.286c5.143-1.714 10.286-2.286 16-2.286 30.286 0 54.857 24.571 54.857 54.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["music"],"defaultCode":61441,"grid":14},"attrs":[],"properties":{"name":"music","id":15,"order":7,"prevSize":28,"code":61441},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40-33.143 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["search"],"defaultCode":61442,"grid":14},"attrs":[],"properties":{"name":"search","id":16,"order":8,"prevSize":28,"code":61442},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M950.857 859.429v-438.857c-12 13.714-25.143 26.286-39.429 37.714-81.714 62.857-164 126.857-243.429 193.143-42.857 36-96 80-155.429 80h-1.143c-59.429 0-112.571-44-155.429-80-79.429-66.286-161.714-130.286-243.429-193.143-14.286-11.429-27.429-24-39.429-37.714v438.857c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM950.857 258.857c0-14.286 3.429-39.429-18.286-39.429h-841.143c-9.714 0-18.286 8.571-18.286 18.286 0 65.143 32.571 121.714 84 162.286 76.571 60 153.143 120.571 229.143 181.143 30.286 24.571 85.143 77.143 125.143 77.143h1.143c40 0 94.857-52.571 125.143-77.143 76-60.571 152.571-121.143 229.143-181.143 37.143-29.143 84-92.571 84-141.143zM1024 237.714v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["envelope-o"],"defaultCode":61443,"grid":14},"attrs":[],"properties":{"name":"envelope-o","id":17,"order":9,"prevSize":28,"code":61443},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M512 950.857c-9.143 0-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429 0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["heart"],"defaultCode":61444,"grid":14},"attrs":[],"properties":{"name":"heart","id":18,"order":10,"prevSize":28,"code":61444},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 14.857-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star"],"defaultCode":61445,"grid":14},"attrs":[],"properties":{"name":"star","id":19,"order":11,"prevSize":28,"code":61445},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M649.714 573.714l174.857-169.714-241.143-35.429-108-218.286-108 218.286-241.143 35.429 174.857 169.714-41.714 240.571 216-113.714 215.429 113.714zM950.857 369.714c0 10.286-7.429 20-14.857 27.429l-207.429 202.286 49.143 285.714c0.571 4 0.571 7.429 0.571 11.429 0 15.429-6.857 28.571-23.429 28.571-8 0-16-2.857-22.857-6.857l-256.571-134.857-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429s22.857 12.571 28 23.429l128.571 260 286.857 41.714c13.714 2.286 32 9.143 32 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star-o"],"defaultCode":61446,"grid":14},"attrs":[],"properties":{"name":"star-o","id":20,"order":12,"prevSize":28,"code":61446},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M731.429 799.429c0 83.429-54.857 151.429-121.714 151.429h-488c-66.857 0-121.714-68-121.714-151.429 0-150.286 37.143-324 186.857-324 46.286 45.143 109.143 73.143 178.857 73.143s132.571-28 178.857-73.143c149.714 0 186.857 173.714 186.857 324zM585.143 292.571c0 121.143-98.286 219.429-219.429 219.429s-219.429-98.286-219.429-219.429 98.286-219.429 219.429-219.429 219.429 98.286 219.429 219.429z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["user"],"defaultCode":61447,"grid":14},"attrs":[],"properties":{"name":"user","id":21,"order":13,"prevSize":28,"code":61447},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M219.429 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM219.429 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 914.286v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM219.429 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 914.286v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM804.571 475.429v-292.571c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v292.571c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM1024 694.857v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 475.429v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1024 256v-73.143c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571zM1097.143 164.571v768c0 50.286-41.143 91.429-91.429 91.429h-914.286c-50.286 0-91.429-41.143-91.429-91.429v-768c0-50.286 41.143-91.429 91.429-91.429h914.286c50.286 0 91.429 41.143 91.429 91.429z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["film"],"defaultCode":61448,"grid":14},"attrs":[],"properties":{"name":"film","id":22,"order":14,"prevSize":28,"code":61448},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M438.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM438.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 585.143v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143zM950.857 146.286v219.429c0 40-33.143 73.143-73.143 73.143h-292.571c-40 0-73.143-33.143-73.143-73.143v-219.429c0-40 33.143-73.143 73.143-73.143h292.571c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["th-large"],"defaultCode":61449,"grid":14},"attrs":[],"properties":{"name":"th-large","id":23,"order":15,"prevSize":28,"code":61449},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["th"],"defaultCode":61450,"grid":14},"attrs":[],"properties":{"name":"th","id":24,"order":16,"prevSize":28,"code":61450},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h548.571c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["th-list"],"defaultCode":61451,"grid":14},"attrs":[],"properties":{"name":"th-list","id":25,"order":17,"prevSize":28,"code":61451},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M725.322 782.343c3.477 3.448 6.237 7.547 8.118 12.069 1.885 4.515 2.853 9.364 2.853 14.259s-0.967 9.744-2.853 14.266c-1.881 4.515-4.641 8.623-8.118 12.069-3.448 3.472-7.547 6.232-12.069 8.118-4.515 1.881-9.364 2.848-14.259 2.848s-9.744-0.967-14.266-2.848c-4.522-1.885-8.623-4.646-12.069-8.118l-270.371-270.375-270.372 270.375c-3.448 3.472-7.549 6.232-12.069 8.118-4.519 1.881-9.366 2.848-14.263 2.848s-9.744-0.967-14.263-2.848c-4.519-1.885-8.622-4.646-12.069-8.118-3.474-3.448-6.235-7.555-8.118-12.069-1.884-4.522-2.853-9.37-2.853-14.266s0.97-9.744 2.853-14.259c1.884-4.522 4.643-8.623 8.118-12.069l270.372-270.375-270.372-270.372c-3.456-3.456-6.201-7.565-8.072-12.082s-2.835-9.36-2.835-14.25c0-4.891 0.964-9.732 2.835-14.25s4.617-8.626 8.072-12.081c3.456-3.456 7.564-6.201 12.081-8.072s9.361-2.835 14.25-2.835c4.891 0 9.732 0.964 14.25 2.835s8.626 4.617 12.081 8.072l270.372 270.372 270.371-270.372c6.984-6.983 16.455-10.909 26.335-10.909 9.875 0 19.347 3.923 26.33 10.909s10.909 16.456 10.909 26.333c0 9.877-3.923 19.348-10.909 26.333l-270.371 270.372 270.371 270.375z"],"width":804.5714285714286,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[{}],"12714014111291321":[{}]},"tags":["close","remove","times"],"defaultCode":61453,"grid":14},"attrs":[{}],"properties":{"name":"close, remove, times","id":26,"order":19,"prevSize":28,"code":61453},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-128v128c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-128h-128c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h128v-128c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286v128h128c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["search-plus"],"defaultCode":61454,"grid":14},"attrs":[],"properties":{"name":"search-plus","id":27,"order":20,"prevSize":28,"code":61454},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M585.143 457.143v36.571c0 9.714-8.571 18.286-18.286 18.286h-329.143c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h329.143c9.714 0 18.286 8.571 18.286 18.286zM658.286 475.429c0-141.143-114.857-256-256-256s-256 114.857-256 256 114.857 256 256 256 256-114.857 256-256zM950.857 950.857c0 40.571-32.571 73.143-73.143 73.143-19.429 0-38.286-8-51.429-21.714l-196-195.429c-66.857 46.286-146.857 70.857-228 70.857-222.286 0-402.286-180-402.286-402.286s180-402.286 402.286-402.286 402.286 180 402.286 402.286c0 81.143-24.571 161.143-70.857 228l196 196c13.143 13.143 21.143 32 21.143 51.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["search-minus"],"defaultCode":61456,"grid":14},"attrs":[],"properties":{"name":"search-minus","id":28,"order":21,"prevSize":28,"code":61456},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857s-438.857-197.143-438.857-438.857c0-138.857 64-266.857 175.429-350.286 32.571-24.571 78.286-18.286 102.286 14.286 24.571 32 17.714 78.286-14.286 102.286-74.286 56-117.143 141.143-117.143 233.714 0 161.143 131.429 292.571 292.571 292.571s292.571-131.429 292.571-292.571c0-92.571-42.857-177.714-117.143-233.714-32-24-38.857-70.286-14.286-102.286 24-32.571 70.286-38.857 102.286-14.286 111.429 83.429 175.429 211.429 175.429 350.286zM512 73.143v365.714c0 40-33.143 73.143-73.143 73.143s-73.143-33.143-73.143-73.143v-365.714c0-40 33.143-73.143 73.143-73.143s73.143 33.143 73.143 73.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["power-off"],"defaultCode":61457,"grid":14},"attrs":[],"properties":{"name":"power-off","id":29,"order":22,"prevSize":28,"code":61457},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M146.286 822.857v109.714c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM365.714 749.714v182.857c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM585.143 603.429v329.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM804.571 384v548.571c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-548.571c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286zM1024 91.429v841.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-841.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["signal"],"defaultCode":61458,"grid":14},"attrs":[],"properties":{"name":"signal","id":30,"order":23,"prevSize":28,"code":61458},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M585.143 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM877.714 449.714v126.857c0 8.571-6.857 18.857-16 20.571l-105.714 16c-6.286 18.286-13.143 35.429-22.286 52 19.429 28 40 53.143 61.143 78.857 3.429 4 5.714 9.143 5.714 14.286s-1.714 9.143-5.143 13.143c-13.714 18.286-90.857 102.286-110.286 102.286-5.143 0-10.286-2.286-14.857-5.143l-78.857-61.714c-16.571 8.571-34.286 16-52 21.714-4 34.857-7.429 72-16.571 106.286-2.286 9.143-10.286 16-20.571 16h-126.857c-10.286 0-19.429-7.429-20.571-17.143l-16-105.143c-17.714-5.714-34.857-12.571-51.429-21.143l-80.571 61.143c-4 3.429-9.143 5.143-14.286 5.143s-10.286-2.286-14.286-6.286c-30.286-27.429-70.286-62.857-94.286-96-2.857-4-4-8.571-4-13.143 0-5.143 1.714-9.143 4.571-13.143 19.429-26.286 40.571-51.429 60-78.286-9.714-18.286-17.714-37.143-23.429-56.571l-104.571-15.429c-9.714-1.714-16.571-10.857-16.571-20.571v-126.857c0-8.571 6.857-18.857 15.429-20.571l106.286-16c5.714-18.286 13.143-35.429 22.286-52.571-19.429-27.429-40-53.143-61.143-78.857-3.429-4-5.714-8.571-5.714-13.714s2.286-9.143 5.143-13.143c13.714-18.857 90.857-102.286 110.286-102.286 5.143 0 10.286 2.286 14.857 5.714l78.857 61.143c16.571-8.571 34.286-16 52-21.714 4-34.857 7.429-72 16.571-106.286 2.286-9.143 10.286-16 20.571-16h126.857c10.286 0 19.429 7.429 20.571 17.143l16 105.143c17.714 5.714 34.857 12.571 51.429 21.143l81.143-61.143c3.429-3.429 8.571-5.143 13.714-5.143s10.286 2.286 14.286 5.714c30.286 28 70.286 63.429 94.286 97.143 2.857 3.429 4 8 4 12.571 0 5.143-1.714 9.143-4.571 13.143-19.429 26.286-40.571 51.429-60 78.286 9.714 18.286 17.714 37.143 23.429 56l104.571 16c9.714 1.714 16.571 10.857 16.571 20.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["cog","gear"],"defaultCode":61459,"grid":14},"attrs":[],"properties":{"name":"cog, gear","id":31,"order":24,"prevSize":28,"code":61459},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M292.571 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM438.857 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM585.143 420.571v329.143c0 10.286-8 18.286-18.286 18.286h-36.571c-10.286 0-18.286-8-18.286-18.286v-329.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM658.286 834.286v-541.714h-512v541.714c0 27.429 15.429 43.429 18.286 43.429h475.429c2.857 0 18.286-16 18.286-43.429zM274.286 219.429h256l-27.429-66.857c-1.714-2.286-6.857-5.714-9.714-6.286h-181.143c-3.429 0.571-8 4-9.714 6.286zM804.571 237.714v36.571c0 10.286-8 18.286-18.286 18.286h-54.857v541.714c0 62.857-41.143 116.571-91.429 116.571h-475.429c-50.286 0-91.429-51.429-91.429-114.286v-544h-54.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h176.571l40-95.429c11.429-28 45.714-50.857 76-50.857h182.857c30.286 0 64.571 22.857 76 50.857l40 95.429h176.571c10.286 0 18.286 8 18.286 18.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["trash-o"],"defaultCode":61460,"grid":14},"attrs":[],"properties":{"name":"trash-o","id":32,"order":25,"prevSize":28,"code":61460},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M804.571 566.857v274.286c0 20-16.571 36.571-36.571 36.571h-219.429v-219.429h-146.286v219.429h-219.429c-20 0-36.571-16.571-36.571-36.571v-274.286c0-1.143 0.571-2.286 0.571-3.429l328.571-270.857 328.571 270.857c0.571 1.143 0.571 2.286 0.571 3.429zM932 527.429l-35.429 42.286c-2.857 3.429-7.429 5.714-12 6.286h-1.714c-4.571 0-8.571-1.143-12-4l-395.429-329.714-395.429 329.714c-4 2.857-8.571 4.571-13.714 4-4.571-0.571-9.143-2.857-12-6.286l-35.429-42.286c-6.286-7.429-5.143-19.429 2.286-25.714l410.857-342.286c24-20 62.857-20 86.857 0l139.429 116.571v-111.429c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v233.143l125.143 104c7.429 6.286 8.571 18.286 2.286 25.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["home"],"defaultCode":61461,"grid":14},"attrs":[],"properties":{"name":"home","id":33,"order":26,"prevSize":28,"code":61461},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["file-o"],"defaultCode":61462,"grid":14},"attrs":[],"properties":{"name":"file-o","id":34,"order":27,"prevSize":28,"code":61462},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M512 310.857v256c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h128v-201.143c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["clock-o"],"defaultCode":61463,"grid":14},"attrs":[],"properties":{"name":"clock-o","id":35,"order":28,"prevSize":28,"code":61463},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M731.429 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 768c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 640v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h265.714l77.143 77.714c21.143 20.571 48.571 32 77.714 32s56.571-11.429 77.714-32l77.714-77.714h265.143c30.286 0 54.857 24.571 54.857 54.857zM765.143 314.857c5.714 13.714 2.857 29.714-8 40l-256 256c-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-256-256c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h146.286v-256c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571v256h146.286c14.857 0 28 9.143 33.714 22.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["download"],"defaultCode":61465,"grid":14},"attrs":[],"properties":{"name":"download","id":36,"order":30,"prevSize":28,"code":61465},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M640 530.286c0 5.143-2.286 9.714-5.714 13.714l-182.286 182.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143l-182.857-182.857c-5.143-5.714-6.857-13.143-4-20s9.714-11.429 17.143-11.429h109.714v-201.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v201.143h109.714c10.286 0 18.286 8 18.286 18.286zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-o-down"],"defaultCode":61466,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-down","id":37,"order":31,"prevSize":28,"code":61466},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M638.857 500.571c-2.857 6.857-9.714 11.429-17.143 11.429h-109.714v201.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-201.143h-109.714c-10.286 0-18.286-8-18.286-18.286 0-5.143 2.286-9.714 5.714-13.714l182.286-182.286c4-3.429 8.571-5.143 13.143-5.143s9.143 1.714 13.143 5.143l182.857 182.857c5.143 5.714 6.857 13.143 4 20zM438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-o-up"],"defaultCode":61467,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-o-up","id":38,"order":32,"prevSize":28,"code":61467},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M584.571 548.571h180.571c-1.143-2.857-1.714-6.286-2.857-9.143l-121.143-283.429h-404.571l-121.143 283.429c-1.143 2.857-1.714 6.286-2.857 9.143h180.571l54.286 109.714h182.857zM877.714 565.714v275.429c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-275.429c0-20.571 6.286-50.857 14.286-70.286l136-315.429c8-18.857 30.857-33.714 50.857-33.714h475.429c20 0 42.857 14.857 50.857 33.714l136 315.429c8 19.429 14.286 49.714 14.286 70.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["inbox"],"defaultCode":61468,"grid":14},"attrs":[],"properties":{"name":"inbox","id":39,"order":33,"prevSize":28,"code":61468},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M676.571 512c0 13.143-6.857 25.143-18.286 31.429l-310.857 182.857c-5.714 3.429-12 5.143-18.286 5.143s-12.571-1.714-18.286-4.571c-11.429-6.857-18.286-18.857-18.286-32v-365.714c0-13.143 6.857-25.143 18.286-32 11.429-6.286 25.714-6.286 36.571 0.571l310.857 182.857c11.429 6.286 18.286 18.286 18.286 31.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["play-circle-o"],"defaultCode":61469,"grid":14},"attrs":[],"properties":{"name":"play-circle-o","id":40,"order":34,"prevSize":28,"code":61469},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l78.857-78.857c-53.714-49.714-124.571-78.286-199.429-78.286-161.143 0-292.571 131.429-292.571 292.571s131.429 292.571 292.571 292.571c90.857 0 174.857-41.143 230.857-113.714 2.857-4 8-6.286 13.143-6.857 5.143 0 10.286 1.714 14.286 5.143l78.286 78.857c6.857 6.286 6.857 17.143 1.143 24.571-83.429 100.571-206.857 158.286-337.714 158.286-241.714 0-438.857-197.143-438.857-438.857s197.143-438.857 438.857-438.857c112.571 0 221.714 45.143 302.286 121.143l74.286-73.714c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["repeat","rotate-right"],"defaultCode":61470,"grid":14},"attrs":[],"properties":{"name":"repeat, rotate-right","id":41,"order":35,"prevSize":28,"code":61470},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M863.429 603.429c0 1.143 0 2.857-0.571 4-48.571 202.286-215.429 343.429-426.286 343.429-111.429 0-219.429-44-300.571-121.143l-73.714 73.714c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-78.286 78.286c53.714 50.286 125.143 78.857 198.857 78.857 101.714 0 196-52.571 249.143-139.429 13.714-22.286 20.571-44 30.286-66.857 2.857-8 8.571-13.143 17.143-13.143h109.714c10.286 0 18.286 8.571 18.286 18.286zM877.714 146.286v256c0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l78.857-78.857c-54.286-50.286-125.714-78.286-199.429-78.286-101.714 0-196 52.571-249.143 139.429-13.714 22.286-20.571 44-30.286 66.857-2.857 8-8.571 13.143-17.143 13.143h-113.714c-10.286 0-18.286-8.571-18.286-18.286v-4c49.143-202.857 217.714-343.429 428.571-343.429 112 0 221.143 44.571 302.286 121.143l74.286-73.714c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["refresh"],"defaultCode":61473,"grid":14},"attrs":[],"properties":{"name":"refresh","id":42,"order":36,"prevSize":28,"code":61473},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M219.429 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM219.429 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-36.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h36.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 676.571v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 530.286v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM877.714 384v36.571c0 9.714-8.571 18.286-18.286 18.286h-548.571c-9.714 0-18.286-8.571-18.286-18.286v-36.571c0-9.714 8.571-18.286 18.286-18.286h548.571c9.714 0 18.286 8.571 18.286 18.286zM950.857 786.286v-475.429c0-9.714-8.571-18.286-18.286-18.286h-841.143c-9.714 0-18.286 8.571-18.286 18.286v475.429c0 9.714 8.571 18.286 18.286 18.286h841.143c9.714 0 18.286-8.571 18.286-18.286zM1024 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h841.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list-alt"],"defaultCode":61474,"grid":14},"attrs":[],"properties":{"name":"list-alt","id":43,"order":37,"prevSize":28,"code":61474},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M182.857 438.857h292.571v-109.714c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286v109.714zM658.286 493.714v329.143c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-329.143c0-30.286 24.571-54.857 54.857-54.857h18.286v-109.714c0-140.571 115.429-256 256-256s256 115.429 256 256v109.714h18.286c30.286 0 54.857 24.571 54.857 54.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["lock"],"defaultCode":61475,"grid":14},"attrs":[],"properties":{"name":"lock","id":44,"order":38,"prevSize":28,"code":61475},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["volume-off"],"defaultCode":61478,"grid":14},"attrs":[],"properties":{"name":"volume-off","id":45,"order":41,"prevSize":28,"code":61478},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["volume-down"],"defaultCode":61479,"grid":14},"attrs":[],"properties":{"name":"volume-down","id":46,"order":42,"prevSize":28,"code":61479},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M438.857 201.143v621.714c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-190.286-190.286h-149.714c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h149.714l190.286-190.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571zM658.286 512c0 57.143-34.857 112.571-88.571 134.286-4.571 2.286-9.714 2.857-14.286 2.857-20 0-36.571-16-36.571-36.571 0-43.429 66.286-31.429 66.286-100.571s-66.286-57.143-66.286-100.571c0-20.571 16.571-36.571 36.571-36.571 4.571 0 9.714 0.571 14.286 2.857 53.714 21.143 88.571 77.143 88.571 134.286zM804.571 512c0 116-69.714 224-177.143 269.143-4.571 1.714-9.714 2.857-14.286 2.857-20.571 0-37.143-16.571-37.143-36.571 0-16 9.143-26.857 22.286-33.714 15.429-8 29.714-14.857 43.429-25.143 56.571-41.143 89.714-106.857 89.714-176.571s-33.143-135.429-89.714-176.571c-13.714-10.286-28-17.143-43.429-25.143-13.143-6.857-22.286-17.714-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 107.429 45.143 177.143 153.143 177.143 269.143zM950.857 512c0 175.429-104.571 334.286-265.714 403.429-4.571 1.714-9.714 2.857-14.857 2.857-20 0-36.571-16.571-36.571-36.571 0-16.571 8.571-25.714 22.286-33.714 8-4.571 17.143-7.429 25.714-12 16-8.571 32-18.286 46.857-29.143 93.714-69.143 149.143-178.286 149.143-294.857s-55.429-225.714-149.143-294.857c-14.857-10.857-30.857-20.571-46.857-29.143-8.571-4.571-17.714-7.429-25.714-12-13.714-8-22.286-17.143-22.286-33.714 0-20 16.571-36.571 36.571-36.571 5.143 0 10.286 1.143 14.857 2.857 161.143 69.143 265.714 228 265.714 403.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["volume-up"],"defaultCode":61480,"grid":14},"attrs":[],"properties":{"name":"volume-up","id":47,"order":43,"prevSize":28,"code":61480},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M219.429 658.286v73.143h-73.143v-73.143h73.143zM219.429 219.429v73.143h-73.143v-73.143h73.143zM658.286 219.429v73.143h-73.143v-73.143h73.143zM73.143 804h219.429v-218.857h-219.429v218.857zM73.143 365.714h219.429v-219.429h-219.429v219.429zM512 365.714h219.429v-219.429h-219.429v219.429zM365.714 512v365.714h-365.714v-365.714h365.714zM658.286 804.571v73.143h-73.143v-73.143h73.143zM804.571 804.571v73.143h-73.143v-73.143h73.143zM804.571 512v219.429h-219.429v-73.143h-73.143v219.429h-73.143v-365.714h219.429v73.143h73.143v-73.143h73.143zM365.714 73.143v365.714h-365.714v-365.714h365.714zM804.571 73.143v365.714h-365.714v-365.714h365.714z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["qrcode"],"defaultCode":61481,"grid":14},"attrs":[],"properties":{"name":"qrcode","id":48,"order":44,"prevSize":28,"code":61481},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["tag"],"defaultCode":61483,"grid":14},"attrs":[],"properties":{"name":"tag","id":49,"order":46,"prevSize":28,"code":61483},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M256 256c0-40.571-32.571-73.143-73.143-73.143s-73.143 32.571-73.143 73.143 32.571 73.143 73.143 73.143 73.143-32.571 73.143-73.143zM865.714 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-408.571-409.143c-29.143-28.571-52-84-52-124.571v-237.714c0-40 33.143-73.143 73.143-73.143h237.714c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52zM1085.143 585.143c0 19.429-8 38.286-21.143 51.429l-280.571 281.143c-13.714 13.143-32.571 21.143-52 21.143-29.714 0-44.571-13.714-64-33.714l268.571-268.571c13.143-13.143 21.143-32 21.143-51.429s-8-38.286-21.143-52l-408.571-408c-29.143-29.143-84.571-52-125.143-52h128c40.571 0 96 22.857 125.143 52l408.571 408c13.143 13.714 21.143 32.571 21.143 52z"],"width":1085.1474285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["tags"],"defaultCode":61484,"grid":14},"attrs":[],"properties":{"name":"tags","id":50,"order":47,"prevSize":28,"code":61484},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M936.571 273.143c14.286 20.571 18.286 47.429 10.286 73.714l-157.143 517.714c-14.286 48.571-64.571 86.286-113.714 86.286h-527.429c-58.286 0-120.571-46.286-141.714-105.714-9.143-25.714-9.143-50.857-1.143-72.571 1.143-11.429 3.429-22.857 4-36.571 0.571-9.143-4.571-16.571-3.429-23.429 2.286-13.714 14.286-23.429 23.429-38.857 17.143-28.571 36.571-74.857 42.857-104.571 2.857-10.857-2.857-23.429 0-33.143 2.857-10.857 13.714-18.857 19.429-29.143 15.429-26.286 35.429-77.143 38.286-104 1.143-12-4.571-25.143-1.143-34.286 4-13.143 16.571-18.857 25.143-30.286 13.714-18.857 36.571-73.143 40-103.429 1.143-9.714-4.571-19.429-2.857-29.714 2.286-10.857 16-22.286 25.143-35.429 24-35.429 28.571-113.714 101.143-93.143l-0.571 1.714c9.714-2.286 19.429-5.143 29.143-5.143h434.857c26.857 0 50.857 12 65.143 32 14.857 20.571 18.286 47.429 10.286 74.286l-156.571 517.714c-26.857 88-41.714 107.429-114.286 107.429h-496.571c-7.429 0-16.571 1.714-21.714 8.571-4.571 6.857-5.143 12-0.571 24.571 11.429 33.143 50.857 40 82.286 40h527.429c21.143 0 45.714-12 52-32.571l171.429-564c3.429-10.857 3.429-22.286 2.857-32.571 13.143 5.143 25.143 13.143 33.714 24.571zM328.571 274.286c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286zM281.143 420.571c-3.429 10.286 2.286 18.286 12.571 18.286h347.429c9.714 0 20.571-8 24-18.286l12-36.571c3.429-10.286-2.286-18.286-12.571-18.286h-347.429c-9.714 0-20.571 8-24 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["book"],"defaultCode":61485,"grid":14},"attrs":[],"properties":{"name":"book","id":51,"order":48,"prevSize":28,"code":61485},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M219.429 877.714h512v-146.286h-512v146.286zM219.429 512h512v-219.429h-91.429c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-365.714v365.714zM877.714 548.571c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 548.571v237.714c0 9.714-8.571 18.286-18.286 18.286h-128v91.429c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-91.429h-128c-9.714 0-18.286-8.571-18.286-18.286v-237.714c0-60 49.714-109.714 109.714-109.714h36.571v-310.857c0-30.286 24.571-54.857 54.857-54.857h384c30.286 0 72 17.143 93.714 38.857l86.857 86.857c21.714 21.714 38.857 63.429 38.857 93.714v146.286h36.571c60 0 109.714 49.714 109.714 109.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["print"],"defaultCode":61487,"grid":14},"attrs":[],"properties":{"name":"print","id":52,"order":50,"prevSize":28,"code":61487},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M996.571 804.571c25.143 0 33.143 16 17.714 36l-72 92.571c-15.429 20-40.571 20-56 0l-72-92.571c-15.429-20-7.429-36 17.714-36h45.714v-585.143h-45.714c-25.143 0-33.143-16-17.714-36l72-92.571c15.429-20 40.571-20 56 0l72 92.571c15.429 20 7.429 36-17.714 36h-45.714v585.143h45.714zM46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 41.143 0 81.714 0.571 122.857 0.571h167.429c22.857 0 36 5.143 51.429-16.571l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-17.714-88.571-18.857-89.714-12-14.857-25.143-12-42.857-12-52 0-106.286-2.286-157.714 4-2.857 25.143-5.143 52-4.571 77.714 0.571 160.571 2.286 321.143 2.286 481.714 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 12.571-28 10.857-182.857 10.857-218.857 0-115.429-3.429-230.857-3.429-346.286v-66.857c0-10.286 2.286-51.429-4.571-59.429-8-8.571-82.857-6.857-92.571-6.857-21.143 0-82.286 9.714-98.857 21.714-27.429 18.857-27.429 133.143-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857z"],"width":1029.7051428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["text-height"],"defaultCode":61492,"grid":14},"attrs":[],"properties":{"name":"text-height","id":53,"order":694,"prevSize":28,"code":61492},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M46.286 73.714l30.857 15.429c4 1.714 108.571 2.857 120.571 2.857 50.286 0 100.571-2.286 150.857-2.286 151.429 0 304.571-3.429 456 1.714 12.571 0.571 24.571-7.429 32-17.714l24-0.571c5.143 0 10.857 0.571 16 0.571 1.143 64 1.143 128 1.143 192 0 20.571 0.571 42.286-2.857 62.286-12.571 4.571-25.714 8.571-38.857 10.286-13.143-22.857-22.286-48-30.857-73.143-4-11.429-18.286-88.571-18.857-89.714-4-5.143-9.143-8.571-15.429-10.857-4.571-1.714-32-1.143-37.714-1.143-70.286 0-151.429-4-220.571 4-2.857 25.143-5.143 52-4.571 77.714l0.571 86.857v-29.714c0.571 93.143 1.714 185.714 1.714 278.286 0 44-6.857 90.286 5.714 132.571 43.429 22.286 94.857 25.714 139.429 45.714 1.143 9.143 2.857 18.857 2.857 28.571 0 5.143-0.571 10.857-1.714 16.571l-19.429 0.571c-81.143 2.286-161.143-10.286-242.857-10.286-57.714 0-115.429 10.286-173.143 10.286-0.571-9.714-1.714-20-1.714-29.714v-5.143c21.714-34.857 100-35.429 136-56.571 14.286-32 10.286-302.286 10.286-352.571 0-8-2.857-16.571-2.857-25.143 0-23.429 4-157.714-4.571-167.429-8-8.571-82.857-6.857-92.571-6.857-24 0-158.286 12.571-172 21.714-26.857 17.714-27.429 132.571-61.714 135.429-10.286-6.286-24.571-15.429-32-25.143v-218.857zM748.571 806.286c20 0 96 68 111.429 80 8.571 6.857 14.857 16.571 14.857 28s-6.286 21.143-14.857 28c-15.429 12-91.429 80-111.429 80-26.286 0-17.143-61.143-17.143-71.429h-585.143c0 10.286 9.143 71.429-17.143 71.429-20 0-96-68-111.429-80-8.571-6.857-14.857-16.571-14.857-28s6.286-21.143 14.857-28c15.429-12 91.429-80 111.429-80 26.286 0 17.143 61.143 17.143 71.429h585.143c0-10.286-9.143-71.429 17.143-71.429z"],"width":878.2994285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["text-width"],"defaultCode":61493,"grid":14},"attrs":[],"properties":{"name":"text-width","id":54,"order":695,"prevSize":28,"code":61493},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-left"],"defaultCode":61494,"grid":14},"attrs":[],"properties":{"name":"align-left","id":55,"order":57,"prevSize":28,"code":61494},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM804.571 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM950.857 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM731.429 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-365.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h365.714c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-center"],"defaultCode":61495,"grid":14},"attrs":[],"properties":{"name":"align-center","id":56,"order":58,"prevSize":28,"code":61495},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-731.429c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h731.429c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-877.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h877.714c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-658.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h658.286c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-right"],"defaultCode":61496,"grid":14},"attrs":[],"properties":{"name":"align-right","id":57,"order":59,"prevSize":28,"code":61496},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M1024 768v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 548.571v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 329.143v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v73.143c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["align-justify"],"defaultCode":61497,"grid":14},"attrs":[],"properties":{"name":"align-justify","id":58,"order":60,"prevSize":28,"code":61497},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M146.286 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM146.286 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM146.286 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-109.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h109.714c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-768c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h768c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list"],"defaultCode":61498,"grid":14},"attrs":[],"properties":{"name":"list","id":59,"order":61,"prevSize":28,"code":61498},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M219.429 310.857v329.143c0 9.714-8.571 18.286-18.286 18.286-4.571 0-9.714-1.714-13.143-5.143l-164.571-164.571c-3.429-3.429-5.143-8.571-5.143-13.143s1.714-9.714 5.143-13.143l164.571-164.571c3.429-3.429 8.571-5.143 13.143-5.143 9.714 0 18.286 8.571 18.286 18.286zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["dedent","outdent"],"defaultCode":61499,"grid":14},"attrs":[],"properties":{"name":"dedent, outdent","id":60,"order":62,"prevSize":28,"code":61499},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M201.143 475.429c0 4.571-1.714 9.714-5.143 13.143l-164.571 164.571c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-329.143c0-9.714 8.571-18.286 18.286-18.286 4.571 0 9.714 1.714 13.143 5.143l164.571 164.571c3.429 3.429 5.143 8.571 5.143 13.143zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286zM1024 530.286v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 310.857v109.714c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286zM1024 91.429v109.714c0 9.714-8.571 18.286-18.286 18.286h-987.429c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h987.429c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["indent"],"defaultCode":61500,"grid":14},"attrs":[],"properties":{"name":"indent","id":61,"order":63,"prevSize":28,"code":61500},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M207.429 877.714l52-52-134.286-134.286-52 52v61.143h73.143v73.143h61.143zM506.286 347.429c0-7.429-5.143-12.571-12.571-12.571-3.429 0-6.857 1.143-9.714 4l-309.714 309.714c-2.857 2.857-4 6.286-4 9.714 0 7.429 5.143 12.571 12.571 12.571 3.429 0 6.857-1.143 9.714-4l309.714-309.714c2.857-2.857 4-6.286 4-9.714zM475.429 237.714l237.714 237.714-475.429 475.429h-237.714v-237.714zM865.714 292.571c0 19.429-8 38.286-21.143 51.429l-94.857 94.857-237.714-237.714 94.857-94.286c13.143-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l134.286 133.714c13.143 13.714 21.143 32.571 21.143 52z"],"width":865.7188571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["pencil"],"defaultCode":61504,"grid":14},"attrs":[],"properties":{"name":"pencil","id":62,"order":66,"prevSize":28,"code":61504},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M438.857 822.857v-621.714c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["adjust"],"defaultCode":61506,"grid":14},"attrs":[],"properties":{"name":"adjust","id":63,"order":68,"prevSize":28,"code":61506},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M507.429 676.571l66.286-66.286-86.857-86.857-66.286 66.286v32h54.857v54.857h32zM758.857 265.143c-5.143-5.143-13.714-4.571-18.857 0.571l-200 200c-5.143 5.143-5.714 13.714-0.571 18.857s13.714 4.571 18.857-0.571l200-200c5.143-5.143 5.714-13.714 0.571-18.857zM804.571 604.571v108.571c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-5.143 5.143-12 6.857-18.286 4.571-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-72c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c5.714-5.714 13.143-6.857 20-4s11.429 9.143 11.429 16.571zM749.714 182.857l164.571 164.571-384 384h-164.571v-164.571zM1003.429 258.286l-52.571 52.571-164.571-164.571 52.571-52.571c21.143-21.143 56.571-21.143 77.714 0l86.857 86.857c21.143 21.143 21.143 56.571 0 77.714z"],"width":1024.5851428571427,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["edit","pencil-square-o"],"defaultCode":61508,"grid":14},"attrs":[],"properties":{"name":"edit, pencil-square-o","id":64,"order":70,"prevSize":28,"code":61508},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M804.571 565.143v148c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h145.714c9.714 0 18.286 8 18.286 18.286 0 9.143-6.286 16.571-14.857 18.286-28.571 9.714-54.286 21.143-76 34.286-2.857 1.143-5.714 2.286-9.143 2.286h-64c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-122.286c0-6.857 4-13.143 10.286-16.571 11.429-5.143 21.714-12.571 30.857-21.143 5.143-5.143 13.143-7.429 20-4.571s12 9.143 12 16.571zM940 281.714l-219.429 219.429c-6.857 7.429-16 10.857-25.714 10.857-4.571 0-9.714-1.143-14.286-2.857-13.143-5.714-22.286-18.857-22.286-33.714v-109.714h-91.429c-125.714 0-205.714 24-250.286 74.857-46.286 53.143-60 138.857-42.286 270.286 1.143 8-4 16-11.429 19.429-2.286 0.571-4.571 1.143-6.857 1.143-5.714 0-11.429-2.857-14.857-7.429-4-5.714-94.857-134.286-94.857-248.571 0-153.143 48-329.143 420.571-329.143h91.429v-109.714c0-14.857 9.143-28 22.286-33.714 4.571-1.714 9.714-2.857 14.286-2.857 9.714 0 18.857 4 25.714 10.857l219.429 219.429c14.286 14.286 14.286 37.143 0 51.429z"],"width":954.2948571428572,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["share-square-o"],"defaultCode":61509,"grid":14},"attrs":[],"properties":{"name":"share-square-o","id":65,"order":71,"prevSize":28,"code":61509},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M804.571 531.429v181.714c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c22.857 0 45.714 4.571 66.857 14.286 5.143 2.286 9.143 7.429 10.286 13.143 1.143 6.286-0.571 12-5.143 16.571l-28 28c-3.429 3.429-8.571 5.714-13.143 5.714-1.714 0-3.429-0.571-5.143-1.143-8.571-2.286-17.143-3.429-25.714-3.429h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-145.143c0-4.571 1.714-9.143 5.143-12.571l36.571-36.571c4-4 8.571-5.714 13.143-5.714 2.286 0 4.571 0.571 6.857 1.714 6.857 2.857 11.429 9.143 11.429 16.571zM936.571 252l-465.143 465.143c-18.286 18.286-46.857 18.286-65.143 0l-245.714-245.714c-18.286-18.286-18.286-46.857 0-65.143l62.857-62.857c18.286-18.286 46.857-18.286 65.143 0l150.286 150.286 369.714-369.714c18.286-18.286 46.857-18.286 65.143 0l62.857 62.857c18.286 18.286 18.286 46.857 0 65.143z"],"width":954.8799999999999,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["check-square-o"],"defaultCode":61510,"grid":14},"attrs":[],"properties":{"name":"check-square-o","id":66,"order":719,"prevSize":28,"code":61510},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-219.429v219.429h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-219.429h-219.429v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h219.429v-219.429h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-73.143v219.429h219.429v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows"],"defaultCode":61511,"grid":14},"attrs":[],"properties":{"name":"arrows","id":67,"order":73,"prevSize":28,"code":61511},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M559.429 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["step-backward"],"defaultCode":61512,"grid":14},"attrs":[],"properties":{"name":"step-backward","id":68,"order":74,"prevSize":28,"code":61512},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M998.286 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v387.429c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v387.429c1.714-4 4-7.429 7.429-10.857l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["fast-backward"],"defaultCode":61513,"grid":14},"attrs":[],"properties":{"name":"fast-backward","id":69,"order":75,"prevSize":28,"code":61513},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M925.143 80.571c14.286-14.286 25.714-9.143 25.714 10.857v841.143c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-3.429-3.429-5.714-6.857-7.429-10.857v405.714c0 20-11.429 25.143-25.714 10.857l-405.714-405.714c-14.286-14.286-14.286-37.143 0-51.429l405.714-405.714c14.286-14.286 25.714-9.143 25.714 10.857v405.714c1.714-4 4-7.429 7.429-10.857z"],"width":1017.1245714285715,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["backward"],"defaultCode":61514,"grid":14},"attrs":[],"properties":{"name":"backward","id":70,"order":76,"prevSize":28,"code":61514},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M790.857 529.714l-758.857 421.714c-17.714 9.714-32 1.143-32-18.857v-841.143c0-20 14.286-28.571 32-18.857l758.857 421.714c17.714 9.714 17.714 25.714 0 35.429z"],"width":808.5942857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["play"],"defaultCode":61515,"grid":14},"attrs":[],"properties":{"name":"play","id":71,"order":77,"prevSize":28,"code":61515},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571zM365.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-292.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["pause"],"defaultCode":61516,"grid":14},"attrs":[],"properties":{"name":"pause","id":72,"order":78,"prevSize":28,"code":61516},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M877.714 109.714v804.571c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-804.571c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["stop"],"defaultCode":61517,"grid":14},"attrs":[],"properties":{"name":"stop","id":73,"order":79,"prevSize":28,"code":61517},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c14.286 14.286 14.286 37.143 0 51.429l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":884.5897142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["forward"],"defaultCode":61518,"grid":14},"attrs":[],"properties":{"name":"forward","id":74,"order":80,"prevSize":28,"code":61518},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-405.714c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857l-405.714 405.714c-14.286 14.286-25.714 9.143-25.714-10.857v-405.714c-1.714 4-4 7.429-7.429 10.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["fast-forward"],"defaultCode":61520,"grid":14},"attrs":[],"properties":{"name":"fast-forward","id":75,"order":81,"prevSize":28,"code":61520},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M25.714 943.429c-14.286 14.286-25.714 9.143-25.714-10.857v-841.143c0-20 11.429-25.143 25.714-10.857l405.714 405.714c3.429 3.429 5.714 6.857 7.429 10.857v-387.429c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v804.571c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-387.429c-1.714 4-4 7.429-7.429 10.857z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["step-forward"],"defaultCode":61521,"grid":14},"attrs":[],"properties":{"name":"step-forward","id":76,"order":82,"prevSize":28,"code":61521},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M8 559.429l405.714-405.714c14.286-14.286 37.143-14.286 51.429 0l405.714 405.714c14.286 14.286 9.143 25.714-10.857 25.714h-841.143c-20 0-25.143-11.429-10.857-25.714zM841.714 877.714h-804.571c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571v146.286c0 20-16.571 36.571-36.571 36.571z"],"width":878.8845714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["eject"],"defaultCode":61522,"grid":14},"attrs":[],"properties":{"name":"eject","id":77,"order":83,"prevSize":28,"code":61522},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M669.143 172l-303.429 303.429 303.429 303.429c14.286 14.286 14.286 37.143 0 51.429l-94.857 94.857c-14.286 14.286-37.143 14.286-51.429 0l-424-424c-14.286-14.286-14.286-37.143 0-51.429l424-424c14.286-14.286 37.143-14.286 51.429 0l94.857 94.857c14.286 14.286 14.286 37.143 0 51.429z"],"width":768,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-left"],"defaultCode":61523,"grid":14},"attrs":[],"properties":{"name":"chevron-left","id":78,"order":84,"prevSize":28,"code":61523},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M632.571 501.143l-424 424c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.857c-14.286-14.286-14.286-37.143 0-51.429l303.429-303.429-303.429-303.429c-14.286-14.286-14.286-37.143 0-51.429l94.857-94.857c14.286-14.286 37.143-14.286 51.429 0l424 424c14.286 14.286 14.286 37.143 0 51.429z"],"width":694.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-right"],"defaultCode":61524,"grid":14},"attrs":[],"properties":{"name":"chevron-right","id":79,"order":85,"prevSize":28,"code":61524},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-146.286v-146.286c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v146.286h-146.286c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h146.286v146.286c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-146.286h146.286c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["plus-circle"],"defaultCode":61525,"grid":14},"attrs":[],"properties":{"name":"plus-circle","id":80,"order":86,"prevSize":28,"code":61525},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M694.857 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-438.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h438.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["minus-circle"],"defaultCode":61526,"grid":14},"attrs":[],"properties":{"name":"minus-circle","id":81,"order":87,"prevSize":28,"code":61526},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M656.571 641.143c0-9.714-4-18.857-10.857-25.714l-103.429-103.429 103.429-103.429c6.857-6.857 10.857-16 10.857-25.714s-4-19.429-10.857-26.286l-51.429-51.429c-6.857-6.857-16.571-10.857-26.286-10.857s-18.857 4-25.714 10.857l-103.429 103.429-103.429-103.429c-6.857-6.857-16-10.857-25.714-10.857s-19.429 4-26.286 10.857l-51.429 51.429c-6.857 6.857-10.857 16.571-10.857 26.286s4 18.857 10.857 25.714l103.429 103.429-103.429 103.429c-6.857 6.857-10.857 16-10.857 25.714s4 19.429 10.857 26.286l51.429 51.429c6.857 6.857 16.571 10.857 26.286 10.857s18.857-4 25.714-10.857l103.429-103.429 103.429 103.429c6.857 6.857 16 10.857 25.714 10.857s19.429-4 26.286-10.857l51.429-51.429c6.857-6.857 10.857-16.571 10.857-26.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["times-circle"],"defaultCode":61527,"grid":14},"attrs":[],"properties":{"name":"times-circle","id":82,"order":88,"prevSize":28,"code":61527},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M733.714 419.429c0-9.714-3.429-19.429-10.286-26.286l-52-51.429c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-233.143 232.571-129.143-129.143c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 51.429c-6.857 6.857-10.286 16.571-10.286 26.286s3.429 18.857 10.286 25.714l206.857 206.857c6.857 6.857 16.571 10.857 25.714 10.857 9.714 0 19.429-4 26.286-10.857l310.286-310.286c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["check-circle"],"defaultCode":61528,"grid":14},"attrs":[],"properties":{"name":"check-circle","id":83,"order":89,"prevSize":28,"code":61528},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M512 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM658.286 402.286c0-104.571-109.714-182.857-208-182.857-93.143 0-162.857 40-212 121.714-5.143 8-2.857 18.286 4.571 24l75.429 57.143c2.857 2.286 6.857 3.429 10.857 3.429 5.143 0 10.857-2.286 14.286-6.857 26.857-34.286 38.286-44.571 49.143-52.571 9.714-6.857 28.571-13.714 49.143-13.714 36.571 0 70.286 23.429 70.286 48.571 0 29.714-15.429 44.571-50.286 60.571-40.571 18.286-96 65.714-96 121.143v20.571c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286v0c0-13.143 16.571-41.143 43.429-56.571 43.429-24.571 102.857-57.714 102.857-144.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["question-circle"],"defaultCode":61529,"grid":14},"attrs":[],"properties":{"name":"question-circle","id":84,"order":90,"prevSize":28,"code":61529},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M585.143 786.286v-91.429c0-10.286-8-18.286-18.286-18.286h-54.857v-292.571c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h54.857v182.857h-54.857c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h256c10.286 0 18.286-8 18.286-18.286zM512 274.286v-91.429c0-10.286-8-18.286-18.286-18.286h-109.714c-10.286 0-18.286 8-18.286 18.286v91.429c0 10.286 8 18.286 18.286 18.286h109.714c10.286 0 18.286-8 18.286-18.286zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["info-circle"],"defaultCode":61530,"grid":14},"attrs":[],"properties":{"name":"info-circle","id":85,"order":91,"prevSize":28,"code":61530},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M684 585.143h-62.286c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h62.286c-24.571-82.286-89.714-147.429-172-172v62.286c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-62.286c-82.286 24.571-147.429 89.714-172 172h62.286c20 0 36.571 16.571 36.571 36.571v73.143c0 20-16.571 36.571-36.571 36.571h-62.286c24.571 82.286 89.714 147.429 172 172v-62.286c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v62.286c82.286-24.571 147.429-89.714 172-172zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-81.714c-28 122.857-124.571 219.429-247.429 247.429v81.714c0 20-16.571 36.571-36.571 36.571h-73.143c-20 0-36.571-16.571-36.571-36.571v-81.714c-122.857-28-219.429-124.571-247.429-247.429h-81.714c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h81.714c28-122.857 124.571-219.429 247.429-247.429v-81.714c0-20 16.571-36.571 36.571-36.571h73.143c20 0 36.571 16.571 36.571 36.571v81.714c122.857 28 219.429 124.571 247.429 247.429h81.714c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["crosshairs"],"defaultCode":61531,"grid":14},"attrs":[],"properties":{"name":"crosshairs","id":86,"order":92,"prevSize":28,"code":61531},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M626.857 616.571l-83.429 83.429c-7.429 7.429-18.857 7.429-26.286 0l-78.286-78.286-78.286 78.286c-7.429 7.429-18.857 7.429-26.286 0l-83.429-83.429c-7.429-7.429-7.429-18.857 0-26.286l78.286-78.286-78.286-78.286c-7.429-7.429-7.429-18.857 0-26.286l83.429-83.429c7.429-7.429 18.857-7.429 26.286 0l78.286 78.286 78.286-78.286c7.429-7.429 18.857-7.429 26.286 0l83.429 83.429c7.429 7.429 7.429 18.857 0 26.286l-78.286 78.286 78.286 78.286c7.429 7.429 7.429 18.857 0 26.286zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["times-circle-o"],"defaultCode":61532,"grid":14},"attrs":[],"properties":{"name":"times-circle-o","id":87,"order":93,"prevSize":28,"code":61532},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M669.143 464.571l-241.143 241.143c-14.286 14.286-37.143 14.286-51.429 0l-168-168c-14.286-14.286-14.286-37.143 0-51.429l58.286-58.286c14.286-14.286 37.143-14.286 51.429 0l84 84 157.143-157.143c14.286-14.286 37.143-14.286 51.429 0l58.286 58.286c14.286 14.286 14.286 37.143 0 51.429zM749.714 512c0-171.429-139.429-310.857-310.857-310.857s-310.857 139.429-310.857 310.857 139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["check-circle-o"],"defaultCode":61533,"grid":14},"attrs":[],"properties":{"name":"check-circle-o","id":88,"order":94,"prevSize":28,"code":61533},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M749.714 510.286c0-62.286-18.286-120-49.714-168.571l-430.857 430.286c49.143 32 107.429 50.857 169.714 50.857 171.429 0 310.857-140 310.857-312.571zM178.857 681.143l431.429-430.857c-49.143-33.143-108-52-171.429-52-171.429 0-310.857 140-310.857 312 0 63.429 18.857 121.714 50.857 170.857zM877.714 510.286c0 243.429-196.571 440.571-438.857 440.571s-438.857-197.143-438.857-440.571c0-242.857 196.571-440 438.857-440s438.857 197.143 438.857 440z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["ban"],"defaultCode":61534,"grid":14},"attrs":[],"properties":{"name":"ban","id":89,"order":95,"prevSize":28,"code":61534},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M877.714 512v73.143c0 38.857-25.714 73.143-66.857 73.143h-402.286l167.429 168c13.714 13.143 21.714 32 21.714 51.429s-8 38.286-21.714 51.429l-42.857 43.429c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-372-372.571c-13.143-13.143-21.143-32-21.143-51.429s8-38.286 21.143-52l372-371.429c13.714-13.714 32.571-21.714 52-21.714s37.714 8 51.429 21.714l42.857 42.286c13.714 13.714 21.714 32.571 21.714 52s-8 38.286-21.714 52l-167.429 167.429h402.286c41.143 0 66.857 34.286 66.857 73.143z"],"width":914.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-left"],"defaultCode":61536,"grid":14},"attrs":[],"properties":{"name":"arrow-left","id":90,"order":96,"prevSize":28,"code":61536},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M841.143 548.571c0 19.429-7.429 38.286-21.143 52l-372 372c-13.714 13.143-32.571 21.143-52 21.143s-37.714-8-51.429-21.143l-42.857-42.857c-13.714-13.714-21.714-32.571-21.714-52s8-38.286 21.714-52l167.429-167.429h-402.286c-41.143 0-66.857-34.286-66.857-73.143v-73.143c0-38.857 25.714-73.143 66.857-73.143h402.286l-167.429-168c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-51.429l42.857-42.857c13.714-13.714 32-21.714 51.429-21.714s38.286 8 52 21.714l372 372c13.714 13.143 21.143 32 21.143 51.429z"],"width":841.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-right"],"defaultCode":61537,"grid":14},"attrs":[],"properties":{"name":"arrow-right","id":91,"order":97,"prevSize":28,"code":61537},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M920.571 554.857c0 19.429-8 37.714-21.143 51.429l-42.857 42.857c-13.714 13.714-32.571 21.714-52 21.714s-38.286-8-51.429-21.714l-168-167.429v402.286c0 41.143-34.286 66.857-73.143 66.857h-73.143c-38.857 0-73.143-25.714-73.143-66.857v-402.286l-168 167.429c-13.143 13.714-32 21.714-51.429 21.714s-38.286-8-51.429-21.714l-42.857-42.857c-13.714-13.714-21.714-32-21.714-51.429s8-38.286 21.714-52l372-372c13.143-13.714 32-21.143 51.429-21.143s38.286 7.429 52 21.143l372 372c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-up"],"defaultCode":61538,"grid":14},"attrs":[],"properties":{"name":"arrow-up","id":92,"order":98,"prevSize":28,"code":61538},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M920.571 475.429c0 19.429-8 38.286-21.143 51.429l-372 372.571c-13.714 13.143-32.571 21.143-52 21.143s-38.286-8-51.429-21.143l-372-372.571c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l42.286-42.857c13.714-13.143 32.571-21.143 52-21.143s38.286 8 51.429 21.143l168 168v-402.286c0-40 33.143-73.143 73.143-73.143h73.143c40 0 73.143 33.143 73.143 73.143v402.286l168-168c13.143-13.143 32-21.143 51.429-21.143s38.286 8 52 21.143l42.857 42.857c13.143 13.714 21.143 32.571 21.143 52z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-down"],"defaultCode":61539,"grid":14},"attrs":[],"properties":{"name":"arrow-down","id":93,"order":99,"prevSize":28,"code":61539},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M1024 365.714c0 9.714-4 18.857-10.857 25.714l-292.571 292.571c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-146.286h-128c-246.286 0-408 47.429-408 320 0 23.429 1.143 46.857 2.857 70.286 0.571 9.143 2.857 19.429 2.857 28.571 0 10.857-6.857 20-18.286 20-8 0-12-4-16-9.714-8.571-12-14.857-30.286-21.143-43.429-32.571-73.143-72.571-177.714-72.571-257.714 0-64 6.286-129.714 30.286-190.286 79.429-197.143 312.571-230.286 500-230.286h128v-146.286c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l292.571 292.571c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["mail-forward","share"],"defaultCode":61540,"grid":14},"attrs":[],"properties":{"name":"mail-forward, share","id":94,"order":100,"prevSize":28,"code":61540},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M431.429 603.429c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143zM877.714 109.714v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["expand"],"defaultCode":61541,"grid":14},"attrs":[],"properties":{"name":"expand","id":95,"order":101,"prevSize":28,"code":61541},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M438.857 548.571v256c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-82.286-82.286-189.714 189.714c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l189.714-189.714-82.286-82.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h256c20 0 36.571 16.571 36.571 36.571zM870.286 164.571c0 4.571-2.286 9.714-5.714 13.143l-189.714 189.714 82.286 82.286c6.857 6.857 10.857 16 10.857 25.714 0 20-16.571 36.571-36.571 36.571h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l82.286 82.286 189.714-189.714c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l65.143 65.143c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["compress"],"defaultCode":61542,"grid":14},"attrs":[],"properties":{"name":"compress","id":96,"order":102,"prevSize":28,"code":61542},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M438.857 73.143c242.286 0 438.857 196.571 438.857 438.857s-196.571 438.857-438.857 438.857-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857zM512 785.714v-108.571c0-10.286-8-18.857-17.714-18.857h-109.714c-10.286 0-18.857 8.571-18.857 18.857v108.571c0 10.286 8.571 18.857 18.857 18.857h109.714c9.714 0 17.714-8.571 17.714-18.857zM510.857 589.143l10.286-354.857c0-4-1.714-8-5.714-10.286-3.429-2.857-8.571-4.571-13.714-4.571h-125.714c-5.143 0-10.286 1.714-13.714 4.571-4 2.286-5.714 6.286-5.714 10.286l9.714 354.857c0 8 8.571 14.286 19.429 14.286h105.714c10.286 0 18.857-6.286 19.429-14.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["exclamation-circle"],"defaultCode":61546,"grid":14},"attrs":[],"properties":{"name":"exclamation-circle","id":97,"order":103,"prevSize":28,"code":61546},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M950.857 548.571c-54.286-84-128.571-156-217.714-201.714 22.857 38.857 34.857 83.429 34.857 128.571 0 141.143-114.857 256-256 256s-256-114.857-256-256c0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 97.714 150.857 255.429 256 438.857 256s341.143-105.143 438.857-256zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.143 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM1024 548.571c0 14.286-4.571 27.429-11.429 39.429-105.143 173.143-297.714 289.714-500.571 289.714s-395.429-117.143-500.571-289.714c-6.857-12-11.429-25.143-11.429-39.429s4.571-27.429 11.429-39.429c105.143-172.571 297.714-289.714 500.571-289.714s395.429 117.143 500.571 289.714c6.857 12 11.429 25.143 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["eye"],"defaultCode":61550,"grid":14},"attrs":[],"properties":{"name":"eye","id":98,"order":107,"prevSize":28,"code":61550},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M317.143 762.857l44.571-80.571c-66.286-48-105.714-125.143-105.714-206.857 0-45.143 12-89.714 34.857-128.571-89.143 45.714-163.429 117.714-217.714 201.714 59.429 92 143.429 169.143 244 214.286zM539.429 329.143c0-14.857-12.571-27.429-27.429-27.429-95.429 0-173.714 78.286-173.714 173.714 0 14.857 12.571 27.429 27.429 27.429s27.429-12.571 27.429-27.429c0-65.714 53.714-118.857 118.857-118.857 14.857 0 27.429-12.571 27.429-27.429zM746.857 220c0 1.143 0 4-0.571 5.143-120.571 215.429-240 432-360.571 647.429l-28 50.857c-3.429 5.714-9.714 9.143-16 9.143-10.286 0-64.571-33.143-76.571-40-5.714-3.429-9.143-9.143-9.143-16 0-9.143 19.429-40 25.143-49.714-110.857-50.286-204-136-269.714-238.857-7.429-11.429-11.429-25.143-11.429-39.429 0-13.714 4-28 11.429-39.429 113.143-173.714 289.714-289.714 500.571-289.714 34.286 0 69.143 3.429 102.857 9.714l30.857-55.429c3.429-5.714 9.143-9.143 16-9.143 10.286 0 64 33.143 76 40 5.714 3.429 9.143 9.143 9.143 15.429zM768 475.429c0 106.286-65.714 201.143-164.571 238.857l160-286.857c2.857 16 4.571 32 4.571 48zM1024 548.571c0 14.857-4 26.857-11.429 39.429-17.714 29.143-40 57.143-62.286 82.857-112 128.571-266.286 206.857-438.286 206.857l42.286-75.429c166.286-14.286 307.429-115.429 396.571-253.714-42.286-65.714-96.571-123.429-161.143-168l36-64c70.857 47.429 142.286 118.857 186.857 192.571 7.429 12.571 11.429 24.571 11.429 39.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["eye-slash"],"defaultCode":61552,"grid":14},"attrs":[],"properties":{"name":"eye-slash","id":99,"order":108,"prevSize":28,"code":61552},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M585.143 785.714v-108.571c0-10.286-8-18.857-18.286-18.857h-109.714c-10.286 0-18.286 8.571-18.286 18.857v108.571c0 10.286 8 18.857 18.286 18.857h109.714c10.286 0 18.286-8.571 18.286-18.857zM584 572l10.286-262.286c0-3.429-1.714-8-5.714-10.857-3.429-2.857-8.571-6.286-13.714-6.286h-125.714c-5.143 0-10.286 3.429-13.714 6.286-4 2.857-5.714 8.571-5.714 12l9.714 261.143c0 7.429 8.571 13.143 19.429 13.143h105.714c10.286 0 18.857-5.714 19.429-13.143zM576 38.286l438.857 804.571c12.571 22.286 12 49.714-1.143 72s-37.143 36-62.857 36h-877.714c-25.714 0-49.714-13.714-62.857-36s-13.714-49.714-1.143-72l438.857-804.571c12.571-23.429 37.143-38.286 64-38.286s51.429 14.857 64 38.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["exclamation-triangle","warning"],"defaultCode":61553,"grid":14},"attrs":[],"properties":{"name":"exclamation-triangle, warning","id":100,"order":109,"prevSize":28,"code":61553},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M73.143 950.857h164.571v-164.571h-164.571v164.571zM274.286 950.857h182.857v-164.571h-182.857v164.571zM73.143 749.714h164.571v-182.857h-164.571v182.857zM274.286 749.714h182.857v-182.857h-182.857v182.857zM73.143 530.286h164.571v-164.571h-164.571v164.571zM493.714 950.857h182.857v-164.571h-182.857v164.571zM274.286 530.286h182.857v-164.571h-182.857v164.571zM713.143 950.857h164.571v-164.571h-164.571v164.571zM493.714 749.714h182.857v-182.857h-182.857v182.857zM292.571 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM713.143 749.714h164.571v-182.857h-164.571v182.857zM493.714 530.286h182.857v-164.571h-182.857v164.571zM713.143 530.286h164.571v-164.571h-164.571v164.571zM731.429 256v-164.571c0-9.714-8.571-18.286-18.286-18.286h-36.571c-9.714 0-18.286 8.571-18.286 18.286v164.571c0 9.714 8.571 18.286 18.286 18.286h36.571c9.714 0 18.286-8.571 18.286-18.286zM950.857 219.429v731.429c0 40-33.143 73.143-73.143 73.143h-804.571c-40 0-73.143-33.143-73.143-73.143v-731.429c0-40 33.143-73.143 73.143-73.143h73.143v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h219.429v-54.857c0-50.286 41.143-91.429 91.429-91.429h36.571c50.286 0 91.429 41.143 91.429 91.429v54.857h73.143c40 0 73.143 33.143 73.143 73.143z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["calendar"],"defaultCode":61555,"grid":14},"attrs":[],"properties":{"name":"calendar","id":101,"order":111,"prevSize":28,"code":61555},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M380.571 274.857c-32 49.143-55.429 102.286-78.286 156-33.143-69.143-69.714-138.286-156-138.286h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c101.714 0 176.571 47.429 234.286 128.571zM1024 731.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8.571-18.286-18.286v-109.714c-169.714 0-274.286 20-380-128.571 31.429-49.143 54.857-102.286 77.714-156 33.143 69.143 69.714 138.286 156 138.286h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143zM1024 219.429c0 4.571-1.714 9.714-5.143 13.143l-182.857 182.857c-3.429 3.429-8.571 5.143-13.143 5.143-9.714 0-18.286-8-18.286-18.286v-109.714h-146.286c-76 0-112 52-144 113.714-16.571 32-30.857 65.143-44.571 97.714-63.429 147.429-137.714 300.571-323.429 300.571h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128c76 0 112-52 144-113.714 16.571-32 30.857-65.143 44.571-97.714 63.429-147.429 137.714-300.571 323.429-300.571h146.286v-109.714c0-10.286 8-18.286 18.286-18.286 5.143 0 9.714 2.286 13.714 5.714l182.286 182.286c3.429 3.429 5.143 8.571 5.143 13.143z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["random"],"defaultCode":61556,"grid":14},"attrs":[],"properties":{"name":"random","id":102,"order":112,"prevSize":28,"code":61556},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M1024 512c0 202.286-229.143 365.714-512 365.714-28 0-56-1.714-82.857-4.571-74.857 66.286-164 113.143-262.857 138.286-20.571 5.714-42.857 9.714-65.143 12.571-12.571 1.143-24.571-8-27.429-21.714v-0.571c-2.857-14.286 6.857-22.857 15.429-33.143 36-40.571 77.143-74.857 104-170.286-117.714-66.857-193.143-170.286-193.143-286.286 0-201.714 229.143-365.714 512-365.714s512 163.429 512 365.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["comment"],"defaultCode":61557,"grid":14},"attrs":[],"properties":{"name":"comment","id":103,"order":113,"prevSize":28,"code":61557},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M961.714 760.571l-94.857 94.286c-14.286 14.286-37.143 14.286-51.429 0l-303.429-303.429-303.429 303.429c-14.286 14.286-37.143 14.286-51.429 0l-94.857-94.286c-14.286-14.286-14.286-37.714 0-52l424-423.429c14.286-14.286 37.143-14.286 51.429 0l424 423.429c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-up"],"defaultCode":61559,"grid":14},"attrs":[],"properties":{"name":"chevron-up","id":104,"order":115,"prevSize":28,"code":61559},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M961.714 461.714l-424 423.429c-14.286 14.286-37.143 14.286-51.429 0l-424-423.429c-14.286-14.286-14.286-37.714 0-52l94.857-94.286c14.286-14.286 37.143-14.286 51.429 0l303.429 303.429 303.429-303.429c14.286-14.286 37.143-14.286 51.429 0l94.857 94.286c14.286 14.286 14.286 37.714 0 52z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-down"],"defaultCode":61560,"grid":14},"attrs":[],"properties":{"name":"chevron-down","id":105,"order":116,"prevSize":28,"code":61560},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M731.429 859.429c0 9.714-8.571 18.286-18.286 18.286h-548.571c-21.143 0-18.286-22.286-18.286-36.571v-329.143h-109.714c-20 0-36.571-16.571-36.571-36.571 0-8.571 2.857-17.143 8.571-23.429l182.857-219.429c6.857-8 17.143-12.571 28-12.571s21.143 4.571 28 12.571l182.857 219.429c5.714 6.286 8.571 14.857 8.571 23.429 0 20-16.571 36.571-36.571 36.571h-109.714v219.429h329.143c5.143 0 10.857 2.286 14.286 6.286l91.429 109.714c2.286 3.429 4 8 4 12zM1097.143 621.714c0 8.571-2.857 17.143-8.571 23.429l-182.857 219.429c-6.857 8-17.143 13.143-28 13.143s-21.143-5.143-28-13.143l-182.857-219.429c-5.714-6.286-8.571-14.857-8.571-23.429 0-20 16.571-36.571 36.571-36.571h109.714v-219.429h-329.143c-5.143 0-10.857-2.286-14.286-6.857l-91.429-109.714c-2.286-2.857-4-7.429-4-11.429 0-9.714 8.571-18.286 18.286-18.286h548.571c21.143 0 18.286 22.286 18.286 36.571v329.143h109.714c20 0 36.571 16.571 36.571 36.571z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["retweet"],"defaultCode":61561,"grid":14},"attrs":[],"properties":{"name":"retweet","id":106,"order":117,"prevSize":28,"code":61561},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder"],"defaultCode":61563,"grid":14},"attrs":[],"properties":{"name":"folder","id":107,"order":119,"prevSize":28,"code":61563},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M1073.714 544c0 13.714-8.571 27.429-17.714 37.714l-192 226.286c-33.143 38.857-100.571 69.714-150.857 69.714h-621.714c-20.571 0-49.714-6.286-49.714-32 0-13.714 8.571-27.429 17.714-37.714l192-226.286c33.143-38.857 100.571-69.714 150.857-69.714h621.714c20.571 0 49.714 6.286 49.714 32zM877.714 347.429v91.429h-475.429c-71.429 0-160 40.571-206.286 95.429l-195.429 229.714c0-4.571-0.571-9.714-0.571-14.286v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128z"],"width":1073.7371428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder-open"],"defaultCode":61564,"grid":14},"attrs":[],"properties":{"name":"folder-open","id":108,"order":120,"prevSize":28,"code":61564},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M402.286 182.857c0 20-16.571 36.571-36.571 36.571h-73.143v585.143h73.143c20 0 36.571 16.571 36.571 36.571 0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h73.143v-585.143h-73.143c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows-v"],"defaultCode":61565,"grid":14},"attrs":[],"properties":{"name":"arrows-v","id":109,"order":121,"prevSize":28,"code":61565},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M1024 512c0 9.714-4 18.857-10.857 25.714l-146.286 146.286c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-73.143h-585.143v73.143c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l146.286-146.286c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v73.143h585.143v-73.143c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l146.286 146.286c6.857 6.857 10.857 16 10.857 25.714z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows-h"],"defaultCode":61566,"grid":14},"attrs":[],"properties":{"name":"arrows-h","id":110,"order":122,"prevSize":28,"code":61566},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M512 512c0-80.571-65.714-146.286-146.286-146.286s-146.286 65.714-146.286 146.286 65.714 146.286 146.286 146.286 146.286-65.714 146.286-146.286zM950.857 804.571c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM950.857 219.429c0-40-33.143-73.143-73.143-73.143s-73.143 33.143-73.143 73.143c0 40.571 33.143 73.143 73.143 73.143 40.571 0 73.143-33.143 73.143-73.143zM731.429 460v105.714c0 7.429-5.714 16-13.143 17.143l-88.571 13.714c-4.571 14.857-10.857 29.143-18.286 43.429 16 22.857 33.143 44 51.429 65.714 2.286 3.429 4 6.857 4 11.429 0 4-1.143 8-4 10.857-11.429 15.429-75.429 85.143-92 85.143-4.571 0-8.571-1.714-12-4l-65.714-51.429c-14.286 7.429-28.571 13.143-44 17.714-2.857 29.143-5.714 60.571-13.143 88.571-2.286 8-9.143 13.714-17.143 13.714h-106.286c-8 0-16-6.286-17.143-14.286l-13.143-87.429c-14.857-4.571-29.143-10.857-42.857-17.714l-67.429 50.857c-2.857 2.857-7.429 4-11.429 4-4.571 0-8.571-1.714-12-4.571-14.857-13.714-82.286-74.857-82.286-91.429 0-4 1.714-7.429 4-10.857 16.571-21.714 33.714-42.857 50.286-65.143-8-15.429-14.857-30.857-20-46.857l-86.857-13.714c-8-1.143-13.714-8.571-13.714-16.571v-105.714c0-7.429 5.714-16 13.143-17.143l88.571-13.714c4.571-14.857 10.857-29.143 18.286-43.429-16-22.857-33.143-44-51.429-65.714-2.286-3.429-4-7.429-4-11.429s1.143-8 4-11.429c11.429-15.429 75.429-84.571 92-84.571 4.571 0 8.571 1.714 12 4l65.714 51.429c14.286-7.429 28.571-13.143 44-18.286 2.857-28.571 5.714-60 13.143-88 2.286-8 9.143-13.714 17.143-13.714h106.286c8 0 16 6.286 17.143 14.286l13.143 87.429c14.857 4.571 29.143 10.857 42.857 17.714l67.429-50.857c3.429-2.857 7.429-4 11.429-4 4.571 0 8.571 1.714 12 4.571 14.857 13.714 82.286 75.429 82.286 91.429 0 4-1.714 7.429-4 10.857-16.571 22.286-33.714 42.857-49.714 65.143 7.429 15.429 14.286 30.857 19.429 46.857l86.857 13.143c8 1.714 13.714 9.143 13.714 17.143zM1097.143 764.571v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714zM1097.143 179.429v80c0 8.571-73.714 16.571-85.143 17.714-4.571 10.857-10.286 20.571-17.143 29.714 5.143 11.429 29.143 68.571 29.143 78.857 0 1.714-0.571 2.857-2.286 4-6.857 4-68 40.571-70.857 40.571-7.429 0-50.286-57.143-56-65.714-5.714 0.571-11.429 1.143-17.143 1.143s-11.429-0.571-17.143-1.143c-5.714 8.571-48.571 65.714-56 65.714-2.857 0-64-36.571-70.857-40.571-1.714-1.143-2.286-2.857-2.286-4 0-9.714 24-67.429 29.143-78.857-6.857-9.143-12.571-18.857-17.143-29.714-11.429-1.143-85.143-9.143-85.143-17.714v-80c0-8.571 73.714-16.571 85.143-17.714 4.571-10.286 10.286-20.571 17.143-29.714-5.143-11.429-29.143-69.143-29.143-78.857 0-1.143 0.571-2.857 2.286-4 6.857-3.429 68-40 70.857-40 7.429 0 50.286 56.571 56 65.143 5.714-0.571 11.429-1.143 17.143-1.143s11.429 0.571 17.143 1.143c16-22.286 33.143-44.571 52.571-64l3.429-1.143c2.857 0 64 36 70.857 40 1.714 1.143 2.286 2.857 2.286 4 0 10.286-24 67.429-29.143 78.857 6.857 9.143 12.571 19.429 17.143 29.714 11.429 1.143 85.143 9.143 85.143 17.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["cogs","gears"],"defaultCode":61573,"grid":14},"attrs":[],"properties":{"name":"cogs, gears","id":111,"order":128,"prevSize":28,"code":61573},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M475.429 18.286v765.143l-256.571 134.857c-7.429 4-14.857 6.857-22.857 6.857-16.571 0-24-13.714-24-28.571 0-4 0.571-7.429 1.143-11.429l49.143-285.714-208-202.286c-6.857-7.429-14.286-17.143-14.286-27.429 0-17.143 17.714-24 32-26.286l286.857-41.714 128.571-260c5.143-10.857 14.857-23.429 28-23.429v0z"],"width":475.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star-half"],"defaultCode":61577,"grid":14},"attrs":[],"properties":{"name":"star-half","id":112,"order":132,"prevSize":28,"code":61577},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M950.857 340.571c0-160.571-108.571-194.286-200-194.286-85.143 0-181.143 92-210.857 127.429-13.714 16.571-42.286 16.571-56 0-29.714-35.429-125.714-127.429-210.857-127.429-91.429 0-200 33.714-200 194.286 0 104.571 105.714 201.714 106.857 202.857l332 320 331.429-319.429c1.714-1.714 107.429-98.857 107.429-203.429zM1024 340.571c0 137.143-125.714 252-130.857 257.143l-356 342.857c-6.857 6.857-16 10.286-25.143 10.286s-18.286-3.429-25.143-10.286l-356.571-344c-4.571-4-130.286-118.857-130.286-256 0-167.429 102.286-267.429 273.143-267.429 100 0 193.714 78.857 238.857 123.429 45.143-44.571 138.857-123.429 238.857-123.429 170.857 0 273.143 100 273.143 267.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["heart-o"],"defaultCode":61578,"grid":14},"attrs":[],"properties":{"name":"heart-o","id":113,"order":133,"prevSize":28,"code":61578},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M365.714 822.857c0 16 7.429 54.857-18.286 54.857h-182.857c-90.857 0-164.571-73.714-164.571-164.571v-402.286c0-90.857 73.714-164.571 164.571-164.571h182.857c9.714 0 18.286 8.571 18.286 18.286 0 16 7.429 54.857-18.286 54.857h-182.857c-50.286 0-91.429 41.143-91.429 91.429v402.286c0 50.286 41.143 91.429 91.429 91.429h164.571c14.286 0 36.571-2.857 36.571 18.286zM896 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714z"],"width":896,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sign-out"],"defaultCode":61579,"grid":14},"attrs":[],"properties":{"name":"sign-out","id":114,"order":134,"prevSize":28,"code":61579},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M274.286 493.714v-256c0-10.286-8-18.286-18.286-18.286s-18.286 8-18.286 18.286v256c0 10.286 8 18.286 18.286 18.286s18.286-8 18.286-18.286zM658.286 694.857c0 20-16.571 36.571-36.571 36.571h-245.143l-29.143 276c-1.143 9.143-8.571 16.571-17.714 16.571h-0.571c-9.143 0-16.571-6.286-18.286-15.429l-43.429-277.143h-230.857c-20 0-36.571-16.571-36.571-36.571 0-93.714 70.857-182.857 146.286-182.857v-292.571c-40 0-73.143-33.143-73.143-73.143s33.143-73.143 73.143-73.143h365.714c40 0 73.143 33.143 73.143 73.143s-33.143 73.143-73.143 73.143v292.571c75.429 0 146.286 89.143 146.286 182.857z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["thumb-tack"],"defaultCode":61581,"grid":14},"attrs":[],"properties":{"name":"thumb-tack","id":115,"order":136,"prevSize":28,"code":61581},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M804.571 530.286v182.857c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-182.857c0-10.286 8-18.286 18.286-18.286h36.571c10.286 0 18.286 8 18.286 18.286zM1024 36.571v292.571c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-100.571-100.571-372.571 372.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-65.143-65.143c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l372.571-372.571-100.571-100.571c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h292.571c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["external-link"],"defaultCode":61582,"grid":14},"attrs":[],"properties":{"name":"external-link","id":116,"order":137,"prevSize":28,"code":61582},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M676.571 512c0 9.714-4 18.857-10.857 25.714l-310.857 310.857c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-164.571h-256c-20 0-36.571-16.571-36.571-36.571v-219.429c0-20 16.571-36.571 36.571-36.571h256v-164.571c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l310.857 310.857c6.857 6.857 10.857 16 10.857 25.714zM877.714 310.857v402.286c0 90.857-73.714 164.571-164.571 164.571h-182.857c-9.714 0-18.286-8.571-18.286-18.286 0-16-7.429-54.857 18.286-54.857h182.857c50.286 0 91.429-41.143 91.429-91.429v-402.286c0-50.286-41.143-91.429-91.429-91.429h-164.571c-14.286 0-36.571 2.857-36.571-18.286 0-16-7.429-54.857 18.286-54.857h182.857c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sign-in"],"defaultCode":61584,"grid":14},"attrs":[],"properties":{"name":"sign-in","id":117,"order":138,"prevSize":28,"code":61584},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M731.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM877.714 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM950.857 713.143v182.857c0 30.286-24.571 54.857-54.857 54.857h-841.143c-30.286 0-54.857-24.571-54.857-54.857v-182.857c0-30.286 24.571-54.857 54.857-54.857h244c15.429 42.286 56 73.143 103.429 73.143h146.286c47.429 0 88-30.857 103.429-73.143h244c30.286 0 54.857 24.571 54.857 54.857zM765.143 342.857c-5.714 13.714-18.857 22.857-33.714 22.857h-146.286v256c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-256h-146.286c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l256-256c6.857-7.429 16.571-10.857 25.714-10.857s18.857 3.429 25.714 10.857l256 256c10.857 10.286 13.714 26.286 8 39.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["upload"],"defaultCode":61587,"grid":14},"attrs":[],"properties":{"name":"upload","id":118,"order":141,"prevSize":28,"code":61587},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M640 146.286h-475.429c-50.286 0-91.429 41.143-91.429 91.429v475.429c0 50.286 41.143 91.429 91.429 91.429h475.429c50.286 0 91.429-41.143 91.429-91.429v-475.429c0-50.286-41.143-91.429-91.429-91.429zM804.571 237.714v475.429c0 90.857-73.714 164.571-164.571 164.571h-475.429c-90.857 0-164.571-73.714-164.571-164.571v-475.429c0-90.857 73.714-164.571 164.571-164.571h475.429c90.857 0 164.571 73.714 164.571 164.571z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["square-o"],"defaultCode":61590,"grid":14},"attrs":[],"properties":{"name":"square-o","id":119,"order":144,"prevSize":28,"code":61590},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M658.286 146.286h-585.143v709.714l292.571-280.571 50.857 48.571 241.714 232v-709.714zM665.143 73.143c8.571 0 17.143 1.714 25.143 5.143 25.143 9.714 41.143 33.143 41.143 58.857v736.571c0 25.714-16 49.143-41.143 58.857-8 3.429-16.571 4.571-25.143 4.571-17.714 0-34.286-6.286-47.429-18.286l-252-242.286-252 242.286c-13.143 12-29.714 18.857-47.429 18.857-8.571 0-17.143-1.714-25.143-5.143-25.143-9.714-41.143-33.143-41.143-58.857v-736.571c0-25.714 16-49.143 41.143-58.857 8-3.429 16.571-5.143 25.143-5.143h598.857z"],"width":731.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["bookmark-o"],"defaultCode":61591,"grid":14},"attrs":[],"properties":{"name":"bookmark-o","id":120,"order":145,"prevSize":28,"code":61591},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M594.286 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM740.571 694.857c0 25.143-20.571 45.714-45.714 45.714s-45.714-20.571-45.714-45.714 20.571-45.714 45.714-45.714 45.714 20.571 45.714 45.714zM804.571 786.286v-182.857c0-9.714-8.571-18.286-18.286-18.286h-694.857c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h694.857c9.714 0 18.286-8.571 18.286-18.286zM101.714 512h674.286l-89.714-275.429c-2.857-9.714-13.714-17.143-24-17.143h-446.857c-10.286 0-21.143 7.429-24 17.143zM877.714 603.429v182.857c0 50.286-41.143 91.429-91.429 91.429h-694.857c-50.286 0-91.429-41.143-91.429-91.429v-182.857c0-15.429 4.571-28.571 9.143-42.857l112.571-346.286c13.143-40 51.429-68 93.714-68h446.857c42.286 0 80.571 28 93.714 68l112.571 346.286c4.571 14.286 9.143 27.429 9.143 42.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["hdd-o"],"defaultCode":61600,"grid":14},"attrs":[],"properties":{"name":"hdd-o","id":121,"order":153,"prevSize":28,"code":61600},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M521.143 969.143c0-5.143-4-9.143-9.143-9.143-45.143 0-82.286-37.143-82.286-82.286 0-5.143-4-9.143-9.143-9.143s-9.143 4-9.143 9.143c0 55.429 45.143 100.571 100.571 100.571 5.143 0 9.143-4 9.143-9.143zM140.571 804.571h742.857c-102.286-115.429-152-272-152-475.429 0-73.714-69.714-182.857-219.429-182.857s-219.429 109.143-219.429 182.857c0 203.429-49.714 360-152 475.429zM987.429 804.571c0 40-33.143 73.143-73.143 73.143h-256c0 80.571-65.714 146.286-146.286 146.286s-146.286-65.714-146.286-146.286h-256c-40 0-73.143-33.143-73.143-73.143 84.571-71.429 182.857-199.429 182.857-475.429 0-109.714 90.857-229.714 242.286-252-2.857-6.857-4.571-14.286-4.571-22.286 0-30.286 24.571-54.857 54.857-54.857s54.857 24.571 54.857 54.857c0 8-1.714 15.429-4.571 22.286 151.429 22.286 242.286 142.286 242.286 252 0 276 98.286 404 182.857 475.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["bell-o"],"defaultCode":61602,"grid":14},"attrs":[],"properties":{"name":"bell-o","id":122,"order":686,"prevSize":28,"code":61602},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M786.286 512l78.857 77.143c10.857 10.286 14.857 25.714 11.429 40-4 14.286-15.429 25.714-29.714 29.143l-107.429 27.429 30.286 106.286c4 14.286 0 29.714-10.857 40-10.286 10.857-25.714 14.857-40 10.857l-106.286-30.286-27.429 107.429c-3.429 14.286-14.857 25.714-29.143 29.714-3.429 0.571-7.429 1.143-10.857 1.143-10.857 0-21.714-4.571-29.143-12.571l-77.143-78.857-77.143 78.857c-10.286 10.857-25.714 14.857-40 11.429-14.857-4-25.714-15.429-29.143-29.714l-27.429-107.429-106.286 30.286c-14.286 4-29.714 0-40-10.857-10.857-10.286-14.857-25.714-10.857-40l30.286-106.286-107.429-27.429c-14.286-3.429-25.714-14.857-29.714-29.143-3.429-14.286 0.571-29.714 11.429-40l78.857-77.143-78.857-77.143c-10.857-10.286-14.857-25.714-11.429-40 4-14.286 15.429-25.714 29.714-29.143l107.429-27.429-30.286-106.286c-4-14.286 0-29.714 10.857-40 10.286-10.857 25.714-14.857 40-10.857l106.286 30.286 27.429-107.429c3.429-14.286 14.857-25.714 29.143-29.143 14.286-4 29.714 0 40 10.857l77.143 79.429 77.143-79.429c10.286-10.857 25.143-14.857 40-10.857 14.286 3.429 25.714 14.857 29.143 29.143l27.429 107.429 106.286-30.286c14.286-4 29.714 0 40 10.857 10.857 10.286 14.857 25.714 10.857 40l-30.286 106.286 107.429 27.429c14.286 3.429 25.714 14.857 29.714 29.143 3.429 14.286-0.571 29.714-11.429 40z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["certificate"],"defaultCode":61603,"grid":14},"attrs":[],"properties":{"name":"certificate","id":123,"order":687,"prevSize":28,"code":61603},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-286.857l108-108c6.857-6.857 10.857-16 10.857-25.714s-4-18.857-10.857-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l52-52c6.857-6.857 10.286-16 10.286-25.714s-3.429-18.857-10.286-25.714l-108-108h286.857c20 0 36.571-16.571 36.571-36.571zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-left"],"defaultCode":61608,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-left","id":124,"order":161,"prevSize":28,"code":61608},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M734.286 512c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l108 108h-286.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h286.857l-108 108c-6.857 6.857-10.857 16-10.857 25.714s4 18.857 10.857 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-right"],"defaultCode":61609,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-right","id":125,"order":162,"prevSize":28,"code":61609},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M733.714 511.429c0-9.714-3.429-18.857-10.286-25.714l-258.857-258.857c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-258.857 258.857c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l52 52c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l108-108v286.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-286.857l108 108c6.857 6.857 16 10.857 25.714 10.857s18.857-4 25.714-10.857l52-52c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-up"],"defaultCode":61610,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-up","id":126,"order":163,"prevSize":28,"code":61610},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M733.714 512.571c0-9.714-3.429-18.857-10.286-25.714l-52-52c-6.857-6.857-16-10.286-25.714-10.286s-18.857 3.429-25.714 10.286l-108 108v-286.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v286.857l-108-108c-6.857-6.857-16-10.857-25.714-10.857s-18.857 4-25.714 10.857l-52 52c-6.857 6.857-10.286 16-10.286 25.714s3.429 18.857 10.286 25.714l258.857 258.857c6.857 6.857 16 10.286 25.714 10.286s18.857-3.429 25.714-10.286l258.857-258.857c6.857-6.857 10.286-16 10.286-25.714zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrow-circle-down"],"defaultCode":61611,"grid":14},"attrs":[],"properties":{"name":"arrow-circle-down","id":127,"order":164,"prevSize":28,"code":61611},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M219.429 841.143c0-20-16.571-36.571-36.571-36.571s-36.571 16.571-36.571 36.571 16.571 36.571 36.571 36.571 36.571-16.571 36.571-36.571zM587.429 601.143l-389.714 389.714c-13.143 13.143-32 21.143-51.429 21.143s-38.286-8-52-21.143l-60.571-61.714c-13.714-13.143-21.714-32-21.714-51.429s8-38.286 21.714-52l389.143-389.143c29.714 74.857 89.714 134.857 164.571 164.571zM949.714 352.571c0 18.857-6.857 42.286-13.143 60.571-36 101.714-133.714 172-241.714 172-141.143 0-256-114.857-256-256s114.857-256 256-256c41.714 0 96 12.571 130.857 36 5.714 4 9.143 9.143 9.143 16 0 6.286-4 12.571-9.143 16l-167.429 96.571v128l110.286 61.143c18.857-10.857 151.429-94.286 162.857-94.286s18.286 8.571 18.286 20z"],"width":961.6822857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["wrench"],"defaultCode":61613,"grid":14},"attrs":[],"properties":{"name":"wrench","id":128,"order":166,"prevSize":28,"code":61613},"setIdx":0,"setId":1,"iconIdx":139},{"icon":{"paths":["M585.143 804.571h365.714v-73.143h-365.714v73.143zM365.714 512h585.143v-73.143h-585.143v73.143zM731.429 219.429h219.429v-73.143h-219.429v73.143zM1024 694.857v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 402.286v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571zM1024 109.714v146.286c0 20-16.571 36.571-36.571 36.571h-950.857c-20 0-36.571-16.571-36.571-36.571v-146.286c0-20 16.571-36.571 36.571-36.571h950.857c20 0 36.571 16.571 36.571 36.571z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["tasks"],"defaultCode":61614,"grid":14},"attrs":[],"properties":{"name":"tasks","id":129,"order":167,"prevSize":28,"code":61614},"setIdx":0,"setId":1,"iconIdx":140},{"icon":{"paths":["M801.714 168.571c5.714 13.714 2.857 29.714-8 40l-281.714 281.714v424c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-146.286-146.286c-6.857-6.857-10.857-16-10.857-25.714v-277.714l-281.714-281.714c-10.857-10.286-13.714-26.286-8-40 5.714-13.143 18.857-22.286 33.714-22.286h731.429c14.857 0 28 9.143 33.714 22.286z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["filter"],"defaultCode":61616,"grid":14},"attrs":[],"properties":{"name":"filter","id":130,"order":168,"prevSize":28,"code":61616},"setIdx":0,"setId":1,"iconIdx":141},{"icon":{"paths":["M365.714 146.286h292.571v-73.143h-292.571v73.143zM1024 512v274.286c0 50.286-41.143 91.429-91.429 91.429h-841.143c-50.286 0-91.429-41.143-91.429-91.429v-274.286h384v91.429c0 20 16.571 36.571 36.571 36.571h182.857c20 0 36.571-16.571 36.571-36.571v-91.429h384zM585.143 512v73.143h-146.286v-73.143h146.286zM1024 237.714v219.429h-1024v-219.429c0-50.286 41.143-91.429 91.429-91.429h201.143v-91.429c0-30.286 24.571-54.857 54.857-54.857h329.143c30.286 0 54.857 24.571 54.857 54.857v91.429h201.143c50.286 0 91.429 41.143 91.429 91.429z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["briefcase"],"defaultCode":61617,"grid":14},"attrs":[],"properties":{"name":"briefcase","id":131,"order":169,"prevSize":28,"code":61617},"setIdx":0,"setId":1,"iconIdx":142},{"icon":{"paths":["M733.143 309.143l-202.857 202.857 202.857 202.857 82.286-82.286c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v256c0 20-16.571 36.571-36.571 36.571h-256c-14.857 0-28-9.143-33.714-22.857-5.714-13.143-2.857-29.143 8-39.429l82.286-82.286-202.857-202.857-202.857 202.857 82.286 82.286c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l82.286 82.286 202.857-202.857-202.857-202.857-82.286 82.286c-6.857 6.857-16 10.857-25.714 10.857-4.571 0-9.714-1.143-13.714-2.857-13.714-5.714-22.857-18.857-22.857-33.714v-256c0-20 16.571-36.571 36.571-36.571h256c14.857 0 28 9.143 33.714 22.857 5.714 13.143 2.857 29.143-8 39.429l-82.286 82.286 202.857 202.857 202.857-202.857-82.286-82.286c-10.857-10.286-13.714-26.286-8-39.429 5.714-13.714 18.857-22.857 33.714-22.857h256c20 0 36.571 16.571 36.571 36.571v256c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-4-25.714-10.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["arrows-alt"],"defaultCode":61618,"grid":14},"attrs":[],"properties":{"name":"arrows-alt","id":132,"order":170,"prevSize":28,"code":61618},"setIdx":0,"setId":1,"iconIdx":143},{"icon":{"paths":["M1097.143 658.286c0 121.143-98.286 219.429-219.429 219.429h-621.714c-141.143 0-256-114.857-256-256 0-102.286 60.571-190.857 147.429-231.429-0.571-8-1.143-16.571-1.143-24.571 0-161.714 130.857-292.571 292.571-292.571 122.286 0 226.857 74.857 270.857 181.714 25.143-22.286 58.286-35.429 94.857-35.429 80.571 0 146.286 65.714 146.286 146.286 0 29.143-8.571 56-23.429 78.857 97.143 22.857 169.714 109.714 169.714 213.714z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["cloud"],"defaultCode":61634,"grid":14},"attrs":[],"properties":{"name":"cloud","id":133,"order":173,"prevSize":28,"code":61634},"setIdx":0,"setId":1,"iconIdx":144},{"icon":{"paths":["M969.143 219.429c30.286 0 54.857 24.571 54.857 54.857v694.857c0 30.286-24.571 54.857-54.857 54.857h-548.571c-30.286 0-54.857-24.571-54.857-54.857v-164.571h-310.857c-30.286 0-54.857-24.571-54.857-54.857v-384c0-30.286 17.714-72.571 38.857-93.714l233.143-233.143c21.143-21.143 63.429-38.857 93.714-38.857h237.714c30.286 0 54.857 24.571 54.857 54.857v187.429c22.286-13.143 50.857-22.857 73.143-22.857h237.714zM658.286 341.143l-170.857 170.857h170.857v-170.857zM292.571 121.714l-170.857 170.857h170.857v-170.857zM404.571 491.429l180.571-180.571v-237.714h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h292.571v-146.286c0-30.286 17.714-72.571 38.857-93.714zM950.857 950.857v-658.286h-219.429v237.714c0 30.286-24.571 54.857-54.857 54.857h-237.714v365.714h512z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["copy","files-o"],"defaultCode":61637,"grid":14},"attrs":[],"properties":{"name":"copy, files-o","id":134,"order":176,"prevSize":28,"code":61637},"setIdx":0,"setId":1,"iconIdx":145},{"icon":{"paths":["M219.429 877.714h438.857v-219.429h-438.857v219.429zM731.429 877.714h73.143v-512c0-10.857-9.714-34.286-17.143-41.714l-160.571-160.571c-8-8-30.286-17.143-41.714-17.143v237.714c0 30.286-24.571 54.857-54.857 54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-73.143v731.429h73.143v-237.714c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857v237.714zM512 347.429v-182.857c0-9.714-8.571-18.286-18.286-18.286h-109.714c-9.714 0-18.286 8.571-18.286 18.286v182.857c0 9.714 8.571 18.286 18.286 18.286h109.714c9.714 0 18.286-8.571 18.286-18.286zM877.714 365.714v530.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-768c0-30.286 24.571-54.857 54.857-54.857h530.286c30.286 0 72 17.143 93.714 38.857l160 160c21.714 21.714 38.857 63.429 38.857 93.714z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["floppy-o","save"],"defaultCode":61639,"grid":14},"attrs":[],"properties":{"name":"floppy-o, save","id":135,"order":178,"prevSize":28,"code":61639},"setIdx":0,"setId":1,"iconIdx":146},{"icon":{"paths":["M877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["square"],"defaultCode":61640,"grid":14},"attrs":[],"properties":{"name":"square","id":136,"order":179,"prevSize":28,"code":61640},"setIdx":0,"setId":1,"iconIdx":147},{"icon":{"paths":["M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["bars","navicon","reorder"],"defaultCode":61641,"grid":14},"attrs":[],"properties":{"name":"bars, navicon, reorder","id":137,"order":180,"prevSize":28,"code":61641},"setIdx":0,"setId":1,"iconIdx":148},{"icon":{"paths":["M219.429 804.571c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM219.429 512c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM219.429 219.429c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-9.714 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8.571-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list-ul"],"defaultCode":61642,"grid":14},"attrs":[],"properties":{"name":"list-ul","id":138,"order":181,"prevSize":28,"code":61642},"setIdx":0,"setId":1,"iconIdx":149},{"icon":{"paths":["M217.714 925.714c0 62.857-49.143 98.286-108.571 98.286-36 0-72.571-12-98.286-37.714l32.571-50.286c15.429 14.286 38.857 25.714 60.571 25.714 20 0 41.143-9.714 41.143-32.571 0-32-36.571-33.714-60-32l-14.857-32c20.571-26.286 39.429-55.429 64-77.714v-0.571c-18.286 0-37.143 1.143-55.429 1.143v30.286h-60.571v-86.857h190.286v50.286l-54.286 65.714c38.286 9.143 63.429 38.857 63.429 78.286zM218.857 567.429v90.857h-206.857c-1.714-10.286-3.429-20.571-3.429-30.857 0-105.714 129.143-121.714 129.143-169.714 0-19.429-12-29.714-30.857-29.714-20 0-36.571 17.143-46.286 33.143l-48.571-33.714c18.857-39.429 57.714-61.714 101.143-61.714 53.143 0 98.857 31.429 98.857 88 0 84.571-124 103.429-125.714 148h72.571v-34.286h60zM1024 749.714v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM219.429 236v56.571h-191.429v-56.571h61.143c0-46.286 0.571-92.571 0.571-138.857v-6.857h-1.143c-6.286 12.571-17.714 21.143-28.571 30.857l-40.571-43.429 77.714-72.571h60.571v230.857h61.714zM1024 457.143v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8 18.286 18.286zM1024 164.571v109.714c0 9.714-8.571 18.286-18.286 18.286h-694.857c-10.286 0-18.286-8.571-18.286-18.286v-109.714c0-9.714 8-18.286 18.286-18.286h694.857c9.714 0 18.286 8.571 18.286 18.286z"],"width":1032.5577142857144,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["list-ol"],"defaultCode":61643,"grid":14},"attrs":[],"properties":{"name":"list-ol","id":139,"order":182,"prevSize":28,"code":61643},"setIdx":0,"setId":1,"iconIdx":150},{"icon":{"paths":["M292.571 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM292.571 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 786.286v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM585.143 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 566.857v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM877.714 347.429v-109.714c0-10.286-8-18.286-18.286-18.286h-182.857c-10.286 0-18.286 8-18.286 18.286v109.714c0 10.286 8 18.286 18.286 18.286h182.857c10.286 0 18.286-8 18.286-18.286zM950.857 164.571v621.714c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["table"],"defaultCode":61646,"grid":14},"attrs":[],"properties":{"name":"table","id":140,"order":185,"prevSize":28,"code":61646},"setIdx":0,"setId":1,"iconIdx":151},{"icon":{"paths":["M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-down"],"defaultCode":61655,"grid":14},"attrs":[],"properties":{"name":"caret-down","id":141,"order":193,"prevSize":28,"code":61655},"setIdx":0,"setId":1,"iconIdx":152},{"icon":{"paths":["M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-up"],"defaultCode":61656,"grid":14},"attrs":[],"properties":{"name":"caret-up","id":142,"order":194,"prevSize":28,"code":61656},"setIdx":0,"setId":1,"iconIdx":153},{"icon":{"paths":["M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":402.2857142857143,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-left"],"defaultCode":61657,"grid":14},"attrs":[],"properties":{"name":"caret-left","id":143,"order":195,"prevSize":28,"code":61657},"setIdx":0,"setId":1,"iconIdx":154},{"icon":{"paths":["M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":329.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["caret-right"],"defaultCode":61658,"grid":14},"attrs":[],"properties":{"name":"caret-right","id":144,"order":196,"prevSize":28,"code":61658},"setIdx":0,"setId":1,"iconIdx":155},{"icon":{"paths":["M91.429 877.714h347.429v-658.286h-365.714v640c0 9.714 8.571 18.286 18.286 18.286zM877.714 859.429v-640h-365.714v658.286h347.429c9.714 0 18.286-8.571 18.286-18.286zM950.857 164.571v694.857c0 50.286-41.143 91.429-91.429 91.429h-768c-50.286 0-91.429-41.143-91.429-91.429v-694.857c0-50.286 41.143-91.429 91.429-91.429h768c50.286 0 91.429 41.143 91.429 91.429z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["columns"],"defaultCode":61659,"grid":14},"attrs":[],"properties":{"name":"columns","id":145,"order":197,"prevSize":28,"code":61659},"setIdx":0,"setId":1,"iconIdx":156},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571zM585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sort","unsorted"],"defaultCode":61660,"grid":14},"attrs":[],"properties":{"name":"sort, unsorted","id":146,"order":198,"prevSize":28,"code":61660},"setIdx":0,"setId":1,"iconIdx":157},{"icon":{"paths":["M585.143 621.714c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sort-desc","sort-down"],"defaultCode":61661,"grid":14},"attrs":[],"properties":{"name":"sort-desc, sort-down","id":147,"order":199,"prevSize":28,"code":61661},"setIdx":0,"setId":1,"iconIdx":158},{"icon":{"paths":["M585.143 402.286c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["sort-asc","sort-up"],"defaultCode":61662,"grid":14},"attrs":[],"properties":{"name":"sort-asc, sort-up","id":148,"order":200,"prevSize":28,"code":61662},"setIdx":0,"setId":1,"iconIdx":159},{"icon":{"paths":["M877.714 512c0 241.714-197.143 438.857-438.857 438.857-130.857 0-254.286-57.714-337.714-158.286-5.714-7.429-5.143-18.286 1.143-24.571l78.286-78.857c4-3.429 9.143-5.143 14.286-5.143 5.143 0.571 10.286 2.857 13.143 6.857 56 72.571 140 113.714 230.857 113.714 161.143 0 292.571-131.429 292.571-292.571s-131.429-292.571-292.571-292.571c-74.857 0-145.714 28.571-198.857 78.286l78.286 78.857c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-256c-20 0-36.571-16.571-36.571-36.571v-256c0-14.857 9.143-28 22.857-33.714 13.143-5.714 29.143-2.857 39.429 8l74.286 73.714c80.571-76 189.714-121.143 302.286-121.143 241.714 0 438.857 197.143 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["rotate-left","undo"],"defaultCode":61666,"grid":14},"attrs":[],"properties":{"name":"rotate-left, undo","id":149,"order":203,"prevSize":28,"code":61666},"setIdx":0,"setId":1,"iconIdx":160},{"icon":{"paths":["M838.857 217.143c21.143 21.143 38.857 63.429 38.857 93.714v658.286c0 30.286-24.571 54.857-54.857 54.857h-768c-30.286 0-54.857-24.571-54.857-54.857v-914.286c0-30.286 24.571-54.857 54.857-54.857h512c30.286 0 72.571 17.714 93.714 38.857zM585.143 77.714v214.857h214.857c-3.429-9.714-8.571-19.429-12.571-23.429l-178.857-178.857c-4-4-13.714-9.143-23.429-12.571zM804.571 950.857v-585.143h-237.714c-30.286 0-54.857-24.571-54.857-54.857v-237.714h-438.857v877.714h731.429zM219.429 457.143c0-10.286 8-18.286 18.286-18.286h402.286c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571zM640 585.143c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286zM640 731.429c10.286 0 18.286 8 18.286 18.286v36.571c0 10.286-8 18.286-18.286 18.286h-402.286c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h402.286z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["file-text-o"],"defaultCode":61686,"grid":14},"attrs":[],"properties":{"name":"file-text-o","id":150,"order":222,"prevSize":28,"code":61686},"setIdx":0,"setId":1,"iconIdx":161},{"icon":{"paths":["M731.429 548.571v-73.143c0-20-16.571-36.571-36.571-36.571h-182.857v-182.857c0-20-16.571-36.571-36.571-36.571h-73.143c-20 0-36.571 16.571-36.571 36.571v182.857h-182.857c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h182.857v182.857c0 20 16.571 36.571 36.571 36.571h73.143c20 0 36.571-16.571 36.571-36.571v-182.857h182.857c20 0 36.571-16.571 36.571-36.571zM877.714 237.714v548.571c0 90.857-73.714 164.571-164.571 164.571h-548.571c-90.857 0-164.571-73.714-164.571-164.571v-548.571c0-90.857 73.714-164.571 164.571-164.571h548.571c90.857 0 164.571 73.714 164.571 164.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["plus-square"],"defaultCode":61694,"grid":14},"attrs":[],"properties":{"name":"plus-square","id":151,"order":230,"prevSize":28,"code":61694},"setIdx":0,"setId":1,"iconIdx":162},{"icon":{"paths":["M358.286 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143zM577.714 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":603.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-left"],"defaultCode":61696,"grid":14},"attrs":[],"properties":{"name":"angle-double-left","id":152,"order":231,"prevSize":28,"code":61696},"setIdx":0,"setId":1,"iconIdx":163},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM559.429 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":566.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-right"],"defaultCode":61697,"grid":14},"attrs":[],"properties":{"name":"angle-double-right","id":153,"order":232,"prevSize":28,"code":61697},"setIdx":0,"setId":1,"iconIdx":164},{"icon":{"paths":["M614.286 749.714c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 530.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-up"],"defaultCode":61698,"grid":14},"attrs":[],"properties":{"name":"angle-double-up","id":154,"order":233,"prevSize":28,"code":61698},"setIdx":0,"setId":1,"iconIdx":165},{"icon":{"paths":["M614.286 493.714c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143zM614.286 274.286c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-double-down"],"defaultCode":61699,"grid":14},"attrs":[],"properties":{"name":"angle-double-down","id":155,"order":234,"prevSize":28,"code":61699},"setIdx":0,"setId":1,"iconIdx":166},{"icon":{"paths":["M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z"],"width":384,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-left"],"defaultCode":61700,"grid":14},"attrs":[],"properties":{"name":"angle-left","id":156,"order":235,"prevSize":28,"code":61700},"setIdx":0,"setId":1,"iconIdx":167},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":347.4285714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-right"],"defaultCode":61701,"grid":14},"attrs":[],"properties":{"name":"angle-right","id":157,"order":236,"prevSize":28,"code":61701},"setIdx":0,"setId":1,"iconIdx":168},{"icon":{"paths":["M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-up"],"defaultCode":61702,"grid":14},"attrs":[],"properties":{"name":"angle-up","id":158,"order":237,"prevSize":28,"code":61702},"setIdx":0,"setId":1,"iconIdx":169},{"icon":{"paths":["M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658.2857142857142,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["angle-down"],"defaultCode":61703,"grid":14},"attrs":[],"properties":{"name":"angle-down","id":159,"order":238,"prevSize":28,"code":61703},"setIdx":0,"setId":1,"iconIdx":170},{"icon":{"paths":["M438.857 201.143c-171.429 0-310.857 139.429-310.857 310.857s139.429 310.857 310.857 310.857 310.857-139.429 310.857-310.857-139.429-310.857-310.857-310.857zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857v0c242.286 0 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["circle-o"],"defaultCode":61708,"grid":14},"attrs":[],"properties":{"name":"circle-o","id":160,"order":243,"prevSize":28,"code":61708},"setIdx":0,"setId":1,"iconIdx":171},{"icon":{"paths":["M300.571 796.571c0 40-32.571 73.143-73.143 73.143-40 0-73.143-33.143-73.143-73.143 0-40.571 33.143-73.143 73.143-73.143 40.571 0 73.143 32.571 73.143 73.143zM585.143 914.286c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM182.857 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM869.714 796.571c0 40-33.143 73.143-73.143 73.143-40.571 0-73.143-33.143-73.143-73.143 0-40.571 32.571-73.143 73.143-73.143 40 0 73.143 32.571 73.143 73.143zM318.857 227.429c0 50.286-41.143 91.429-91.429 91.429s-91.429-41.143-91.429-91.429 41.143-91.429 91.429-91.429 91.429 41.143 91.429 91.429zM987.429 512c0 40.571-32.571 73.143-73.143 73.143s-73.143-32.571-73.143-73.143 32.571-73.143 73.143-73.143 73.143 32.571 73.143 73.143zM621.714 109.714c0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714 49.143-109.714 109.714-109.714 109.714 49.143 109.714 109.714zM924.571 227.429c0 70.857-57.714 128-128 128-70.857 0-128-57.143-128-128 0-70.286 57.143-128 128-128 70.286 0 128 57.714 128 128z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["spinner"],"defaultCode":61712,"grid":14},"attrs":[],"properties":{"name":"spinner","id":161,"order":246,"prevSize":28,"code":61712},"setIdx":0,"setId":1,"iconIdx":172},{"icon":{"paths":["M877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["circle"],"defaultCode":61713,"grid":14},"attrs":[],"properties":{"name":"circle","id":162,"order":247,"prevSize":28,"code":61713},"setIdx":0,"setId":1,"iconIdx":173},{"icon":{"paths":["M1024 640c0 80-40 184.571-72.571 257.714-6.286 13.143-12.571 31.429-21.143 43.429-4 5.714-8 9.714-16 9.714-11.429 0-18.286-9.143-18.286-20 0-9.143 2.286-19.429 2.857-28.571 1.714-23.429 2.857-46.857 2.857-70.286 0-272.571-161.714-320-408-320h-128v146.286c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-292.571-292.571c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l292.571-292.571c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571v146.286h128c187.429 0 420.571 33.143 500 230.286 24 60.571 30.286 126.286 30.286 190.286z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["mail-reply","reply"],"defaultCode":61714,"grid":14},"attrs":[],"properties":{"name":"mail-reply, reply","id":163,"order":248,"prevSize":28,"code":61714},"setIdx":0,"setId":1,"iconIdx":174},{"icon":{"paths":["M877.714 749.714v-402.286c0-30.286-24.571-54.857-54.857-54.857h-402.286c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v548.571c0 30.286 24.571 54.857 54.857 54.857h694.857c30.286 0 54.857-24.571 54.857-54.857zM950.857 347.429v402.286c0 70.286-57.714 128-128 128h-694.857c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h384c70.286 0 128 57.714 128 128z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder-o"],"defaultCode":61716,"grid":14},"attrs":[],"properties":{"name":"folder-o","id":164,"order":250,"prevSize":28,"code":61716},"setIdx":0,"setId":1,"iconIdx":175},{"icon":{"paths":["M1017.714 532c0-16-17.714-20-30.286-20h-621.714c-30.286 0-70.286 18.857-89.714 42.286l-168 207.429c-5.143 6.857-10.286 14.286-10.286 22.857 0 16 17.714 20 30.286 20h621.714c30.286 0 70.286-18.857 89.714-42.857l168-207.429c5.143-6.286 10.286-13.714 10.286-22.286zM365.714 438.857h438.857v-91.429c0-30.286-24.571-54.857-54.857-54.857h-329.143c-30.286 0-54.857-24.571-54.857-54.857v-36.571c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v487.429l146.286-180c33.143-40.571 94.286-69.714 146.286-69.714zM1090.857 532c0 25.143-10.857 49.143-26.286 68.571l-168.571 207.429c-32.571 40-94.857 69.714-146.286 69.714h-621.714c-70.286 0-128-57.714-128-128v-548.571c0-70.286 57.714-128 128-128h182.857c70.286 0 128 57.714 128 128v18.286h310.857c70.286 0 128 57.714 128 128v91.429h109.714c38.857 0 77.714 17.714 94.857 54.286 5.714 12 8.571 25.143 8.571 38.857z"],"width":1090.8525714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["folder-open-o"],"defaultCode":61717,"grid":14},"attrs":[],"properties":{"name":"folder-open-o","id":165,"order":251,"prevSize":28,"code":61717},"setIdx":0,"setId":1,"iconIdx":176},{"icon":{"paths":["M219.429 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM292.571 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h128c5.143 0 9.143 4 9.143 9.143zM219.429 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-493.714c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h493.714c5.143 0 9.143 4 9.143 9.143zM438.857 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM365.714 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM585.143 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM512 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM731.429 521.143v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 667.429v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM658.286 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM804.571 374.857v54.857c0 5.143-4 9.143-9.143 9.143h-54.857c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM950.857 374.857v201.143c0 5.143-4 9.143-9.143 9.143h-128c-5.143 0-9.143-4-9.143-9.143v-54.857c0-5.143 4-9.143 9.143-9.143h64v-137.143c0-5.143 4-9.143 9.143-9.143h54.857c5.143 0 9.143 4 9.143 9.143zM1024 804.571v-512h-950.857v512h950.857zM1097.143 292.571v512c0 40.571-32.571 73.143-73.143 73.143h-950.857c-40.571 0-73.143-32.571-73.143-73.143v-512c0-40.571 32.571-73.143 73.143-73.143h950.857c40.571 0 73.143 32.571 73.143 73.143z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["keyboard-o"],"defaultCode":61724,"grid":14},"attrs":[],"properties":{"name":"keyboard-o","id":166,"order":256,"prevSize":28,"code":61724},"setIdx":0,"setId":1,"iconIdx":177},{"icon":{"paths":["M334.286 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286zM950.857 822.857v36.571c0 10.286-8 18.286-18.286 18.286h-548.571c-10.286 0-18.286-8-18.286-18.286v-36.571c0-10.286 8-18.286 18.286-18.286h548.571c10.286 0 18.286 8 18.286 18.286z"],"width":956.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["terminal"],"defaultCode":61728,"grid":14},"attrs":[],"properties":{"name":"terminal","id":167,"order":259,"prevSize":28,"code":61728},"setIdx":0,"setId":1,"iconIdx":178},{"icon":{"paths":["M352.571 799.429l-28.571 28.571c-7.429 7.429-18.857 7.429-26.286 0l-266.286-266.286c-7.429-7.429-7.429-18.857 0-26.286l266.286-266.286c7.429-7.429 18.857-7.429 26.286 0l28.571 28.571c7.429 7.429 7.429 18.857 0 26.286l-224.571 224.571 224.571 224.571c7.429 7.429 7.429 18.857 0 26.286zM690.286 189.714l-213.143 737.714c-2.857 9.714-13.143 15.429-22.286 12.571l-35.429-9.714c-9.714-2.857-15.429-13.143-12.571-22.857l213.143-737.714c2.857-9.714 13.143-15.429 22.286-12.571l35.429 9.714c9.714 2.857 15.429 13.143 12.571 22.857zM1065.714 561.714l-266.286 266.286c-7.429 7.429-18.857 7.429-26.286 0l-28.571-28.571c-7.429-7.429-7.429-18.857 0-26.286l224.571-224.571-224.571-224.571c-7.429-7.429-7.429-18.857 0-26.286l28.571-28.571c7.429-7.429 18.857-7.429 26.286 0l266.286 266.286c7.429 7.429 7.429 18.857 0 26.286z"],"width":1097.142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["code"],"defaultCode":61729,"grid":14},"attrs":[],"properties":{"name":"code","id":168,"order":684,"prevSize":28,"code":61729},"setIdx":0,"setId":1,"iconIdx":179},{"icon":{"paths":["M365.714 618.286v40c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v39.429l-226.857 227.429c-14.286 14.286-14.286 37.143 0 51.429zM1024 640c0 118.857-89.714 293.714-93.714 301.143-2.857 6.286-9.143 9.714-16 9.714-1.714 0-3.429 0-5.143-0.571-8.571-2.857-13.714-10.857-13.143-19.429 16.571-156-2.857-258.857-60.571-322.857-48.571-54.286-127.429-83.429-250.286-93.143v143.429c0 14.857-9.143 28-22.286 33.714-4.571 1.714-9.714 2.857-14.286 2.857-9.714 0-18.857-3.429-25.714-10.857l-292.571-292.571c-14.286-14.286-14.286-37.143 0-51.429l292.571-292.571c10.286-10.857 26.286-13.714 40-8 13.143 5.714 22.286 18.857 22.286 33.714v149.714c157.714 10.857 270.286 52.571 342.286 126.286 86.286 88.571 96.571 208.571 96.571 290.857z"],"width":1020.5622857142856,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["mail-reply-all","reply-all"],"defaultCode":61730,"grid":14},"attrs":[],"properties":{"name":"mail-reply-all, reply-all","id":169,"order":685,"prevSize":28,"code":61730},"setIdx":0,"setId":1,"iconIdx":180},{"icon":{"paths":["M677.714 546.857l146.857-142.857-241.143-35.429-17.143-34.286-90.857-184v550.286l33.714 17.714 181.714 96-34.286-202.857-6.857-37.714zM936 397.143l-207.429 202.286 49.143 285.714c4 25.143-5.143 40-22.857 40-6.286 0-14.286-2.286-22.857-6.857l-256.571-134.857-256.571 134.857c-8.571 4.571-16.571 6.857-22.857 6.857-17.714 0-26.857-14.857-22.857-40l49.143-285.714-208-202.286c-24.571-24.571-16.571-48.571 17.714-53.714l286.857-41.714 128.571-260c7.429-15.429 17.714-23.429 28-23.429v0c10.286 0 20 8 28 23.429l128.571 260 286.857 41.714c34.286 5.143 42.286 29.143 17.143 53.714z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["star-half-empty","star-half-full","star-half-o"],"defaultCode":61731,"grid":14},"attrs":[],"properties":{"name":"star-half-empty, star-half-full, star-half-o","id":170,"order":262,"prevSize":28,"code":61731},"setIdx":0,"setId":1,"iconIdx":181},{"icon":{"paths":["M318.286 731.429h340v-340zM292.571 705.714l340-340h-340v340zM950.857 749.714v109.714c0 10.286-8 18.286-18.286 18.286h-128v128c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-128h-493.714c-10.286 0-18.286-8-18.286-18.286v-493.714h-128c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h128v-128c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v128h486.286l140.571-141.143c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286l-141.143 140.571v486.286h128c10.286 0 18.286 8 18.286 18.286z"],"width":952.5394285714285,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["crop"],"defaultCode":61733,"grid":14},"attrs":[],"properties":{"name":"crop","id":171,"order":264,"prevSize":28,"code":61733},"setIdx":0,"setId":1,"iconIdx":182},{"icon":{"paths":["M164.571 841.143c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM164.571 182.857c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM530.286 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM585.143 256c0 40.571-22.286 76-54.857 94.857-1.714 206.286-148 252-245.143 282.857-90.857 28.571-120.571 42.286-120.571 97.714v14.857c32.571 18.857 54.857 54.286 54.857 94.857 0 60.571-49.143 109.714-109.714 109.714s-109.714-49.143-109.714-109.714c0-40.571 22.286-76 54.857-94.857v-468.571c-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714c0 40.571-22.286 76-54.857 94.857v284c29.143-14.286 60-24 88-32.571 106.286-33.714 166.857-58.857 168-178.286-32.571-18.857-54.857-54.286-54.857-94.857 0-60.571 49.143-109.714 109.714-109.714s109.714 49.143 109.714 109.714z"],"width":585.1428571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["code-fork"],"defaultCode":61734,"grid":14},"attrs":[],"properties":{"name":"code-fork","id":172,"order":265,"prevSize":28,"code":61734},"setIdx":0,"setId":1,"iconIdx":183},{"icon":{"paths":["M250.857 726.286l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286zM347.429 749.714v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM219.429 621.714c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM941.714 694.857c0 44-17.143 85.143-48.571 116l-84 83.429c-30.857 30.857-72 47.429-116 47.429s-85.714-17.143-116.571-48.571l-190.857-191.429c-9.714-9.714-17.143-20.571-24-32l136.571-10.286 156 156.571c20.571 20.571 57.143 21.143 77.714 0.571l84-83.429c10.286-10.286 16-24 16-38.286 0-14.857-5.714-28.571-16-38.857l-156.571-157.143 10.286-136.571c11.429 6.857 22.286 14.286 32 24l192 192c30.857 31.429 48 72.571 48 116.571zM589.143 281.143l-136.571 10.286-156-156.571c-10.286-10.286-24-16-38.857-16s-28.571 5.714-38.857 15.429l-84 83.429c-10.286 10.286-16 24-16 38.286 0 14.857 5.714 28.571 16 38.857l156.571 156.571-10.286 137.143c-11.429-6.857-22.286-14.286-32-24l-192-192c-30.857-31.429-48-72.571-48-116.571s17.143-85.143 48.571-116l84-83.429c30.857-30.857 72-47.429 116-47.429s85.714 17.143 116.571 48.571l190.857 191.429c9.714 9.714 17.143 20.571 24 32zM950.857 329.143c0 10.286-8 18.286-18.286 18.286h-182.857c-10.286 0-18.286-8-18.286-18.286s8-18.286 18.286-18.286h182.857c10.286 0 18.286 8 18.286 18.286zM640 18.286v182.857c0 10.286-8 18.286-18.286 18.286s-18.286-8-18.286-18.286v-182.857c0-10.286 8-18.286 18.286-18.286s18.286 8 18.286 18.286zM872.571 104.571l-146.286 146.286c-4 3.429-8.571 5.143-13.143 5.143s-9.143-1.714-13.143-5.143c-6.857-7.429-6.857-18.857 0-26.286l146.286-146.286c7.429-6.857 18.857-6.857 26.286 0 6.857 7.429 6.857 18.857 0 26.286z"],"width":950.8571428571428,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chain-broken","unlink"],"defaultCode":61735,"grid":14},"attrs":[],"properties":{"name":"chain-broken, unlink","id":173,"order":266,"prevSize":28,"code":61735},"setIdx":0,"setId":1,"iconIdx":184},{"icon":{"paths":["M511.999 960c-88.606 0-175.222-26.276-248.895-75.5-73.673-49.229-131.095-119.199-165.002-201.057-33.908-81.864-42.78-171.94-25.494-258.844s59.954-166.729 122.608-229.383c62.654-62.654 142.48-105.322 229.383-122.608s176.98-8.414 258.844 25.494c81.859 33.908 151.828 91.329 201.057 165.002 49.224 73.673 75.5 160.29 75.5 248.895 0 118.815-47.201 232.765-131.215 316.785-84.019 84.014-197.97 131.215-316.785 131.215zM511.999 128c-75.948 0-150.19 22.521-213.339 64.716s-112.367 102.167-141.431 172.334c-29.064 70.167-36.668 147.375-21.852 221.866 14.817 74.486 51.389 142.909 105.093 196.613s122.126 90.276 196.615 105.093c74.488 14.817 151.699 7.214 221.863-21.852 70.17-29.066 130.14-78.285 172.334-141.43 42.194-63.15 64.717-137.39 64.717-213.34 0-101.843-40.458-199.515-112.471-271.529s-169.687-112.471-271.529-112.471z","M495.999 352c26.511 0 48-21.49 48-48s-21.489-48-48-48c-26.51 0-48 21.49-48 48s21.49 48 48 48z","M671.999 704c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375h-256c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625s3.372-16.625 9.373-22.625c6.001-6.006 14.14-9.375 22.627-9.375h96v-192h-64c-8.487 0-16.626-3.372-22.627-9.373s-9.373-14.14-9.373-22.627c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373h96c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224h96c8.489 0 16.625 3.369 22.625 9.375 6.006 6.001 9.375 14.136 9.375 22.625z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["info"],"defaultCode":61737,"grid":14},"attrs":[],"properties":{"name":"info","id":174,"order":678,"prevSize":28,"code":61737},"setIdx":0,"setId":1,"iconIdx":185},{"icon":{"paths":["M917.119 944.34h-812.798c-5.469-0.020-10.84-1.444-15.602-4.137-4.762-2.688-8.755-6.554-11.598-11.223-2.809-4.864-4.287-10.383-4.287-16s1.479-11.136 4.287-16l406.4-799.999c2.685-5.242 6.765-9.64 11.79-12.712s10.8-4.697 16.688-4.697c5.893 0 11.668 1.625 16.691 4.697 5.028 3.072 9.103 7.471 11.791 12.712l406.4 799.999c2.806 4.864 4.285 10.383 4.285 16s-1.48 11.136-4.285 16c-3.057 5.059-7.46 9.175-12.713 11.884-5.253 2.714-11.151 3.917-17.050 3.476zM156.481 880.34h708.481l-354.243-697.279-354.238 697.279z","M510.709 816.34c26.511 0 48-21.489 48-48s-21.489-48-48-48c-26.51 0-48 21.489-48 48s21.49 48 48 48z","M510.709 656.34c-8.487 0-16.626-3.369-22.627-9.375-6.001-6.001-9.373-14.136-9.373-22.625v-224c0-8.487 3.372-16.626 9.373-22.627s14.14-9.373 22.627-9.373c8.489 0 16.625 3.372 22.625 9.373 6.006 6.001 9.375 14.14 9.375 22.627v224c0 8.489-3.369 16.625-9.375 22.625-6.001 6.006-14.136 9.375-22.625 9.375z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["exclamation"],"defaultCode":61738,"grid":14},"attrs":[],"properties":{"name":"exclamation","id":175,"order":268,"prevSize":28,"code":61738},"setIdx":0,"setId":1,"iconIdx":186},{"icon":{"paths":["M822.857 256c0-30.286-24.571-54.857-54.857-54.857s-54.857 24.571-54.857 54.857 24.571 54.857 54.857 54.857 54.857-24.571 54.857-54.857zM950.857 91.429c0 189.714-52.571 316-188 452-33.143 32.571-70.857 66.286-111.429 100.571l-11.429 216.571c-0.571 5.714-4 11.429-9.143 14.857l-219.429 128c-2.857 1.714-5.714 2.286-9.143 2.286-4.571 0-9.143-1.714-13.143-5.143l-36.571-36.571c-4.571-5.143-6.286-12-4.571-18.286l48.571-157.714-160.571-160.571-157.714 48.571c-1.714 0.571-3.429 0.571-5.143 0.571-4.571 0-9.714-1.714-13.143-5.143l-36.571-36.571c-5.714-6.286-6.857-15.429-2.857-22.286l128-219.429c3.429-5.143 9.143-8.571 14.857-9.143l216.571-11.429c34.286-40.571 68-78.286 100.571-111.429 142.857-142.286 252-188 450.857-188 10.286 0 19.429 8 19.429 18.286z"],"width":967.4605714285714,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["rocket"],"defaultCode":61749,"grid":14},"attrs":[],"properties":{"name":"rocket","id":176,"order":682,"prevSize":28,"code":61749},"setIdx":0,"setId":1,"iconIdx":187},{"icon":{"paths":["M997.143 441.714l-93.714 436h-190.857l101.714-475.429c4.571-20 1.714-38.286-8.571-50.286-9.714-12-26.857-18.857-47.429-18.857h-96.571l-116.571 544.571h-190.857l116.571-544.571h-163.429l-116.571 544.571h-190.857l116.571-544.571-87.429-186.857h729.143c77.143 0 147.429 32 192.571 88 45.714 56 62.286 132 46.286 207.429z"],"width":1013.1748571428571,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["maxcdn"],"defaultCode":61750,"grid":14},"attrs":[],"properties":{"name":"maxcdn","id":177,"order":683,"prevSize":28,"code":61750},"setIdx":0,"setId":1,"iconIdx":188},{"icon":{"paths":["M519.429 797.143l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-175.429-175.429 175.429-175.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-left"],"defaultCode":61751,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-left","id":178,"order":280,"prevSize":28,"code":61751},"setIdx":0,"setId":1,"iconIdx":189},{"icon":{"paths":["M409.714 797.143l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l175.429 175.429-175.429 175.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-right"],"defaultCode":61752,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-right","id":179,"order":281,"prevSize":28,"code":61752},"setIdx":0,"setId":1,"iconIdx":190},{"icon":{"paths":["M665.714 650.857l58.286-58.286c14.286-14.286 14.286-37.143 0-51.429l-259.429-259.429c-14.286-14.286-37.143-14.286-51.429 0l-259.429 259.429c-14.286 14.286-14.286 37.143 0 51.429l58.286 58.286c14.286 14.286 37.143 14.286 51.429 0l175.429-175.429 175.429 175.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-up"],"defaultCode":61753,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-up","id":180,"order":282,"prevSize":28,"code":61753},"setIdx":0,"setId":1,"iconIdx":191},{"icon":{"paths":["M464.571 742.286l259.429-259.429c14.286-14.286 14.286-37.143 0-51.429l-58.286-58.286c-14.286-14.286-37.143-14.286-51.429 0l-175.429 175.429-175.429-175.429c-14.286-14.286-37.143-14.286-51.429 0l-58.286 58.286c-14.286 14.286-14.286 37.143 0 51.429l259.429 259.429c14.286 14.286 37.143 14.286 51.429 0zM877.714 512c0 242.286-196.571 438.857-438.857 438.857s-438.857-196.571-438.857-438.857 196.571-438.857 438.857-438.857 438.857 196.571 438.857 438.857z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["chevron-circle-down"],"defaultCode":61754,"grid":14},"attrs":[],"properties":{"name":"chevron-circle-down","id":181,"order":283,"prevSize":28,"code":61754},"setIdx":0,"setId":1,"iconIdx":192},{"icon":{"paths":["M219.429 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM512 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857zM804.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-109.714c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h109.714c30.286 0 54.857 24.571 54.857 54.857z"],"width":804.5714285714286,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["ellipsis-h"],"defaultCode":61761,"grid":14},"attrs":[],"properties":{"name":"ellipsis-h","id":182,"order":289,"prevSize":28,"code":61761},"setIdx":0,"setId":1,"iconIdx":193},{"icon":{"paths":["M437.143 742.286c2.857 6.857 1.714 14.286-2.857 20l-200 219.429c-3.429 3.429-8 5.714-13.143 5.714v0c-5.143 0-10.286-2.286-13.714-5.714l-202.857-219.429c-4.571-5.714-5.714-13.143-2.857-20 2.857-6.286 9.143-10.857 16.571-10.857h128v-713.143c0-10.286 8-18.286 18.286-18.286h109.714c10.286 0 18.286 8 18.286 18.286v713.143h128c7.429 0 13.714 4 16.571 10.857z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-down"],"defaultCode":61813,"grid":14},"attrs":[],"properties":{"name":"long-arrow-down","id":183,"order":338,"prevSize":28,"code":61813},"setIdx":0,"setId":1,"iconIdx":194},{"icon":{"paths":["M437.143 281.714c-2.857 6.286-9.143 10.857-16.571 10.857h-128v713.143c0 10.286-8 18.286-18.286 18.286h-109.714c-10.286 0-18.286-8-18.286-18.286v-713.143h-128c-7.429 0-13.714-4-16.571-10.857s-1.714-14.286 2.857-20l200-219.429c3.429-3.429 8-5.714 13.143-5.714v0c5.143 0 10.286 2.286 13.714 5.714l202.857 219.429c4.571 5.714 5.714 13.143 2.857 20z"],"width":438.85714285714283,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-up"],"defaultCode":61814,"grid":14},"attrs":[],"properties":{"name":"long-arrow-up","id":184,"order":339,"prevSize":28,"code":61814},"setIdx":0,"setId":1,"iconIdx":195},{"icon":{"paths":["M1024 457.143v109.714c0 10.286-8 18.286-18.286 18.286h-713.143v128c0 7.429-4 13.714-10.857 16.571s-14.286 1.714-20-2.857l-219.429-200c-3.429-3.429-5.714-8-5.714-13.143v0c0-5.143 2.286-10.286 5.714-13.714l219.429-202.286c5.714-5.143 13.143-6.286 20-3.429 6.286 2.857 10.857 9.143 10.857 16.571v128h713.143c10.286 0 18.286 8 18.286 18.286z"],"width":1060.5714285714284,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-left"],"defaultCode":61815,"grid":14},"attrs":[],"properties":{"name":"long-arrow-left","id":185,"order":340,"prevSize":28,"code":61815},"setIdx":0,"setId":1,"iconIdx":196},{"icon":{"paths":["M987.429 510.286c0 5.143-2.286 10.286-5.714 13.714l-219.429 202.286c-5.714 5.143-13.143 6.286-20 3.429-6.286-2.857-10.857-9.143-10.857-16.571v-128h-713.143c-10.286 0-18.286-8-18.286-18.286v-109.714c0-10.286 8-18.286 18.286-18.286h713.143v-128c0-7.429 4-13.714 10.857-16.571s14.286-1.714 20 2.857l219.429 200c3.429 3.429 5.714 8 5.714 13.143v0z"],"width":987.4285714285713,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["long-arrow-right"],"defaultCode":61816,"grid":14},"attrs":[],"properties":{"name":"long-arrow-right","id":186,"order":341,"prevSize":28,"code":61816},"setIdx":0,"setId":1,"iconIdx":197},{"icon":{"paths":["M109.714 731.429v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 585.143v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 438.857v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 292.571v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM109.714 146.286v73.143h-64c-5.143 0-9.143-4-9.143-9.143v-9.143h-27.429c-5.143 0-9.143-4-9.143-9.143v-18.286c0-5.143 4-9.143 9.143-9.143h27.429v-9.143c0-5.143 4-9.143 9.143-9.143h64zM731.429 54.857v841.143c0 30.286-24.571 54.857-54.857 54.857h-475.429c-30.286 0-54.857-24.571-54.857-54.857v-841.143c0-30.286 24.571-54.857 54.857-54.857h475.429c30.286 0 54.857 24.571 54.857 54.857zM877.714 758.857v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 612.571v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 466.286v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 320v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143zM877.714 173.714v18.286c0 5.143-4 9.143-9.143 9.143h-27.429v9.143c0 5.143-4 9.143-9.143 9.143h-64v-73.143h64c5.143 0 9.143 4 9.143 9.143v9.143h27.429c5.143 0 9.143 4 9.143 9.143z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"colorPermutations":{"18919919916779841":[],"12714014111291321":[]},"tags":["microchip"],"defaultCode":62171,"grid":14},"attrs":[],"properties":{"name":"microchip","id":187,"order":693,"prevSize":28,"code":62171},"setIdx":0,"setId":1,"iconIdx":198}],"height":1024,"metadata":{"name":"FontAwesome"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"fa-","metadata":{"fontFamily":"FontAwesome","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"noie8":true,"ie7":false,"showSelector":false,"selector":"i","showMetrics":false,"showMetadata":false,"showVersion":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3cf6e2c6e..f717a4d9a 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -53,7 +53,6 @@ "@types/js-yaml": "^3.12.2", "@types/keytar": "^4.4.0", "@types/lodash.debounce": "^4.0.6", - "@types/ncp": "^2.0.4", "@types/node-fetch": "^2.5.7", "@types/p-queue": "^2.3.1", "@types/ps-tree": "^1.1.0", @@ -66,6 +65,7 @@ "auth0-js": "^9.14.0", "btoa": "^1.2.1", "classnames": "^2.3.1", + "cpy": "^8.1.2", "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", "deepmerge": "2.0.1", @@ -76,6 +76,7 @@ "glob": "^7.1.6", "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", + "is-online": "^9.0.1", "js-yaml": "^3.13.1", "jsonc-parser": "^2.2.0", "just-diff": "^5.1.1", @@ -83,7 +84,6 @@ "keytar": "7.2.0", "lodash.debounce": "^4.0.8", "minimatch": "^3.1.2", - "ncp": "^2.0.0", "node-fetch": "^2.6.1", "open": "^8.0.6", "p-debounce": "^2.1.0", @@ -120,6 +120,7 @@ "mocha": "^7.0.0", "mockdate": "^3.0.5", "moment": "^2.24.0", + "ncp": "^2.0.0", "protoc": "^1.0.4", "shelljs": "^0.8.3", "uuid": "^3.2.1", 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 73ed052e9..6c6b44a63 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -93,6 +93,8 @@ import { EditorCommandContribution as TheiaEditorCommandContribution } from '@th import { FrontendConnectionStatusService, ApplicationConnectionStatusContribution, + DaemonPort, + IsOnline, } from './theia/core/connection-status-service'; import { FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, @@ -353,6 +355,7 @@ import { CreateFeatures } from './create/create-features'; import { Account } from './contributions/account'; import { SidebarBottomMenuWidget } from './theia/core/sidebar-bottom-menu-widget'; import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget'; +import { CreateCloudCopy } from './contributions/create-cloud-copy'; export default new ContainerModule((bind, unbind, isBound, rebind) => { // Commands and toolbar items @@ -741,6 +744,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, ValidateSketch); Contribution.configure(bind, RenameCloudSketch); Contribution.configure(bind, Account); + Contribution.configure(bind, CloudSketchbookContribution); + Contribution.configure(bind, CreateCloudCopy); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window @@ -919,8 +924,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(CreateFsProvider).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(CreateFsProvider); bind(FileServiceContribution).toService(CreateFsProvider); - bind(CloudSketchbookContribution).toSelf().inSingletonScope(); - bind(CommandContribution).toService(CloudSketchbookContribution); bind(LocalCacheFsProvider).toSelf().inSingletonScope(); bind(FileServiceContribution).toService(LocalCacheFsProvider); bind(CloudSketchbookCompositeWidget).toSelf(); @@ -1026,4 +1029,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(TheiaSidebarBottomMenuWidget).toService(SidebarBottomMenuWidget); bind(ArduinoComponentContextMenuRenderer).toSelf().inSingletonScope(); + + bind(DaemonPort).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(DaemonPort); + bind(IsOnline).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(IsOnline); }); diff --git a/arduino-ide-extension/src/browser/contributions/account.ts b/arduino-ide-extension/src/browser/contributions/account.ts index cb82229ad..a8f728de2 100644 --- a/arduino-ide-extension/src/browser/contributions/account.ts +++ b/arduino-ide-extension/src/browser/contributions/account.ts @@ -8,6 +8,7 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { CloudUserCommands, LEARN_MORE_URL } from '../auth/cloud-user-commands'; import { CreateFeatures } from '../create/create-features'; import { ArduinoMenus } from '../menu/arduino-menus'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; import { Command, CommandRegistry, @@ -29,6 +30,8 @@ export class Account extends Contribution { private readonly windowService: WindowService; @inject(CreateFeatures) private readonly createFeatures: CreateFeatures; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; private readonly toDispose = new DisposableCollection(); private app: FrontendApplication; @@ -50,21 +53,28 @@ export class Account extends Contribution { override registerCommands(registry: CommandRegistry): void { const openExternal = (url: string) => this.windowService.openNewWindow(url, { external: true }); + const loggedIn = () => Boolean(this.createFeatures.session); + const loggedInWithInternetConnection = () => + loggedIn() && this.connectionStatus.offlineStatus !== 'internet'; registry.registerCommand(Account.Commands.LEARN_MORE, { execute: () => openExternal(LEARN_MORE_URL), - isEnabled: () => !Boolean(this.createFeatures.session), + isEnabled: () => !loggedIn(), + isVisible: () => !loggedIn(), }); registry.registerCommand(Account.Commands.GO_TO_PROFILE, { execute: () => openExternal('https://id.arduino.cc/'), - isEnabled: () => Boolean(this.createFeatures.session), + isEnabled: () => loggedInWithInternetConnection(), + isVisible: () => loggedIn(), }); registry.registerCommand(Account.Commands.GO_TO_CLOUD_EDITOR, { execute: () => openExternal('https://create.arduino.cc/editor'), - isEnabled: () => Boolean(this.createFeatures.session), + isEnabled: () => loggedInWithInternetConnection(), + isVisible: () => loggedIn(), }); registry.registerCommand(Account.Commands.GO_TO_IOT_CLOUD, { execute: () => openExternal('https://create.arduino.cc/iot/'), - isEnabled: () => Boolean(this.createFeatures.session), + isEnabled: () => loggedInWithInternetConnection(), + isVisible: () => loggedIn(), }); } diff --git a/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts b/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts index c13abd89c..47e14210d 100644 --- a/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/cloud-contribution.ts @@ -93,7 +93,7 @@ export abstract class CloudSketchContribution extends SketchContribution { ); } try { - await treeModel.sketchbookTree().pull({ node }); + await treeModel.sketchbookTree().pull({ node }, true); return node; } catch (err) { if (isNotFound(err)) { diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 3260ab7b9..c53bac1ff 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -14,7 +14,6 @@ import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { MessageService } from '@theia/core/lib/common/message-service'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { open, OpenerService } from '@theia/core/lib/browser/opener-service'; - import { MenuModelRegistry, MenuContribution, @@ -58,7 +57,7 @@ import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; import { ExecuteWithProgress } from '../../common/protocol/progressible'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { BoardsDataStore } from '../boards/boards-data-store'; -import { NotificationManager } from '../theia/messages/notifications-manager'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; import { MessageType } from '@theia/core/lib/common/message-service-protocol'; import { WorkspaceService } from '../theia/workspace/workspace-service'; import { MainMenuManager } from '../../common/main-menu-manager'; @@ -295,7 +294,7 @@ export abstract class CoreServiceContribution extends SketchContribution { } private notificationId(message: string, ...actions: string[]): string { - return this.notificationManager.getMessageId({ + return this.notificationManager['getMessageId']({ text: message, actions, type: MessageType.Error, diff --git a/arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts b/arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts new file mode 100644 index 000000000..73b967f0f --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/create-cloud-copy.ts @@ -0,0 +1,118 @@ +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { ApplicationShell } from '@theia/core/lib/browser/shell'; +import type { Command, CommandRegistry } from '@theia/core/lib/common/command'; +import { Progress } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Create } from '../create/typings'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; +import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; +import { SketchbookTree } from '../widgets/sketchbook/sketchbook-tree'; +import { SketchbookTreeModel } from '../widgets/sketchbook/sketchbook-tree-model'; +import { CloudSketchContribution, pushingSketch } from './cloud-contribution'; +import { + CreateNewCloudSketchCallback, + NewCloudSketch, + NewCloudSketchParams, +} from './new-cloud-sketch'; +import { saveOntoCopiedSketch } from './save-as-sketch'; + +interface CreateCloudCopyParams { + readonly model: SketchbookTreeModel; + readonly node: SketchbookTree.SketchDirNode; +} +function isCreateCloudCopyParams(arg: unknown): arg is CreateCloudCopyParams { + return ( + typeof arg === 'object' && + (<CreateCloudCopyParams>arg).model !== undefined && + (<CreateCloudCopyParams>arg).model instanceof SketchbookTreeModel && + (<CreateCloudCopyParams>arg).node !== undefined && + SketchbookTree.SketchDirNode.is((<CreateCloudCopyParams>arg).node) + ); +} + +@injectable() +export class CreateCloudCopy extends CloudSketchContribution { + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + + private shell: ApplicationShell; + + override onStart(app: FrontendApplication): void { + this.shell = app.shell; + } + + override registerCommands(registry: CommandRegistry): void { + registry.registerCommand(CreateCloudCopy.Commands.CREATE_CLOUD_COPY, { + execute: (args: CreateCloudCopyParams) => this.createCloudCopy(args), + isEnabled: (args: unknown) => + Boolean(this.createFeatures.session) && isCreateCloudCopyParams(args), + isVisible: (args: unknown) => + Boolean(this.createFeatures.enabled) && + Boolean(this.createFeatures.session) && + this.connectionStatus.offlineStatus !== 'internet' && + isCreateCloudCopyParams(args), + }); + } + + /** + * - creates new cloud sketch with the name of the params sketch, + * - pulls the cloud sketch, + * - copies files from params sketch to pulled cloud sketch in the cache folder, + * - pushes the cloud sketch, and + * - opens in new window. + */ + private async createCloudCopy(params: CreateCloudCopyParams): Promise<void> { + const sketch = await this.sketchesService.loadSketch( + params.node.fileStat.resource.toString() + ); + const callback: CreateNewCloudSketchCallback = async ( + newSketch: Create.Sketch, + newNode: CloudSketchbookTree.CloudSketchDirNode, + progress: Progress + ) => { + const treeModel = await this.treeModel(); + if (!treeModel) { + throw new Error('Could not retrieve the cloud sketchbook tree model.'); + } + + progress.report({ + message: nls.localize( + 'arduino/createCloudCopy/copyingSketchFilesMessage', + 'Copying local sketch files...' + ), + }); + const localCacheFolderUri = newNode.uri.toString(); + await this.sketchesService.copy(sketch, { + destinationUri: localCacheFolderUri, + onlySketchFiles: true, + }); + await saveOntoCopiedSketch( + sketch, + localCacheFolderUri, + this.shell, + this.editorManager + ); + + progress.report({ message: pushingSketch(newSketch.name) }); + await treeModel.sketchbookTree().push(newNode, true, true); + }; + return this.commandService.executeCommand( + NewCloudSketch.Commands.NEW_CLOUD_SKETCH.id, + <NewCloudSketchParams>{ + initialValue: params.node.fileStat.name, + callback, + skipShowErrorMessageOnOpen: false, + } + ); + } +} + +export namespace CreateCloudCopy { + export namespace Commands { + export const CREATE_CLOUD_COPY: Command = { + id: 'arduino-create-cloud-copy', + iconClass: 'fa fa-arduino-cloud-upload', + }; + } +} diff --git a/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts index 4d449b121..d165c4779 100644 --- a/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/new-cloud-sketch.ts @@ -6,7 +6,7 @@ import { Progress } from '@theia/core/lib/common/message-service-protocol'; import { nls } from '@theia/core/lib/common/nls'; import { injectable } from '@theia/core/shared/inversify'; import { CreateUri } from '../create/create-uri'; -import { isConflict } from '../create/typings'; +import { Create, isConflict } from '../create/typings'; import { ArduinoMenus } from '../menu/arduino-menus'; import { TaskFactoryImpl, @@ -15,13 +15,36 @@ import { import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree'; import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model'; import { SketchbookCommands } from '../widgets/sketchbook/sketchbook-commands'; -import { Command, CommandRegistry, Sketch } from './contribution'; import { CloudSketchContribution, pullingSketch, sketchAlreadyExists, synchronizingSketchbook, } from './cloud-contribution'; +import { Command, CommandRegistry, Sketch } from './contribution'; + +export interface CreateNewCloudSketchCallback { + ( + newSketch: Create.Sketch, + newNode: CloudSketchbookTree.CloudSketchDirNode, + progress: Progress + ): Promise<void>; +} + +export interface NewCloudSketchParams { + /** + * Value to populate the dialog `<input>` when it opens. + */ + readonly initialValue?: string | undefined; + /** + * Additional callback to call when the new cloud sketch has been created. + */ + readonly callback?: CreateNewCloudSketchCallback; + /** + * If `true`, the validation error message will not be visible in the input dialog, but the `OK` button will be disabled. Defaults to `true`. + */ + readonly skipShowErrorMessageOnOpen?: boolean; +} @injectable() export class NewCloudSketch extends CloudSketchContribution { @@ -43,7 +66,12 @@ export class NewCloudSketch extends CloudSketchContribution { override registerCommands(registry: CommandRegistry): void { registry.registerCommand(NewCloudSketch.Commands.NEW_CLOUD_SKETCH, { - execute: () => this.createNewSketch(true), + execute: (params: NewCloudSketchParams) => + this.createNewSketch( + params?.skipShowErrorMessageOnOpen === false ? false : true, + params?.initialValue, + params?.callback + ), isEnabled: () => Boolean(this.createFeatures.session), isVisible: () => this.createFeatures.enabled, }); @@ -66,7 +94,8 @@ export class NewCloudSketch extends CloudSketchContribution { private async createNewSketch( skipShowErrorMessageOnOpen: boolean, - initialValue?: string | undefined + initialValue?: string | undefined, + callback?: CreateNewCloudSketchCallback ): Promise<void> { const treeModel = await this.treeModel(); if (treeModel) { @@ -75,7 +104,8 @@ export class NewCloudSketch extends CloudSketchContribution { rootNode, treeModel, skipShowErrorMessageOnOpen, - initialValue + initialValue, + callback ); } } @@ -84,13 +114,14 @@ export class NewCloudSketch extends CloudSketchContribution { rootNode: CompositeTreeNode, treeModel: CloudSketchbookTreeModel, skipShowErrorMessageOnOpen: boolean, - initialValue?: string | undefined + initialValue?: string | undefined, + callback?: CreateNewCloudSketchCallback ): Promise<void> { const existingNames = rootNode.children .filter(CloudSketchbookTree.CloudSketchDirNode.is) .map(({ fileStat }) => fileStat.name); const taskFactory = new TaskFactoryImpl((value) => - this.createNewSketchWithProgress(treeModel, value) + this.createNewSketchWithProgress(treeModel, value, callback) ); try { const dialog = new WorkspaceInputDialogWithProgress( @@ -118,7 +149,11 @@ export class NewCloudSketch extends CloudSketchContribution { } catch (err) { if (isConflict(err)) { await treeModel.refresh(); - return this.createNewSketch(false, taskFactory.value ?? initialValue); + return this.createNewSketch( + false, + taskFactory.value ?? initialValue, + callback + ); } throw err; } @@ -126,7 +161,8 @@ export class NewCloudSketch extends CloudSketchContribution { private createNewSketchWithProgress( treeModel: CloudSketchbookTreeModel, - value: string + value: string, + callback?: CreateNewCloudSketchCallback ): ( progress: Progress ) => Promise<CloudSketchbookTree.CloudSketchDirNode | undefined> { @@ -143,6 +179,9 @@ export class NewCloudSketch extends CloudSketchContribution { await treeModel.refresh(); progress.report({ message: pullingSketch(sketch.name) }); const node = await this.pull(sketch); + if (callback && node) { + await callback(sketch, node, progress); + } return node; }; } @@ -152,7 +191,7 @@ export class NewCloudSketch extends CloudSketchContribution { ): Promise<void> { return this.commandService.executeCommand( SketchbookCommands.OPEN_NEW_WINDOW.id, - { node } + { node, treeWidgetId: 'cloud-sketchbook-composite-widget' } ); } } diff --git a/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts b/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts index faed8d070..5cee63f0e 100644 --- a/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/rename-cloud-sketch.ts @@ -123,7 +123,7 @@ export class RenameCloudSketch extends CloudSketchContribution { const toPosixPath = params.cloudUri.parent.resolve(value).path.toString(); // push progress.report({ message: pushingSketch(params.sketch.name) }); - await treeModel.sketchbookTree().push(node); + await treeModel.sketchbookTree().push(node, true); // rename progress.report({ 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 82fcec530..e57f16191 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -6,6 +6,7 @@ import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shel import { WindowService } from '@theia/core/lib/browser/window/window-service'; 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 { ArduinoMenus } from '../menu/arduino-menus'; @@ -28,7 +29,7 @@ import { @injectable() export class SaveAsSketch extends CloudSketchContribution { @inject(ApplicationShell) - private readonly applicationShell: ApplicationShell; + private readonly shell: ApplicationShell; @inject(WindowService) private readonly windowService: WindowService; @@ -80,14 +81,17 @@ export class SaveAsSketch extends CloudSketchContribution { return false; } - const newWorkspaceUri = await this.sketchesService.copy(sketch, { + const copiedSketch = await this.sketchesService.copy(sketch, { destinationUri, }); - if (!newWorkspaceUri) { - return false; - } + const newWorkspaceUri = copiedSketch.uri; - await this.saveOntoCopiedSketch(sketch, newWorkspaceUri); + await saveOntoCopiedSketch( + sketch, + newWorkspaceUri, + this.shell, + this.editorManager + ); if (markAsRecentlyOpened) { this.sketchesService.markAsRecentlyOpened(newWorkspaceUri); } @@ -238,53 +242,6 @@ ${dialogContent.question}`.trim(); } return sketchFolderDestinationUri; } - - private async saveOntoCopiedSketch( - sketch: Sketch, - newSketchFolderUri: string - ): Promise<void> { - const widgets = this.applicationShell.widgets; - const snapshots = new Map<string, Saveable.Snapshot>(); - for (const widget of widgets) { - const saveable = Saveable.getDirty(widget); - const uri = NavigatableWidget.getUri(widget); - if (!uri) { - continue; - } - const uriString = uri.toString(); - let relativePath: string; - if ( - uriString.includes(sketch.uri) && - saveable && - saveable.createSnapshot - ) { - // The main file will change its name during the copy process - // We need to store the new name in the map - if (sketch.mainFileUri === uriString) { - const lastPart = new URI(newSketchFolderUri).path.base + uri.path.ext; - relativePath = '/' + lastPart; - } else { - relativePath = uri.toString().substring(sketch.uri.length); - } - snapshots.set(relativePath, saveable.createSnapshot()); - } - } - await Promise.all( - Array.from(snapshots.entries()).map(async ([path, snapshot]) => { - const widgetUri = new URI(newSketchFolderUri + path); - try { - const widget = await this.editorManager.getOrCreateByUri(widgetUri); - const saveable = Saveable.get(widget); - if (saveable && saveable.applySnapshot) { - saveable.applySnapshot(snapshot); - await saveable.save(); - } - } catch (e) { - console.error(e); - } - }) - ); - } } interface InvalidSketchFolderDialogContent { @@ -317,3 +274,48 @@ export namespace SaveAsSketch { }; } } + +export async function saveOntoCopiedSketch( + sketch: Sketch, + newSketchFolderUri: string, + shell: ApplicationShell, + editorManager: EditorManager +): Promise<void> { + const widgets = shell.widgets; + const snapshots = new Map<string, Saveable.Snapshot>(); + for (const widget of widgets) { + const saveable = Saveable.getDirty(widget); + const uri = NavigatableWidget.getUri(widget); + if (!uri) { + continue; + } + const uriString = uri.toString(); + let relativePath: string; + if (uriString.includes(sketch.uri) && saveable && saveable.createSnapshot) { + // The main file will change its name during the copy process + // We need to store the new name in the map + if (sketch.mainFileUri === uriString) { + const lastPart = new URI(newSketchFolderUri).path.base + uri.path.ext; + relativePath = '/' + lastPart; + } else { + relativePath = uri.toString().substring(sketch.uri.length); + } + snapshots.set(relativePath, saveable.createSnapshot()); + } + } + await Promise.all( + Array.from(snapshots.entries()).map(async ([path, snapshot]) => { + const widgetUri = new URI(newSketchFolderUri + path); + try { + const widget = await editorManager.getOrCreateByUri(widgetUri); + const saveable = Saveable.get(widget); + if (saveable && saveable.applySnapshot) { + saveable.applySnapshot(snapshot); + await saveable.save(); + } + } catch (e) { + console.error(e); + } + }) + ); +} diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 4c988f5df..72c27cbb0 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -2,7 +2,7 @@ import { MaybePromise } from '@theia/core/lib/common/types'; import { inject, injectable } from '@theia/core/shared/inversify'; import { fetch } from 'cross-fetch'; import { SketchesService } from '../../common/protocol'; -import { unit8ArrayToString } from '../../common/utils'; +import { uint8ArrayToString } from '../../common/utils'; import { ArduinoPreferences } from '../arduino-preferences'; import { AuthenticationClientService } from '../auth/authentication-client-service'; import { SketchCache } from '../widgets/cloud-sketchbook/cloud-sketch-cache'; @@ -10,11 +10,11 @@ import * as createPaths from './create-paths'; import { posix } from './create-paths'; import { Create, CreateError } from './typings'; -export interface ResponseResultProvider { +interface ResponseResultProvider { // eslint-disable-next-line @typescript-eslint/no-explicit-any (response: Response): Promise<any>; } -export namespace ResponseResultProvider { +namespace ResponseResultProvider { export const NOOP: ResponseResultProvider = async () => undefined; export const TEXT: ResponseResultProvider = (response) => response.text(); export const JSON: ResponseResultProvider = (response) => response.json(); @@ -288,10 +288,9 @@ export class CreateApi { if (sketch) { const url = new URL(`${this.domain()}/sketches/${sketch.id}`); const headers = await this.headers(); - // parse the secret file const secrets = ( - typeof content === 'string' ? content : unit8ArrayToString(content) + typeof content === 'string' ? content : uint8ArrayToString(content) ) .split(/\r?\n/) .reduce((prev, curr) => { @@ -355,7 +354,7 @@ export class CreateApi { const headers = await this.headers(); let data: string = - typeof content === 'string' ? content : unit8ArrayToString(content); + typeof content === 'string' ? content : uint8ArrayToString(content); data = await this.toggleSecretsInclude(posixPath, data, 'remove'); const payload = { data: btoa(data) }; diff --git a/arduino-ide-extension/src/browser/create/create-features.ts b/arduino-ide-extension/src/browser/create/create-features.ts index bb61de5b5..befce589d 100644 --- a/arduino-ide-extension/src/browser/create/create-features.ts +++ b/arduino-ide-extension/src/browser/create/create-features.ts @@ -8,6 +8,9 @@ import { AuthenticationSession } from '../../node/auth/types'; import { ArduinoPreferences } from '../arduino-preferences'; import { AuthenticationClientService } from '../auth/authentication-client-service'; import { LocalCacheFsProvider } from '../local-cache/local-cache-fs-provider'; +import { CreateUri } from './create-uri'; + +export type CloudSketchState = 'push' | 'pull'; @injectable() export class CreateFeatures implements FrontendApplicationContribution { @@ -18,13 +21,22 @@ export class CreateFeatures implements FrontendApplicationContribution { @inject(LocalCacheFsProvider) private readonly localCacheFsProvider: LocalCacheFsProvider; + /** + * The keys are the Create URI of the sketches. + */ + private readonly _cloudSketchStates = new Map<string, CloudSketchState>(); private readonly onDidChangeSessionEmitter = new Emitter< AuthenticationSession | undefined >(); private readonly onDidChangeEnabledEmitter = new Emitter<boolean>(); + private readonly onDidChangeCloudSketchStateEmitter = new Emitter<{ + uri: URI; + state: CloudSketchState | undefined; + }>(); private readonly toDispose = new DisposableCollection( this.onDidChangeSessionEmitter, - this.onDidChangeEnabledEmitter + this.onDidChangeEnabledEmitter, + this.onDidChangeCloudSketchStateEmitter ); private _enabled: boolean; private _session: AuthenticationSession | undefined; @@ -64,14 +76,46 @@ export class CreateFeatures implements FrontendApplicationContribution { return this.onDidChangeEnabledEmitter.event; } - get enabled(): boolean { - return this._enabled; + get onDidChangeCloudSketchState(): Event<{ + uri: URI; + state: CloudSketchState | undefined; + }> { + return this.onDidChangeCloudSketchStateEmitter.event; } get session(): AuthenticationSession | undefined { return this._session; } + get enabled(): boolean { + return this._enabled; + } + + cloudSketchState(uri: URI): CloudSketchState | undefined { + return this._cloudSketchStates.get(uri.toString()); + } + + setCloudSketchState(uri: URI, state: CloudSketchState | undefined): void { + if (uri.scheme !== CreateUri.scheme) { + throw new Error( + `Expected a URI with '${uri.scheme}' scheme. Got: ${uri.toString()}` + ); + } + const key = uri.toString(); + if (!state) { + if (!this._cloudSketchStates.delete(key)) { + console.warn( + `Could not reset the cloud sketch state of ${key}. No state existed for the the cloud sketch.` + ); + } else { + this.onDidChangeCloudSketchStateEmitter.fire({ uri, state: undefined }); + } + } else { + this._cloudSketchStates.set(key, state); + this.onDidChangeCloudSketchStateEmitter.fire({ uri, state }); + } + } + /** * `true` if the sketch is under `directories.data/RemoteSketchbook`. Otherwise, `false`. * Returns with `undefined` if `dataDirUri` is `undefined`. @@ -83,7 +127,10 @@ export class CreateFeatures implements FrontendApplicationContribution { ); return undefined; } - return dataDirUri.isEqualOrParent(new URI(sketch.uri)); + return dataDirUri + .resolve('RemoteSketchbook') + .resolve('ArduinoCloud') + .isEqualOrParent(new URI(sketch.uri)); } cloudUri(sketch: Sketch): URI | undefined { diff --git a/arduino-ide-extension/src/browser/style/pull-sketch-icon.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-download.svg similarity index 100% rename from arduino-ide-extension/src/browser/style/pull-sketch-icon.svg rename to arduino-ide-extension/src/browser/icons/arduino-cloud-download.svg diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg new file mode 100644 index 000000000..b86bb5209 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled-offline.svg @@ -0,0 +1,4 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M13.355 3.85509L2.85504 14.3551C2.76026 14.448 2.63281 14.5001 2.50006 14.5001C2.36731 14.5001 2.23986 14.448 2.14508 14.3551C2.0514 14.2607 1.99882 14.1331 1.99882 14.0001C1.99882 13.8671 2.0514 13.7395 2.14508 13.6451L3.82508 11.9651C3.24351 11.8742 2.70645 11.5991 2.29291 11.1802C1.87936 10.7613 1.61116 10.2208 1.52775 9.63811C1.44434 9.05543 1.55012 8.46136 1.82955 7.94328C2.10897 7.4252 2.54728 7.01047 3.08 6.76009C3.20492 6.18251 3.47405 5.64596 3.86232 5.20047C4.25058 4.75498 4.74532 4.41505 5.30042 4.21239C5.85552 4.00972 6.45289 3.9509 7.03686 4.04143C7.62082 4.13196 8.17236 4.36887 8.64004 4.73009C9.01346 4.56809 9.41786 4.48995 9.82475 4.50117C10.2316 4.51239 10.6311 4.6127 10.995 4.79503L12.645 3.14509C12.7392 3.05094 12.8669 2.99805 13 2.99805C13.1332 2.99805 13.2609 3.05094 13.355 3.14509C13.4492 3.23924 13.5021 3.36694 13.5021 3.50009C13.5021 3.63324 13.4492 3.76094 13.355 3.85509V3.85509Z" fill="#7F8C8D"/> +<path d="M14.5 9.25047C14.4987 9.97942 14.2086 10.6782 13.6931 11.1936C13.1777 11.709 12.479 11.9992 11.75 12.0005H6.70996L12.355 6.35547C12.38 6.43042 12.4 6.50547 12.4201 6.58044C13.0153 6.72902 13.5436 7.07272 13.9206 7.55669C14.2976 8.04066 14.5016 8.63699 14.5 9.25047V9.25047Z" fill="#7F8C8D"/> +</svg> diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg new file mode 100644 index 000000000..e51c12063 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud-filled.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M14.5 9.24997C14.4987 9.97893 14.2086 10.6777 13.6932 11.1931C13.1777 11.7086 12.479 11.9987 11.75 12H4.25003C3.62476 11.9998 3.01822 11.7866 2.53034 11.3955C2.04247 11.0045 1.70238 10.4589 1.56612 9.84864C1.42986 9.2384 1.50556 8.59995 1.78074 8.0385C2.05593 7.47705 2.51418 7.0261 3.07998 6.75997C3.2049 6.18239 3.47404 5.64584 3.8623 5.20035C4.25056 4.75486 4.74531 4.41494 5.3004 4.21227C5.8555 4.0096 6.45288 3.95078 7.03684 4.04131C7.62081 4.13184 8.17234 4.36875 8.64003 4.72997C8.99025 4.57772 9.36814 4.49942 9.75003 4.49997C10.3635 4.49838 10.9598 4.70238 11.4438 5.07939C11.9278 5.45641 12.2715 5.9847 12.4201 6.57993C13.0153 6.7285 13.5436 7.07221 13.9206 7.55618C14.2976 8.04015 14.5016 8.63649 14.5 9.24997Z" fill="#7F8C8D"/> +</svg> diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg new file mode 100644 index 000000000..26a284adc --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud-offline.svg @@ -0,0 +1,4 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M12.42 6.58044C12.4 6.50549 12.38 6.43042 12.355 6.35547L11.525 7.18555C11.5575 7.27223 11.6136 7.34811 11.6869 7.40464C11.7603 7.46117 11.8479 7.4961 11.94 7.50549C12.3852 7.55476 12.7947 7.77259 13.0843 8.11428C13.374 8.45597 13.5218 8.89557 13.4975 9.34284C13.4732 9.7901 13.2785 10.2111 12.9536 10.5194C12.6286 10.8276 12.1979 10.9998 11.75 11.0005H7.70996L6.70996 12.0005H11.75C12.421 12.0001 13.0688 11.7545 13.5714 11.3099C14.074 10.8653 14.3969 10.2524 14.4792 9.58644C14.5615 8.92048 14.3977 8.24739 14.0184 7.69379C13.6392 7.14019 13.0708 6.74425 12.42 6.58044V6.58044Z" fill="#7F8C8D"/> +<path d="M13.355 3.14532C13.2606 3.05161 13.133 2.99902 13 2.99902C12.867 2.99902 12.7394 3.05161 12.6451 3.14532L10.995 4.79524C10.6311 4.61291 10.2316 4.5126 9.82472 4.50139C9.41783 4.49017 9.01343 4.56832 8.64002 4.73032C8.17233 4.3691 7.6208 4.13219 7.03684 4.04166C6.45287 3.95114 5.85549 4.00995 5.3004 4.21262C4.7453 4.41529 4.25056 4.75521 3.86229 5.2007C3.47403 5.64619 3.2049 6.18274 3.07997 6.76033C2.54726 7.01071 2.10896 7.42543 1.82954 7.9435C1.55013 8.46157 1.44434 9.05564 1.52775 9.63832C1.61115 10.221 1.87935 10.7615 2.29288 11.1804C2.70641 11.5993 3.24346 11.8744 3.82502 11.9653L2.14502 13.6453C2.05133 13.7397 1.99876 13.8673 1.99876 14.0003C1.99876 14.1333 2.05133 14.2609 2.14502 14.3553C2.23979 14.4482 2.36725 14.5003 2.5 14.5003C2.63275 14.5003 2.7602 14.4482 2.85498 14.3553L13.355 3.85528C13.4487 3.7609 13.5012 3.6333 13.5013 3.50031C13.5013 3.36732 13.4487 3.23972 13.355 3.14532V3.14532ZM4.79006 11.0003H4.25002C3.8356 11.0005 3.43458 10.8535 3.11841 10.5856C2.80224 10.3177 2.59145 9.94623 2.52362 9.5374C2.45578 9.12857 2.53529 8.70893 2.74799 8.35326C2.96069 7.99758 3.29275 7.72898 3.68502 7.59529C3.77434 7.56478 3.85319 7.50962 3.91248 7.43617C3.97176 7.36272 4.00904 7.274 4.02002 7.18025C4.09848 6.57783 4.39334 6.0245 4.84963 5.62341C5.30592 5.22233 5.89251 5.00087 6.50002 5.00032C7.1425 4.99652 7.76054 5.24628 8.21999 5.69539C8.30086 5.77275 8.40511 5.8211 8.5164 5.83285C8.6277 5.8446 8.73974 5.8191 8.83499 5.76033C9.10926 5.58886 9.42655 5.4987 9.75002 5.50032C9.9105 5.50127 10.0702 5.5231 10.225 5.56526L4.79006 11.0003Z" fill="#7F8C8D"/> +</svg> diff --git a/arduino-ide-extension/src/browser/style/push-sketch-icon.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud-upload.svg similarity index 100% rename from arduino-ide-extension/src/browser/style/push-sketch-icon.svg rename to arduino-ide-extension/src/browser/icons/arduino-cloud-upload.svg diff --git a/arduino-ide-extension/src/browser/icons/arduino-cloud.svg b/arduino-ide-extension/src/browser/icons/arduino-cloud.svg new file mode 100644 index 000000000..4d23d15ae --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/arduino-cloud.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M11.75 12H4.25C3.62484 11.9999 3.01838 11.7868 2.53053 11.3959C2.04269 11.0049 1.70257 10.4595 1.56622 9.84934C1.42987 9.23923 1.50542 8.60087 1.78043 8.03945C2.05543 7.47802 2.51348 7.02702 3.0791 6.76076C3.24864 5.97929 3.68041 5.27932 4.3027 4.77712C4.92499 4.27492 5.70035 4.00071 6.5 4.00002C7.27505 3.99715 8.02853 4.25513 8.63916 4.73244C9.00591 4.57154 9.40329 4.49243 9.8037 4.5006C10.2041 4.50877 10.5979 4.60403 10.9578 4.77976C11.3177 4.9555 11.635 5.20748 11.8876 5.51822C12.1403 5.82895 12.3223 6.19097 12.4209 6.57912C13.0715 6.74324 13.6398 7.13939 14.0188 7.69309C14.3979 8.24679 14.5616 8.91989 14.4792 9.58582C14.3967 10.2518 14.0739 10.8646 13.5713 11.3092C13.0687 11.7538 12.421 11.9995 11.75 12ZM6.5 5.00002C5.89213 5.00017 5.30514 5.22179 4.84885 5.62344C4.39257 6.02508 4.09826 6.57921 4.021 7.18215C4.0093 7.27546 3.97153 7.36357 3.91202 7.43638C3.85252 7.50918 3.77369 7.56374 3.68458 7.59377C3.29236 7.72769 2.9604 7.99647 2.7478 8.35224C2.5352 8.70801 2.45576 9.12768 2.52363 9.53654C2.5915 9.9454 2.80227 10.3169 3.11841 10.5849C3.43455 10.8529 3.83555 11 4.25 11H11.75C12.198 10.9996 12.6289 10.8275 12.9539 10.5191C13.279 10.2108 13.4735 9.7896 13.4975 9.34221C13.5215 8.89481 13.3732 8.45522 13.083 8.11384C12.7929 7.77246 12.3829 7.55524 11.9375 7.50686C11.8238 7.4948 11.7176 7.44411 11.6368 7.36325C11.5559 7.28238 11.5052 7.17624 11.4932 7.06252C11.4474 6.63255 11.2439 6.2348 10.9219 5.94619C10.6 5.65758 10.1824 5.49861 9.75 5.50002C9.42739 5.49791 9.11079 5.58731 8.83692 5.75783C8.74185 5.81746 8.62955 5.84352 8.51794 5.83184C8.40633 5.82015 8.30185 5.77141 8.22119 5.69338C7.76046 5.24569 7.14241 4.99672 6.5 5.00002V5.00002Z" fill="#7F8C8D"/> +</svg> diff --git a/arduino-ide-extension/src/browser/style/account-icon.svg b/arduino-ide-extension/src/browser/style/account-icon.svg deleted file mode 100644 index 2759d882f..000000000 --- a/arduino-ide-extension/src/browser/style/account-icon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" width="1em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 16 16"><g fill="#626262"><path d="M16 7.992C16 3.58 12.416 0 8 0S0 3.58 0 7.992c0 2.43 1.104 4.62 2.832 6.09c.016.016.032.016.032.032c.144.112.288.224.448.336c.08.048.144.111.224.175A7.98 7.98 0 0 0 8.016 16a7.98 7.98 0 0 0 4.48-1.375c.08-.048.144-.111.224-.16c.144-.111.304-.223.448-.335c.016-.016.032-.016.032-.032c1.696-1.487 2.8-3.676 2.8-6.106zm-8 7.001c-1.504 0-2.88-.48-4.016-1.279c.016-.128.048-.255.08-.383a4.17 4.17 0 0 1 .416-.991c.176-.304.384-.576.64-.816c.24-.24.528-.463.816-.639c.304-.176.624-.304.976-.4A4.15 4.15 0 0 1 8 10.342a4.185 4.185 0 0 1 2.928 1.166c.368.368.656.8.864 1.295c.112.288.192.592.24.911A7.03 7.03 0 0 1 8 14.993zm-2.448-7.4a2.49 2.49 0 0 1-.208-1.024c0-.351.064-.703.208-1.023c.144-.32.336-.607.576-.847c.24-.24.528-.431.848-.575c.32-.144.672-.208 1.024-.208c.368 0 .704.064 1.024.208c.32.144.608.336.848.575c.24.24.432.528.576.847c.144.32.208.672.208 1.023c0 .368-.064.704-.208 1.023a2.84 2.84 0 0 1-.576.848a2.84 2.84 0 0 1-.848.575a2.715 2.715 0 0 1-2.064 0a2.84 2.84 0 0 1-.848-.575a2.526 2.526 0 0 1-.56-.848zm7.424 5.306c0-.032-.016-.048-.016-.08a5.22 5.22 0 0 0-.688-1.406a4.883 4.883 0 0 0-1.088-1.135a5.207 5.207 0 0 0-1.04-.608a2.82 2.82 0 0 0 .464-.383a4.2 4.2 0 0 0 .624-.784a3.624 3.624 0 0 0 .528-1.934a3.71 3.71 0 0 0-.288-1.47a3.799 3.799 0 0 0-.816-1.199a3.845 3.845 0 0 0-1.2-.8a3.72 3.72 0 0 0-1.472-.287a3.72 3.72 0 0 0-1.472.288a3.631 3.631 0 0 0-1.2.815a3.84 3.84 0 0 0-.8 1.199a3.71 3.71 0 0 0-.288 1.47c0 .352.048.688.144 1.007c.096.336.224.64.4.927c.16.288.384.544.624.784c.144.144.304.271.48.383a5.12 5.12 0 0 0-1.04.624c-.416.32-.784.703-1.088 1.119a4.999 4.999 0 0 0-.688 1.406c-.016.032-.016.064-.016.08C1.776 11.636.992 9.91.992 7.992C.992 4.14 4.144.991 8 .991s7.008 3.149 7.008 7.001a6.96 6.96 0 0 1-2.032 4.907z"/></g></svg> diff --git a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css index f19159260..8982aaf34 100644 --- a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css +++ b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css @@ -15,10 +15,10 @@ .p-TabBar-tabIcon.cloud-sketchbook-tree-icon { background-color: var(--theia-foreground); - -webkit-mask: url(./cloud-sketchbook-tree-icon.svg); + -webkit-mask: url(../icons/arduino-cloud.svg); -webkit-mask-position: center; -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); + width: 19px !important; height: var(--theia-icon-size); -webkit-mask-size: 100%; } @@ -26,7 +26,7 @@ .p-mod-current .cloud-sketchbook-tree-icon { background-color: var(--theia-foreground); - -webkit-mask: url(./cloud-sketchbook-tree-icon-filled.svg); + -webkit-mask: url(../icons/arduino-cloud-filled.svg); -webkit-mask-position: center; -webkit-mask-repeat: no-repeat; -webkit-mask-size: 100%; @@ -99,26 +99,7 @@ color: var(--theia-textLink-foreground); } -.pull-sketch-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./pull-sketch-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); -} - -.push-sketch-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./push-sketch-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); -} - .account-icon { - background: url("./account-icon.svg") center center no-repeat; width: var(--theia-private-sidebar-icon-size); height: var(--theia-private-sidebar-icon-size); border-radius: 50%; @@ -199,3 +180,12 @@ .arduino-share-sketch-dialog .sketch-link-embed textarea { width: 100%; } + +.actions.item.flex-line .fa, +.theia-file-icons-js.file-icon .fa { + font-size: var(--theia-icon-size); +} + +.theia-file-icons-js.file-icon.not-in-sync-offline .fa { + color: var(--theia-activityBar-inactiveForeground); +} diff --git a/arduino-ide-extension/src/browser/style/fonts.css b/arduino-ide-extension/src/browser/style/fonts.css index 65ab9f337..93a855910 100644 --- a/arduino-ide-extension/src/browser/style/fonts.css +++ b/arduino-ide-extension/src/browser/style/fonts.css @@ -11,9 +11,9 @@ @font-face { font-family: 'FontAwesome'; src: - url('fonts/FontAwesome.ttf?2jhpmq') format('truetype'), - url('fonts/FontAwesome.woff?2jhpmq') format('woff'), - url('fonts/FontAwesome.svg?2jhpmq#FontAwesome') format('svg'); + url('fonts/FontAwesome.ttf?h959em') format('truetype'), + url('fonts/FontAwesome.woff?h959em') format('woff'), + url('fonts/FontAwesome.svg?h959em#FontAwesome') format('svg'); font-weight: normal; font-style: normal; font-display: block; @@ -679,3 +679,21 @@ .fa-microchip:before { content: "\f2db"; } +.fa-arduino-cloud-download:before { + content: "\e910"; +} +.fa-arduino-cloud-upload:before { + content: "\e914"; +} +.fa-arduino-cloud:before { + content: "\e915"; +} +.fa-arduino-cloud-filled:before { + content: "\e912"; +} +.fa-arduino-cloud-offline:before { + content: "\e913"; +} +.fa-arduino-cloud-filled-offline:before { + content: "\e911"; +} diff --git a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg index c1594c55c..867d29761 100644 --- a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg +++ b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.svg @@ -23,6 +23,12 @@ <glyph unicode="" glyph-name="arduino-monitor" horiz-adv-x="1536" d="M651.891 59.977c-92.835 0-179.095 28.493-250.5 77.197l-129.659-129.658c-22.494-22.496-58.964-22.496-81.458 0s-22.494 58.963 0 81.459l124.954 124.954c-67.75 78.157-108.777 180.090-108.777 291.489 0 245.759 199.68 445.439 445.44 445.439s445.44-199.679 445.44-445.439c0-245.761-199.68-445.441-445.44-445.441zM651.891 797.257c-161.28 0-291.84-130.559-291.84-291.839s130.56-291.841 291.84-291.841c160.512 0 291.84 130.561 291.84 291.841 0 160.511-130.56 291.839-291.84 291.839zM1149.562 472.766c0-35.423 28.717-64.138 64.141-64.138s64.134 28.716 64.134 64.138c0 35.423-28.71 64.139-64.134 64.139s-64.141-28.716-64.141-64.139zM64.064 408.62c-35.382 0-64.064 28.682-64.064 64.063s28.682 64.064 64.064 64.064c35.381 0 64.064-28.682 64.064-64.064s-28.683-64.063-64.064-64.063zM1458.707 408.628c-35.418 0-64.134 28.716-64.134 64.138s28.717 64.139 64.134 64.139c35.424 0 64.141-28.716 64.141-64.139s-28.717-64.138-64.141-64.138zM652.659 424.010c-44.961 0-81.408 36.447-81.408 81.407s36.447 81.408 81.408 81.408c44.96 0 81.408-36.447 81.408-81.408s-36.448-81.407-81.408-81.407z" /> <glyph unicode="" glyph-name="arduino-sketch-tabs-menu" d="M511.998 347.425c50.495 0 91.432 40.936 91.432 91.432s-40.936 91.432-91.432 91.432c-50.495 0-91.432-40.936-91.432-91.432s40.936-91.432 91.432-91.432zM923.433 347.425c50.494 0 91.432 40.936 91.432 91.432s-40.937 91.432-91.432 91.432c-50.494 0-91.432-40.936-91.432-91.432s40.937-91.432 91.432-91.432zM100.565 347.425c50.495 0 91.432 40.936 91.432 91.432s-40.936 91.432-91.432 91.432c-50.495 0-91.432-40.936-91.432-91.432s40.936-91.432 91.432-91.432z" /> <glyph unicode="" glyph-name="arduino-plotter" horiz-adv-x="862" d="M323.368-19.351c-20.263 0-39 11.42-48.21 29.788l-146.789 293.581h-74.474c-29.789 0-53.895 24.107-53.895 53.895s24.105 53.895 53.895 53.895h107.789c20.421 0 39.053-11.528 48.21-29.788l96.527-193.056 180.263 720.949c5.842 23.579 26.737 40.263 51 40.842 23.947 1.579 45.893-15.158 52.894-38.421l150.162-500.526h67.681c29.788 0 53.895-24.107 53.895-53.895s-24.107-53.895-53.895-53.895h-107.789c-23.789 0-44.787 15.629-51.631 38.422l-105.316 351.104-168.052-672.053c-5.474-21.897-23.948-38.055-46.368-40.529-2-0.21-3.947-0.313-5.895-0.313h-0.001z" /> +<glyph unicode="" glyph-name="arduino-cloud-download" d="M684.256 156.891l-146.286-146.286c-6.932-6.802-16.255-10.606-25.964-10.606s-19.032 3.803-25.964 10.606l-146.286 146.286c-3.41 3.41-6.115 7.458-7.96 11.913s-2.796 9.23-2.796 14.052c-0.001 9.738 3.868 19.079 10.754 25.965s16.226 10.756 25.964 10.756c4.822 0 9.597-0.949 14.052-2.795s8.504-4.549 11.914-7.959l83.749-84.107v423.856c0 9.699 3.853 19.002 10.712 25.86s16.16 10.712 25.86 10.712c9.699 0 19.001-3.853 25.86-10.712s10.712-16.16 10.712-25.86v-423.856l83.749 84.107c6.886 6.886 16.227 10.756 25.966 10.756s19.079-3.869 25.966-10.756c6.886-6.886 10.755-16.227 10.755-25.966s-3.869-19.079-10.755-25.966zM786.286 292.572h-128c-9.699 0-19.001 3.852-25.86 10.711s-10.712 16.161-10.712 25.86c0 9.699 3.853 19.001 10.712 25.86s16.16 10.712 25.86 10.712h128c32.768 0.031 64.285 12.618 88.057 35.172 23.779 22.554 38.005 53.361 39.76 86.085s-9.092 64.877-30.318 89.846c-21.219 24.97-51.207 40.858-83.785 44.396-8.316 0.882-16.084 4.59-21.994 10.505-5.917 5.914-9.626 13.678-10.503 21.996-3.35 31.449-18.235 60.542-41.784 81.652-23.551 21.11-54.092 32.737-85.719 32.634-23.597 0.154-46.754-6.384-66.785-18.857-6.953-4.363-15.168-6.269-23.332-5.414s-15.805 4.42-21.704 10.128c-33.699 32.745-78.905 50.956-125.893 50.714-44.461-0.011-87.395-16.221-120.77-45.598s-54.9-69.908-60.551-114.009c-0.856-6.825-3.618-13.27-7.971-18.595s-10.119-9.315-16.636-11.512c-28.688-9.795-52.969-29.455-68.519-55.477s-21.361-56.718-16.396-86.623c4.964-29.905 20.381-57.078 43.504-76.68s52.454-30.362 82.768-30.363h128c9.699 0 19.002-3.853 25.86-10.712s10.711-16.16 10.711-25.86c0-9.699-3.853-19.002-10.711-25.86s-16.161-10.711-25.86-10.711h-128c-45.726 0.010-90.084 15.596-125.767 44.191s-60.559 68.491-70.532 113.116c-9.973 44.625-4.447 91.317 15.667 132.381s53.618 74.052 94.989 93.527c12.401 57.159 43.982 108.357 89.498 145.089s102.228 56.789 160.717 56.839c56.689 0.21 111.801-18.659 156.464-53.571 26.825 11.769 55.891 17.556 85.178 16.958s58.092-7.565 84.415-20.419c26.323-12.854 49.532-31.284 68.007-54.012 18.483-22.728 31.795-49.208 39.007-77.598 47.587-12.004 89.154-40.98 116.875-81.479 27.728-40.499 39.702-89.732 33.675-138.44-6.034-48.708-29.645-93.536-66.406-126.054s-84.136-50.488-133.215-50.527z" /> +<glyph unicode="" glyph-name="arduino-cloud-filled-offline" d="M854.72 704.131l-671.997-672.001c-6.066-5.946-14.223-9.28-22.719-9.28s-16.653 3.334-22.719 9.28c-5.996 6.042-9.361 14.208-9.361 22.72s3.365 16.678 9.361 22.72l107.52 107.52c-37.22 5.818-71.592 23.424-98.059 50.234s-43.632 61.402-48.97 98.694c-5.338 37.292 1.432 75.312 19.315 108.469s45.935 59.7 80.029 75.724c7.995 36.965 25.219 71.304 50.068 99.816s56.512 50.267 92.038 63.237c35.526 12.971 73.758 16.735 111.132 10.941s72.672-20.956 102.604-44.074c23.899 10.368 49.78 15.369 75.821 14.651 26.038-0.718 51.606-7.138 74.896-18.807l105.6 105.596c6.029 6.026 14.202 9.411 22.72 9.411 8.525 0 16.698-3.385 22.72-9.411 6.029-6.026 9.414-14.198 9.414-22.72s-3.386-16.694-9.414-22.72v0zM928 358.827c-0.083-46.653-18.65-91.375-51.642-124.36-32.986-32.986-77.702-51.558-124.358-51.642h-322.563l361.283 361.282c1.6-4.797 2.88-9.6 4.166-14.398 38.093-9.509 71.904-31.506 96.032-62.48s37.184-69.139 37.082-108.402v0z" /> +<glyph unicode="" glyph-name="arduino-cloud-filled" d="M928 358.859c-0.083-46.653-18.65-91.375-51.635-124.36-32.992-32.992-77.709-51.558-124.365-51.642h-479.998c-40.017 0.013-78.836 13.658-110.060 38.688-31.224 25.024-52.989 59.942-61.71 98.999-8.721 39.055-3.876 79.916 13.736 115.849s46.94 64.794 83.151 81.826c7.995 36.965 25.22 71.304 50.068 99.816s56.513 50.266 92.038 63.237c35.526 12.971 73.759 16.735 111.132 10.941s72.672-20.956 102.604-44.074c22.414 9.744 46.599 14.755 71.040 14.72 39.262 0.102 77.425-12.954 108.401-37.083s52.973-57.94 62.483-96.035c38.093-9.508 71.904-31.506 96.032-62.48s37.184-69.14 37.082-108.403z" /> +<glyph unicode="" glyph-name="arduino-cloud-offline" d="M794.88 529.709c-1.28 4.797-2.56 9.601-4.16 14.398l-53.12-53.125c2.080-5.548 5.67-10.404 10.362-14.022 4.698-3.618 10.304-5.853 16.198-6.454 28.493-3.153 54.701-17.094 73.235-38.963 18.541-21.868 28-50.003 26.445-78.628s-14.016-55.569-34.81-75.3c-20.8-19.725-48.365-30.746-77.030-30.79h-258.563l-64-64h322.563c42.944 0.026 84.403 15.744 116.57 44.198s52.832 67.68 58.099 110.301c5.267 42.621-5.216 85.699-29.491 121.13-24.269 35.43-60.646 60.771-102.298 71.254v0zM854.72 749.557c-6.042 5.997-14.208 9.363-22.72 9.363s-16.678-3.366-22.714-9.363l-105.606-105.595c-23.29 11.669-48.858 18.089-74.898 18.806s-51.923-4.284-75.821-14.652c-29.932 23.118-65.23 38.28-102.604 44.074s-75.606 2.029-111.132-10.941c-35.526-12.971-67.19-34.726-92.039-63.237s-42.073-62.851-50.068-99.816c-34.093-16.024-62.145-42.566-80.028-75.723s-24.653-71.177-19.315-108.468c5.338-37.292 22.502-71.884 48.968-98.693s60.837-44.416 98.057-50.234l-107.52-107.52c-5.996-6.042-9.361-14.208-9.361-22.72s3.364-16.678 9.361-22.72c6.065-5.946 14.223-9.28 22.719-9.28s16.653 3.334 22.719 9.28l672.001 672.001c5.997 6.040 9.357 14.207 9.363 22.718 0 8.511-3.366 16.678-9.363 22.719v0zM306.564 246.838h-34.563c-26.523-0.013-52.188 9.395-72.423 26.541s-33.725 40.92-38.067 67.085c-4.342 26.165 0.747 53.022 14.36 75.785s34.865 39.954 59.97 48.51c5.716 1.953 10.763 5.483 14.557 10.184s6.18 10.379 6.883 16.379c5.021 38.555 23.892 73.968 53.095 99.638s66.744 39.843 105.625 39.878c41.119 0.243 80.673-15.741 110.078-44.484 5.176-4.951 11.848-8.045 18.97-8.797s14.294 0.88 20.39 4.641c17.553 10.974 37.86 16.744 58.562 16.641 10.271-0.061 20.492-1.458 30.399-4.156l-347.836-347.843z" /> +<glyph unicode="" glyph-name="arduino-cloud-upload" d="M684.258 412.892c-6.932-6.799-16.255-10.607-25.964-10.607s-19.032 3.809-25.964 10.607l-83.751 84.118v-423.867c0-9.699-3.853-19.003-10.711-25.856-6.859-6.861-16.161-10.715-25.86-10.715s-19.001 3.855-25.86 10.715c-6.859 6.853-10.712 16.157-10.712 25.856v423.867l-83.749-84.118c-6.886-6.886-16.227-10.756-25.966-10.756s-19.079 3.869-25.966 10.756c-6.886 6.886-10.755 16.227-10.755 25.966s3.869 19.079 10.755 25.966l146.286 146.286c6.903 6.854 16.236 10.701 25.964 10.701s19.062-3.847 25.964-10.701l146.286-146.286c6.853-6.904 10.7-16.237 10.701-25.965s-3.845-19.062-10.698-25.966zM786.286 256.001h-128c-9.699 0-19.001 3.852-25.86 10.711s-10.712 16.161-10.712 25.86c0 9.699 3.853 19.001 10.712 25.86s16.16 10.712 25.86 10.712h128c32.768 0.031 64.285 12.618 88.057 35.172 23.779 22.554 38.005 53.361 39.76 86.085s-9.092 64.877-30.318 89.846c-21.219 24.97-51.207 40.858-83.785 44.396-8.316 0.882-16.084 4.59-21.994 10.505-5.917 5.914-9.626 13.678-10.503 21.996-3.35 31.449-18.235 60.542-41.784 81.652-23.551 21.11-54.092 32.737-85.719 32.634-23.597 0.154-46.754-6.384-66.785-18.857-6.954-4.362-15.168-6.268-23.331-5.413s-15.805 4.419-21.705 10.127c-33.699 32.745-78.905 50.956-125.893 50.714-44.461-0.011-87.395-16.221-120.77-45.598s-54.9-69.908-60.551-114.009c-0.856-6.825-3.618-13.27-7.971-18.595s-10.119-9.315-16.636-11.512c-28.688-9.795-52.969-29.455-68.519-55.477s-21.361-56.718-16.396-86.623c4.964-29.905 20.381-57.078 43.504-76.68s52.454-30.362 82.768-30.363h128c9.699 0 19.002-3.853 25.86-10.712s10.711-16.16 10.711-25.86c0-9.699-3.853-19.002-10.711-25.86s-16.161-10.711-25.86-10.711h-128c-45.726 0.010-90.084 15.596-125.767 44.191s-60.559 68.491-70.532 113.116c-9.973 44.625-4.447 91.317 15.667 132.381s53.618 74.052 94.989 93.527c12.401 57.159 43.982 108.357 89.498 145.089s102.228 56.789 160.717 56.839c56.689 0.21 111.801-18.659 156.464-53.571 26.825 11.769 55.891 17.556 85.178 16.958s58.092-7.565 84.415-20.419c26.323-12.854 49.532-31.284 68.007-54.012 18.483-22.728 31.795-49.208 39.007-77.598 47.587-12.004 89.154-40.98 116.875-81.479 27.728-40.499 39.702-89.732 33.675-138.44-6.034-48.708-29.645-93.536-66.406-126.054s-84.136-50.488-133.215-50.527z" /> +<glyph unicode="" glyph-name="arduino-cloud" d="M752 182.857h-480c-40.010 0.006-78.824 13.645-110.046 38.662-31.222 25.024-52.989 59.93-61.716 98.98-8.726 39.047-3.891 79.902 13.709 115.833s46.915 64.796 83.115 81.836c10.851 50.014 38.484 94.812 78.31 126.953s89.45 49.69 140.627 49.734c49.603 0.184 97.826-16.327 136.906-46.875 23.472 10.298 48.904 15.361 74.531 14.838s50.829-6.62 73.862-17.866c23.034-11.247 43.341-27.374 59.507-47.261 16.173-19.887 27.821-43.056 34.131-67.898 41.638-10.504 78.010-35.857 102.266-71.294 24.262-35.437 34.739-78.515 29.466-121.135-5.28-42.623-25.939-81.842-58.106-110.296s-73.619-44.179-116.563-44.211zM416 630.856c-38.904-0.010-76.471-14.193-105.674-39.899s-48.038-61.169-52.982-99.757c-0.749-5.972-3.166-11.611-6.975-16.271s-8.853-8.151-14.556-10.073c-25.102-8.571-46.348-25.773-59.954-48.542s-18.691-49.628-14.347-75.795c4.344-26.167 17.833-49.943 38.066-67.095s45.897-26.566 72.422-26.566h480c28.672 0.026 56.25 11.040 77.050 30.778 20.806 19.731 33.254 46.688 34.79 75.321s-7.955 56.767-26.528 78.616c-18.566 21.848-44.806 35.75-73.312 38.847-7.277 0.772-14.074 4.016-19.245 9.191-5.178 5.176-8.422 11.969-9.19 19.247-2.931 27.518-15.955 52.974-36.563 71.445-20.602 18.471-47.328 28.645-75.002 28.555-20.647 0.135-40.909-5.587-58.437-16.5-6.084-3.816-13.272-5.484-20.415-4.737s-13.83 3.868-18.992 8.861c-29.487 28.652-69.042 44.586-110.156 44.375v0z" /> <glyph unicode="" glyph-name="music" horiz-adv-x="878" d="M877.714 822.857v-640c0-80.571-120.571-109.714-182.857-109.714s-182.857 29.143-182.857 109.714 120.571 109.714 182.857 109.714c37.714 0 75.429-6.857 109.714-22.286v306.857l-438.857-135.429v-405.143c0-80.571-120.571-109.714-182.857-109.714s-182.857 29.143-182.857 109.714 120.571 109.714 182.857 109.714c37.714 0 75.429-6.857 109.714-22.286v552.571c0 24 16 45.143 38.857 52.571l475.429 146.286c5.143 1.714 10.286 2.286 16 2.286 30.286 0 54.857-24.571 54.857-54.857z" /> <glyph unicode="" glyph-name="search" horiz-adv-x="951" d="M658.286 475.428c0 141.143-114.857 256-256 256s-256-114.857-256-256 114.857-256 256-256 256 114.857 256 256zM950.857 0c0-40-33.143-73.143-73.143-73.143-19.429 0-38.286 8-51.429 21.714l-196 195.429c-66.857-46.286-146.857-70.857-228-70.857-222.286 0-402.286 180-402.286 402.286s180 402.286 402.286 402.286 402.286-180 402.286-402.286c0-81.143-24.571-161.143-70.857-228l196-196c13.143-13.143 21.143-32 21.143-51.429z" /> <glyph unicode="" glyph-name="envelope-o" d="M950.857 91.428v438.857c-12-13.714-25.143-26.286-39.429-37.714-81.714-62.857-164-126.857-243.429-193.143-42.857-36-96-80-155.429-80h-1.143c-59.429 0-112.571 44-155.429 80-79.429 66.286-161.714 130.286-243.429 193.143-14.286 11.429-27.429 24-39.429 37.714v-438.857c0-9.714 8.571-18.286 18.286-18.286h841.143c9.714 0 18.286 8.571 18.286 18.286zM950.857 692c0 14.286 3.429 39.429-18.286 39.429h-841.143c-9.714 0-18.286-8.571-18.286-18.286 0-65.143 32.571-121.714 84-162.286 76.571-60 153.143-120.571 229.143-181.143 30.286-24.571 85.143-77.143 125.143-77.143h1.143c40 0 94.857 52.571 125.143 77.143 76 60.571 152.571 121.143 229.143 181.143 37.143 29.143 84 92.571 84 141.143zM1024 713.143v-621.714c0-50.286-41.143-91.429-91.429-91.429h-841.143c-50.286 0-91.429 41.143-91.429 91.429v621.714c0 50.286 41.143 91.429 91.429 91.429h841.143c50.286 0 91.429-41.143 91.429-91.429z" /> diff --git a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.ttf b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.ttf index 5f0d75b8db6452688aeeb5e11ca85d590ffce5bc..6810cc6265e69d7b238b6e0bf3f523c8d57c4886 100644 GIT binary patch delta 3093 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 Sk8U^%hcZHMUATPu4*nlG3hm|q delta 841 zcmaFyh-uA5rg{cO1_lOhh6V;^1_S?KeItG${x+b<9w1Ig&P^<+{y*b70|TQB5I;#z zEG__w3orl`0|7^RPG#Das@3*DJ_iHCycHR#i7ColTNg4gEZhK;H_HGDaBgF30rFn} z`6?N?B^B#yIk^}Z7V!Y}NaW-vJ0{-n+*rfFuv7(TL0@iSMFGP##&8CPWm|w66!H>t zQ(LEe6$bLJ0Ohw8<QJDf>|W6Wl4oFMZk%|aTKEKzlgHq|z{;Qp^p66A!At(hK8!g` z3<i^TFy>_azaq{mAR-_vAS56tz%Rfnz$3sdz%IZdz%0Ndz$n1L|Cj#{|8M?Z{6G0W z^MBxf&;O494gV|tNBj@@@ABW_zs-M!{}lg8{^R`n`S<Xz<X^<Ukbf@!EdH7Nlldp` z_w%>%*Yo@Ez5+Uoaq>i_jL8d_*eCyFa@(xUd{1EWQJE>d(z@-<@%%Pl8Ms-14rO4t z_s3#3jGkPw%3SCeL>w&1zyzdNChuJ3yjf)Rd8T>|hEt4wjQ^Orn69y~u>`Qnv8k~g zW9MKuVb9_a;_%|=<2c1>z&VTa0hbn68`mA~13WT3H+Z9X-|^M){o>Ezzay|o&`ofW z-~*u`p%cPB!skTzL^?$Nh)xi55Ni-yA@)K1l!Tf@n#3i^9?4fyOQdt8kI5*=RLESA zt&#mAms2lyK%Py0l7g1PB1IL&2*o9eHx$1pX(+iVRVW=%`lhU*9Hd;Qd_zS>Wu7XN zYM1I4wH|c|^*;4C8YUVw8b>sFG}AQCX_;wdXtiiv)3(w+r!z(8gYGmv3%wS-b$Yk- zz4Y_+H|hT{urm@faxyw(EMuHue8oh^WS+?dQ!&#Hvw9h`9p)P5Gb}hPDlFbvdRW$3 zp0WzCnq~FNI>EZm`jCy4%?sN-womN1?2PQ9>?YXVuxGH>u%G83=aA-b!_muekCUEL zj?*fq7tU(V4K6$`HZId#Zn%25Rk&?)mvdj?{>{V7<CNzvFDb8E-Vxphyg&Fj`AqS7 q;%nkt;k(NBo`j!}pPPROFit=j<rrfq13x&Ln1E3&ym|8atBe4ej{bZA diff --git a/arduino-ide-extension/src/browser/style/fonts/FontAwesome.woff b/arduino-ide-extension/src/browser/style/fonts/FontAwesome.woff index 86a6f5031d056b826c1fd9479eb2b5860d0e0546..5213d95155f5a7855930444c420e9422ec377a1e 100644 GIT binary patch delta 3155 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 delta 885 zcmdn;nCZtwCb4pVH#Y`G1|V4RgMk}NuVG-E{E$g(qK<HVTXJq<0RsbL1`t01;p+c0 zuBRs!1I3tqfQmVwSRg&8G7Tse!oV<Z1qffMT5X?^nwY}Cu<#F1jTs0lb8TIi0Tg6l zSY!g^tAH@)Hnx_G+>#2QSOieN1PHIM<>boAPX?;<TMDwg4}@=cZmh{otN`+t1NAW| zfbliP@Vvy_RG=7;&$tbQTc>;#F32w~0s7|#Tpcrz#mw9|nTN4j_ymxh$Kb%g%Ag1I zw*rH~Oa93-7;~5y3?{QM<z)T8BF-uxA|NavBp@ijFTg9nBfu@dF2EwdEWjkdD8Rt~ zm;Vp{Z~kBWKlwlNf8c-5|Bn9+|117S{15r>^55aV&3}gf6#q&7<NW*i_wcXeU&OzV ze=h$l{+axf`6uxA^SAQX^ZW3=VqgY`amwTmOx%-QncX&*Gv5=~EGRprS6a8dIiBC< zD+4zR(4h<r_x@PShS8G`tTGom1`!8KGB5!tmdUKEoi`_}KF?II!ElPvkMSQ<7t=Ks zHkJTZIW{%6W9%I4ChS=pLL6QkeH^Da4LE0UKH$>gYU8@YeSk-X=LT;S?>oLazF+(~ z{C5O43Aza`5_}*OBy>X9NBEowpGb$uAJGY74q^>rE5tsCpOR3MNRzlE*(3Q%YKe4? z^f4I)nF^T;vNf__<Z|le4#=~~Pg2lQSfr?;7@@dC@rL3TB@HDvr3$4ZO5c<<l!KJ( zly9iWsLWGkQteXxqSm7>q28zdM#Ds-M&pPkk7k<YIW04-46PQeYuZ-Y=X9p%e9)by zXQ9`kw@&YtzL$QU{wDn&26jebMovbDjAe{7jIWsJn9MV|U@B(XVOB3=w!>V*e1-*w zMTNyXOApIB%TrbXR<o>rStnT6Ss${ovUy><$M%UGmz|Mal-&fo8}<zL8us%X<Q&o* zZa8{5?s3v{%5hrd^uk%qxxt0U#l~ft%MDi#w+gpy?sD!c+`oBvd7Sdx<t62H%R9pR yfcFO<C!Z-kPkc>$D|}b^-jnbX@^kYC<^gbqI>s2vzz>clCSZ0F-h6-kRYm|*GX;PE diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index fa98d63f3..874db8448 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -77,7 +77,7 @@ .arduino-upload-sketch--toolbar-icon { -webkit-mask: url(../icons/upload.svg) center no-repeat; - background-color: var(--theia-titleBar-activeBackground); + background-color: var(--theia-titleBar-activeBackground); } .toggle-serial-monitor-icon { @@ -114,6 +114,10 @@ z-index: 0; } +.p-TabBar-toolbar .item > div { + text-align: center; +} + :root { --theia-private-menubar-height: 40px; /* set the topbar height */ } diff --git a/arduino-ide-extension/src/browser/style/sketch-folder-icon.svg b/arduino-ide-extension/src/browser/style/sketch-folder-icon.svg deleted file mode 100644 index 363c5df10..000000000 --- a/arduino-ide-extension/src/browser/style/sketch-folder-icon.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="8" height="7" viewBox="0 0 8 7" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M2.5 6.18999C2.415 6.18999 2.33 6.16999 2.25 6.12499C1.17 5.49999 0.5 4.33999 0.5 3.09499C0.5 1.84999 1.17 0.689992 2.25 0.0649925C2.49 -0.0700075 2.795 0.00999246 2.935 0.249992C3.07 0.489992 2.99 0.794992 2.75 0.934992C1.98 1.37499 1.5 2.20499 1.5 3.09499C1.5 3.98499 1.98 4.81499 2.75 5.25499C2.99 5.39499 3.07 5.69999 2.935 5.93999C2.84 6.09999 2.675 6.18999 2.5 6.18999Z" fill="#008184"/> -<path d="M5.49993 6.18999C5.32493 6.18999 5.15993 6.09999 5.06493 5.93999C4.92493 5.69999 5.00993 5.39499 5.24993 5.25499C6.01993 4.81499 6.49993 3.98499 6.49993 3.09499C6.49993 2.20499 6.01993 1.37499 5.24993 0.934992C5.00993 0.794992 4.92993 0.489992 5.06493 0.249992C5.20493 0.00999246 5.50993 -0.0700075 5.74993 0.0649925C6.82993 0.689992 7.49993 1.84999 7.49993 3.09499C7.49993 4.33999 6.82993 5.49999 5.74993 6.12499C5.66993 6.16999 5.58493 6.18999 5.49993 6.18999Z" fill="#008184"/> -</svg> diff --git a/arduino-ide-extension/src/browser/style/sketchbook.css b/arduino-ide-extension/src/browser/style/sketchbook.css index 87143e60c..8a9270c36 100644 --- a/arduino-ide-extension/src/browser/style/sketchbook.css +++ b/arduino-ide-extension/src/browser/style/sketchbook.css @@ -3,13 +3,6 @@ mask: url('./sketchbook.svg'); } -.sketch-folder-icon { - background: url('./sketch-folder-icon.svg') center center no-repeat; - background-position-x: 1px; - width: var(--theia-icon-size); - height: var(--theia-icon-size); -} - .p-TabBar-tabIcon.sketchbook-tree-icon { background-color: var(--theia-foreground); -webkit-mask: url(./sketchbook-tree-icon.svg); diff --git a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index 0738772c6..a0eb05941 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -1,106 +1,324 @@ +import { + ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, + ConnectionStatus, + FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, +} from '@theia/core/lib/browser/connection-status-service'; +import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { Disposable } from '@theia/core/lib/common/disposable'; -import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar'; -import { - FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, - ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, - ConnectionStatus, -} from '@theia/core/lib/browser/connection-status-service'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; import { ArduinoDaemon } from '../../../common/protocol'; +import { assertUnreachable } from '../../../common/utils'; +import { CreateFeatures } from '../../create/create-features'; import { NotificationCenter } from '../../notification-center'; -import { nls } from '@theia/core/lib/common'; import debounce = require('lodash.debounce'); +import isOnline = require('is-online'); @injectable() -export class FrontendConnectionStatusService extends TheiaFrontendConnectionStatusService { - @inject(ArduinoDaemon) - protected readonly daemon: ArduinoDaemon; +export class IsOnline implements FrontendApplicationContribution { + private readonly onDidChangeOnlineEmitter = new Emitter<boolean>(); + private _online = false; + private stopped = false; + + onStart(): void { + const checkOnline = async () => { + if (!this.stopped) { + try { + const online = await isOnline(); + this.setOnline(online); + } finally { + window.setTimeout(() => checkOnline(), 6_000); // 6 seconds poll interval + } + } + }; + checkOnline(); + } + + onStop(): void { + this.stopped = true; + this.onDidChangeOnlineEmitter.dispose(); + } + + get online(): boolean { + return this._online; + } + get onDidChangeOnline(): Event<boolean> { + return this.onDidChangeOnlineEmitter.event; + } + + private setOnline(online: boolean) { + const oldOnline = this._online; + this._online = online; + if (!this.stopped && this._online !== oldOnline) { + this.onDidChangeOnlineEmitter.fire(this._online); + } + } +} + +@injectable() +export class DaemonPort implements FrontendApplicationContribution { + @inject(ArduinoDaemon) + private readonly daemon: ArduinoDaemon; @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly notificationCenter: NotificationCenter; + + private readonly onPortDidChangeEmitter = new Emitter<string | undefined>(); + private _port: string | undefined; + + onStart(): void { + this.daemon.tryGetPort().then( + (port) => this.setPort(port), + (reason) => + console.warn('Could not retrieve the CLI daemon port.', reason) + ); + this.notificationCenter.onDaemonDidStart((port) => this.setPort(port)); + this.notificationCenter.onDaemonDidStop(() => this.setPort(undefined)); + } + + onStop(): void { + this.onPortDidChangeEmitter.dispose(); + } - protected connectedPort: string | undefined; + get port(): string | undefined { + return this._port; + } + + get onDidChangePort(): Event<string | undefined> { + return this.onPortDidChangeEmitter.event; + } + + private setPort(port: string | undefined): void { + const oldPort = this._port; + this._port = port; + if (this._port !== oldPort) { + this.onPortDidChangeEmitter.fire(this._port); + } + } +} + +@injectable() +export class FrontendConnectionStatusService extends TheiaFrontendConnectionStatusService { + @inject(DaemonPort) + private readonly daemonPort: DaemonPort; + @inject(IsOnline) + private readonly isOnline: IsOnline; @postConstruct() protected override async init(): Promise<void> { this.schedulePing(); - try { - this.connectedPort = await this.daemon.tryGetPort(); - } catch {} - this.notificationCenter.onDaemonDidStart( - (port) => (this.connectedPort = port) - ); - this.notificationCenter.onDaemonDidStop( - () => (this.connectedPort = undefined) - ); const refresh = debounce(() => { - this.updateStatus(!!this.connectedPort); + this.updateStatus(Boolean(this.daemonPort.port) && this.isOnline.online); this.schedulePing(); }, this.options.offlineTimeout - 10); this.wsConnectionProvider.onIncomingMessageActivity(() => refresh()); } + + protected override async performPingRequest(): Promise<void> { + try { + await this.pingService.ping(); + this.updateStatus(this.isOnline.online); + } catch (e) { + this.updateStatus(false); + this.logger.error(e); + } + } } +const connectionStatusStatusBar = 'connection-status'; +const theiaOffline = 'theia-mod-offline'; + +export type OfflineConnectionStatus = + /** + * There is no websocket connection between the frontend and the backend. + */ + | 'backend' + /** + * The CLI daemon port is not available. Could not establish the gRPC connection between the backend and the CLI. + */ + | 'daemon' + /** + * Cloud not connect to the Internet from the browser. + */ + | 'internet'; + @injectable() export class ApplicationConnectionStatusContribution extends TheiaApplicationConnectionStatusContribution { - @inject(ArduinoDaemon) - protected readonly daemon: ArduinoDaemon; + @inject(DaemonPort) + private readonly daemonPort: DaemonPort; + @inject(IsOnline) + private readonly isOnline: IsOnline; + @inject(MessageService) + private readonly messageService: MessageService; + @inject(NotificationManager) + private readonly notificationManager: NotificationManager; + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; - @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly offlineStatusDidChangeEmitter = new Emitter< + OfflineConnectionStatus | undefined + >(); + private noInternetConnectionNotificationId: string | undefined; + private _offlineStatus: OfflineConnectionStatus | undefined; - protected connectedPort: string | undefined; + get offlineStatus(): OfflineConnectionStatus | undefined { + return this._offlineStatus; + } - @postConstruct() - protected async init(): Promise<void> { - try { - this.connectedPort = await this.daemon.tryGetPort(); - } catch {} - this.notificationCenter.onDaemonDidStart( - (port) => (this.connectedPort = port) - ); - this.notificationCenter.onDaemonDidStop( - () => (this.connectedPort = undefined) - ); + get onOfflineStatusDidChange(): Event<OfflineConnectionStatus | undefined> { + return this.offlineStatusDidChangeEmitter.event; } protected override onStateChange(state: ConnectionStatus): void { - if (!this.connectedPort && state === ConnectionStatus.ONLINE) { + if ( + (!Boolean(this.daemonPort.port) || !this.isOnline.online) && + state === ConnectionStatus.ONLINE + ) { return; } super.onStateChange(state); } protected override handleOffline(): void { - this.statusBar.setElement('connection-status', { + const params = { + port: this.daemonPort.port, + online: this.isOnline.online, + }; + this._offlineStatus = offlineConnectionStatusType(params); + const { text, tooltip } = offlineMessage(params); + this.statusBar.setElement(connectionStatusStatusBar, { alignment: StatusBarAlignment.LEFT, - text: this.connectedPort - ? nls.localize('theia/core/offline', 'Offline') - : '$(bolt) ' + - nls.localize('theia/core/daemonOffline', 'CLI Daemon Offline'), - tooltip: this.connectedPort - ? nls.localize( - 'theia/core/cannotConnectBackend', - 'Cannot connect to the backend.' - ) - : nls.localize( - 'theia/core/cannotConnectDaemon', - 'Cannot connect to the CLI daemon.' - ), + text, + tooltip, priority: 5000, }); - this.toDisposeOnOnline.push( - Disposable.create(() => this.statusBar.removeElement('connection-status')) - ); - document.body.classList.add('theia-mod-offline'); - this.toDisposeOnOnline.push( + document.body.classList.add(theiaOffline); + this.toDisposeOnOnline.pushAll([ Disposable.create(() => - document.body.classList.remove('theia-mod-offline') - ) - ); + this.statusBar.removeElement(connectionStatusStatusBar) + ), + Disposable.create(() => document.body.classList.remove(theiaOffline)), + Disposable.create(() => { + this._offlineStatus = undefined; + this.fireStatusDidChange(); + }), + ]); + if (!this.isOnline.online) { + const text = nls.localize( + 'arduino/connectionStatus/connectionLost', + "Connection lost. Cloud sketch actions and updates won't be available." + ); + this.noInternetConnectionNotificationId = this.notificationManager[ + 'getMessageId' + ]({ text, type: MessageType.Warning }); + if (this.createFeatures.enabled) { + this.messageService.warn(text); + } + this.toDisposeOnOnline.push( + Disposable.create(() => this.clearNoInternetConnectionNotification()) + ); + } + this.fireStatusDidChange(); + } + + private clearNoInternetConnectionNotification(): void { + if (this.noInternetConnectionNotificationId) { + this.notificationManager.clear(this.noInternetConnectionNotificationId); + this.noInternetConnectionNotificationId = undefined; + } + } + + private fireStatusDidChange(): void { + if (this.createFeatures.enabled) { + return this.offlineStatusDidChangeEmitter.fire(this._offlineStatus); + } + } +} + +interface OfflineMessageParams { + readonly port: string | undefined; + readonly online: boolean; +} +interface OfflineMessage { + readonly text: string; + readonly tooltip: string; +} + +/** + * (non-API) exported for testing + * + * The precedence of the offline states are the following: + * - No connection to the Theia backend, + * - CLI daemon is offline, and + * - There is no Internet connection. + */ +export function offlineMessage(params: OfflineMessageParams): OfflineMessage { + const statusType = offlineConnectionStatusType(params); + const text = getOfflineText(statusType); + const tooltip = getOfflineTooltip(statusType); + return { text, tooltip }; +} + +function offlineConnectionStatusType( + params: OfflineMessageParams +): OfflineConnectionStatus { + const { port, online } = params; + if (port && online) { + return 'backend'; + } + if (!port) { + return 'daemon'; + } + return 'internet'; +} + +export const backendOfflineText = nls.localize('theia/core/offline', 'Offline'); +export const daemonOfflineText = nls.localize( + 'theia/core/daemonOffline', + 'CLI Daemon Offline' +); +export const offlineText = nls.localize('theia/core/offlineText', 'Offline'); +export const backendOfflineTooltip = nls.localize( + 'theia/core/cannotConnectBackend', + 'Cannot connect to the backend.' +); +export const daemonOfflineTooltip = nls.localize( + 'theia/core/cannotConnectDaemon', + 'Cannot connect to the CLI daemon.' +); +export const offlineTooltip = offlineText; + +function getOfflineText(statusType: OfflineConnectionStatus): string { + switch (statusType) { + case 'backend': + return backendOfflineText; + case 'daemon': + return '$(bolt) ' + daemonOfflineText; + case 'internet': + return '$(alert) ' + offlineText; + default: + assertUnreachable(statusType); + } +} + +function getOfflineTooltip(statusType: OfflineConnectionStatus): string { + switch (statusType) { + case 'backend': + return backendOfflineTooltip; + case 'daemon': + return daemonOfflineTooltip; + case 'internet': + return offlineTooltip; + default: + assertUnreachable(statusType); } } diff --git a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx index 308d77260..0c7104c85 100644 --- a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx +++ b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx @@ -10,17 +10,21 @@ import { import * as React from '@theia/core/shared/react'; import { accountMenu } from '../../contributions/account'; import { CreateFeatures } from '../../create/create-features'; +import { ApplicationConnectionStatusContribution } from './connection-status-service'; @injectable() export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget { @inject(CreateFeatures) private readonly createFeatures: CreateFeatures; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatue: ApplicationConnectionStatusContribution; @postConstruct() protected init(): void { - this.toDispose.push( - this.createFeatures.onDidChangeSession(() => this.update()) - ); + this.toDispose.pushAll([ + this.createFeatures.onDidChangeSession(() => this.update()), + this.connectionStatue.onOfflineStatusDidChange(() => this.update()), + ]); } protected override onClick( @@ -28,7 +32,7 @@ export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget { menuPath: MenuPath ): void { const button = e.currentTarget.getBoundingClientRect(); - this.contextMenuRenderer.render({ + const options = { menuPath, includeAnchorArg: false, anchor: { @@ -37,7 +41,9 @@ export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget { // https://github.com/eclipse-theia/theia/discussions/12170 y: button.top, }, - }); + showDisabled: true, + }; + this.contextMenuRenderer.render(options); } protected override render(): React.ReactNode { @@ -55,7 +61,9 @@ export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget { } const arduinoAccount = menu.id === accountMenu.id; const picture = - arduinoAccount && this.createFeatures.session?.account.picture; + arduinoAccount && + this.connectionStatue.offlineStatus !== 'internet' && + this.createFeatures.session?.account.picture; const className = typeof picture === 'string' ? undefined : menu.iconClass; return ( <i diff --git a/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts index 9e786e262..6d5b70cab 100644 --- a/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts +++ b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts @@ -1,18 +1,28 @@ import * as remote from '@theia/core/electron-shared/@electron/remote'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; import { NavigatableWidget } from '@theia/core/lib/browser/navigatable-types'; import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { Widget } from '@theia/core/lib/browser/widgets/widget'; import { WindowTitleUpdater as TheiaWindowTitleUpdater } from '@theia/core/lib/browser/window/window-title-updater'; import { ApplicationServer } from '@theia/core/lib/common/application-protocol'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; import { isOSX } from '@theia/core/lib/common/os'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; +import { ConfigServiceClient } from '../../config/config-service-client'; +import { CreateFeatures } from '../../create/create-features'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../../sketches-service-client-impl'; @injectable() export class WindowTitleUpdater extends TheiaWindowTitleUpdater { @@ -22,12 +32,22 @@ export class WindowTitleUpdater extends TheiaWindowTitleUpdater { private readonly applicationShell: ApplicationShell; @inject(WorkspaceService) private readonly workspaceService: WorkspaceService; - - private _previousRepresentedFilename: string | undefined; + @inject(SketchesServiceClientImpl) + private readonly sketchesServiceClient: SketchesServiceClientImpl; + @inject(ConfigServiceClient) + private readonly configServiceClient: ConfigServiceClient; + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + @inject(EditorManager) + private readonly editorManager: EditorManager; private readonly applicationName = FrontendApplicationConfigProvider.get().applicationName; + private readonly toDispose = new DisposableCollection(); + + private previousRepresentedFilename: string | undefined; private applicationVersion: string | undefined; + private hasCloudPrefix: boolean | undefined; @postConstruct() protected init(): void { @@ -43,6 +63,22 @@ export class WindowTitleUpdater extends TheiaWindowTitleUpdater { ); } + override onStart(app: FrontendApplication): void { + super.onStart(app); + this.toDispose.pushAll([ + this.sketchesServiceClient.onCurrentSketchDidChange(() => + this.maybeSetCloudPrefix() + ), + this.configServiceClient.onDidChangeDataDirUri(() => + this.maybeSetCloudPrefix() + ), + ]); + } + + onStop(): void { + this.toDispose.dispose(); + } + protected override handleWidgetChange(widget?: Widget | undefined): void { if (isOSX) { this.maybeUpdateRepresentedFilename(widget); @@ -54,7 +90,7 @@ export class WindowTitleUpdater extends TheiaWindowTitleUpdater { protected override updateTitleWidget(widget?: Widget | undefined): void { let activeEditorShort = ''; - const rootName = this.workspaceService.workspace?.name ?? ''; + let rootName = this.workspaceService.workspace?.name ?? ''; let appName = `${this.applicationName}${ this.applicationVersion ? ` ${this.applicationVersion}` : '' }`; @@ -69,6 +105,12 @@ export class WindowTitleUpdater extends TheiaWindowTitleUpdater { activeEditorShort = ` - ${base} `; } } + if (this.hasCloudPrefix) { + rootName = `[${nls.localize( + 'arduino/title/cloud', + 'Cloud' + )}] ${rootName}`; + } this.windowTitleService.update({ rootName, appName, activeEditorShort }); } @@ -77,10 +119,32 @@ export class WindowTitleUpdater extends TheiaWindowTitleUpdater { const { uri } = widget.editor; const filename = uri.path.toString(); // Do not necessarily require the current window if not needed. It's a synchronous, blocking call. - if (this._previousRepresentedFilename !== filename) { + if (this.previousRepresentedFilename !== filename) { const currentWindow = remote.getCurrentWindow(); currentWindow.setRepresentedFilename(uri.path.toString()); - this._previousRepresentedFilename = filename; + this.previousRepresentedFilename = filename; + } + } + } + + private maybeSetCloudPrefix(): void { + if (typeof this.hasCloudPrefix === 'boolean') { + return; + } + const sketch = this.sketchesServiceClient.tryGetCurrentSketch(); + if (!CurrentSketch.isValid(sketch)) { + return; + } + const dataDirUri = this.configServiceClient.tryGetDataDirUri(); + if (!dataDirUri) { + return; + } + this.hasCloudPrefix = this.createFeatures.isCloud(sketch, dataDirUri); + if (typeof this.hasCloudPrefix === 'boolean') { + const editor = + this.editorManager.activeEditor ?? this.editorManager.currentEditor; + if (editor) { + this.updateTitleWidget(editor); } } } diff --git a/arduino-ide-extension/src/browser/theia/messages/notifications-manager.ts b/arduino-ide-extension/src/browser/theia/messages/notifications-manager.ts index bdc1ed35f..51339dbf3 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notifications-manager.ts +++ b/arduino-ide-extension/src/browser/theia/messages/notifications-manager.ts @@ -1,6 +1,5 @@ import { CancellationToken } from '@theia/core/lib/common/cancellation'; import type { - Message, ProgressMessage, ProgressUpdate, } from '@theia/core/lib/common/message-service-protocol'; @@ -46,11 +45,4 @@ export class NotificationManager extends TheiaNotificationManager { } return Math.min((update.work.done / update.work.total) * 100, 100); } - - /** - * For `public` visibility. - */ - override getMessageId(message: Message): string { - return super.getMessageId(message); - } } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-commands.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-commands.ts new file mode 100644 index 000000000..7f4602a21 --- /dev/null +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-commands.ts @@ -0,0 +1,88 @@ +import { TreeNode } from '@theia/core/lib/browser/tree'; +import { Command } from '@theia/core/lib/common/command'; +import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; + +export namespace CloudSketchbookCommands { + export interface Arg { + model: CloudSketchbookTreeModel; + node: TreeNode; + event?: MouseEvent; + } + export namespace Arg { + export function is(arg: unknown): arg is Arg { + return ( + typeof arg === 'object' && + (<Arg>arg).model !== undefined && + (<Arg>arg).model instanceof CloudSketchbookTreeModel && + (<Arg>arg).node !== undefined && + TreeNode.is((<Arg>arg).node) + ); + } + } + + export const TOGGLE_CLOUD_SKETCHBOOK = Command.toLocalizedCommand( + { + id: 'arduino-cloud-sketchbook--disable', + label: 'Show/Hide Cloud Sketchbook', + }, + 'arduino/cloud/showHideSketchbook' + ); + + export const PULL_SKETCH = Command.toLocalizedCommand( + { + id: 'arduino-cloud-sketchbook--pull-sketch', + label: 'Pull Sketch', + iconClass: 'fa fa-arduino-cloud-download', + }, + 'arduino/cloud/pullSketch' + ); + + export const PUSH_SKETCH = Command.toLocalizedCommand( + { + id: 'arduino-cloud-sketchbook--push-sketch', + label: 'Push Sketch', + iconClass: 'fa fa-arduino-cloud-upload', + }, + 'arduino/cloud/pullSketch' + ); + + export const PULL_SKETCH__TOOLBAR = { + ...PULL_SKETCH, + id: `${PULL_SKETCH.id}-toolbar`, + }; + + export const PUSH_SKETCH__TOOLBAR = { + ...PUSH_SKETCH, + id: `${PUSH_SKETCH.id}-toolbar`, + }; + + export const OPEN_IN_CLOUD_EDITOR = Command.toLocalizedCommand( + { + id: 'arduino-cloud-sketchbook--open-in-cloud-editor', + label: 'Open in Cloud Editor', + }, + 'arduino/cloud/openInCloudEditor' + ); + + export const OPEN_SKETCHBOOKSYNC_CONTEXT_MENU = Command.toLocalizedCommand( + { + id: 'arduino-sketchbook-sync--open-sketch-context-menu', + label: 'Options...', + iconClass: 'sketchbook-tree__opts', + }, + 'arduino/cloud/options' + ); + + export const OPEN_SKETCH_SHARE_DIALOG = Command.toLocalizedCommand( + { + id: 'arduino-cloud-sketchbook--share-modal', + label: 'Share...', + }, + 'arduino/cloud/share' + ); + + export const OPEN_PROFILE_CONTEXT_MENU: Command = { + id: 'arduino-cloud-sketchbook--open-profile-menu', + label: 'Contextual menu', + }; +} diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx index 0b4d26a94..46e273b25 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx @@ -5,7 +5,7 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { CloudStatus } from './cloud-user-status'; +import { CloudStatus } from './cloud-status'; import { nls } from '@theia/core/lib/common/nls'; import { CloudSketchbookTreeWidget } from './cloud-sketchbook-tree-widget'; import { AuthenticationClientService } from '../../auth/authentication-client-service'; @@ -13,6 +13,7 @@ import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget'; import { CreateNew } from '../sketchbook/create-new'; import { AuthenticationSession } from '../../../node/auth/types'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; @injectable() export class CloudSketchbookCompositeWidget extends BaseSketchbookCompositeWidget<CloudSketchbookTreeWidget> { @@ -20,6 +21,9 @@ export class CloudSketchbookCompositeWidget extends BaseSketchbookCompositeWidge private readonly authenticationService: AuthenticationClientService; @inject(CloudSketchbookTreeWidget) private readonly cloudSketchbookTreeWidget: CloudSketchbookTreeWidget; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + private _session: AuthenticationSession | undefined; constructor() { @@ -66,6 +70,7 @@ export class CloudSketchbookCompositeWidget extends BaseSketchbookCompositeWidge this.cloudSketchbookTreeWidget.model as CloudSketchbookTreeModel } authenticationService={this.authenticationService} + connectionStatus={this.connectionStatus} /> </> ); diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts index 212fc5f62..f58f747e7 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts @@ -1,145 +1,94 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import { TreeNode } from '@theia/core/lib/browser/tree'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { Command, CommandRegistry } from '@theia/core/lib/common/command'; import { ContextMenuRenderer, RenderContextMenuOptions, -} from '@theia/core/lib/browser'; +} from '@theia/core/lib/browser/context-menu-renderer'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { + PreferenceScope, + PreferenceService, +} from '@theia/core/lib/browser/preferences/preference-service'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { CommandRegistry } from '@theia/core/lib/common/command'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { Emitter, Event } from '@theia/core/lib/common/event'; import { MenuModelRegistry } from '@theia/core/lib/common/menu'; -import { CloudSketchbookTree } from './cloud-sketchbook-tree'; -import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; -import { ShareSketchDialog } from '../../dialogs/cloud-share-sketch-dialog'; -import { CreateApi } from '../../create/create-api'; +import { nls } from '@theia/core/lib/common/nls'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { ArduinoPreferences } from '../../arduino-preferences'; +import { ConfigServiceClient } from '../../config/config-service-client'; +import { CloudSketchContribution } from '../../contributions/cloud-contribution'; import { - PreferenceService, - PreferenceScope, -} from '@theia/core/lib/browser/preferences/preference-service'; + Sketch, + TabBarToolbarRegistry, +} from '../../contributions/contribution'; +import { ShareSketchDialog } from '../../dialogs/cloud-share-sketch-dialog'; import { ArduinoMenus, PlaceholderMenuNode } from '../../menu/arduino-menus'; +import { CurrentSketch } from '../../sketches-service-client-impl'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; import { SketchbookCommands } from '../sketchbook/sketchbook-commands'; -import { - CurrentSketch, - SketchesServiceClientImpl, -} from '../../sketches-service-client-impl'; -import { Contribution } from '../../contributions/contribution'; -import { ArduinoPreferences } from '../../arduino-preferences'; -import { MainMenuManager } from '../../../common/main-menu-manager'; -import { nls } from '@theia/core/lib/common'; +import { CloudSketchbookCommands } from './cloud-sketchbook-commands'; +import { CloudSketchbookTree } from './cloud-sketchbook-tree'; +import { CreateUri } from '../../create/create-uri'; -export const SKETCHBOOKSYNC__CONTEXT = ['arduino-sketchbook-sync--context']; +const SKETCHBOOKSYNC__CONTEXT = ['arduino-sketchbook-sync--context']; // `Open Folder`, `Open in New Window` -export const SKETCHBOOKSYNC__CONTEXT__MAIN_GROUP = [ +const SKETCHBOOKSYNC__CONTEXT__MAIN_GROUP = [ ...SKETCHBOOKSYNC__CONTEXT, '0_main', ]; -export namespace CloudSketchbookCommands { - export interface Arg { - model: CloudSketchbookTreeModel; - node: TreeNode; - event?: MouseEvent; - } - export namespace Arg { - export function is(arg: Partial<Arg> | undefined): arg is Arg { - return ( - !!arg && !!arg.node && arg.model instanceof CloudSketchbookTreeModel - ); - } - } - - export const TOGGLE_CLOUD_SKETCHBOOK = Command.toLocalizedCommand( - { - id: 'arduino-cloud-sketchbook--disable', - label: 'Show/Hide Cloud Sketchbook', - }, - 'arduino/cloud/showHideSketchbook' - ); - - export const PULL_SKETCH = Command.toLocalizedCommand( - { - id: 'arduino-cloud-sketchbook--pull-sketch', - label: 'Pull Sketch', - iconClass: 'pull-sketch-icon', - }, - 'arduino/cloud/pullSketch' - ); - - export const PUSH_SKETCH = Command.toLocalizedCommand( - { - id: 'arduino-cloud-sketchbook--push-sketch', - label: 'Push Sketch', - iconClass: 'push-sketch-icon', - }, - 'arduino/cloud/pullSketch' - ); - - export const OPEN_IN_CLOUD_EDITOR = Command.toLocalizedCommand( - { - id: 'arduino-cloud-sketchbook--open-in-cloud-editor', - label: 'Open in Cloud Editor', - }, - 'arduino/cloud/openInCloudEditor' - ); - - export const OPEN_SKETCHBOOKSYNC_CONTEXT_MENU = Command.toLocalizedCommand( - { - id: 'arduino-sketchbook-sync--open-sketch-context-menu', - label: 'Options...', - iconClass: 'sketchbook-tree__opts', - }, - 'arduino/cloud/options' - ); - - export const OPEN_SKETCH_SHARE_DIALOG = Command.toLocalizedCommand( - { - id: 'arduino-cloud-sketchbook--share-modal', - label: 'Share...', - }, - 'arduino/cloud/share' - ); - - export const OPEN_PROFILE_CONTEXT_MENU: Command = { - id: 'arduino-cloud-sketchbook--open-profile-menu', - label: 'Contextual menu', - }; -} - @injectable() -export class CloudSketchbookContribution extends Contribution { - @inject(FileService) - protected readonly fileService: FileService; - +export class CloudSketchbookContribution extends CloudSketchContribution { @inject(ContextMenuRenderer) - protected readonly contextMenuRenderer: ContextMenuRenderer; - + private readonly contextMenuRenderer: ContextMenuRenderer; @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; - - @inject(SketchesServiceClientImpl) - protected readonly sketchServiceClient: SketchesServiceClientImpl; - + private readonly menuRegistry: MenuModelRegistry; + @inject(CommandRegistry) + private readonly commandRegistry: CommandRegistry; @inject(WindowService) - protected readonly windowService: WindowService; - - @inject(CreateApi) - protected readonly createApi: CreateApi; - + private readonly windowService: WindowService; @inject(ArduinoPreferences) - protected readonly arduinoPreferences: ArduinoPreferences; - + private readonly arduinoPreferences: ArduinoPreferences; @inject(PreferenceService) - protected readonly preferenceService: PreferenceService; - - @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; + private readonly preferenceService: PreferenceService; + @inject(ConfigServiceClient) + private readonly configServiceClient: ConfigServiceClient; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + + private readonly onDidChangeToolbarEmitter = new Emitter<void>(); + private readonly toDisposeBeforeNewContextMenu = new DisposableCollection(); + private readonly toDisposeOnStop = new DisposableCollection( + this.onDidChangeToolbarEmitter, + this.toDisposeBeforeNewContextMenu + ); + private shell: ApplicationShell | undefined; + + override onStart(app: FrontendApplication): void { + this.shell = app.shell; + this.toDisposeOnStop.pushAll([ + this.connectionStatus.onOfflineStatusDidChange((offlineStatus) => { + if (!offlineStatus || offlineStatus === 'internet') { + this.fireToolbarChange(); + } + }), + this.createFeatures.onDidChangeSession(() => this.fireToolbarChange()), + this.createFeatures.onDidChangeEnabled(() => this.fireToolbarChange()), + this.createFeatures.onDidChangeCloudSketchState(() => + this.fireToolbarChange() + ), + ]); + } - protected readonly toDisposeBeforeNewContextMenu = new DisposableCollection(); + onStop(): void { + this.toDisposeOnStop.dispose(); + } override registerMenus(menus: MenuModelRegistry): void { menus.registerMenuAction(ArduinoMenus.FILE__ADVANCED_SUBMENU, { @@ -149,6 +98,23 @@ export class CloudSketchbookContribution extends Contribution { }); } + override registerToolbarItems(registry: TabBarToolbarRegistry): void { + registry.registerItem({ + id: CloudSketchbookCommands.PULL_SKETCH__TOOLBAR.id, + command: CloudSketchbookCommands.PULL_SKETCH__TOOLBAR.id, + tooltip: CloudSketchbookCommands.PULL_SKETCH__TOOLBAR.label, + priority: -2, + onDidChange: this.onDidChangeToolbar, + }); + registry.registerItem({ + id: CloudSketchbookCommands.PUSH_SKETCH__TOOLBAR.id, + command: CloudSketchbookCommands.PUSH_SKETCH__TOOLBAR.id, + tooltip: CloudSketchbookCommands.PUSH_SKETCH__TOOLBAR.label, + priority: -1, + onDidChange: this.onDidChangeToolbar, + }); + } + override registerCommands(registry: CommandRegistry): void { registry.registerCommand(CloudSketchbookCommands.TOGGLE_CLOUD_SKETCHBOOK, { execute: () => { @@ -158,32 +124,41 @@ export class CloudSketchbookContribution extends Contribution { PreferenceScope.User ); }, - isEnabled: () => true, - isVisible: () => true, }); registry.registerCommand(CloudSketchbookCommands.PULL_SKETCH, { execute: (arg) => arg.model.sketchbookTree().pull(arg), - isEnabled: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node), - isVisible: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node), + isEnabled: (arg) => this.isCloudSketchDirNodeCommandArg(arg), + isVisible: (arg) => this.isCloudSketchDirNodeCommandArg(arg), }); registry.registerCommand(CloudSketchbookCommands.PUSH_SKETCH, { execute: (arg) => arg.model.sketchbookTree().push(arg.node), isEnabled: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node) && + this.isCloudSketchDirNodeCommandArg(arg) && CloudSketchbookTree.CloudSketchTreeNode.isSynced(arg.node), isVisible: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node) && + this.isCloudSketchDirNodeCommandArg(arg) && CloudSketchbookTree.CloudSketchTreeNode.isSynced(arg.node), }); + registry.registerCommand(CloudSketchbookCommands.PUSH_SKETCH__TOOLBAR, { + execute: () => + this.executeDelegateWithCurrentSketch( + CloudSketchbookCommands.PUSH_SKETCH.id + ), + isEnabled: (arg) => this.isEnabledCloudSketchToolbar(arg), + isVisible: (arg) => this.isVisibleCloudSketchToolbar(arg), + }); + registry.registerCommand(CloudSketchbookCommands.PULL_SKETCH__TOOLBAR, { + execute: () => + this.executeDelegateWithCurrentSketch( + CloudSketchbookCommands.PULL_SKETCH.id + ), + isEnabled: (arg) => this.isEnabledCloudSketchToolbar(arg), + isVisible: (arg) => this.isVisibleCloudSketchToolbar(arg), + }); + registry.registerCommand(CloudSketchbookCommands.OPEN_IN_CLOUD_EDITOR, { execute: (arg) => { this.windowService.openNewWindow( @@ -191,12 +166,8 @@ export class CloudSketchbookContribution extends Contribution { { external: true } ); }, - isEnabled: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node), - isVisible: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node), + isEnabled: (arg) => this.isCloudSketchDirNodeCommandArg(arg), + isVisible: (arg) => this.isCloudSketchDirNodeCommandArg(arg), }); registry.registerCommand(CloudSketchbookCommands.OPEN_SKETCH_SHARE_DIALOG, { @@ -207,12 +178,8 @@ export class CloudSketchbookContribution extends Contribution { createApi: this.createApi, }).open(); }, - isEnabled: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node), - isVisible: (arg) => - CloudSketchbookCommands.Arg.is(arg) && - CloudSketchbookTree.CloudSketchDirNode.is(arg.node), + isEnabled: (arg) => this.isCloudSketchDirNodeCommandArg(arg), + isVisible: (arg) => this.isCloudSketchDirNodeCommandArg(arg), }); registry.registerCommand( @@ -316,7 +283,118 @@ export class CloudSketchbookContribution extends Contribution { }, } ); + } + + private get currentCloudSketch(): Sketch | undefined { + const currentSketch = this.sketchServiceClient.tryGetCurrentSketch(); + // could not load sketch via CLI + if (!CurrentSketch.isValid(currentSketch)) { + return undefined; + } + // cannot determine if the sketch is in the cloud cache folder + const dataDirUri = this.configServiceClient.tryGetDataDirUri(); + if (!dataDirUri) { + return undefined; + } + // sketch is not in the cache folder + if (!this.createFeatures.isCloud(currentSketch, dataDirUri)) { + return undefined; + } + return currentSketch; + } + + private isVisibleCloudSketchToolbar(arg: unknown): boolean { + // cloud preference is disabled + if (!this.createFeatures.enabled) { + return false; + } + if (!this.currentCloudSketch) { + return false; + } + if (arg instanceof Widget) { + return !!this.shell && this.shell.getWidgets('main').indexOf(arg) !== -1; + } + return false; + } + + private isEnabledCloudSketchToolbar(arg: unknown): boolean { + if (!this.isVisibleCloudSketchToolbar(arg)) { + return false; + } + // not logged in + if (!this.createFeatures.session) { + return false; + } + // no Internet connection + if (this.connectionStatus.offlineStatus === 'internet') { + return false; + } + // no pull/push context for the current cloud sketch + const sketch = this.currentCloudSketch; + if (sketch) { + const cloudUri = this.createFeatures.cloudUri(sketch); + if (cloudUri) { + return !this.createFeatures.cloudSketchState( + CreateUri.toUri(cloudUri.path.toString()) + ); + } + } + return false; + } + + private isCloudSketchDirNodeCommandArg( + arg: unknown + ): arg is CloudSketchbookCommands.Arg & { + node: CloudSketchbookTree.CloudSketchDirNode; + } { + return ( + CloudSketchbookCommands.Arg.is(arg) && + CloudSketchbookTree.CloudSketchDirNode.is(arg.node) && + !this.createFeatures.cloudSketchState(arg.node.remoteUri) + ); + } + + private async commandArgFromCurrentSketch(): Promise< + CloudSketchbookCommands.Arg | undefined + > { + const sketch = this.currentCloudSketch; + if (!sketch) { + return undefined; + } + const model = await this.treeModel(); + if (!model) { + return undefined; + } + const cloudUri = this.createFeatures.cloudUri(sketch); + if (!cloudUri) { + return undefined; + } + const posixPath = cloudUri.path.toString(); + const node = model.getNode(posixPath); + if (CloudSketchbookTree.CloudSketchDirNode.is(node)) { + return { model, node }; + } + return undefined; + } + + private async executeDelegateWithCurrentSketch(id: string): Promise<unknown> { + const arg = await this.commandArgFromCurrentSketch(); + if (!arg) { + return; + } + if (!this.commandRegistry.getActiveHandler(id, arg)) { + throw new Error( + `No active handler was available for the delegate command: ${id}. Cloud sketch tree node: ${arg.node.id}` + ); + } + return this.commandRegistry.executeCommand(id, arg); + } + + private fireToolbarChange(): void { + this.onDidChangeToolbarEmitter.fire(); + } - this.registerMenus(this.menuRegistry); + private get onDidChangeToolbar(): Event<void> { + return this.onDidChangeToolbarEmitter.event; } } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts index 3211a85f0..e57926465 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts @@ -20,6 +20,7 @@ import URI from '@theia/core/lib/common/uri'; import { Create } from '../../create/typings'; import { nls } from '@theia/core/lib/common/nls'; import { Deferred } from '@theia/core/lib/common/promise-util'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; function sketchBaseDir(sketch: Create.Sketch): FileStat { // extract the sketch path @@ -63,15 +64,22 @@ export class CloudSketchbookTreeModel extends SketchbookTreeModel { private readonly authenticationService: AuthenticationClientService; @inject(LocalCacheFsProvider) private readonly localCacheFsProvider: LocalCacheFsProvider; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; private _localCacheFsProviderReady: Deferred<void> | undefined; @postConstruct() protected override init(): void { super.init(); - this.toDispose.push( - this.authenticationService.onSessionDidChange(() => this.updateRoot()) - ); + this.toDispose.pushAll([ + this.authenticationService.onSessionDidChange(() => this.updateRoot()), + this.connectionStatus.onOfflineStatusDidChange((offlineStatus) => { + if (!offlineStatus) { + this.updateRoot(); + } + }), + ]); } override *getNodesByUri(uri: URI): IterableIterator<TreeNode> { diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx index 3f1ae430f..8877d2381 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx @@ -15,6 +15,7 @@ import { CompositeTreeNode } from '@theia/core/lib/browser'; import { shell } from '@theia/core/electron-shared/@electron/remote'; import { SketchbookTreeWidget } from '../sketchbook/sketchbook-tree-widget'; import { nls } from '@theia/core/lib/common'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; @injectable() export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { @@ -27,6 +28,9 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { @inject(CloudSketchbookTree) protected readonly cloudSketchbookTree: CloudSketchbookTree; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + protected override renderTree(model: TreeModel): React.ReactNode { if (this.shouldShowWelcomeView()) return this.renderViewWelcome(); if (this.shouldShowEmptyView()) return this.renderEmptyView(); @@ -91,10 +95,33 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { return classNames; } + protected override renderIcon( + node: TreeNode, + props: NodeProps + ): React.ReactNode { + if (CloudSketchbookTree.CloudSketchDirNode.is(node)) { + const synced = CloudSketchbookTree.CloudSketchTreeNode.isSynced(node); + const offline = this.connectionStatus.offlineStatus === 'internet'; + const icon = `fa fa-arduino-cloud${synced ? '-filled' : ''}${ + offline ? '-offline' : '' + }`; + return ( + <div + className={`theia-file-icons-js file-icon${ + !synced && offline ? ' not-in-sync-offline' : '' + }`} + > + <div className={icon} /> + </div> + ); + } + return super.renderIcon(node, props); + } + protected override renderInlineCommands(node: any): React.ReactNode { if (CloudSketchbookTree.CloudSketchDirNode.is(node) && node.commands) { return Array.from(new Set(node.commands)).map((command) => - this.renderInlineCommand(command.id, node, { + this.renderInlineCommand(command, node, { username: this.authenticationService.session?.account?.label, }) ); diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts index e3dd60e70..9a5571da2 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree.ts @@ -22,15 +22,22 @@ import { LocalCacheFsProvider, LocalCacheUri, } from '../../local-cache/local-cache-fs-provider'; -import { CloudSketchbookCommands } from './cloud-sketchbook-contributions'; +import { CloudSketchbookCommands } from './cloud-sketchbook-commands'; import { DoNotAskAgainConfirmDialog } from '../../dialogs/do-not-ask-again-dialog'; import { SketchbookTree } from '../sketchbook/sketchbook-tree'; -import { firstToUpperCase } from '../../../common/utils'; +import { assertUnreachable } from '../../../common/utils'; import { FileStat } from '@theia/filesystem/lib/common/files'; import { WorkspaceNode } from '@theia/navigator/lib/browser/navigator-tree'; import { posix, splitSketchPath } from '../../create/create-paths'; import { Create } from '../../create/typings'; import { nls } from '@theia/core/lib/common'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; +import { ExecuteWithProgress } from '../../../common/protocol/progressible'; +import { + pullingSketch, + pushingSketch, +} from '../../contributions/cloud-contribution'; +import { CloudSketchState, CreateFeatures } from '../../create/create-features'; const MESSAGE_TIMEOUT = 5 * 1000; const deepmerge = require('deepmerge').default; @@ -54,6 +61,19 @@ export class CloudSketchbookTree extends SketchbookTree { @inject(CreateApi) private readonly createApi: CreateApi; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatus: ApplicationConnectionStatusContribution; + + @inject(CreateFeatures) + private readonly createFeatures: CreateFeatures; + + protected override init(): void { + this.toDispose.push( + this.connectionStatus.onOfflineStatusDidChange(() => this.refresh()) + ); + super.init(); + } + async pushPublicWarn( node: CloudSketchbookTree.CloudSketchDirNode ): Promise<boolean> { @@ -84,7 +104,7 @@ export class CloudSketchbookTree extends SketchbookTree { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any - async pull(arg: any): Promise<void> { + async pull(arg: any, noProgress = false): Promise<void> { const { // model, node, @@ -118,32 +138,45 @@ export class CloudSketchbookTree extends SketchbookTree { return; } } - return this.runWithState(node, 'pulling', async (node) => { - const commandsCopy = node.commands; - node.commands = []; + return this.runWithState( + node, + 'pull', + async (node) => { + await this.pullNode(node); + }, + noProgress + ); + } - const localUri = await this.fileService.toUnderlyingResource( - LocalCacheUri.root.resolve(node.remoteUri.path) - ); - await this.sync(node.remoteUri, localUri); + private async pullNode(node: CloudSketchbookTree.CloudSketchDirNode) { + const commandsCopy = node.commands; + node.commands = []; - this.createApi.sketchCache.purgeByPath(node.remoteUri.path.toString()); + const localUri = await this.fileService.toUnderlyingResource( + LocalCacheUri.root.resolve(node.remoteUri.path) + ); + await this.sync(node.remoteUri, localUri); - node.commands = commandsCopy; - this.messageService.info( - nls.localize( - 'arduino/cloud/donePulling', - 'Done pulling ‘{0}’.', - node.fileStat.name - ), - { - timeout: MESSAGE_TIMEOUT, - } - ); - }); + this.createApi.sketchCache.purgeByPath(node.remoteUri.path.toString()); + + node.commands = commandsCopy; + this.messageService.info( + nls.localize( + 'arduino/cloud/donePulling', + "Done pulling '{0}'.", + node.fileStat.name + ), + { + timeout: MESSAGE_TIMEOUT, + } + ); } - async push(node: CloudSketchbookTree.CloudSketchDirNode): Promise<void> { + async push( + node: CloudSketchbookTree.CloudSketchDirNode, + noProgress = false, + ignorePushWarnings = false + ): Promise<void> { if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { throw new Error( nls.localize( @@ -158,7 +191,8 @@ export class CloudSketchbookTree extends SketchbookTree { return; } - const warn = this.arduinoPreferences['arduino.cloud.push.warn']; + const warn = + !ignorePushWarnings && this.arduinoPreferences['arduino.cloud.push.warn']; if (warn) { const ok = await new DoNotAskAgainConfirmDialog({ @@ -178,37 +212,46 @@ export class CloudSketchbookTree extends SketchbookTree { return; } } - return this.runWithState(node, 'pushing', async (node) => { - if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { - throw new Error( - nls.localize( - 'arduino/cloud/pullFirst', - 'You have to pull first to be able to push to the Cloud.' - ) - ); - } - const commandsCopy = node.commands; - node.commands = []; + return this.runWithState( + node, + 'push', + async (node) => { + await this.pushNode(node); + }, + noProgress + ); + } - const localUri = await this.fileService.toUnderlyingResource( - LocalCacheUri.root.resolve(node.remoteUri.path) + private async pushNode(node: CloudSketchbookTree.CloudSketchDirNode) { + if (!CloudSketchbookTree.CloudSketchTreeNode.isSynced(node)) { + throw new Error( + nls.localize( + 'arduino/cloud/pullFirst', + 'You have to pull first to be able to push to the Cloud.' + ) ); - await this.sync(localUri, node.remoteUri); + } + const commandsCopy = node.commands; + node.commands = []; - this.createApi.sketchCache.purgeByPath(node.remoteUri.path.toString()); + const localUri = await this.fileService.toUnderlyingResource( + LocalCacheUri.root.resolve(node.remoteUri.path) + ); + await this.sync(localUri, node.remoteUri); - node.commands = commandsCopy; - this.messageService.info( - nls.localize( - 'arduino/cloud/donePushing', - 'Done pushing ‘{0}’.', - node.fileStat.name - ), - { - timeout: MESSAGE_TIMEOUT, - } - ); - }); + this.createApi.sketchCache.purgeByPath(node.remoteUri.path.toString()); + + node.commands = commandsCopy; + this.messageService.info( + nls.localize( + 'arduino/cloud/donePushing', + "Done pushing '{0}'.", + node.fileStat.name + ), + { + timeout: MESSAGE_TIMEOUT, + } + ); } private async recursiveURIs(uri: URI): Promise<URI[]> { @@ -310,31 +353,37 @@ export class CloudSketchbookTree extends SketchbookTree { private async runWithState<T>( node: CloudSketchbookTree.CloudSketchDirNode & Partial<DecoratedTreeNode>, - state: CloudSketchbookTree.CloudSketchDirNode.State, - task: (node: CloudSketchbookTree.CloudSketchDirNode) => MaybePromise<T> + state: CloudSketchState, + task: (node: CloudSketchbookTree.CloudSketchDirNode) => MaybePromise<T>, + noProgress = false ): Promise<T> { - const decoration: WidgetDecoration.TailDecoration = { - data: `${firstToUpperCase(state)}...`, - fontData: { - color: 'var(--theia-list-highlightForeground)', - }, - }; + this.createFeatures.setCloudSketchState(node.remoteUri, state); try { - node.state = state; - this.mergeDecoration(node, { tailDecorations: [decoration] }); + const result = await (noProgress + ? task(node) + : ExecuteWithProgress.withProgress( + this.taskMessage(state, node.uri.path.name), + this.messageService, + async (progress) => { + progress.report({ work: { done: 0, total: NaN } }); + return task(node); + } + )); await this.refresh(node); - const result = await task(node); return result; } finally { - delete node.state; - // TODO: find a better way to attach and detach decorators. Do we need a proper `TreeDecorator` instead? - const index = node.decorationData?.tailDecorations?.findIndex( - (candidate) => JSON.stringify(decoration) === JSON.stringify(candidate) - ); - if (typeof index === 'number' && index !== -1) { - node.decorationData?.tailDecorations?.splice(index, 1); - } - await this.refresh(node); + this.createFeatures.setCloudSketchState(node.remoteUri, undefined); + } + } + + private taskMessage(state: CloudSketchState, input: string): string { + switch (state) { + case 'pull': + return pullingSketch(input); + case 'push': + return pushingSketch(input); + default: + assertUnreachable(state); } } @@ -501,7 +550,7 @@ export class CloudSketchbookTree extends SketchbookTree { }; } - protected readonly notInSyncDecoration: WidgetDecoration.Data = { + protected readonly notInSyncOfflineDecoration: WidgetDecoration.Data = { fontData: { color: 'var(--theia-activityBar-inactiveForeground)', }, @@ -522,11 +571,15 @@ export class CloudSketchbookTree extends SketchbookTree { node.fileStat.resource.path.toString() ); - const commands = [CloudSketchbookCommands.PULL_SKETCH]; + const commands: Command[] = []; + if (this.connectionStatus.offlineStatus !== 'internet') { + commands.push(CloudSketchbookCommands.PULL_SKETCH); + } if ( CloudSketchbookTree.CloudSketchTreeNode.is(node) && - CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) + CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) && + this.connectionStatus.offlineStatus !== 'internet' ) { commands.push(CloudSketchbookCommands.PUSH_SKETCH); } @@ -557,14 +610,15 @@ export class CloudSketchbookTree extends SketchbookTree { } } - // add style decoration for not-in-sync files + // add style decoration for not-in-sync files when offline if ( CloudSketchbookTree.CloudSketchTreeNode.is(node) && - !CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) + !CloudSketchbookTree.CloudSketchTreeNode.isSynced(node) && + this.connectionStatus.offlineStatus === 'internet' ) { - this.mergeDecoration(node, this.notInSyncDecoration); + this.mergeDecoration(node, this.notInSyncOfflineDecoration); } else { - this.removeDecoration(node, this.notInSyncDecoration); + this.removeDecoration(node, this.notInSyncOfflineDecoration); } return node; @@ -644,7 +698,7 @@ export namespace CloudSketchbookTree { export interface CloudSketchDirNode extends Omit<SketchbookTree.SketchDirNode, 'fileStat'>, CloudSketchTreeNode { - state?: CloudSketchDirNode.State; + state?: CloudSketchState; isPublic?: boolean; sketchId?: string; commands?: Command[]; @@ -653,7 +707,5 @@ export namespace CloudSketchbookTree { export function is(node: TreeNode | undefined): node is CloudSketchDirNode { return SketchbookTree.SketchDirNode.is(node); } - - export type State = 'syncing' | 'pulling' | 'pushing'; } } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-user-status.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx similarity index 62% rename from arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-user-status.tsx rename to arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx index 68a7da5eb..cd329369d 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-user-status.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx @@ -1,19 +1,17 @@ import * as React from '@theia/core/shared/react'; -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; import { AuthenticationClientService } from '../../auth/authentication-client-service'; import { nls } from '@theia/core/lib/common'; +import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; export class CloudStatus extends React.Component< - UserStatus.Props, - UserStatus.State + CloudStatus.Props, + CloudStatus.State > { protected readonly toDispose = new DisposableCollection(); - constructor(props: UserStatus.Props) { + constructor(props: CloudStatus.Props) { super(props); this.state = { status: this.status, @@ -22,17 +20,11 @@ export class CloudStatus extends React.Component< } override componentDidMount(): void { - const statusListener = () => this.setState({ status: this.status }); - window.addEventListener('online', statusListener); - window.addEventListener('offline', statusListener); - this.toDispose.pushAll([ - Disposable.create(() => - window.removeEventListener('online', statusListener) - ), - Disposable.create(() => - window.removeEventListener('offline', statusListener) - ), - ]); + this.toDispose.push( + this.props.connectionStatus.onOfflineStatusDidChange(() => + this.setState({ status: this.status }) + ) + ); } override componentWillUnmount(): void { @@ -58,14 +50,21 @@ export class CloudStatus extends React.Component< : nls.localize('arduino/cloud/offline', 'Offline')} </div> <div className="actions item flex-line"> - <div - title={nls.localize('arduino/cloud/sync', 'Sync')} - className={`fa fa-reload ${ - (this.state.refreshing && 'rotating') || '' - }`} - style={{ cursor: 'pointer' }} - onClick={this.onDidClickRefresh} - /> + {this.props.connectionStatus.offlineStatus === 'internet' ? ( + <div + className="fa fa-arduino-cloud-offline" + title={nls.localize('arduino/cloud/offline', 'Offline')} + /> + ) : ( + <div + title={nls.localize('arduino/cloud/sync', 'Sync')} + className={`fa fa-reload ${ + (this.state.refreshing && 'rotating') || '' + }`} + style={{ cursor: 'pointer' }} + onClick={this.onDidClickRefresh} + /> + )} </div> </div> ); @@ -83,14 +82,17 @@ export class CloudStatus extends React.Component< }; private get status(): 'connected' | 'offline' { - return window.navigator.onLine ? 'connected' : 'offline'; + return this.props.connectionStatus.offlineStatus === 'internet' + ? 'offline' + : 'connected'; } } -export namespace UserStatus { +export namespace CloudStatus { export interface Props { readonly model: CloudSketchbookTreeModel; readonly authenticationService: AuthenticationClientService; + readonly connectionStatus: ApplicationConnectionStatusContribution; } export interface State { status: 'connected' | 'offline'; diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts index 50b5f9008..c8935d663 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-commands.ts @@ -27,17 +27,14 @@ export namespace SketchbookCommands { export const OPEN_SKETCHBOOK_CONTEXT_MENU: Command = { id: 'arduino-sketchbook--open-sketch-context-menu', - label: 'Contextual menu', iconClass: 'sketchbook-tree__opts', }; export const SKETCHBOOK_HIDE_FILES: Command = { id: 'arduino-sketchbook--hide-files', - label: 'Contextual menu', }; export const SKETCHBOOK_SHOW_FILES: Command = { id: 'arduino-sketchbook--show-files', - label: 'Contextual menu', }; } diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-widget.tsx index ece7a1a20..5d1152e21 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 @@ -5,7 +5,7 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { TreeNode } from '@theia/core/lib/browser/tree/tree'; -import { CommandRegistry } from '@theia/core/lib/common/command'; +import { Command, CommandRegistry } from '@theia/core/lib/common/command'; import { NodeProps, TreeProps, @@ -23,7 +23,6 @@ import { SketchesServiceClientImpl, } from '../../sketches-service-client-impl'; import { SelectableTreeNode } from '@theia/core/lib/browser/tree/tree-selection'; -import { Sketch } from '../../contributions/contribution'; import { nls } from '@theia/core/lib/common'; const customTreeProps: TreeProps = { @@ -91,8 +90,8 @@ export class SketchbookTreeWidget extends FileTreeWidget { node: TreeNode, props: NodeProps ): React.ReactNode { - if (SketchbookTree.SketchDirNode.is(node) || Sketch.isSketchFile(node.id)) { - return <div className="sketch-folder-icon file-icon"></div>; + if (SketchbookTree.SketchDirNode.is(node)) { + return undefined; } const icon = this.toNodeIcon(node); if (icon) { @@ -133,26 +132,34 @@ export class SketchbookTreeWidget extends FileTreeWidget { protected renderInlineCommands(node: TreeNode): React.ReactNode { if (SketchbookTree.SketchDirNode.is(node) && node.commands) { return Array.from(new Set(node.commands)).map((command) => - this.renderInlineCommand(command.id, node) + this.renderInlineCommand(command, node) ); } return undefined; } protected renderInlineCommand( - commandId: string, + command: Command | string | [command: string, label: string], node: SketchbookTree.SketchDirNode, options?: any ): React.ReactNode { - const command = this.commandRegistry.getCommand(commandId); - const icon = command?.iconClass; + const commandId = Command.is(command) + ? command.id + : Array.isArray(command) + ? command[0] + : command; + const resolvedCommand = this.commandRegistry.getCommand(commandId); + const icon = resolvedCommand?.iconClass; const args = { model: this.model, node: node, ...options }; if ( - command && + resolvedCommand && icon && this.commandRegistry.isEnabled(commandId, args) && this.commandRegistry.isVisible(commandId, args) ) { + const label = Array.isArray(command) + ? command[1] + : resolvedCommand.label ?? resolvedCommand.id; const className = [ TREE_NODE_SEGMENT_CLASS, TREE_NODE_TAIL_CLASS, @@ -164,7 +171,7 @@ export class SketchbookTreeWidget extends FileTreeWidget { <div key={`${commandId}--${node.id}`} className={className} - title={command?.label || command.id} + title={label} onClick={(event) => { event.preventDefault(); event.stopPropagation(); diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts index 6726f12b6..86391c7db 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree.ts @@ -9,6 +9,7 @@ import { WorkspaceRootNode, } from '@theia/navigator/lib/browser/navigator-tree'; import { ArduinoPreferences } from '../../arduino-preferences'; +import { nls } from '@theia/core/lib/common/nls'; @injectable() export class SketchbookTree extends FileNavigatorTree { @@ -18,7 +19,9 @@ export class SketchbookTree extends FileNavigatorTree { @inject(ArduinoPreferences) protected readonly arduinoPreferences: ArduinoPreferences; - override async resolveChildren(parent: CompositeTreeNode): Promise<TreeNode[]> { + override async resolveChildren( + parent: CompositeTreeNode + ): Promise<TreeNode[]> { const showAllFiles = this.arduinoPreferences['arduino.sketchbook.showAllFiles']; @@ -71,7 +74,13 @@ export class SketchbookTree extends FileNavigatorTree { protected async augmentSketchNode(node: DirNode): Promise<void> { Object.assign(node, { type: 'sketch', - commands: [SketchbookCommands.OPEN_SKETCHBOOK_CONTEXT_MENU], + commands: [ + [ + 'arduino-create-cloud-copy', + nls.localize('arduino/createCloudCopy', 'Push Sketch to Cloud'), + ], + SketchbookCommands.OPEN_SKETCHBOOK_CONTEXT_MENU, + ], }); } @@ -96,7 +105,10 @@ export class SketchbookTree extends FileNavigatorTree { export namespace SketchbookTree { export interface SketchDirNode extends DirNode { readonly type: 'sketch'; - readonly commands?: Command[]; + /** + * Theia command, the command ID string, or a tuple of command ID and preferred UI label. If the array construct is used, the label is the 1<sup>st</sup> of the array. + */ + readonly commands?: (Command | string | [string, string])[]; } export namespace SketchDirNode { export function is( diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts index ba3794233..511ac486f 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 @@ -106,7 +106,7 @@ export class SketchbookWidgetContribution this.revealSketchNode(treeWidgetId, nodeUri), }); registry.registerCommand(SketchbookCommands.OPEN_NEW_WINDOW, { - execute: (arg) => this.openNewWindow(arg.node), + execute: (arg) => this.openNewWindow(arg.node, arg?.treeWidgetId), isEnabled: (arg) => !!arg && 'node' in arg && SketchbookTree.SketchDirNode.is(arg.node), isVisible: (arg) => @@ -209,14 +209,20 @@ export class SketchbookWidgetContribution }); } - private openNewWindow(node: SketchbookTree.SketchDirNode): void { - const widget = this.tryGetWidget(); - if (widget) { - const treeWidgetId = widget.activeTreeWidgetId(); - if (!treeWidgetId) { + private openNewWindow( + node: SketchbookTree.SketchDirNode, + treeWidgetId?: string + ): void { + if (!treeWidgetId) { + const widget = this.tryGetWidget(); + if (!widget) { console.warn(`Could not retrieve active sketchbook tree ID.`); return; } + treeWidgetId = widget.activeTreeWidgetId(); + } + const widget = this.tryGetWidget(); + if (widget) { const nodeUri = node.uri.toString(); const options: WorkspaceInput = {}; Object.assign(options, { diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 7953be720..9364639f6 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -74,12 +74,15 @@ export interface SketchesService { isTemp(sketch: SketchRef): Promise<boolean>; /** - * If `isTemp` is `true` for the `sketch`, you can call this method to move the sketch from the temp - * location to `directories.user`. Resolves with the URI of the sketch after the move. Rejects, when the sketch - * was not in the temp folder. This method always overrides. It's the callers responsibility to ask the user whether - * the files at the destination can be overwritten or not. + * Recursively copies the sketch folder content including all files into the destination folder. + * Resolves with the new URI of the sketch after the move. This method always overrides. It's the callers responsibility to ask the user whether + * the files at the destination can be overwritten or not. This method copies all filesystem files, if you want to copy only sketch files, + * but exclude, for example, language server log file, set the `onlySketchFiles` property to `true`. `onlySketchFiles` is `false` by default. */ - copy(sketch: Sketch, options: { destinationUri: string }): Promise<string>; + copy( + sketch: Sketch, + options: { destinationUri: string; onlySketchFiles?: boolean } + ): Promise<Sketch>; /** * Returns with the container sketch for the input `uri`. If the `uri` is not in a sketch folder, the promise resolves to `undefined`. diff --git a/arduino-ide-extension/src/common/utils.ts b/arduino-ide-extension/src/common/utils.ts index 994e02ec0..56ed366c1 100644 --- a/arduino-ide-extension/src/common/utils.ts +++ b/arduino-ide-extension/src/common/utils.ts @@ -21,8 +21,15 @@ export function isNullOrUndefined(what: unknown): what is undefined | null { return what === undefined || what === null; } +// Use it for and exhaustive `switch` statements +// https://stackoverflow.com/a/39419171/5529090 +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function assertUnreachable(_: never): never { + throw new Error(); +} + // Text encoder can crash in electron browser: https://github.com/arduino/arduino-ide/issues/634#issuecomment-1440039171 -export function unit8ArrayToString(uint8Array: Uint8Array): string { +export function uint8ArrayToString(uint8Array: Uint8Array): string { return uint8Array.reduce( (text, byte) => text + String.fromCharCode(byte), '' diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index f4ff29db2..c6fd56a8a 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -6,7 +6,6 @@ import * as path from 'path'; import * as glob from 'glob'; import * as crypto from 'crypto'; import * as PQueue from 'p-queue'; -import { ncp } from 'ncp'; import { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; import { ILogger } from '@theia/core/lib/common/logger'; @@ -44,6 +43,7 @@ import { startsWithUpperCase, } from '../common/utils'; import { SettingsReader } from './settings-reader'; +import cpy = require('cpy'); const RecentSketches = 'recent-sketches.json'; const DefaultIno = `void setup() { @@ -368,63 +368,66 @@ export class SketchesServiceImpl const destinationUri = FileUri.create( path.join(parentPath, sketch.name) ).toString(); - const copiedSketchUri = await this.copy(sketch, { destinationUri }); - return this.doLoadSketch(copiedSketchUri, false); - } - - async createNewSketch(): Promise<Sketch> { - const monthNames = [ - 'jan', - 'feb', - 'mar', - 'apr', - 'may', - 'jun', - 'jul', - 'aug', - 'sep', - 'oct', - 'nov', - 'dec', - ]; - const today = new Date(); + const copiedSketch = await this.copy(sketch, { destinationUri }); + return this.doLoadSketch(copiedSketch.uri, false); + } + + async createNewSketch(name?: string, content?: string): Promise<Sketch> { + let sketchName: string | undefined = name; const parentPath = await this.createTempFolder(); - const sketchBaseName = `sketch_${ - monthNames[today.getMonth()] - }${today.getDate()}`; - const { config } = await this.configService.getConfiguration(); - const sketchbookPath = config?.sketchDirUri - ? FileUri.fsPath(config?.sketchDirUri) - : os.homedir(); - let sketchName: string | undefined; - - // If it's another day, reset the count of sketches created today - if (this.lastSketchBaseName !== sketchBaseName) this.sketchSuffixIndex = 1; - - let nameFound = false; - while (!nameFound) { - const sketchNameCandidate = `${sketchBaseName}${sketchIndexToLetters( - this.sketchSuffixIndex++ - )}`; - // Note: we check the future destination folder (`directories.user`) for name collision and not the temp folder! - const sketchExists = await exists( - path.join(sketchbookPath, sketchNameCandidate) - ); - if (!sketchExists) { - nameFound = true; - sketchName = sketchNameCandidate; + if (!sketchName) { + const monthNames = [ + 'jan', + 'feb', + 'mar', + 'apr', + 'may', + 'jun', + 'jul', + 'aug', + 'sep', + 'oct', + 'nov', + 'dec', + ]; + const today = new Date(); + const sketchBaseName = `sketch_${ + monthNames[today.getMonth()] + }${today.getDate()}`; + const { config } = await this.configService.getConfiguration(); + const sketchbookPath = config?.sketchDirUri + ? FileUri.fsPath(config?.sketchDirUri) + : os.homedir(); + + // If it's another day, reset the count of sketches created today + if (this.lastSketchBaseName !== sketchBaseName) + this.sketchSuffixIndex = 1; + + let nameFound = false; + while (!nameFound) { + const sketchNameCandidate = `${sketchBaseName}${sketchIndexToLetters( + this.sketchSuffixIndex++ + )}`; + // Note: we check the future destination folder (`directories.user`) for name collision and not the temp folder! + const sketchExists = await exists( + path.join(sketchbookPath, sketchNameCandidate) + ); + if (!sketchExists) { + nameFound = true; + sketchName = sketchNameCandidate; + } } + this.lastSketchBaseName = sketchBaseName; } if (!sketchName) { throw new Error('Cannot create a unique sketch name'); } - this.lastSketchBaseName = sketchBaseName; const sketchDir = path.join(parentPath, sketchName); const sketchFile = path.join(sketchDir, `${sketchName}.ino`); const [inoContent] = await Promise.all([ - this.loadInoContent(), + content ? content : this.loadInoContent(), fs.mkdir(sketchDir, { recursive: true }), ]); await fs.writeFile(sketchFile, inoContent, { encoding: 'utf8' }); @@ -441,7 +444,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` */ - private createTempFolder(): Promise<string> { + createTempFolder(): Promise<string> { return new Promise<string>((resolve, reject) => { temp.mkdir({ prefix: TempSketchPrefix }, (createError, dirPath) => { if (createError) { @@ -499,58 +502,37 @@ export class SketchesServiceImpl async copy( sketch: Sketch, - { destinationUri }: { destinationUri: string } - ): Promise<string> { - const source = FileUri.fsPath(sketch.uri); - const sketchExists = await exists(source); - if (!sketchExists) { - throw new Error(`Sketch does not exist: ${sketch}`); + { + destinationUri, + onlySketchFiles, + }: { destinationUri: string; onlySketchFiles?: boolean } + ): Promise<Sketch> { + const sourceUri = sketch.uri; + const source = FileUri.fsPath(sourceUri); + const destination = FileUri.fsPath(destinationUri); + if (source === destination) { + const reloadedSketch = await this.doLoadSketch(sourceUri, false); + return reloadedSketch; } - // Nothing to do when source and destination are the same. - if (sketch.uri === destinationUri) { - await this.doLoadSketch(sketch.uri, false); // Sanity check. - return sketch.uri; + const sourceFolderBasename = path.basename(source); + const destinationFolderBasename = path.basename(destination); + let filter: cpy.Options['filter']; + if (onlySketchFiles) { + const sketchFilePaths = Sketch.uris(sketch).map(FileUri.fsPath); + filter = (file) => sketchFilePaths.includes(file.path); + } else { + filter = () => true; } - - const copy = async (sourcePath: string, destinationPath: string) => { - return new Promise<void>((resolve, reject) => { - ncp.ncp(sourcePath, destinationPath, async (error) => { - if (error) { - reject(error); - return; - } - const newName = path.basename(destinationPath); - try { - const oldPath = path.join( - destinationPath, - new URI(sketch.mainFileUri).path.base - ); - const newPath = path.join(destinationPath, `${newName}.ino`); - if (oldPath !== newPath) { - await fs.rename(oldPath, newPath); - } - await this.doLoadSketch( - FileUri.create(destinationPath).toString(), - false - ); // Sanity check. - resolve(); - } catch (e) { - reject(e); - } - }); - }); - }; - // https://github.com/arduino/arduino-ide/issues/65 - // When copying `/path/to/sketchbook/sketch_A` to `/path/to/sketchbook/sketch_A/anything` on a non-POSIX filesystem, - // `ncp` makes a recursion and copies the folders over and over again. In such cases, we copy the source into a temp folder, - // then move it to the desired destination. - const destination = FileUri.fsPath(destinationUri); - let tempDestination = await this.createTempFolder(); - tempDestination = path.join(tempDestination, sketch.name); - await fs.mkdir(tempDestination, { recursive: true }); - await copy(source, tempDestination); - await copy(tempDestination, destination); - return FileUri.create(destination).toString(); + await cpy(source, destination, { + rename: (basename) => + sourceFolderBasename !== destinationFolderBasename && + basename === `${sourceFolderBasename}.ino` + ? `${destinationFolderBasename}.ino` + : basename, + filter, + }); + const copiedSketch = await this.doLoadSketch(destinationUri, false); + return copiedSketch; } async archive(sketch: Sketch, destinationUri: string): Promise<string> { diff --git a/arduino-ide-extension/src/test/browser/connection-status-service.test.ts b/arduino-ide-extension/src/test/browser/connection-status-service.test.ts new file mode 100644 index 000000000..1f1228ce6 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/connection-status-service.test.ts @@ -0,0 +1,46 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { expect } from 'chai'; +import { + backendOfflineText, + backendOfflineTooltip, + daemonOfflineText, + daemonOfflineTooltip, + offlineText, + offlineTooltip, + offlineMessage, +} from '../../browser/theia/core/connection-status-service'; + +disableJSDOM(); + +describe('connection-status-service', () => { + describe('offlineMessage', () => { + it('should warn about the offline backend if connected to both CLI daemon and Internet but offline', () => { + const actual = offlineMessage({ port: '50051', online: true }); + 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 }); + 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 }); + 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 }); + expect(actual.text.endsWith(offlineText)).to.be.true; + expect(actual.tooltip).to.be.equal(offlineTooltip); + }); + }); +}); 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 dd9ec71ae..fe89cc4b2 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 @@ -1,4 +1,4 @@ -import { Disposable } from '@theia/core/lib/common/disposable'; +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'; @@ -10,26 +10,18 @@ import { describe('boards-service-impl', () => { let boardService: BoardsService; - let toDispose: Disposable[] = []; + let toDispose: DisposableCollection; before(async function () { configureBackendApplicationConfigProvider(); this.timeout(20_000); - toDispose = []; + toDispose = new DisposableCollection(); const container = createContainer(); await start(container, toDispose); boardService = container.get<BoardsService>(BoardsService); }); - after(() => { - let disposable = toDispose.pop(); - while (disposable) { - try { - disposable?.dispose(); - } catch {} - disposable = toDispose.pop(); - } - }); + after(() => toDispose.dispose()); describe('search', () => { it('should run search', async function () { @@ -37,7 +29,7 @@ describe('boards-service-impl', () => { expect(result).is.not.empty; }); - it("should boost a result when 'types' includes 'arduino', and lower the score if deprecated", async function () { + it("should boost a result when 'types' includes 'arduino', and lower the score if deprecated", async () => { const result = await boardService.search({}); const arduinoIndexes: number[] = []; const otherIndexes: number[] = []; @@ -108,7 +100,7 @@ function createContainer(): Container { async function start( container: Container, - toDispose: Disposable[] + toDispose: DisposableCollection ): Promise<void> { return startDaemon(container, toDispose); } 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 fa73f6549..700673c32 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 @@ -1,6 +1,6 @@ import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; import { CommandRegistry } from '@theia/core/lib/common/command'; -import { Disposable } from '@theia/core/lib/common/disposable'; +import { 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, injectable } from '@theia/core/shared/inversify'; @@ -23,7 +23,7 @@ const uno = 'arduino:avr:uno'; describe('core-service-impl', () => { let container: Container; - let toDispose: Disposable[]; + let toDispose: DisposableCollection; before(() => { configureBackendApplicationConfigProvider(); @@ -31,20 +31,12 @@ describe('core-service-impl', () => { beforeEach(async function () { this.timeout(setupTimeout); - toDispose = []; + toDispose = new DisposableCollection(); container = createContainer(); await start(container, toDispose); }); - afterEach(() => { - let disposable = toDispose.pop(); - while (disposable) { - try { - disposable?.dispose(); - } catch {} - disposable = toDispose.pop(); - } - }); + afterEach(() => toDispose.dispose()); describe('compile', () => { it('should execute a command with the build path', async function () { @@ -92,7 +84,7 @@ describe('core-service-impl', () => { async function start( container: Container, - toDispose: Disposable[] + toDispose: DisposableCollection ): Promise<void> { await startDaemon(container, toDispose, async (container) => { const boardService = container.get<BoardsService>(BoardsService); 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 cd0f85737..95613395e 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 @@ -1,4 +1,4 @@ -import { Disposable } from '@theia/core/lib/common/disposable'; +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'; @@ -11,26 +11,18 @@ import { describe('library-service-impl', () => { let libraryService: LibraryService; - let toDispose: Disposable[] = []; + let toDispose: DisposableCollection; before(async function () { configureBackendApplicationConfigProvider(); this.timeout(20_000); - toDispose = []; + toDispose = new DisposableCollection(); const container = createContainer(); await start(container, toDispose); libraryService = container.get<LibraryService>(LibraryService); }); - after(() => { - let disposable = toDispose.pop(); - while (disposable) { - try { - disposable?.dispose(); - } catch {} - disposable = toDispose.pop(); - } - }); + after(() => toDispose.dispose()); describe('search', () => { it('should run search', async function () { @@ -89,7 +81,7 @@ function createContainer(): Container { async function start( container: Container, - toDispose: Disposable[] + toDispose: DisposableCollection ): Promise<void> { return startDaemon(container, toDispose); } diff --git a/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts new file mode 100644 index 000000000..7669971b1 --- /dev/null +++ b/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts @@ -0,0 +1,262 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +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 { sync as rimrafSync } from 'rimraf'; +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'; + +const testTimeout = 10_000; + +describe('sketches-service-impl', () => { + let container: Container; + let toDispose: DisposableCollection; + + before(async () => { + configureBackendApplicationConfigProvider(); + toDispose = new DisposableCollection(); + container = createContainer(); + await start(container, toDispose); + }); + + after(() => toDispose.dispose()); + + describe('copy', () => { + it('should copy a sketch when the destination does not exist', async function () { + this.timeout(testTimeout); + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const destinationPath = await sketchesService['createTempFolder'](); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const libBasename = 'lib.cpp'; + const libContent = 'lib content'; + const libPath = join(sourcePath, libBasename); + await fs.writeFile(libPath, libContent, { encoding: 'utf8' }); + const headerBasename = 'header.h'; + const headerContent = 'header content'; + const headerPath = join(sourcePath, headerBasename); + await fs.writeFile(headerPath, headerContent, { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; + + const copied = await sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }); + toDispose.push(disposeSketch(copied)); + expect(copied.name).to.be.equal(basename(destinationPath)); + expect( + Sketch.isInSketch( + FileUri.create( + join(destinationPath, `${basename(destinationPath)}.ino`) + ), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, libBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, headerBasename)), + copied + ) + ).to.be.true; + }); + + it("should copy only sketch files if 'onlySketchFiles' is true", async function () { + this.timeout(testTimeout); + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const destinationPath = await sketchesService['createTempFolder'](); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const libBasename = 'lib.cpp'; + const libContent = 'lib content'; + const libPath = join(sourcePath, libBasename); + await fs.writeFile(libPath, libContent, { encoding: 'utf8' }); + const headerBasename = 'header.h'; + const headerContent = 'header content'; + const headerPath = join(sourcePath, headerBasename); + await fs.writeFile(headerPath, headerContent, { encoding: 'utf8' }); + const logBasename = 'inols-clangd-err.log'; + const logContent = 'log file content'; + const logPath = join(sourcePath, logBasename); + await fs.writeFile(logPath, logContent, { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(logPath), sketch)).to.be.false; + const reloadedLogContent = await fs.readFile(logPath, { + encoding: 'utf8', + }); + expect(reloadedLogContent).to.be.equal(logContent); + + const copied = await sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + onlySketchFiles: true, + }); + toDispose.push(disposeSketch(copied)); + expect(copied.name).to.be.equal(basename(destinationPath)); + expect( + Sketch.isInSketch( + FileUri.create( + join(destinationPath, `${basename(destinationPath)}.ino`) + ), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, libBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, headerBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, logBasename)), + copied + ) + ).to.be.false; + try { + await fs.readFile(join(destinationPath, logBasename), { + encoding: 'utf8', + }); + expect.fail( + 'Log file must not exist in the destination. Expected ENOENT when loading the log file.' + ); + } catch (err) { + expect(ErrnoException.isENOENT(err)).to.be.true; + } + }); + + it('should copy sketch inside the sketch folder', async function () { + this.timeout(testTimeout); + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + let sketch = await sketchesService.createNewSketch(); + const destinationPath = join(FileUri.fsPath(sketch.uri), 'nested_copy'); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const libBasename = 'lib.cpp'; + const libContent = 'lib content'; + const libPath = join(sourcePath, libBasename); + await fs.writeFile(libPath, libContent, { encoding: 'utf8' }); + const headerBasename = 'header.h'; + const headerContent = 'header content'; + const headerPath = join(sourcePath, headerBasename); + await fs.writeFile(headerPath, headerContent, { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; + expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; + + const copied = await sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }); + toDispose.push(disposeSketch(copied)); + expect(copied.name).to.be.equal(basename(destinationPath)); + expect( + Sketch.isInSketch( + FileUri.create( + join(destinationPath, `${basename(destinationPath)}.ino`) + ), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, libBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, headerBasename)), + copied + ) + ).to.be.true; + }); + + it('should copy sketch with overwrite when source and destination sketch folder names are the same', async function () { + this.timeout(testTimeout); + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const sketchFolderName = 'alma'; + const contentOne = 'korte'; + const contentTwo = 'szilva'; + const [sketchOne, sketchTwo] = await Promise.all([ + sketchesService.createNewSketch(sketchFolderName, contentOne), + sketchesService.createNewSketch(sketchFolderName, contentTwo), + ]); + toDispose.push(disposeSketch(sketchOne, sketchTwo)); + const [mainFileContentOne, mainFileContentTwo] = await Promise.all([ + mainFileContentOf(sketchOne), + mainFileContentOf(sketchTwo), + ]); + expect(mainFileContentOne).to.be.equal(contentOne); + expect(mainFileContentTwo).to.be.equal(contentTwo); + + await sketchesService.copy(sketchOne, { destinationUri: sketchTwo.uri }); + const [mainFileContentOneAfterCopy, mainFileContentTwoAfterCopy] = + await Promise.all([ + mainFileContentOf(sketchOne), + mainFileContentOf(sketchTwo), + ]); + expect(mainFileContentOneAfterCopy).to.be.equal(contentOne); + expect(mainFileContentTwoAfterCopy).to.be.equal(contentOne); + }); + }); +}); + +function disposeSketch(...sketch: Sketch[]): Disposable { + return new DisposableCollection( + ...sketch + .map(({ uri }) => FileUri.fsPath(uri)) + .map((path) => + Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 })) + ) + ); +} + +async function mainFileContentOf(sketch: Sketch): Promise<string> { + return fs.readFile(FileUri.fsPath(sketch.mainFileUri), { + encoding: 'utf8', + }); +} + +async function start( + container: Container, + toDispose: DisposableCollection +): Promise<void> { + await startDaemon(container, toDispose); +} + +function createContainer(): Container { + return createBaseContainer(); +} diff --git a/arduino-ide-extension/src/test/node/test-bindings.ts b/arduino-ide-extension/src/test/node/test-bindings.ts index 19b99f3a3..80a3eea7c 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/test-bindings.ts @@ -4,7 +4,10 @@ import { CommandService, } from '@theia/core/lib/common/command'; import { bindContributionProvider } from '@theia/core/lib/common/contribution-provider'; -import { Disposable } from '@theia/core/lib/common/disposable'; +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'; @@ -289,18 +292,23 @@ export function createBaseContainer( export async function startDaemon( container: Container, - toDispose: Disposable[], + toDispose: DisposableCollection, startCustomizations?: ( container: Container, - toDispose: Disposable[] + toDispose: DisposableCollection ) => Promise<void> ): Promise<void> { const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); const configService = container.get<ConfigServiceImpl>(ConfigServiceImpl); + const coreClientProvider = + container.get<CoreClientProvider>(CoreClientProvider); toDispose.push(Disposable.create(() => daemon.stop())); configService.onStart(); daemon.onStart(); - await waitForEvent(daemon.onDaemonStarted, 10_000); + await Promise.all([ + waitForEvent(daemon.onDaemonStarted, 10_000), + coreClientProvider.client, + ]); if (startCustomizations) { await startCustomizations(container, toDispose); } diff --git a/i18n/en.json b/i18n/en.json index b6e67e855..22419c5bf 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -93,8 +93,8 @@ "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -179,6 +179,9 @@ "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.", @@ -199,6 +202,7 @@ "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", @@ -462,6 +466,9 @@ "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." }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "Update Indexes", "updateLibraryIndex": "Update Library Index", @@ -494,6 +501,7 @@ "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": { diff --git a/yarn.lock b/yarn.lock index 3ed199799..44833b671 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1184,6 +1184,11 @@ "@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" @@ -1890,6 +1895,14 @@ 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@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" @@ -1933,6 +1946,11 @@ 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": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" @@ -3294,7 +3312,7 @@ dependencies: "@types/node" "*" -"@types/glob@*", "@types/glob@^7.2.0": +"@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== @@ -3461,13 +3479,6 @@ dependencies: "@types/express" "*" -"@types/ncp@^2.0.4": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/ncp/-/ncp-2.0.5.tgz#5c53b229a321946102a188b603306162137f4fb9" - integrity sha512-ocK0p8JuFmX7UkMabFPjY0F7apPvQyLWt5qtdvuvQEBz9i4m2dbzV+6L1zNaUp042RfnL6pHnxDE53OH6XQ9VQ== - dependencies: - "@types/node" "*" - "@types/node-fetch@^2.5.7": version "2.6.2" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" @@ -4531,7 +4542,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.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== @@ -5187,6 +5198,11 @@ 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" @@ -5943,6 +5959,31 @@ cp-file@^6.1.0: pify "^4.0.1" safe-buffer "^5.0.1" +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== + dependencies: + graceful-fs "^4.1.2" + make-dir "^3.0.0" + nested-error-stacks "^2.0.0" + p-event "^4.1.0" + +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== + 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" + create-frame@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/create-frame/-/create-frame-1.0.0.tgz#8b95f2691e3249b6080443e33d0bad9f8f6975aa" @@ -6402,7 +6443,7 @@ diff@^5.0.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.0.0, dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== @@ -6416,6 +6457,20 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.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== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dns-socket@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/dns-socket/-/dns-socket-4.2.2.tgz#58b0186ec053ea0731feb06783c7eeac4b95b616" + integrity sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg== + dependencies: + dns-packet "^5.2.4" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -7236,6 +7291,18 @@ 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" @@ -7925,6 +7992,14 @@ 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: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -7932,6 +8007,11 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: 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-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -8049,6 +8129,20 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + google-protobuf@3.12.4: version "3.12.4" resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.4.tgz#fd89b7e5052cdb35a80f9b455612851d542a5c9f" @@ -8076,6 +8170,23 @@ got@^11.7.0, got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" +got@^11.8.0: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@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" + got@^8.3.1: version "8.3.2" resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" @@ -8257,6 +8368,13 @@ 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" @@ -8595,7 +8713,7 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.6: +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== @@ -8745,6 +8863,11 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" @@ -8900,7 +9023,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.1: +is-extglob@^2.1.0, 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== @@ -8922,6 +9045,13 @@ 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== + dependencies: + is-extglob "^2.1.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -8934,6 +9064,13 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -9002,6 +9139,16 @@ 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== + dependencies: + got "^11.8.0" + p-any "^3.0.0" + p-timeout "^3.2.0" + public-ip "^4.0.4" + is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -9418,6 +9565,11 @@ jsprim@^1.2.2: array-includes "^3.1.5" object.assign "^4.1.2" +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== + 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" @@ -10167,7 +10319,7 @@ merge-stream@^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.3.0, merge2@^1.4.1: +merge2@^1.2.3, 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== @@ -10372,7 +10524,7 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -10841,7 +10993,7 @@ 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.0.0, nested-error-stacks@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== @@ -11438,6 +11590,21 @@ 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== + 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" @@ -11470,6 +11637,20 @@ p-event@^2.1.0: 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== + dependencies: + p-timeout "^3.1.0" + +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== + dependencies: + p-map "^2.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -11532,6 +11713,11 @@ p-map-series@^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" @@ -11569,6 +11755,14 @@ p-reduce@^2.0.0, p-reduce@^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" @@ -11576,7 +11770,7 @@ p-timeout@^2.0.1: dependencies: p-finally "^1.0.0" -p-timeout@^3.2.0: +p-timeout@^3.1.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== @@ -11719,6 +11913,11 @@ 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" @@ -12147,6 +12346,15 @@ psl@^1.1.28, psl@^1.1.33: 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== + dependencies: + dns-socket "^4.2.2" + got "^9.6.0" + is-ip "^3.1.0" + pump@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" @@ -13229,6 +13437,11 @@ slash@^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" From 9b49712669b06c97bda68a1e5f04eee4664c13f8 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 10 Mar 2023 15:28:53 +0100 Subject: [PATCH 167/384] feat: omit release details to speed up lib search Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 10 ++ .../cc/arduino/cli/commands/v1/lib_pb.js | 92 ++++++++++++++++++- .../src/node/library-service-impl.ts | 6 +- 4 files changed, 102 insertions(+), 8 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index f717a4d9a..5bd714377 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -166,7 +166,7 @@ "version": { "owner": "arduino", "repo": "arduino-cli", - "commitish": "6992de7" + "commitish": "71a8576" } }, "fwuploader": { 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 1f02e1682..27866d15a 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 @@ -406,6 +406,9 @@ export class LibrarySearchRequest extends jspb.Message { getQuery(): string; setQuery(value: string): LibrarySearchRequest; + getOmitReleasesDetails(): boolean; + setOmitReleasesDetails(value: boolean): LibrarySearchRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibrarySearchRequest.AsObject; @@ -421,6 +424,7 @@ export namespace LibrarySearchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, query: string, + omitReleasesDetails: boolean, } } @@ -465,6 +469,11 @@ export class SearchedLibrary extends jspb.Message { getLatest(): LibraryRelease | undefined; setLatest(value?: LibraryRelease): SearchedLibrary; + clearAvailableVersionsList(): void; + getAvailableVersionsList(): Array<string>; + setAvailableVersionsList(value: Array<string>): SearchedLibrary; + addAvailableVersions(value: string, index?: number): string; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SearchedLibrary.AsObject; @@ -482,6 +491,7 @@ export namespace SearchedLibrary { releasesMap: Array<[string, LibraryRelease.AsObject]>, latest?: LibraryRelease.AsObject, + availableVersionsList: Array<string>, } } 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 0ccd1856c..4923acaa8 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 @@ -374,7 +374,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.SearchedLibrary = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.SearchedLibrary.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.SearchedLibrary, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -3202,7 +3202,8 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.toObject = funct proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - query: jspb.Message.getFieldWithDefault(msg, 2, "") + query: jspb.Message.getFieldWithDefault(msg, 2, ""), + omitReleasesDetails: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -3248,6 +3249,10 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.deserializeBinaryFromReade var value = /** @type {string} */ (reader.readString()); msg.setQuery(value); break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOmitReleasesDetails(value); + break; default: reader.skipField(); break; @@ -3292,6 +3297,13 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.serializeBinaryToWriter = f ); } + f = message.getOmitReleasesDetails(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; @@ -3350,6 +3362,24 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setQuery = funct }; +/** + * optional bool omit_releases_details = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getOmitReleasesDetails = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.LibrarySearchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setOmitReleasesDetails = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + /** * List of repeated fields within this message type. @@ -3541,6 +3571,13 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchResponse.prototype.setStatus = fun +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.repeatedFields_ = [4]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -3574,7 +3611,8 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.toObject = function(includeInst var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), releasesMap: (f = msg.getReleasesMap()) ? f.toObject(includeInstance, proto.cc.arduino.cli.commands.v1.LibraryRelease.toObject) : [], - latest: (f = msg.getLatest()) && proto.cc.arduino.cli.commands.v1.LibraryRelease.toObject(includeInstance, f) + latest: (f = msg.getLatest()) && proto.cc.arduino.cli.commands.v1.LibraryRelease.toObject(includeInstance, f), + availableVersionsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f }; if (includeInstance) { @@ -3626,6 +3664,10 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.deserializeBinaryFromReader = f reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryRelease.deserializeBinaryFromReader); msg.setLatest(value); break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.addAvailableVersions(value); + break; default: reader.skipField(); break; @@ -3674,6 +3716,13 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.serializeBinaryToWriter = funct proto.cc.arduino.cli.commands.v1.LibraryRelease.serializeBinaryToWriter ); } + f = message.getAvailableVersionsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 4, + f + ); + } }; @@ -3754,6 +3803,43 @@ proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.hasLatest = function( }; +/** + * repeated string available_versions = 4; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.getAvailableVersionsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.SearchedLibrary} returns this + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.setAvailableVersionsList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.SearchedLibrary} returns this + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.addAvailableVersions = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.SearchedLibrary} returns this + */ +proto.cc.arduino.cli.commands.v1.SearchedLibrary.prototype.clearAvailableVersionsList = function() { + return this.setAvailableVersionsList([]); +}; + + /** * List of repeated fields within this message type. diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index bd5eb8cb1..1bb836dcc 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -79,6 +79,7 @@ export class LibraryServiceImpl const req = new LibrarySearchRequest(); req.setQuery(options.query || ''); req.setInstance(instance); + req.setOmitReleasesDetails(true); const resp = await new Promise<LibrarySearchResponse>((resolve, reject) => client.librarySearch(req, (err, resp) => !!err ? reject(err) : resolve(resp) @@ -88,11 +89,8 @@ export class LibraryServiceImpl .getLibrariesList() .filter((item) => !!item.getLatest()) .map((item) => { - // TODO: This seems to contain only the latest item instead of all of the items. const availableVersions = item - .getReleasesMap() - .getEntryList() - .map(([key, _]) => key) + .getAvailableVersionsList() .sort(Installable.Version.COMPARATOR) .reverse(); let installedVersion: string | undefined; From dafb2454fd3133e229d0081a2b6788f88ac39e95 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 22 Mar 2023 13:23:58 +0100 Subject: [PATCH 168/384] chore: latest VSIX handles custom directories.data so when starting the debugger the CLI config path is used by the CLI for the `daemon -I` command. Closes #1911 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 266f0feac..2e97fea6e 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "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.7.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", From 39ab836880ce7a958ce1d61e43e7e3e75120d3fc Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 21 Mar 2023 10:25:37 +0100 Subject: [PATCH 169/384] fix: let the resource finish all write operation before checking if it's in sync or not. Closes #437 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/arduino-ide-frontend-module.ts | 6 ++ .../browser/theia/filesystem/file-resource.ts | 78 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts 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 6c6b44a63..d2161ebf2 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -356,6 +356,8 @@ import { Account } from './contributions/account'; import { SidebarBottomMenuWidget } from './theia/core/sidebar-bottom-menu-widget'; import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget'; import { CreateCloudCopy } from './contributions/create-cloud-copy'; +import { FileResourceResolver } from './theia/filesystem/file-resource'; +import { FileResourceResolver as TheiaFileResourceResolver } from '@theia/filesystem/lib/browser/file-resource'; export default new ContainerModule((bind, unbind, isBound, rebind) => { // Commands and toolbar items @@ -1034,4 +1036,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(FrontendApplicationContribution).toService(DaemonPort); bind(IsOnline).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(IsOnline); + + // https://github.com/arduino/arduino-ide/issues/437 + bind(FileResourceResolver).toSelf().inSingletonScope(); + rebind(TheiaFileResourceResolver).toService(FileResourceResolver); }); diff --git a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts new file mode 100644 index 000000000..168883910 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts @@ -0,0 +1,78 @@ +import { ResourceSaveOptions } from '@theia/core/lib/common/resource'; +import { Readable } from '@theia/core/lib/common/stream'; +import URI from '@theia/core/lib/common/uri'; +import { injectable } from '@theia/core/shared/inversify'; +import { + FileResource, + FileResourceOptions, + FileResourceResolver as TheiaFileResourceResolver, +} from '@theia/filesystem/lib/browser/file-resource'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { + FileOperationError, + FileOperationResult, + FileStat, +} from '@theia/filesystem/lib/common/files'; +import * as PQueue from 'p-queue'; + +@injectable() +export class FileResourceResolver extends TheiaFileResourceResolver { + override async resolve(uri: URI): Promise<WriteQueuedFileResource> { + let stat: FileStat | undefined; + try { + stat = await this.fileService.resolve(uri); + } catch (e) { + if ( + !( + e instanceof FileOperationError && + e.fileOperationResult === FileOperationResult.FILE_NOT_FOUND + ) + ) { + throw e; + } + } + if (stat && stat.isDirectory) { + throw new Error( + 'The given uri is a directory: ' + this.labelProvider.getLongName(uri) + ); + } + return new WriteQueuedFileResource(uri, this.fileService, { + shouldOverwrite: () => this.shouldOverwrite(uri), + shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error), + }); + } +} + +class WriteQueuedFileResource extends FileResource { + private readonly writeQueue = new PQueue({ autoStart: true, concurrency: 1 }); + + constructor( + uri: URI, + fileService: FileService, + options: FileResourceOptions + ) { + super(uri, fileService, options); + const originalSaveContentChanges = this['saveContentChanges']; + if (originalSaveContentChanges) { + this['saveContentChanges'] = (changes, options) => { + return this.writeQueue.add(() => + originalSaveContentChanges.bind(this)(changes, options) + ); + }; + } + } + + protected override async doWrite( + content: string | Readable<string>, + options?: ResourceSaveOptions + ): Promise<void> { + return this.writeQueue.add(() => super.doWrite(content, options)); + } + + protected override async isInSync(): Promise<boolean> { + // Let all the write operations finish to update the version (mtime) before checking whether the resource is in sync. + // https://github.com/eclipse-theia/theia/issues/12327 + await this.writeQueue.onIdle(); + return super.isInSync(); + } +} From e4beb03a404b6f6f7ecfad3a7d3b9ea24476632c Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 20 Mar 2023 14:27:03 +0100 Subject: [PATCH 170/384] fix: incorrect editor widget key calculation to avoid duplicate editor tabs when opening a sketch with no previously saved workbench layout Closes #1791 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/contributions/open-sketch-files.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 01fa997d3..86cf971d0 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -45,7 +45,11 @@ export class OpenSketchFiles extends SketchContribution { await this.ensureOpened(uri); } if (focusMainSketchFile) { - await this.ensureOpened(mainFileUri, true, { mode: 'activate' }); + await this.ensureOpened(mainFileUri, true, { + mode: 'activate', + preview: false, + counter: 0, + }); } if (mainFileUri.endsWith('.pde')) { const message = nls.localize( From 6e72be1b4cb3ef6c119ab0caae3dcfe008aa7c8d Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 24 Mar 2023 17:24:11 +0100 Subject: [PATCH 171/384] feat: re-focus monitor widget after verify/upload supported when the monitor widget was the current in the bottom panel, and the core command (upload/verify/etc./) was successful Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/contributions/contribution.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index c53bac1ff..b34f3ee4e 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -6,6 +6,10 @@ import { } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { ILogger } from '@theia/core/lib/common/logger'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { Saveable } from '@theia/core/lib/browser/saveable'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { MaybePromise } from '@theia/core/lib/common/types'; @@ -62,6 +66,7 @@ import { MessageType } from '@theia/core/lib/common/message-service-protocol'; 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'; export { Command, @@ -217,6 +222,9 @@ export abstract class CoreServiceContribution extends SketchContribution { @inject(NotificationManager) private readonly notificationManager: NotificationManager; + @inject(ApplicationShell) + private readonly shell: ApplicationShell; + /** * This is the internal (Theia) ID of the notification that is currently visible. * It's stored here as a field to be able to close it before executing any new core command (such as verify, upload, etc.) @@ -279,6 +287,9 @@ export abstract class CoreServiceContribution extends SketchContribution { keepOutput?: boolean; task: (progressId: string, coreService: CoreService) => Promise<T>; }): Promise<T> { + const toDisposeOnComplete = new DisposableCollection( + this.maybeActivateMonitorWidget() + ); const { progressText, keepOutput, task } = options; this.outputChannelManager .getChannel('Arduino') @@ -290,9 +301,24 @@ export abstract class CoreServiceContribution extends SketchContribution { run: ({ progressId }) => task(progressId, this.coreService), keepOutput, }); + toDisposeOnComplete.dispose(); return result; } + // TODO: cleanup! + // this dependency does not belong here + // support core command contribution handlers, the monitor-widget should implement it and register itself as a handler + // the monitor widget should reveal itself after a successful core command execution + private maybeActivateMonitorWidget(): Disposable { + const currentWidget = this.shell.bottomPanel.currentTitle?.owner; + if (currentWidget?.id === 'serial-monitor') { + return Disposable.create(() => + this.shell.bottomPanel.activateWidget(currentWidget) + ); + } + return Disposable.NULL; + } + private notificationId(message: string, ...actions: string[]): string { return this.notificationManager['getMessageId']({ text: message, From eb1f247296a1993c38a65b1b5707a238a8d8a77d Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 24 Mar 2023 10:42:17 +0100 Subject: [PATCH 172/384] fix: the focus in the sketchbook widget Ref: arduino/arduino-ide#1720 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/library/library-list-widget.ts | 13 +------ .../src/browser/utils/dom.ts | 37 +++++++++++++++++++ .../sketchbook-composite-widget.tsx | 11 ++++-- .../widgets/sketchbook/sketchbook-widget.tsx | 8 +--- 4 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 arduino-ide-extension/src/browser/utils/dom.ts diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 050783816..25480de95 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -20,6 +20,7 @@ import { Installable } from '../../common/protocol'; import { ListItemRenderer } from '../widgets/component-list/list-item-renderer'; import { nls } from '@theia/core/lib/common'; import { LibraryFilterRenderer } from '../widgets/component-list/filter-renderer'; +import { findChildTheiaButton } from '../utils/dom'; @injectable() export class LibraryListWidget extends ListWidget< @@ -243,17 +244,7 @@ class MessageBoxDialog extends AbstractDialog<MessageBoxDialog.Result> { protected override onAfterAttach(message: Message): void { super.onAfterAttach(message); - let buttonToFocus: HTMLButtonElement | undefined = undefined; - for (const child of Array.from(this.controlPanel.children)) { - if (child instanceof HTMLButtonElement) { - if (child.classList.contains('main')) { - buttonToFocus = child; - break; - } - buttonToFocus = child; - } - } - buttonToFocus?.focus(); + findChildTheiaButton(this.controlPanel)?.focus(); } } export namespace MessageBoxDialog { diff --git a/arduino-ide-extension/src/browser/utils/dom.ts b/arduino-ide-extension/src/browser/utils/dom.ts new file mode 100644 index 000000000..5d6e65d3c --- /dev/null +++ b/arduino-ide-extension/src/browser/utils/dom.ts @@ -0,0 +1,37 @@ +import { notEmpty } from '@theia/core'; + +/** + * Finds the closest child HTMLButtonElement representing a Theia button. + * A button is a Theia button if it's a `<button>` element and has the `"theia-button"` class. + * If an element has multiple Theia button children, this function prefers `"main"` over `"secondary"` button. + */ +export function findChildTheiaButton( + element: HTMLElement, + recursive = false +): HTMLButtonElement | undefined { + let button: HTMLButtonElement | undefined = undefined; + const children = Array.from(element.children); + for (const child of children) { + if ( + child instanceof HTMLButtonElement && + child.classList.contains('theia-button') + ) { + if (child.classList.contains('main')) { + return child; + } + button = child; + } + } + if (!button && recursive) { + button = children + .filter(isHTMLElement) + .map((childElement) => findChildTheiaButton(childElement, true)) + .filter(notEmpty) + .shift(); + } + return button; +} + +function isHTMLElement(element: Element): element is HTMLElement { + return element instanceof HTMLElement; +} 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 b0ba780be..897ce61fb 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 @@ -9,6 +9,7 @@ import { BaseWidget } from '@theia/core/lib/browser/widgets/widget'; import { CommandService } from '@theia/core/lib/common/command'; import { SketchbookTreeWidget } from './sketchbook-tree-widget'; import { CreateNew } from '../sketchbook/create-new'; +import { findChildTheiaButton } from '../../utils/dom'; @injectable() export abstract class BaseSketchbookCompositeWidget< @@ -18,16 +19,17 @@ export abstract class BaseSketchbookCompositeWidget< protected readonly commandService: CommandService; private readonly compositeNode: HTMLElement; + private readonly footerNode: HTMLElement; private readonly footerRoot: Root; constructor() { super(); this.compositeNode = document.createElement('div'); this.compositeNode.classList.add('composite-node'); - const footerNode = document.createElement('div'); - footerNode.classList.add('footer-node'); - this.compositeNode.appendChild(footerNode); - this.footerRoot = createRoot(footerNode); + this.footerNode = document.createElement('div'); + this.footerNode.classList.add('footer-node'); + this.compositeNode.appendChild(this.footerNode); + this.footerRoot = createRoot(this.footerNode); this.node.appendChild(this.compositeNode); this.title.closable = false; } @@ -51,6 +53,7 @@ export abstract class BaseSketchbookCompositeWidget< super.onActivateRequest(message); // Sending a resize message is needed because otherwise the tree widget would render empty this.onResize(Widget.ResizeMessage.UnknownSize); + findChildTheiaButton(this.footerNode, true)?.focus(); } protected override onResize(message: Widget.ResizeMessage): void { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx index 93533e37e..2d99f97b7 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget.tsx @@ -128,13 +128,7 @@ export class SketchbookWidget extends BaseWidget { protected override onActivateRequest(message: Message): void { super.onActivateRequest(message); - - // TODO: focus the active sketchbook - // if (this.editor) { - // this.editor.focus(); - // } else { - // } - this.node.focus(); + this.sketchbookCompositeWidget.activate(); } protected override onResize(message: Widget.ResizeMessage): void { From f5c98c8400a23ddaa9ea0c5afb15a3f068014659 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 12 Apr 2023 16:55:01 +0200 Subject: [PATCH 173/384] feat(infra): support for `topic: cloud` label Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .github/label-configuration-files/labels.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/label-configuration-files/labels.yml b/.github/label-configuration-files/labels.yml index a938431b2..b0ae38dc2 100644 --- a/.github/label-configuration-files/labels.yml +++ b/.github/label-configuration-files/labels.yml @@ -7,6 +7,9 @@ - name: "topic: CLI" color: "00ffff" description: Related to Arduino CLI +- name: "topic: cloud" + color: "00ffff" + description: Related to Arduino Cloud and cloud sketches - name: "topic: debugger" color: "00ffff" description: Related to the integrated debugger From 0a53550b0b4865ff46da20caea947b9a85492834 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 29 Mar 2023 10:04:32 +0200 Subject: [PATCH 174/384] ci: use `ubuntu-latest` for the Linux build Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d26c26def..b4a7ba472 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,7 +43,7 @@ jobs: certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX # Name of the secret that contains the certificate. certificate-password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD # Name of the secret that contains the certificate password. certificate-extension: pfx # File extension for the certificate. - - os: ubuntu-18.04 # https://github.com/arduino/arduino-ide/issues/259 + - os: ubuntu-latest - os: macos-latest # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate From ab5c63c4b7f34f76dafae1b21f8ec771a52b5a5e Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Tue, 11 Apr 2023 09:45:23 +0200 Subject: [PATCH 175/384] Update .github/workflows/build.yml Co-authored-by: per1234 <accounts@perglass.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b4a7ba472..1113042eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,7 +43,7 @@ jobs: certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX # Name of the secret that contains the certificate. certificate-password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD # Name of the secret that contains the certificate password. certificate-extension: pfx # File extension for the certificate. - - os: ubuntu-latest + - os: ubuntu-20.04 - os: macos-latest # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate From 80d5b5afa70c82cf43a64b7c7eb0e145dc140891 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 17 Mar 2023 15:41:34 +0100 Subject: [PATCH 176/384] fix: propagate monitor errors to the frontend - Handle when the board's platform is not installed (Closes #1974) - UX: Smoother monitor widget reset (Closes #1985) - Fixed monitor <input> readOnly state (Closes #1984) - Set monitor widget header color (Ref #682) Closes #1508 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/arduino-ide-frontend-module.ts | 10 +- .../monitor-manager-proxy-client-impl.ts | 92 +++-- .../src/browser/monitor-model.ts | 84 ++-- .../monitor/monitor-view-contribution.tsx | 8 +- .../browser/serial/monitor/monitor-widget.tsx | 94 +++-- .../monitor/serial-monitor-send-input.tsx | 86 +++- .../src/browser/style/index.css | 32 +- .../src/browser/style/monitor.css | 33 +- .../src/common/protocol/core-service.ts | 10 +- .../src/common/protocol/monitor-service.ts | 186 ++++++++- .../src/node/core-service-impl.ts | 4 +- .../src/node/monitor-manager-proxy-impl.ts | 14 +- .../src/node/monitor-manager.ts | 33 +- .../src/node/monitor-service.ts | 372 ++++++++++-------- .../monitor-settings-provider.ts | 5 +- i18n/en.json | 8 + 16 files changed, 718 insertions(+), 353 deletions(-) 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 d2161ebf2..09475690b 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -496,15 +496,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(TabBarToolbarContribution).toService(MonitorViewContribution); bind(WidgetFactory).toDynamicValue((context) => ({ id: MonitorWidget.ID, - createWidget: () => { - return new MonitorWidget( - context.container.get<MonitorModel>(MonitorModel), - context.container.get<MonitorManagerProxyClient>( - MonitorManagerProxyClient - ), - context.container.get<BoardsServiceProvider>(BoardsServiceProvider) - ); - }, + createWidget: () => context.container.get(MonitorWidget), })); bind(MonitorManagerProxyFactory).toFactory( diff --git a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts index 94ab4d0f5..ebbafa385 100644 --- a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts +++ b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts @@ -1,11 +1,14 @@ import { - CommandRegistry, + ApplicationError, Disposable, Emitter, MessageService, nls, } from '@theia/core'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; import { Board, Port } from '../common/protocol'; import { Monitor, @@ -23,21 +26,31 @@ import { BoardsServiceProvider } from './boards/boards-service-provider'; export class MonitorManagerProxyClientImpl implements MonitorManagerProxyClient { + @inject(MessageService) + private readonly messageService: MessageService; + // This is necessary to call the backend methods from the frontend + @inject(MonitorManagerProxyFactory) + private readonly server: MonitorManagerProxyFactory; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(NotificationManager) + private readonly notificationManager: NotificationManager; + // When pluggable monitor messages are received from the backend // this event is triggered. // Ideally a frontend component is connected to this event // to update the UI. - protected readonly onMessagesReceivedEmitter = new Emitter<{ + private readonly onMessagesReceivedEmitter = new Emitter<{ messages: string[]; }>(); readonly onMessagesReceived = this.onMessagesReceivedEmitter.event; - protected readonly onMonitorSettingsDidChangeEmitter = + private readonly onMonitorSettingsDidChangeEmitter = new Emitter<MonitorSettings>(); readonly onMonitorSettingsDidChange = this.onMonitorSettingsDidChangeEmitter.event; - protected readonly onMonitorShouldResetEmitter = new Emitter(); + private readonly onMonitorShouldResetEmitter = new Emitter<void>(); readonly onMonitorShouldReset = this.onMonitorShouldResetEmitter.event; // WebSocket used to handle pluggable monitor communication between @@ -51,29 +64,16 @@ export class MonitorManagerProxyClientImpl return this.wsPort; } - constructor( - @inject(MessageService) - protected messageService: MessageService, - - // This is necessary to call the backend methods from the frontend - @inject(MonitorManagerProxyFactory) - protected server: MonitorManagerProxyFactory, - - @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry, - - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider - ) {} - /** * Connects a localhost WebSocket using the specified port. * @param addressPort port of the WebSocket */ async connect(addressPort: number): Promise<void> { - if (!!this.webSocket) { - if (this.wsPort === addressPort) return; - else this.disconnect(); + if (this.webSocket) { + if (this.wsPort === addressPort) { + return; + } + this.disconnect(); } try { this.webSocket = new WebSocket(`ws://localhost:${addressPort}`); @@ -87,6 +87,9 @@ export class MonitorManagerProxyClientImpl return; } + const opened = new Deferred<void>(); + this.webSocket.onopen = () => opened.resolve(); + this.webSocket.onerror = () => opened.reject(); this.webSocket.onmessage = (message) => { const parsedMessage = JSON.parse(message.data); if (Array.isArray(parsedMessage)) @@ -99,19 +102,26 @@ export class MonitorManagerProxyClientImpl } }; this.wsPort = addressPort; + return opened.promise; } /** * Disconnects the WebSocket if connected. */ disconnect(): void { - if (!this.webSocket) return; + if (!this.webSocket) { + return; + } this.onBoardsConfigChanged?.dispose(); this.onBoardsConfigChanged = undefined; try { - this.webSocket?.close(); + this.webSocket.close(); this.webSocket = undefined; - } catch { + } catch (err) { + console.error( + 'Could not close the websocket connection for the monitor.', + err + ); this.messageService.error( nls.localize( 'arduino/monitor/unableToCloseWebSocket', @@ -126,6 +136,7 @@ export class MonitorManagerProxyClientImpl } async startMonitor(settings?: PluggableMonitorSettings): Promise<void> { + await this.boardsServiceProvider.reconciled; this.lastConnectedBoard = { selectedBoard: this.boardsServiceProvider.boardsConfig.selectedBoard, selectedPort: this.boardsServiceProvider.boardsConfig.selectedPort, @@ -150,11 +161,11 @@ export class MonitorManagerProxyClientImpl ? Port.keyOf(this.lastConnectedBoard.selectedPort) : undefined) ) { - this.onMonitorShouldResetEmitter.fire(null); this.lastConnectedBoard = { selectedBoard: selectedBoard, selectedPort: selectedPort, }; + this.onMonitorShouldResetEmitter.fire(); } else { // a board is plugged and it's the same as prev, rerun "this.startMonitor" to // recreate the listener callback @@ -167,7 +178,14 @@ export class MonitorManagerProxyClientImpl const { selectedBoard, selectedPort } = this.boardsServiceProvider.boardsConfig; if (!selectedBoard || !selectedBoard.fqbn || !selectedPort) return; - await this.server().startMonitor(selectedBoard, selectedPort, settings); + try { + this.clearVisibleNotification(); + await this.server().startMonitor(selectedBoard, selectedPort, settings); + } catch (err) { + const message = ApplicationError.is(err) ? err.message : String(err); + this.previousNotificationId = this.notificationId(message); + this.messageService.error(message); + } } getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings> { @@ -199,4 +217,24 @@ export class MonitorManagerProxyClientImpl }) ); } + + /** + * This is the internal (Theia) ID of the notification that is currently visible. + * It's stored here as a field to be able to close it before starting a new monitor connection. It's a hack. + */ + private previousNotificationId: string | undefined; + private clearVisibleNotification(): void { + if (this.previousNotificationId) { + this.notificationManager.clear(this.previousNotificationId); + this.previousNotificationId = undefined; + } + } + + private notificationId(message: string, ...actions: string[]): string { + return this.notificationManager['getMessageId']({ + text: message, + actions, + type: MessageType.Error, + }); + } } diff --git a/arduino-ide-extension/src/browser/monitor-model.ts b/arduino-ide-extension/src/browser/monitor-model.ts index 3ebea1819..c3c8a26f4 100644 --- a/arduino-ide-extension/src/browser/monitor-model.ts +++ b/arduino-ide-extension/src/browser/monitor-model.ts @@ -4,7 +4,14 @@ import { LocalStorageService, } from '@theia/core/lib/browser'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { MonitorManagerProxyClient } from '../common/protocol'; +import { + isMonitorConnected, + MonitorConnectionStatus, + monitorConnectionStatusEquals, + MonitorEOL, + MonitorManagerProxyClient, + MonitorState, +} from '../common/protocol'; import { isNullOrUndefined } from '../common/utils'; import { MonitorSettings } from '../node/monitor-settings/monitor-settings-provider'; @@ -19,36 +26,36 @@ export class MonitorModel implements FrontendApplicationContribution { protected readonly monitorManagerProxy: MonitorManagerProxyClient; protected readonly onChangeEmitter: Emitter< - MonitorModel.State.Change<keyof MonitorModel.State> + MonitorState.Change<keyof MonitorState> >; protected _autoscroll: boolean; protected _timestamp: boolean; - protected _lineEnding: MonitorModel.EOL; + protected _lineEnding: MonitorEOL; protected _interpolate: boolean; protected _darkTheme: boolean; protected _wsPort: number; protected _serialPort: string; - protected _connected: boolean; + protected _connectionStatus: MonitorConnectionStatus; constructor() { this._autoscroll = true; this._timestamp = false; this._interpolate = false; - this._lineEnding = MonitorModel.EOL.DEFAULT; + this._lineEnding = MonitorEOL.DEFAULT; this._darkTheme = false; this._wsPort = 0; this._serialPort = ''; - this._connected = true; + this._connectionStatus = 'not-connected'; this.onChangeEmitter = new Emitter< - MonitorModel.State.Change<keyof MonitorModel.State> + MonitorState.Change<keyof MonitorState> >(); } onStart(): void { this.localStorageService - .getData<MonitorModel.State>(MonitorModel.STORAGE_ID) + .getData<MonitorState>(MonitorModel.STORAGE_ID) .then(this.restoreState.bind(this)); this.monitorManagerProxy.onMonitorSettingsDidChange( @@ -56,11 +63,11 @@ export class MonitorModel implements FrontendApplicationContribution { ); } - get onChange(): Event<MonitorModel.State.Change<keyof MonitorModel.State>> { + get onChange(): Event<MonitorState.Change<keyof MonitorState>> { return this.onChangeEmitter.event; } - protected restoreState(state: MonitorModel.State): void { + protected restoreState(state: MonitorState): void { if (!state) { return; } @@ -125,11 +132,11 @@ export class MonitorModel implements FrontendApplicationContribution { this.timestamp = !this._timestamp; } - get lineEnding(): MonitorModel.EOL { + get lineEnding(): MonitorEOL { return this._lineEnding; } - set lineEnding(lineEnding: MonitorModel.EOL) { + set lineEnding(lineEnding: MonitorEOL) { if (lineEnding === this._lineEnding) return; this._lineEnding = lineEnding; this.monitorManagerProxy.changeSettings({ @@ -211,19 +218,26 @@ export class MonitorModel implements FrontendApplicationContribution { ); } - get connected(): boolean { - return this._connected; + get connectionStatus(): MonitorConnectionStatus { + return this._connectionStatus; } - set connected(connected: boolean) { - if (connected === this._connected) return; - this._connected = connected; + set connectionStatus(connectionStatus: MonitorConnectionStatus) { + if ( + monitorConnectionStatusEquals(connectionStatus, this.connectionStatus) + ) { + return; + } + this._connectionStatus = connectionStatus; this.monitorManagerProxy.changeSettings({ - monitorUISettings: { connected }, + monitorUISettings: { + connectionStatus, + connected: isMonitorConnected(connectionStatus), + }, }); this.onChangeEmitter.fire({ - property: 'connected', - value: this._connected, + property: 'connectionStatus', + value: this._connectionStatus, }); } @@ -238,7 +252,7 @@ export class MonitorModel implements FrontendApplicationContribution { darkTheme, wsPort, serialPort, - connected, + connectionStatus, } = monitorUISettings; if (!isNullOrUndefined(autoscroll)) this.autoscroll = autoscroll; @@ -248,31 +262,7 @@ export class MonitorModel implements FrontendApplicationContribution { if (!isNullOrUndefined(darkTheme)) this.darkTheme = darkTheme; if (!isNullOrUndefined(wsPort)) this.wsPort = wsPort; if (!isNullOrUndefined(serialPort)) this.serialPort = serialPort; - if (!isNullOrUndefined(connected)) this.connected = connected; + if (!isNullOrUndefined(connectionStatus)) + this.connectionStatus = connectionStatus; }; } - -// TODO: Move this to /common -export namespace MonitorModel { - export interface State { - autoscroll: boolean; - timestamp: boolean; - lineEnding: EOL; - interpolate: boolean; - darkTheme: boolean; - wsPort: number; - serialPort: string; - connected: boolean; - } - export namespace State { - export interface Change<K extends keyof State> { - readonly property: K; - readonly value: State[K]; - } - } - - export type EOL = '' | '\n' | '\r' | '\r\n'; - export namespace EOL { - export const DEFAULT: EOL = '\n'; - } -} diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx index 36f13c3b2..925d221ec 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx @@ -10,6 +10,7 @@ import { import { ArduinoToolbar } from '../../toolbar/arduino-toolbar'; import { ArduinoMenus } from '../../menu/arduino-menus'; import { nls } from '@theia/core/lib/common'; +import { Event } from '@theia/core/lib/common/event'; import { MonitorModel } from '../../monitor-model'; import { MonitorManagerProxyClient } from '../../../common/protocol'; @@ -84,13 +85,13 @@ export class MonitorViewContribution id: 'monitor-autoscroll', render: () => this.renderAutoScrollButton(), isVisible: (widget) => widget instanceof MonitorWidget, - onDidChange: this.model.onChange as any, // XXX: it's a hack. See: https://github.com/eclipse-theia/theia/pull/6696/ + onDidChange: this.model.onChange as Event<unknown> as Event<void>, }); registry.registerItem({ id: 'monitor-timestamp', render: () => this.renderTimestampButton(), isVisible: (widget) => widget instanceof MonitorWidget, - onDidChange: this.model.onChange as any, // XXX: it's a hack. See: https://github.com/eclipse-theia/theia/pull/6696/ + onDidChange: this.model.onChange as Event<unknown> as Event<void>, }); registry.registerItem({ id: SerialMonitor.Commands.CLEAR_OUTPUT.id, @@ -143,8 +144,7 @@ export class MonitorViewContribution protected async reset(): Promise<void> { const widget = this.tryGetWidget(); if (widget) { - widget.dispose(); - await this.openView({ activate: true, reveal: true }); + widget.reset(); } } diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index ec83f5a0a..c2311a11c 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -1,7 +1,14 @@ import * as React from '@theia/core/shared/react'; -import { injectable, inject } from '@theia/core/shared/inversify'; +import { + injectable, + inject, + postConstruct, +} from '@theia/core/shared/inversify'; import { Emitter } from '@theia/core/lib/common/event'; -import { Disposable } from '@theia/core/lib/common/disposable'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { ReactWidget, Message, @@ -13,9 +20,13 @@ import { SerialMonitorSendInput } from './serial-monitor-send-input'; import { SerialMonitorOutput } from './serial-monitor-send-output'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { nls } from '@theia/core/lib/common'; -import { MonitorManagerProxyClient } from '../../../common/protocol'; +import { + MonitorEOL, + MonitorManagerProxyClient, +} from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; import { MonitorSettings } from '../../../node/monitor-settings/monitor-settings-provider'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @injectable() export class MonitorWidget extends ReactWidget { @@ -40,40 +51,46 @@ export class MonitorWidget extends ReactWidget { protected closing = false; protected readonly clearOutputEmitter = new Emitter<void>(); - constructor( - @inject(MonitorModel) - protected readonly monitorModel: MonitorModel, + @inject(MonitorModel) + private readonly monitorModel: MonitorModel; + @inject(MonitorManagerProxyClient) + private readonly monitorManagerProxy: MonitorManagerProxyClient; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; - @inject(MonitorManagerProxyClient) - protected readonly monitorManagerProxy: MonitorManagerProxyClient, + private readonly toDisposeOnReset: DisposableCollection; - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider - ) { + constructor() { super(); this.id = MonitorWidget.ID; this.title.label = MonitorWidget.LABEL; this.title.iconClass = 'monitor-tab-icon'; this.title.closable = true; this.scrollOptions = undefined; + this.toDisposeOnReset = new DisposableCollection(); this.toDispose.push(this.clearOutputEmitter); - this.toDispose.push( - Disposable.create(() => this.monitorManagerProxy.disconnect()) - ); } - protected override onBeforeAttach(msg: Message): void { - this.update(); - this.toDispose.push(this.monitorModel.onChange(() => this.update())); - this.getCurrentSettings().then(this.onMonitorSettingsDidChange.bind(this)); - this.monitorManagerProxy.onMonitorSettingsDidChange( - this.onMonitorSettingsDidChange.bind(this) - ); + @postConstruct() + protected init(): void { + this.toDisposeOnReset.dispose(); + this.toDisposeOnReset.pushAll([ + Disposable.create(() => this.monitorManagerProxy.disconnect()), + this.monitorModel.onChange(() => this.update()), + this.monitorManagerProxy.onMonitorSettingsDidChange((event) => + this.updateSettings(event) + ), + ]); + this.startMonitor(); + } - this.monitorManagerProxy.startMonitor(); + reset(): void { + this.init(); } - onMonitorSettingsDidChange(settings: MonitorSettings): void { + private updateSettings(settings: MonitorSettings): void { this.settings = { ...this.settings, pluggableMonitorSettings: { @@ -90,6 +107,7 @@ export class MonitorWidget extends ReactWidget { } override dispose(): void { + this.toDisposeOnReset.dispose(); super.dispose(); } @@ -122,7 +140,7 @@ export class MonitorWidget extends ReactWidget { this.update(); } - protected onFocusResolved = (element: HTMLElement | undefined) => { + protected onFocusResolved = (element: HTMLElement | undefined): void => { if (this.closing || !this.isAttached) { return; } @@ -132,7 +150,7 @@ export class MonitorWidget extends ReactWidget { ); }; - protected get lineEndings(): SerialMonitorOutput.SelectOption<MonitorModel.EOL>[] { + protected get lineEndings(): SerialMonitorOutput.SelectOption<MonitorEOL>[] { return [ { label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), @@ -156,11 +174,23 @@ export class MonitorWidget extends ReactWidget { ]; } - private getCurrentSettings(): Promise<MonitorSettings> { + private async startMonitor(): Promise<void> { + await this.appStateService.reachedState('ready'); + await this.boardsServiceProvider.reconciled; + await this.syncSettings(); + await this.monitorManagerProxy.startMonitor(); + } + + private async syncSettings(): Promise<void> { + const settings = await this.getCurrentSettings(); + this.updateSettings(settings); + } + + private async getCurrentSettings(): Promise<MonitorSettings> { const board = this.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.boardsServiceProvider.boardsConfig.selectedPort; if (!board || !port) { - return Promise.resolve(this.settings || {}); + return this.settings || {}; } return this.monitorManagerProxy.getCurrentSettings(board, port); } @@ -171,7 +201,7 @@ export class MonitorWidget extends ReactWidget { : undefined; const baudrateOptions = baudrate?.values.map((b) => ({ - label: b + ' baud', + label: nls.localize('arduino/monitor/baudRate', '{0} baud', b), value: b, })); const baudrateSelectedOption = baudrateOptions?.find( @@ -181,7 +211,7 @@ export class MonitorWidget extends ReactWidget { const lineEnding = this.lineEndings.find( (item) => item.value === this.monitorModel.lineEnding - ) || this.lineEndings[1]; // Defaults to `\n`. + ) || MonitorEOL.DEFAULT; return ( <div className="serial-monitor"> @@ -228,13 +258,13 @@ export class MonitorWidget extends ReactWidget { ); } - protected readonly onSend = (value: string) => this.doSend(value); - protected async doSend(value: string): Promise<void> { + protected readonly onSend = (value: string): void => this.doSend(value); + protected doSend(value: string): void { this.monitorManagerProxy.send(value); } protected readonly onChangeLineEnding = ( - option: SerialMonitorOutput.SelectOption<MonitorModel.EOL> + option: SerialMonitorOutput.SelectOption<MonitorEOL> ): void => { this.monitorModel.lineEnding = option.value; }; diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx index 163fdbafd..21e54e2fd 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx @@ -5,6 +5,10 @@ import { DisposableCollection, nls } from '@theia/core/lib/common'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { Unknown } from '../../../common/nls'; +import { + isMonitorConnectionError, + MonitorConnectionStatus, +} from '../../../common/protocol'; class HistoryList { private readonly items: string[] = []; @@ -62,7 +66,7 @@ export namespace SerialMonitorSendInput { } export interface State { text: string; - connected: boolean; + connectionStatus: MonitorConnectionStatus; history: HistoryList; } } @@ -75,18 +79,27 @@ export class SerialMonitorSendInput extends React.Component< constructor(props: Readonly<SerialMonitorSendInput.Props>) { super(props); - this.state = { text: '', connected: true, history: new HistoryList() }; + this.state = { + text: '', + connectionStatus: 'not-connected', + history: new HistoryList(), + }; this.onChange = this.onChange.bind(this); this.onSend = this.onSend.bind(this); this.onKeyDown = this.onKeyDown.bind(this); } override componentDidMount(): void { - this.setState({ connected: this.props.monitorModel.connected }); + this.setState({ + connectionStatus: this.props.monitorModel.connectionStatus, + }); this.toDisposeBeforeUnmount.push( this.props.monitorModel.onChange(({ property }) => { - if (property === 'connected') - this.setState({ connected: this.props.monitorModel.connected }); + if (property === 'connected' || property === 'connectionStatus') { + this.setState({ + connectionStatus: this.props.monitorModel.connectionStatus, + }); + } }) ); } @@ -97,44 +110,83 @@ export class SerialMonitorSendInput extends React.Component< } override render(): React.ReactNode { + const status = this.state.connectionStatus; + const input = this.renderInput(status); + if (status !== 'connecting') { + return input; + } + return <label>{input}</label>; + } + + private renderInput(status: MonitorConnectionStatus): React.ReactNode { + const inputClassName = this.inputClassName(status); + const placeholder = this.placeholder; + const readOnly = Boolean(inputClassName); return ( <input ref={this.setRef} type="text" - className={`theia-input ${this.shouldShowWarning() ? 'warning' : ''}`} - placeholder={this.placeholder} - value={this.state.text} + className={`theia-input ${inputClassName}`} + readOnly={readOnly} + placeholder={placeholder} + title={placeholder} + value={readOnly ? '' : this.state.text} // always show the placeholder if cannot edit the <input> onChange={this.onChange} onKeyDown={this.onKeyDown} /> ); } + private inputClassName( + status: MonitorConnectionStatus + ): 'error' | 'warning' | '' { + if (isMonitorConnectionError(status)) { + return 'error'; + } + if (status === 'connected') { + return ''; + } + return 'warning'; + } + protected shouldShowWarning(): boolean { const board = this.props.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.props.boardsServiceProvider.boardsConfig.selectedPort; - return !this.state.connected || !board || !port; + return !this.state.connectionStatus || !board || !port; } protected get placeholder(): string { - if (this.shouldShowWarning()) { + const status = this.state.connectionStatus; + if (isMonitorConnectionError(status)) { + return status.errorMessage; + } + if (status === 'not-connected') { return nls.localize( 'arduino/serial/notConnected', 'Not connected. Select a board and a port to connect automatically.' ); } - const board = this.props.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.props.boardsServiceProvider.boardsConfig.selectedPort; + const boardLabel = board + ? Board.toString(board, { + useFqbn: false, + }) + : Unknown; + const portLabel = port ? port.address : Unknown; + if (status === 'connecting') { + return nls.localize( + 'arduino/serial/connecting', + "Connecting to '{0}' on '{1}'...", + boardLabel, + portLabel + ); + } return nls.localize( 'arduino/serial/message', "Message (Enter to send message to '{0}' on '{1}')", - board - ? Board.toString(board, { - useFqbn: false, - }) - : Unknown, - port ? port.address : Unknown + boardLabel, + portLabel ); } diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index d0ac1e45e..4698d4a33 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -29,9 +29,11 @@ /* https://github.com/arduino/arduino-ide/pull/1662#issuecomment-1324997134 */ body { --theia-icon-loading: url(../icons/loading-light.svg); + --theia-icon-loading-warning: url(../icons/loading-dark.svg); } body.theia-dark { --theia-icon-loading: url(../icons/loading-dark.svg); + --theia-icon-loading-warning: url(../icons/loading-light.svg); } .theia-input.warning:focus { @@ -48,22 +50,32 @@ body.theia-dark { } .theia-input.warning::placeholder { - /* Chrome, Firefox, Opera, Safari 10.1+ */ color: var(--theia-warningForeground); background-color: var(--theia-warningBackground); - opacity: 1; /* Firefox */ } -.theia-input.warning:-ms-input-placeholder { - /* Internet Explorer 10-11 */ - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); +.hc-black.hc-theia.theia-hc .theia-input.warning, +.hc-black.hc-theia.theia-hc .theia-input.warning::placeholder { + color: var(--theia-warningBackground); + background-color: var(--theia-warningForeground); } -.theia-input.warning::-ms-input-placeholder { - /* Microsoft Edge */ - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); +.theia-input.error:focus { + outline-width: 1px; + outline-style: solid; + outline-offset: -1px; + opacity: 1 !important; + color: var(--theia-errorForeground); + background-color: var(--theia-errorBackground); +} + +.theia-input.error { + background-color: var(--theia-errorBackground); +} + +.theia-input.error::placeholder { + color: var(--theia-errorForeground); + background-color: var(--theia-errorBackground); } /* Makes the sidepanel a bit wider when opening the widget */ diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index fdcdfc21c..6787ea4cb 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -20,22 +20,47 @@ .serial-monitor .head { display: flex; - padding: 5px; + padding: 0px 5px 5px 0px; height: 27px; + background-color: var(--theia-activityBar-background); } .serial-monitor .head .send { display: flex; flex: 1; - margin-right: 2px; } -.serial-monitor .head .send > input { +.serial-monitor .head .send > label:before { + content: ""; + position: absolute; + top: -1px; + background: var(--theia-icon-loading-warning) center center no-repeat; + animation: theia-spin 1.25s linear infinite; + width: 30px; + height: 30px; +} + +.serial-monitor .head .send > label { + position: relative; + width: 100%; + display: flex; + align-self: baseline; +} + +.serial-monitor .head .send > input, +.serial-monitor .head .send > label > input { line-height: var(--theia-content-line-height); + height: 27px; width: 100%; } -.serial-monitor .head .send > input:focus { +.serial-monitor .head .send > label > input { + padding-left: 30px; + box-sizing: border-box; +} + +.serial-monitor .head .send > input:focus, +.serial-monitor .head .send > label > input:focus { border-color: var(--theia-focusBorder); } diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 809f3a7c6..7dfcfb896 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -73,12 +73,12 @@ export namespace CoreError { UploadUsingProgrammer: 4003, BurnBootloader: 4004, }; - export const VerifyFailed = create(Codes.Verify); - export const UploadFailed = create(Codes.Upload); - export const UploadUsingProgrammerFailed = create( + export const VerifyFailed = declareCoreError(Codes.Verify); + export const UploadFailed = declareCoreError(Codes.Upload); + export const UploadUsingProgrammerFailed = declareCoreError( Codes.UploadUsingProgrammer ); - export const BurnBootloaderFailed = create(Codes.BurnBootloader); + export const BurnBootloaderFailed = declareCoreError(Codes.BurnBootloader); export function is( error: unknown ): error is ApplicationError<number, ErrorLocation[]> { @@ -88,7 +88,7 @@ export namespace CoreError { Object.values(Codes).includes(error.code) ); } - function create( + function declareCoreError( code: number ): ApplicationError.Constructor<number, ErrorLocation[]> { return ApplicationError.declare( diff --git a/arduino-ide-extension/src/common/protocol/monitor-service.ts b/arduino-ide-extension/src/common/protocol/monitor-service.ts index 7374951db..6c9bbcac9 100644 --- a/arduino-ide-extension/src/common/protocol/monitor-service.ts +++ b/arduino-ide-extension/src/common/protocol/monitor-service.ts @@ -1,4 +1,4 @@ -import { Event, JsonRpcServer } from '@theia/core'; +import { ApplicationError, Event, JsonRpcServer, nls } from '@theia/core'; import { PluggableMonitorSettings, MonitorSettings, @@ -31,7 +31,7 @@ export interface MonitorManagerProxyClient { onMessagesReceived: Event<{ messages: string[] }>; onMonitorSettingsDidChange: Event<MonitorSettings>; onMonitorShouldReset: Event<void>; - connect(addressPort: number): void; + connect(addressPort: number): Promise<void>; disconnect(): void; getWebSocketPort(): number | undefined; isWSConnected(): Promise<boolean>; @@ -46,7 +46,7 @@ export interface PluggableMonitorSetting { readonly id: string; // A human-readable label of the setting (to be displayed on the GUI) readonly label: string; - // The setting type (at the moment only "enum" is avaiable) + // The setting type (at the moment only "enum" is available) readonly type: string; // The values allowed on "enum" types readonly values: string[]; @@ -72,24 +72,168 @@ export namespace Monitor { }; } -export interface Status {} -export type OK = Status; -export interface ErrorStatus extends Status { - readonly message: string; +export const MonitorErrorCodes = { + ConnectionFailed: 6001, + NotConnected: 6002, + AlreadyConnected: 6003, + MissingConfiguration: 6004, +} as const; + +export const ConnectionFailedError = declareMonitorError( + MonitorErrorCodes.ConnectionFailed +); +export const NotConnectedError = declareMonitorError( + MonitorErrorCodes.NotConnected +); +export const AlreadyConnectedError = declareMonitorError( + MonitorErrorCodes.AlreadyConnected +); +export const MissingConfigurationError = declareMonitorError( + MonitorErrorCodes.MissingConfiguration +); + +export function createConnectionFailedError( + port: Port, + details?: string +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + let message; + if (details) { + const detailsWithPeriod = details.endsWith('.') ? details : `${details}.`; + message = nls.localize( + 'arduino/monitor/connectionFailedErrorWithDetails', + '{0} Could not connect to {1} {2} port.', + detailsWithPeriod, + address, + protocol + ); + } else { + message = nls.localize( + 'arduino/monitor/connectionFailedError', + 'Could not connect to {0} {1} port.', + address, + protocol + ); + } + return ConnectionFailedError(message, { protocol, address }); +} +export function createNotConnectedError( + port: Port +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + return NotConnectedError( + nls.localize( + 'arduino/monitor/notConnectedError', + 'Not connected to {0} {1} port.', + address, + protocol + ), + { protocol, address } + ); +} +export function createAlreadyConnectedError( + port: Port +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + return AlreadyConnectedError( + nls.localize( + 'arduino/monitor/alreadyConnectedError', + 'Could not connect to {0} {1} port. Already connected.', + address, + protocol + ), + { protocol, address } + ); +} +export function createMissingConfigurationError( + port: Port +): ApplicationError<number, PortDescriptor> { + const { protocol, address } = port; + return MissingConfigurationError( + nls.localize( + 'arduino/monitor/missingConfigurationError', + 'Could not connect to {0} {1} port. The monitor configuration is missing.', + address, + protocol + ), + { protocol, address } + ); +} + +/** + * Bare minimum representation of a port. Supports neither UI labels nor properties. + */ +interface PortDescriptor { + readonly protocol: string; + readonly address: string; +} +function declareMonitorError( + code: number +): ApplicationError.Constructor<number, PortDescriptor> { + return ApplicationError.declare( + code, + (message: string, data: PortDescriptor) => ({ data, message }) + ); +} + +export interface MonitorConnectionError { + readonly errorMessage: string; +} + +export type MonitorConnectionStatus = + | 'connecting' + | 'connected' + | 'not-connected' + | MonitorConnectionError; + +export function monitorConnectionStatusEquals( + left: MonitorConnectionStatus, + right: MonitorConnectionStatus +): boolean { + if (typeof left === 'object' && typeof right === 'object') { + return left.errorMessage === right.errorMessage; + } + return left === right; +} + +/** + * @deprecated see `MonitorState#connected` + */ +export function isMonitorConnected( + status: MonitorConnectionStatus +): status is 'connected' { + return status === 'connected'; } -export namespace Status { - export function isOK(status: Status & { message?: string }): status is OK { - return !!status && typeof status.message !== 'string'; + +export function isMonitorConnectionError( + status: MonitorConnectionStatus +): status is MonitorConnectionError { + return typeof status === 'object'; +} + +export interface MonitorState { + autoscroll: boolean; + timestamp: boolean; + lineEnding: MonitorEOL; + interpolate: boolean; + darkTheme: boolean; + wsPort: number; + serialPort: string; + connectionStatus: MonitorConnectionStatus; + /** + * @deprecated This property is never get by IDE2 only set. This value is present to be backward compatible with the plotter app. + * IDE2 uses `MonitorState#connectionStatus`. + */ + connected: boolean; +} +export namespace MonitorState { + export interface Change<K extends keyof MonitorState> { + readonly property: K; + readonly value: MonitorState[K]; } - export const OK: OK = {}; - export const NOT_CONNECTED: ErrorStatus = { message: 'Not connected.' }; - export const ALREADY_CONNECTED: ErrorStatus = { - message: 'Already connected.', - }; - export const CONFIG_MISSING: ErrorStatus = { - message: 'Serial Config missing.', - }; - export const UPLOAD_IN_PROGRESS: ErrorStatus = { - message: 'Upload in progress.', - }; +} + +export type MonitorEOL = '' | '\n' | '\r' | '\r\n'; +export namespace MonitorEOL { + export const DEFAULT: MonitorEOL = '\n'; } diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index f438ca2e6..08cfe4260 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -23,7 +23,7 @@ import { UploadUsingProgrammerResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; import { ResponseService } from '../common/protocol/response-service'; -import { OutputMessage, Port, Status } from '../common/protocol'; +import { OutputMessage, Port } 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'; @@ -392,7 +392,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { }: { fqbn?: string | undefined; port?: Port | undefined; - }): Promise<Status> { + }): Promise<void> { this.boardDiscovery.setUploadInProgress(false); return this.monitorManager.notifyUploadFinished(fqbn, port); } diff --git a/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts b/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts index 7f284ac3f..079b85d48 100644 --- a/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts +++ b/arduino-ide-extension/src/node/monitor-manager-proxy-impl.ts @@ -2,7 +2,6 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { MonitorManagerProxy, MonitorManagerProxyClient, - Status, } from '../common/protocol'; import { Board, Port } from '../common/protocol'; import { MonitorManager } from './monitor-manager'; @@ -41,11 +40,16 @@ export class MonitorManagerProxyImpl implements MonitorManagerProxy { await this.changeMonitorSettings(board, port, settings); } - const connectToClient = (status: Status) => { - if (status === Status.ALREADY_CONNECTED || status === Status.OK) { - // Monitor started correctly, connect it with the frontend - this.client.connect(this.manager.getWebsocketAddressPort(board, port)); + const connectToClient = async () => { + const address = this.manager.getWebsocketAddressPort(board, port); + if (!this.client) { + throw new Error( + `No client was connected to this monitor manager. Board: ${ + board.fqbn ?? board.name + }, port: ${port.address}, address: ${address}` + ); } + await this.client.connect(address); }; return this.manager.startMonitor(board, port, connectToClient); } diff --git a/arduino-ide-extension/src/node/monitor-manager.ts b/arduino-ide-extension/src/node/monitor-manager.ts index 38360a39f..ea63aa8cb 100644 --- a/arduino-ide-extension/src/node/monitor-manager.ts +++ b/arduino-ide-extension/src/node/monitor-manager.ts @@ -1,6 +1,11 @@ import { ILogger } from '@theia/core'; import { inject, injectable, named } from '@theia/core/shared/inversify'; -import { Board, BoardsService, Port, Status } from '../common/protocol'; +import { + AlreadyConnectedError, + Board, + BoardsService, + Port, +} from '../common/protocol'; import { CoreClientAware } from './core-client-provider'; import { MonitorService } from './monitor-service'; import { MonitorServiceFactory } from './monitor-service-factory'; @@ -36,7 +41,7 @@ export class MonitorManager extends CoreClientAware { private monitorServiceStartQueue: { monitorID: string; serviceStartParams: [Board, Port]; - connectToClient: (status: Status) => void; + connectToClient: () => Promise<void>; }[] = []; @inject(MonitorServiceFactory) @@ -104,7 +109,7 @@ export class MonitorManager extends CoreClientAware { async startMonitor( board: Board, port: Port, - connectToClient: (status: Status) => void + connectToClient: () => Promise<void> ): Promise<void> { const monitorID = this.monitorID(board.fqbn, port); @@ -127,8 +132,14 @@ export class MonitorManager extends CoreClientAware { return; } - const result = await monitor.start(); - connectToClient(result); + try { + await connectToClient(); + await monitor.start(); + } catch (err) { + if (!AlreadyConnectedError.is(err)) { + throw err; + } + } } /** @@ -202,8 +213,7 @@ export class MonitorManager extends CoreClientAware { async notifyUploadFinished( fqbn?: string | undefined, port?: Port - ): Promise<Status> { - let status: Status = Status.NOT_CONNECTED; + ): Promise<void> { let portDidChangeOnUpload = false; // We have no way of knowing which monitor @@ -214,7 +224,7 @@ export class MonitorManager extends CoreClientAware { const monitor = this.monitorServices.get(monitorID); if (monitor) { - status = await monitor.start(); + await monitor.start(); } // this monitorID will only be present in "disposedForUpload" @@ -232,7 +242,6 @@ export class MonitorManager extends CoreClientAware { } await this.startQueuedServices(portDidChangeOnUpload); - return status; } async startQueuedServices(portDidChangeOnUpload: boolean): Promise<void> { @@ -246,7 +255,7 @@ export class MonitorManager extends CoreClientAware { for (const { monitorID, - serviceStartParams: [_, port], + serviceStartParams: [, port], connectToClient, } of queued) { const boardsState = await this.boardsService.getState(); @@ -261,8 +270,8 @@ export class MonitorManager extends CoreClientAware { const monitorService = this.monitorServices.get(monitorID); if (monitorService) { - const result = await monitorService.start(); - connectToClient(result); + await connectToClient(); + await monitorService.start(); } } } diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index db5f100d7..ff7a9019f 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -1,8 +1,23 @@ -import { ClientDuplexStream } from '@grpc/grpc-js'; -import { Disposable, Emitter, ILogger } from '@theia/core'; +import { ClientDuplexStream, status } from '@grpc/grpc-js'; +import { + ApplicationError, + Disposable, + Emitter, + ILogger, + nls, +} from '@theia/core'; import { inject, named, postConstruct } from '@theia/core/shared/inversify'; import { diff, Operation } from 'just-diff'; -import { Board, Port, Status, Monitor } from '../common/protocol'; +import { + Board, + Port, + Monitor, + createAlreadyConnectedError, + createMissingConfigurationError, + createNotConnectedError, + createConnectionFailedError, + isMonitorConnected, +} from '../common/protocol'; import { EnumerateMonitorPortSettingsRequest, EnumerateMonitorPortSettingsResponse, @@ -19,8 +34,13 @@ import { PluggableMonitorSettings, MonitorSettingsProvider, } from './monitor-settings/monitor-settings-provider'; -import { Deferred } from '@theia/core/lib/common/promise-util'; +import { + Deferred, + retry, + timeoutReject, +} from '@theia/core/lib/common/promise-util'; import { MonitorServiceFactoryOptions } from './monitor-service-factory'; +import { ServiceError } from './service-error'; export const MonitorServiceName = 'monitor-service'; type DuplexHandlerKeys = @@ -76,7 +96,7 @@ export class MonitorService extends CoreClientAware implements Disposable { readonly onDispose = this.onDisposeEmitter.event; private _initialized = new Deferred<void>(); - private creating: Deferred<Status>; + private creating: Deferred<void>; private readonly board: Board; private readonly port: Port; private readonly monitorID: string; @@ -114,7 +134,7 @@ export class MonitorService extends CoreClientAware implements Disposable { this.updateClientsSettings(this.settings); }); - this.portMonitorSettings(this.port.protocol, this.board.fqbn!).then( + this.portMonitorSettings(this.port.protocol, this.board.fqbn!, true).then( async (settings) => { this.settings = { ...this.settings, @@ -154,74 +174,85 @@ export class MonitorService extends CoreClientAware implements Disposable { /** * Start and connects a monitor using currently set board and port. - * If a monitor is already started or board fqbn, port address and/or protocol - * are missing nothing happens. - * @returns a status to verify connection has been established. + * If a monitor is already started, the promise will reject with an `AlreadyConnectedError`. + * If the board fqbn, port address and/or protocol are missing, the promise rejects with a `MissingConfigurationError`. */ - async start(): Promise<Status> { + async start(): Promise<void> { if (this.creating?.state === 'unresolved') return this.creating.promise; this.creating = new Deferred(); if (this.duplex) { this.updateClientsSettings({ - monitorUISettings: { connected: true, serialPort: this.port.address }, + monitorUISettings: { + connectionStatus: 'connected', + connected: true, // TODO: should be removed when plotter app understand the `connectionStatus` message + serialPort: this.port.address, + }, }); - this.creating.resolve(Status.ALREADY_CONNECTED); + this.creating.reject(createAlreadyConnectedError(this.port)); return this.creating.promise; } if (!this.board?.fqbn || !this.port?.address || !this.port?.protocol) { - this.updateClientsSettings({ monitorUISettings: { connected: false } }); + this.updateClientsSettings({ + monitorUISettings: { + connectionStatus: 'not-connected', + connected: false, // TODO: should be removed when plotter app understand the `connectionStatus` message + }, + }); - this.creating.resolve(Status.CONFIG_MISSING); + this.creating.reject(createMissingConfigurationError(this.port)); return this.creating.promise; } this.logger.info('starting monitor'); - // get default monitor settings from the CLI - const defaultSettings = await this.portMonitorSettings( - this.port.protocol, - this.board.fqbn - ); - // get actual settings from the settings provider - this.settings = { - ...this.settings, - pluggableMonitorSettings: { - ...this.settings.pluggableMonitorSettings, - ...(await this.monitorSettingsProvider.getSettings( - this.monitorID, - defaultSettings - )), - }, - }; + try { + // get default monitor settings from the CLI + const defaultSettings = await this.portMonitorSettings( + this.port.protocol, + this.board.fqbn + ); - const coreClient = await this.coreClient; + this.updateClientsSettings({ + monitorUISettings: { connectionStatus: 'connecting' }, + }); - const { instance } = coreClient; - const monitorRequest = new MonitorRequest(); - monitorRequest.setInstance(instance); - if (this.board?.fqbn) { - monitorRequest.setFqbn(this.board.fqbn); - } - if (this.port?.address && this.port?.protocol) { - const rpcPort = new RpcPort(); - rpcPort.setAddress(this.port.address); - rpcPort.setProtocol(this.port.protocol); - monitorRequest.setPort(rpcPort); - } - const config = new MonitorPortConfiguration(); - for (const id in this.settings.pluggableMonitorSettings) { - const s = new MonitorPortSetting(); - s.setSettingId(id); - s.setValue(this.settings.pluggableMonitorSettings[id].selectedValue); - config.addSettings(s); - } - monitorRequest.setPortConfiguration(config); + // get actual settings from the settings provider + this.settings = { + ...this.settings, + pluggableMonitorSettings: { + ...this.settings.pluggableMonitorSettings, + ...(await this.monitorSettingsProvider.getSettings( + this.monitorID, + defaultSettings + )), + }, + }; - const wroteToStreamSuccessfully = await this.pollWriteToStream( - monitorRequest - ); - if (wroteToStreamSuccessfully) { + const coreClient = await this.coreClient; + + const { instance } = coreClient; + const monitorRequest = new MonitorRequest(); + monitorRequest.setInstance(instance); + if (this.board?.fqbn) { + monitorRequest.setFqbn(this.board.fqbn); + } + if (this.port?.address && this.port?.protocol) { + const rpcPort = new RpcPort(); + rpcPort.setAddress(this.port.address); + rpcPort.setProtocol(this.port.protocol); + monitorRequest.setPort(rpcPort); + } + const config = new MonitorPortConfiguration(); + for (const id in this.settings.pluggableMonitorSettings) { + const s = new MonitorPortSetting(); + s.setSettingId(id); + s.setValue(this.settings.pluggableMonitorSettings[id].selectedValue); + config.addSettings(s); + } + monitorRequest.setPortConfiguration(config); + + await this.pollWriteToStream(monitorRequest); // Only store the config, if the monitor has successfully started. this.currentPortConfigSnapshot = MonitorPortConfiguration.toObject( false, @@ -237,15 +268,34 @@ export class MonitorService extends CoreClientAware implements Disposable { `started monitor to ${this.port?.address} using ${this.port?.protocol}` ); this.updateClientsSettings({ - monitorUISettings: { connected: true, serialPort: this.port.address }, + monitorUISettings: { + connectionStatus: 'connected', + connected: true, // TODO: should be removed when plotter app understand the `connectionStatus` message + serialPort: this.port.address, + }, }); - this.creating.resolve(Status.OK); + this.creating.resolve(); return this.creating.promise; - } else { + } catch (err) { this.logger.warn( `failed starting monitor to ${this.port?.address} using ${this.port?.protocol}` ); - this.creating.resolve(Status.NOT_CONNECTED); + const appError = ApplicationError.is(err) + ? err + : createConnectionFailedError( + this.port, + ServiceError.is(err) + ? err.details + : err instanceof Error + ? err.message + : String(err) + ); + this.creating.reject(appError); + this.updateClientsSettings({ + monitorUISettings: { + connectionStatus: { errorMessage: appError.message }, + }, + }); return this.creating.promise; } } @@ -264,19 +314,29 @@ export class MonitorService extends CoreClientAware implements Disposable { // default handlers duplex .on('close', () => { - this.duplex = null; - this.updateClientsSettings({ - monitorUISettings: { connected: false }, - }); + if (duplex === this.duplex) { + this.duplex = null; + this.updateClientsSettings({ + monitorUISettings: { + connected: false, // TODO: should be removed when plotter app understand the `connectionStatus` message + connectionStatus: 'not-connected', + }, + }); + } this.logger.info( `monitor to ${this.port?.address} using ${this.port?.protocol} closed by client` ); }) .on('end', () => { - this.duplex = null; - this.updateClientsSettings({ - monitorUISettings: { connected: false }, - }); + if (duplex === this.duplex) { + this.duplex = null; + this.updateClientsSettings({ + monitorUISettings: { + connected: false, // TODO: should be removed when plotter app understand the `connectionStatus` message + connectionStatus: 'not-connected', + }, + }); + } this.logger.info( `monitor to ${this.port?.address} using ${this.port?.protocol} closed by server` ); @@ -287,21 +347,17 @@ export class MonitorService extends CoreClientAware implements Disposable { } } - pollWriteToStream(request: MonitorRequest): Promise<boolean> { - let attemptsRemaining = MAX_WRITE_TO_STREAM_TRIES; - const writeTimeoutMs = WRITE_TO_STREAM_TIMEOUT_MS; - + pollWriteToStream(request: MonitorRequest): Promise<void> { const createWriteToStreamExecutor = (duplex: ClientDuplexStream<MonitorRequest, MonitorResponse>) => - (resolve: (value: boolean) => void, reject: () => void) => { + (resolve: () => void, reject: (reason?: unknown) => void) => { const resolvingDuplexHandlers: DuplexHandler[] = [ { key: 'error', callback: async (err: Error) => { this.logger.error(err); - resolve(false); - // TODO - // this.theiaFEClient?.notifyError() + const details = ServiceError.is(err) ? err.details : err.message; + reject(createConnectionFailedError(this.port, details)); }, }, { @@ -313,79 +369,47 @@ export class MonitorService extends CoreClientAware implements Disposable { return; } if (monitorResponse.getSuccess()) { - resolve(true); + resolve(); return; } const data = monitorResponse.getRxData(); const message = typeof data === 'string' ? data - : this.streamingTextDecoder.decode(data, {stream:true}); + : this.streamingTextDecoder.decode(data, { stream: true }); this.messages.push(...splitLines(message)); }, }, ]; this.setDuplexHandlers(duplex, resolvingDuplexHandlers); - - setTimeout(() => { - reject(); - }, writeTimeoutMs); duplex.write(request); }; - const pollWriteToStream = new Promise<boolean>((resolve) => { - const startPolling = async () => { - // here we create a new duplex but we don't yet - // set "this.duplex", nor do we use "this.duplex" in our poll - // as duplex 'end' / 'close' events (which we do not "await") - // will set "this.duplex" to null - const createdDuplex = await this.createDuplex(); - - let pollingIsSuccessful; - // attempt a "writeToStream" and "await" CLI response: success (true) or error (false) - // if we get neither within WRITE_TO_STREAM_TIMEOUT_MS or an error we get undefined - try { - const writeToStream = createWriteToStreamExecutor(createdDuplex); - pollingIsSuccessful = await new Promise(writeToStream); - } catch (error) { - this.logger.error(error); - } - - // CLI confirmed port opened successfully - if (pollingIsSuccessful) { - this.duplex = createdDuplex; - resolve(true); - return; - } - - // if "pollingIsSuccessful" is false - // the CLI gave us an error, lets try again - // after waiting 2 seconds if we've not already - // reached MAX_WRITE_TO_STREAM_TRIES - if (pollingIsSuccessful === false) { - attemptsRemaining -= 1; - if (attemptsRemaining > 0) { - setTimeout(startPolling, 2000); - return; - } else { - resolve(false); - return; + return Promise.race([ + retry( + async () => { + let createdDuplex = undefined; + try { + createdDuplex = await this.createDuplex(); + await new Promise<void>(createWriteToStreamExecutor(createdDuplex)); + this.duplex = createdDuplex; + } catch (err) { + createdDuplex?.end(); + throw err; } - } - - // "pollingIsSuccessful" remains undefined: - // we got no response from the CLI within 30 seconds - // resolve to false and end the duplex connection - resolve(false); - createdDuplex.end(); - return; - }; - - startPolling(); - }); - - return pollWriteToStream; + }, + 2_000, + MAX_WRITE_TO_STREAM_TRIES + ), + timeoutReject( + WRITE_TO_STREAM_TIMEOUT_MS, + nls.localize( + 'arduino/monitor/connectionTimeout', + "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it" + ) + ), + ]) as Promise<unknown> as Promise<void>; } /** @@ -429,9 +453,9 @@ export class MonitorService extends CoreClientAware implements Disposable { * @param message string sent to running monitor * @returns a status to verify message has been sent. */ - async send(message: string): Promise<Status> { + async send(message: string): Promise<void> { if (!this.duplex) { - return Status.NOT_CONNECTED; + throw createNotConnectedError(this.port); } const coreClient = await this.coreClient; const { instance } = coreClient; @@ -439,14 +463,12 @@ export class MonitorService extends CoreClientAware implements Disposable { const req = new MonitorRequest(); req.setInstance(instance); req.setTxData(new TextEncoder().encode(message)); - return new Promise<Status>((resolve) => { + return new Promise<void>((resolve, reject) => { if (this.duplex) { - this.duplex?.write(req, () => { - resolve(Status.OK); - }); + this.duplex?.write(req, resolve); return; } - this.stop().then(() => resolve(Status.NOT_CONNECTED)); + this.stop().then(() => reject(createNotConnectedError(this.port))); }); } @@ -469,7 +491,8 @@ export class MonitorService extends CoreClientAware implements Disposable { */ private async portMonitorSettings( protocol: string, - fqbn: string + fqbn: string, + swallowsPlatformNotFoundError = false ): Promise<PluggableMonitorSettings> { const coreClient = await this.coreClient; const { client, instance } = coreClient; @@ -478,19 +501,33 @@ export class MonitorService extends CoreClientAware implements Disposable { req.setPortProtocol(protocol); req.setFqbn(fqbn); - const res = await new Promise<EnumerateMonitorPortSettingsResponse>( - (resolve, reject) => { - client.enumerateMonitorPortSettings(req, (err, resp) => { - if (!!err) { - reject(err); + const resp = await new Promise< + EnumerateMonitorPortSettingsResponse | undefined + >((resolve, reject) => { + client.enumerateMonitorPortSettings(req, async (err, resp) => { + if (err) { + // Check whether the platform is installed: https://github.com/arduino/arduino-ide/issues/1974. + // No error codes. Look for `Unknown FQBN: platform arduino:mbed_nano is not installed` message similarities: https://github.com/arduino/arduino-cli/issues/1762. + if ( + swallowsPlatformNotFoundError && + ServiceError.is(err) && + err.code === status.NOT_FOUND && + err.details.includes('FQBN') && + err.details.includes(fqbn.split(':', 2).join(':')) // create a platform ID from the FQBN + ) { + resolve(undefined); } - resolve(resp); - }); - } - ); + reject(err); + } + resolve(resp); + }); + }); const settings: PluggableMonitorSettings = {}; - for (const iterator of res.getSettingsList()) { + if (!resp) { + return settings; + } + for (const iterator of resp.getSettingsList()) { settings[iterator.getSettingId()] = { id: iterator.getSettingId(), label: iterator.getLabel(), @@ -510,7 +547,7 @@ export class MonitorService extends CoreClientAware implements Disposable { * @param settings map of monitor settings to change * @returns a status to verify settings have been sent. */ - async changeSettings(settings: MonitorSettings): Promise<Status> { + async changeSettings(settings: MonitorSettings): Promise<void> { const config = new MonitorPortConfiguration(); const { pluggableMonitorSettings } = settings; const reconciledSettings = await this.monitorSettingsProvider.setSettings( @@ -527,17 +564,23 @@ export class MonitorService extends CoreClientAware implements Disposable { } } + const connectionStatus = Boolean(this.duplex) + ? 'connected' + : 'not-connected'; this.updateClientsSettings({ monitorUISettings: { ...settings.monitorUISettings, - connected: !!this.duplex, + connectionStatus, serialPort: this.port.address, + connected: isMonitorConnected(connectionStatus), // TODO: should be removed when plotter app understand the `connectionStatus` message }, pluggableMonitorSettings: reconciledSettings, }); if (!this.duplex) { - return Status.NOT_CONNECTED; + // instead of throwing an error, return silently like the original logic + // https://github.com/arduino/arduino-ide/blob/9b49712669b06c97bda68a1e5f04eee4664c13f8/arduino-ide-extension/src/node/monitor-service.ts#L540 + return; } const diffConfig = this.maybeUpdatePortConfigSnapshot(config); @@ -545,7 +588,7 @@ export class MonitorService extends CoreClientAware implements Disposable { this.logger.info( `No port configuration changes have been detected. No need to send configure commands to the running monitor ${this.port.protocol}:${this.port.address}.` ); - return Status.OK; + return; } const coreClient = await this.coreClient; @@ -560,7 +603,6 @@ export class MonitorService extends CoreClientAware implements Disposable { req.setInstance(instance); req.setPortConfiguration(diffConfig); this.duplex.write(req); - return Status.OK; } /** @@ -688,6 +730,26 @@ export class MonitorService extends CoreClientAware implements Disposable { updateClientsSettings(settings: MonitorSettings): void { this.settings = { ...this.settings, ...settings }; + if ( + settings.monitorUISettings?.connectionStatus && + !('connected' in settings.monitorUISettings) + ) { + // Make sure the deprecated `connected` prop is set. + settings.monitorUISettings.connected = isMonitorConnected( + settings.monitorUISettings.connectionStatus + ); + } + if ( + typeof settings.monitorUISettings?.connected === 'boolean' && + !('connectionStatus' in settings.monitorUISettings) + ) { + // Set the connectionStatus if the message was sent by the plotter which does not handle the new protocol. Assuming that the plotter can send anything. + // https://github.com/arduino/arduino-serial-plotter-webapp#monitor-settings + settings.monitorUISettings.connectionStatus = settings.monitorUISettings + .connected + ? 'connected' + : 'not-connected'; + } const command: Monitor.Message = { command: Monitor.MiddlewareCommand.ON_SETTINGS_DID_CHANGE, data: settings, diff --git a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider.ts b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider.ts index e8949a60b..293751781 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,9 @@ -import { MonitorModel } from '../../browser/monitor-model'; -import { PluggableMonitorSetting } from '../../common/protocol'; +import { MonitorState, PluggableMonitorSetting } from '../../common/protocol'; export type PluggableMonitorSettings = Record<string, PluggableMonitorSetting>; export interface MonitorSettings { pluggableMonitorSettings?: PluggableMonitorSettings; - monitorUISettings?: Partial<MonitorModel.State>; + monitorUISettings?: Partial<MonitorState>; } export const MonitorSettingsProvider = Symbol('MonitorSettingsProvider'); diff --git a/i18n/en.json b/i18n/en.json index 22419c5bf..320be23f1 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -328,6 +328,13 @@ "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" }, @@ -408,6 +415,7 @@ "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", From 3aee575a358c95f766dec9ceb8bc44f9a681eeb9 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 5 Apr 2023 11:34:24 +0200 Subject: [PATCH 177/384] chore(cli): Updated to `0.32.2` CLI Signed-off-by: Akos Kitta <a.kitta@arduino.cc> Co-authored-by: per1234 <accounts@perglass.com> Co-authored-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 6 +--- .../arduino/cli/commands/v1/compile_pb.d.ts | 4 --- .../cc/arduino/cli/commands/v1/compile_pb.js | 30 ------------------- 3 files changed, 1 insertion(+), 39 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 5bd714377..37e682b7f 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -163,11 +163,7 @@ ], "arduino": { "cli": { - "version": { - "owner": "arduino", - "repo": "arduino-cli", - "commitish": "71a8576" - } + "version": "0.32.2" }, "fwuploader": { "version": "2.2.2" 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 5954b8501..692e2a3d5 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 @@ -48,9 +48,6 @@ export class CompileRequest extends jspb.Message { getQuiet(): boolean; setQuiet(value: boolean): CompileRequest; - getVidPid(): string; - setVidPid(value: string): CompileRequest; - getJobs(): number; setJobs(value: number): CompileRequest; @@ -122,7 +119,6 @@ export namespace CompileRequest { warnings: string, verbose: boolean, quiet: boolean, - vidPid: string, jobs: number, librariesList: Array<string>, optimizeForDebug: boolean, 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 d5d0a7812..f32a64b87 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 @@ -137,7 +137,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.toObject = function(includeInsta warnings: jspb.Message.getFieldWithDefault(msg, 9, ""), verbose: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), quiet: jspb.Message.getBooleanFieldWithDefault(msg, 11, false), - vidPid: jspb.Message.getFieldWithDefault(msg, 12, ""), jobs: jspb.Message.getFieldWithDefault(msg, 14, 0), librariesList: (f = jspb.Message.getRepeatedField(msg, 15)) == null ? undefined : f, optimizeForDebug: jspb.Message.getBooleanFieldWithDefault(msg, 16, false), @@ -232,10 +231,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu var value = /** @type {boolean} */ (reader.readBool()); msg.setQuiet(value); break; - case 12: - var value = /** @type {string} */ (reader.readString()); - msg.setVidPid(value); - break; case 14: var value = /** @type {number} */ (reader.readInt32()); msg.setJobs(value); @@ -398,13 +393,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } - f = message.getVidPid(); - if (f.length > 0) { - writer.writeString( - 12, - f - ); - } f = message.getJobs(); if (f !== 0) { writer.writeInt32( @@ -733,24 +721,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setQuiet = function(va }; -/** - * optional string vid_pid = 12; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getVidPid = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 12, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setVidPid = function(value) { - return jspb.Message.setProto3StringField(this, 12, value); -}; - - /** * optional int32 jobs = 14; * @return {number} From ef5762599a9e58393fd2e635e52f1db165b3f0ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:05:59 +0000 Subject: [PATCH 178/384] build(deps): Bump peter-evans/create-pull-request from 4 to 5 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4 to 5. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v4...v5) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 435d1e572..9398b0e4f 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -45,7 +45,7 @@ jobs: TRANSIFEX_API_KEY: ${{ secrets.TRANSIFEX_API_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 with: commit-message: Updated translation files title: Update translation files diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index a236db537..872f3faec 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -54,7 +54,7 @@ jobs: run: yarn run themes:generate - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 with: commit-message: Updated themes title: Update themes From 96da5bb5ea7e85759152e3264d09210174dcf8f3 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Thu, 13 Apr 2023 17:53:43 +0200 Subject: [PATCH 179/384] fix: updated to `electron-builder@23.6.0` (#1986) - updated to `electron-builder@23.6.0` - set `CSC_FOR_PULL_REQUEST` env to run notarization for a PR build. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .github/workflows/build.yml | 1 + electron/build/template-package.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1113042eb..6213a4a88 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -99,6 +99,7 @@ jobs: export CSC_LINK="${{ runner.temp }}/signing_certificate.${{ matrix.config.certificate-extension }}" echo "${{ secrets[matrix.config.certificate-secret] }}" | base64 --decode > "$CSC_LINK" export CSC_KEY_PASSWORD="${{ secrets[matrix.config.certificate-password-secret] }}" + export CSC_FOR_PULL_REQUEST=true fi if [ "${{ runner.OS }}" = "Windows" ]; then diff --git a/electron/build/template-package.json b/electron/build/template-package.json index f3692a416..a835ee23e 100644 --- a/electron/build/template-package.json +++ b/electron/build/template-package.json @@ -3,7 +3,7 @@ "author": "Arduino SA", "resolutions": { "**/fs-extra": "^4.0.3", - "electron-builder": "23.0.2" + "electron-builder": "23.6.0" }, "dependencies": { "node-log-rotate": "^0.1.5" @@ -11,7 +11,7 @@ "devDependencies": { "@theia/cli": "1.31.1", "cross-env": "^7.0.2", - "electron-builder": "23.3.3", + "electron-builder": "23.6.0", "electron-notarize": "^1.1.1", "is-ci": "^2.0.0", "ncp": "^2.0.0", From cb2a3712636a6f247abb9fe3657be811f7646624 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 31 Mar 2023 16:15:54 +0200 Subject: [PATCH 180/384] fix: update `themeId` settings after theme change In Theia, the theme ID is not always in sync with the persisted `workbench.colorTheme` preference value. For example, one can preview a theme with the `CtrlCmd+K` + `CtrlCmd+T` key chords. On quick pick selection change events, the theme changes, but the change is persisted only on accept (user presses `Enter`). IDE2 has its own way of showing and managing different settings in the UI. When the theme is changed from outside of the IDE2's UI, the model could get out of sync. This PR ensures that on `workbench.colorTheme` preference change, IDE2's settings model is synchronized with persisted Theia preferences. Closes #1987 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/dialogs/settings/settings.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index e4923c760..c120d6a9a 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -123,6 +123,17 @@ export class SettingsService { this._settings = deepClone(settings); this.ready.resolve(); }); + this.preferenceService.onPreferenceChanged(async (event) => { + await this.ready.promise; + const { preferenceName, newValue } = event; + if ( + preferenceName === 'workbench.colorTheme' && + typeof newValue === 'string' && + this._settings.themeId !== newValue + ) { + this.reset(); + } + }); } protected async loadSettings(): Promise<Settings> { From 7cc252fc36608be85c5d9269f498fc76019a8f23 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 3 Apr 2023 16:50:09 +0200 Subject: [PATCH 181/384] fix: location of possible drop-in folder for VSIX Closes #1851 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../build/scripts/arduino-ide-electron-main.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/electron/build/scripts/arduino-ide-electron-main.js b/electron/build/scripts/arduino-ide-electron-main.js index 82a63fbec..12ad02e72 100644 --- a/electron/build/scripts/arduino-ide-electron-main.js +++ b/electron/build/scripts/arduino-ide-electron-main.js @@ -1,9 +1,15 @@ 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_DEFAULT_PLUGINS = `local-dir:${path.resolve( + __dirname, + '..', + 'plugins' +)}`; process.env.THEIA_PLUGINS = [ - process.env.THEIA_PLUGINS, - `local-dir:${path.resolve(os.homedir(), '.arduinoProIDE', 'plugins')}` -].filter(Boolean).join(','); + process.env.THEIA_PLUGINS, + `local-dir:${path.resolve(os.homedir(), '.arduinoIDE', 'plugins')}`, +] + .filter(Boolean) + .join(','); require('../src-gen/frontend/electron-main.js'); From 5540170341e791e43bfcac0bb4c8ef305ff10ad0 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 3 Apr 2023 15:33:46 +0200 Subject: [PATCH 182/384] feat: removed the non official themes from the UI Closes #1283 Ref eclipse-theia/theia#11151 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/arduino-ide-frontend-module.ts | 23 +- .../dialogs/settings/settings-component.tsx | 58 ++++- .../src/browser/theia/core/theming.ts | 180 +++++++++++++- .../theia/monaco/monaco-theming-service.ts | 228 +++++++++++++++++- .../src/test/browser/theming.test.ts | 179 ++++++++++++++ i18n/en.json | 8 + 6 files changed, 642 insertions(+), 34 deletions(-) create mode 100644 arduino-ide-extension/src/test/browser/theming.test.ts 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 09475690b..8a5b4467a 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -238,7 +238,6 @@ import { UploadFirmwareDialog, UploadFirmwareDialogProps, } from './dialogs/firmware-uploader/firmware-uploader-dialog'; - import { UploadCertificate } from './contributions/upload-certificate'; import { ArduinoFirmwareUploader, @@ -328,9 +327,13 @@ import { NewCloudSketch } from './contributions/new-cloud-sketch'; import { SketchbookCompositeWidget } from './widgets/sketchbook/sketchbook-composite-widget'; import { WindowTitleUpdater } from './theia/core/window-title-updater'; import { WindowTitleUpdater as TheiaWindowTitleUpdater } from '@theia/core/lib/browser/window/window-title-updater'; -import { ThemeServiceWithDB } from './theia/core/theming'; -import { ThemeServiceWithDB as TheiaThemeServiceWithDB } from '@theia/monaco/lib/browser/monaco-indexed-db'; -import { MonacoThemingService } from './theia/monaco/monaco-theming-service'; +import { + MonacoThemingService, + CleanupObsoleteThemes, + ThemesRegistrationSummary, + MonacoThemeRegistry, +} from './theia/monaco/monaco-theming-service'; +import { MonacoThemeRegistry as TheiaMonacoThemeRegistry } from '@theia/monaco/lib/browser/textmate/monaco-theme-registry'; import { MonacoThemingService as TheiaMonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service'; import { TypeHierarchyServiceProvider } from './theia/typehierarchy/type-hierarchy-service'; import { TypeHierarchyServiceProvider as TheiaTypeHierarchyServiceProvider } from '@theia/typehierarchy/lib/browser/typehierarchy-service'; @@ -973,11 +976,19 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(TheiaWindowTitleUpdater).toService(WindowTitleUpdater); // register Arduino themes - bind(ThemeServiceWithDB).toSelf().inSingletonScope(); - rebind(TheiaThemeServiceWithDB).toService(ThemeServiceWithDB); bind(MonacoThemingService).toSelf().inSingletonScope(); rebind(TheiaMonacoThemingService).toService(MonacoThemingService); + // workaround for themes cannot be removed after registration + // https://github.com/eclipse-theia/theia/issues/11151 + bind(CleanupObsoleteThemes).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService( + CleanupObsoleteThemes + ); + bind(ThemesRegistrationSummary).toSelf().inSingletonScope(); + bind(MonacoThemeRegistry).toSelf().inSingletonScope(); + rebind(TheiaMonacoThemeRegistry).toService(MonacoThemeRegistry); + // disable type-hierarchy support // https://github.com/eclipse-theia/theia/commit/16c88a584bac37f5cf3cc5eb92ffdaa541bda5be bind(TypeHierarchyServiceProvider).toSelf().inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index a5249326b..644484f01 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -24,6 +24,12 @@ import { } from '@theia/core/lib/common/i18n/localization'; import SettingsStepInput from './settings-step-input'; import { InterfaceScale } from '../../contributions/interface-scale'; +import { + userConfigurableThemes, + themeLabelForSettings, + arduinoThemeTypeOf, +} from '../../theia/core/theming'; +import { Theme } from '@theia/core/lib/common/theme'; const maxScale = InterfaceScale.ZoomLevel.toPercentage( InterfaceScale.ZoomLevel.MAX @@ -218,14 +224,10 @@ export class SettingsComponent extends React.Component< <div className="flex-line"> <select className="theia-select" - value={this.props.themeService.getCurrentTheme().label} + value={this.currentThemeLabel} onChange={this.themeDidChange} > - {this.props.themeService.getThemes().map(({ id, label }) => ( - <option key={id} value={label}> - {label} - </option> - ))} + {this.themeSelectOptions} </select> </div> <div className="flex-line"> @@ -333,6 +335,46 @@ export class SettingsComponent extends React.Component< ); } + private get currentThemeLabel(): string { + const currentTheme = this.props.themeService.getCurrentTheme(); + return themeLabelForSettings(currentTheme); + } + + private get separatedThemes(): (Theme | string)[] { + const separatedThemes: (Theme | string)[] = []; + const groupedThemes = userConfigurableThemes(this.props.themeService); + for (const group of groupedThemes) { + for (let i = 0; i < group.length; i++) { + const theme = group[i]; + if (i === 0 && separatedThemes.length) { + const arduinoThemeType = arduinoThemeTypeOf(theme); + separatedThemes.push(`separator-${arduinoThemeType}`); + } + separatedThemes.push(theme); + } + } + return separatedThemes; + } + + private get themeSelectOptions(): React.ReactNode[] { + return this.separatedThemes.map((item) => { + if (typeof item === 'string') { + return ( + // ─ -> BOX DRAWINGS LIGHT HORIZONTAL + <option key={item} disabled> + ────────── + </option> + ); + } + const label = themeLabelForSettings(item); + return ( + <option key={item.id} value={label}> + {label} + </option> + ); + }); + } + private toSelectOptions(language: string | LanguageInfo): JSX.Element { const plain = typeof language === 'string'; const key = plain ? language : language.languageId; @@ -610,8 +652,8 @@ export class SettingsComponent extends React.Component< event: React.ChangeEvent<HTMLSelectElement> ): void => { const { selectedIndex } = event.target.options; - const theme = this.props.themeService.getThemes()[selectedIndex]; - if (theme) { + const theme = this.separatedThemes[selectedIndex]; + if (theme && typeof theme !== 'string') { this.setState({ themeId: theme.id }); if (this.props.themeService.getCurrentTheme().id !== theme.id) { this.props.themeService.setCurrentTheme(theme.id); diff --git a/arduino-ide-extension/src/browser/theia/core/theming.ts b/arduino-ide-extension/src/browser/theia/core/theming.ts index 9f95f780d..b46f04b9b 100644 --- a/arduino-ide-extension/src/browser/theia/core/theming.ts +++ b/arduino-ide-extension/src/browser/theia/core/theming.ts @@ -1,15 +1,19 @@ -import type { Theme } from '@theia/core/lib/common/theme'; -import { injectable } from '@theia/core/shared/inversify'; -import { ThemeServiceWithDB as TheiaThemeServiceWithDB } from '@theia/monaco/lib/browser/monaco-indexed-db'; +import { + BuiltinThemeProvider, + ThemeService, +} from '@theia/core/lib/browser/theming'; +import { nls } from '@theia/core/lib/common/nls'; +import type { Theme, ThemeType } from '@theia/core/lib/common/theme'; +import { assertUnreachable } from '../../../common/utils'; export namespace ArduinoThemes { - export const Light: Theme = { + export const light: Theme = { id: 'arduino-theme', type: 'light', label: 'Light (Arduino)', editorTheme: 'arduino-theme', }; - export const Dark: Theme = { + export const dark: Theme = { id: 'arduino-theme-dark', type: 'dark', label: 'Dark (Arduino)', @@ -17,10 +21,166 @@ export namespace ArduinoThemes { }; } -@injectable() -export class ThemeServiceWithDB extends TheiaThemeServiceWithDB { - protected override init(): void { - this.register(ArduinoThemes.Light, ArduinoThemes.Dark); - super.init(); +const builtInThemeIds = new Set( + [ + ArduinoThemes.light, + ArduinoThemes.dark, + BuiltinThemeProvider.hcTheme, + // TODO: add the HC light theme after Theia 1.36 + ].map(({ id }) => id) +); +const deprecatedThemeIds = new Set( + [BuiltinThemeProvider.lightTheme, BuiltinThemeProvider.darkTheme].map( + ({ id }) => id + ) +); + +export const lightThemeLabel = nls.localize('arduino/theme/light', 'Light'); +export const darkThemeLabel = nls.localize('arduino/theme/dark', 'Dark'); +export const hcThemeLabel = nls.localize('arduino/theme/hc', 'High Contrast'); +export function userThemeLabel(theme: Theme): string { + return nls.localize('arduino/theme/user', '{0} (user)', theme.label); +} +export function deprecatedThemeLabel(theme: Theme): string { + return nls.localize( + 'arduino/theme/deprecated', + '{0} (deprecated)', + theme.label + ); +} + +export function themeLabelForSettings(theme: Theme): string { + switch (theme.id) { + case ArduinoThemes.light.id: + return lightThemeLabel; + case ArduinoThemes.dark.id: + return darkThemeLabel; + case BuiltinThemeProvider.hcTheme.id: + return hcThemeLabel; + case BuiltinThemeProvider.lightTheme.id: // fall-through + case BuiltinThemeProvider.darkTheme.id: + return deprecatedThemeLabel(theme); + default: + return userThemeLabel(theme); + } +} + +export function compatibleBuiltInTheme(theme: Theme): Theme { + switch (theme.type) { + case 'light': + return ArduinoThemes.light; + case 'dark': + return ArduinoThemes.dark; + case 'hc': + return BuiltinThemeProvider.hcTheme; + default: { + console.warn( + `Unhandled theme type: ${theme.type}. Theme ID: ${theme.id}, label: ${theme.label}` + ); + return ArduinoThemes.light; + } + } +} + +// For tests without DI +interface ThemeProvider { + themes(): Theme[]; + currentTheme(): Theme; +} + +/** + * Returns with a list of built-in themes officially supported by IDE2 (https://github.com/arduino/arduino-ide/issues/1283). + * The themes in the array follow the following order: + * - built-in themes first (in `Light`, `Dark`, `High Contrast`), // TODO -> High Contrast will be split up to HC Dark and HC Light after the Theia version uplift + * - followed by user installed (VSIX) themes grouped by theme type, then alphabetical order, + * - if the `currentTheme` is either Light (Theia) or Dark (Theia), the last item of the array will be the selected theme with `(deprecated)` suffix. + */ +export function userConfigurableThemes(service: ThemeService): Theme[][]; +export function userConfigurableThemes(provider: ThemeProvider): Theme[][]; +export function userConfigurableThemes( + serviceOrProvider: ThemeService | ThemeProvider +): Theme[][] { + const provider = + serviceOrProvider instanceof ThemeService + ? { + currentTheme: () => serviceOrProvider.getCurrentTheme(), + themes: () => serviceOrProvider.getThemes(), + } + : serviceOrProvider; + const currentTheme = provider.currentTheme(); + const allThemes = provider + .themes() + .map((theme) => ({ ...theme, arduinoThemeType: arduinoThemeTypeOf(theme) })) + .filter( + (theme) => + theme.arduinoThemeType !== 'deprecated' || currentTheme.id === theme.id + ) + .sort((left, right) => { + const leftArduinoThemeType = left.arduinoThemeType; + const rightArduinoThemeType = right.arduinoThemeType; + if (leftArduinoThemeType === rightArduinoThemeType) { + const result = themeTypeOrder[left.type] - themeTypeOrder[right.type]; + if (result) { + return result; + } + return left.label.localeCompare(right.label); // alphabetical order + } + return ( + arduinoThemeTypeOrder[leftArduinoThemeType] - + arduinoThemeTypeOrder[rightArduinoThemeType] + ); + }); + const builtInThemes: Theme[] = []; + const userThemes: Theme[] = []; + const deprecatedThemes: Theme[] = []; + allThemes.forEach((theme) => { + const { arduinoThemeType } = theme; + switch (arduinoThemeType) { + case 'built-in': + builtInThemes.push(theme); + break; + case 'user': + userThemes.push(theme); + break; + case 'deprecated': + deprecatedThemes.push(theme); + break; + default: + assertUnreachable(arduinoThemeType); + } + }); + const groupedThemes: Theme[][] = []; + if (builtInThemes.length) { + groupedThemes.push(builtInThemes); + } + if (userThemes.length) { + groupedThemes.push(userThemes); + } + if (deprecatedThemes.length) { + groupedThemes.push(deprecatedThemes); + } + return groupedThemes; +} + +export type ArduinoThemeType = 'built-in' | 'user' | 'deprecated'; +const arduinoThemeTypeOrder: Record<ArduinoThemeType, number> = { + 'built-in': 0, + user: 1, + deprecated: 2, +}; +const themeTypeOrder: Record<ThemeType, number> = { + light: 0, + dark: 1, + hc: 2, +}; + +export function arduinoThemeTypeOf(theme: Theme | string): ArduinoThemeType { + const themeId = typeof theme === 'string' ? theme : theme.id; + if (builtInThemeIds.has(themeId)) { + return 'built-in'; + } + if (deprecatedThemeIds.has(themeId)) { + return 'deprecated'; } + return 'user'; } diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts index 4951ba771..40d703423 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts @@ -1,23 +1,231 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { MonacoThemingService as TheiaMonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service'; -import { ArduinoThemes } from '../core/theming'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { ThemeService } from '@theia/core/lib/browser/theming'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { nls } from '@theia/core/lib/common/nls'; +import { deepClone } from '@theia/core/lib/common/objects'; +import { wait } from '@theia/core/lib/common/promise-util'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { + MonacoThemeState, + deleteTheme as deleteThemeFromIndexedDB, + getThemes as getThemesFromIndexedDB, +} from '@theia/monaco/lib/browser/monaco-indexed-db'; +import { + MonacoTheme, + MonacoThemingService as TheiaMonacoThemingService, +} from '@theia/monaco/lib/browser/monaco-theming-service'; +import { MonacoThemeRegistry as TheiaMonacoThemeRegistry } from '@theia/monaco/lib/browser/textmate/monaco-theme-registry'; +import type { ThemeMix } from '@theia/monaco/lib/browser/textmate/monaco-theme-types'; +import { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +import { ArduinoThemes, compatibleBuiltInTheme } from '../core/theming'; +import { WindowServiceExt } from '../core/window-service-ext'; + +type MonacoThemeRegistrationSource = + /** + * When reading JS/TS contributed theme from a JSON file. Such as the Arduino themes and the ones contributed by Theia. + */ + | 'compiled' + /** + * When reading and registering previous monaco themes from the `indexedDB`. + */ + | 'indexedDB' + /** + * Contributed by VS Code extensions when starting the app and loading the plugins. + */ + | 'vsix'; + +@injectable() +export class ThemesRegistrationSummary { + private readonly _summary: Record<MonacoThemeRegistrationSource, string[]> = { + compiled: [], + indexedDB: [], + vsix: [], + }; + + add(source: MonacoThemeRegistrationSource, themeId: string): void { + const themeIds = this._summary[source]; + if (!themeIds.includes(themeId)) { + themeIds.push(themeId); + } + } + + get summary(): Record<MonacoThemeRegistrationSource, string[]> { + return deepClone(this._summary); + } +} + +@injectable() +export class MonacoThemeRegistry extends TheiaMonacoThemeRegistry { + @inject(ThemesRegistrationSummary) + private readonly summary: ThemesRegistrationSummary; + + private initializing = false; + + override initializeDefaultThemes(): void { + this.initializing = true; + try { + super.initializeDefaultThemes(); + } finally { + this.initializing = false; + } + } + + override setTheme(name: string, data: ThemeMix): void { + super.setTheme(name, data); + if (this.initializing) { + this.summary.add('compiled', name); + } + } +} @injectable() export class MonacoThemingService extends TheiaMonacoThemingService { - override initialize(): void { - super.initialize(); - const { Light, Dark } = ArduinoThemes; + @inject(ThemesRegistrationSummary) + private readonly summary: ThemesRegistrationSummary; + + private themeRegistrationSource: MonacoThemeRegistrationSource | undefined; + + protected override async restore(): Promise<void> { + // The custom theme registration must happen before restoring the themes. + // Otherwise, theme changes are not picked up. + // https://github.com/arduino/arduino-ide/issues/1251#issuecomment-1436737702 + this.registerArduinoThemes(); + this.themeRegistrationSource = 'indexedDB'; + try { + await super.restore(); + } finally { + this.themeRegistrationSource = 'indexedDB'; + } + } + + private registerArduinoThemes(): void { + const { light, dark } = ArduinoThemes; this.registerParsedTheme({ - id: Light.id, - label: Light.label, + id: light.id, + label: light.label, uiTheme: 'vs', json: require('../../../../src/browser/data/default.color-theme.json'), }); this.registerParsedTheme({ - id: Dark.id, - label: Dark.label, + id: dark.id, + label: dark.label, uiTheme: 'vs-dark', json: require('../../../../src/browser/data/dark.color-theme.json'), }); } + + protected override doRegisterParsedTheme( + state: MonacoThemeState + ): Disposable { + const themeId = state.id; + const source = this.themeRegistrationSource ?? 'compiled'; + const disposable = super.doRegisterParsedTheme(state); + this.summary.add(source, themeId); + return disposable; + } + + protected override async doRegister( + theme: MonacoTheme, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + pending: { [uri: string]: Promise<any> }, + toDispose: DisposableCollection + ): Promise<void> { + try { + this.themeRegistrationSource = 'vsix'; + await super.doRegister(theme, pending, toDispose); + } finally { + this.themeRegistrationSource = undefined; + } + } +} + +/** + * Workaround for removing VSIX themes from the indexedDB if they were not loaded during the app startup. + */ +@injectable() +export class CleanupObsoleteThemes implements FrontendApplicationContribution { + @inject(HostedPluginSupport) + private readonly hostedPlugin: HostedPluginSupport; + @inject(ThemesRegistrationSummary) + private readonly summary: ThemesRegistrationSummary; + @inject(ThemeService) + private readonly themeService: ThemeService; + @inject(MessageService) + private readonly messageService: MessageService; + @inject(WindowServiceExt) + private readonly windowService: WindowServiceExt; + + onStart(): void { + this.hostedPlugin.didStart.then(() => this.cleanupObsoleteThemes()); + } + + private async cleanupObsoleteThemes(): Promise<void> { + const persistedThemes = await getThemesFromIndexedDB(); + const obsoleteThemeIds = collectObsoleteThemeIds( + persistedThemes, + this.summary.summary + ); + if (!obsoleteThemeIds.length) { + return; + } + const firstWindow = await this.windowService.isFirstWindow(); + if (firstWindow) { + await this.removeObsoleteThemesFromIndexedDB(obsoleteThemeIds); + this.unregisterObsoleteThemes(obsoleteThemeIds); + } + } + + private removeObsoleteThemesFromIndexedDB(themeIds: string[]): Promise<void> { + return themeIds.reduce(async (previousTask, themeId) => { + await previousTask; + return deleteThemeFromIndexedDB(themeId); + }, Promise.resolve()); + } + + private unregisterObsoleteThemes(themeIds: string[]): void { + const currentTheme = this.themeService.getCurrentTheme(); + const switchToCompatibleTheme = themeIds.includes(currentTheme.id); + for (const themeId of themeIds) { + delete this.themeService['themes'][themeId]; + } + this.themeService['doUpdateColorThemePreference'](); + if (switchToCompatibleTheme) { + this.themeService.setCurrentTheme( + compatibleBuiltInTheme(currentTheme).id, + true + ); + wait(250).then(() => + requestAnimationFrame(() => + this.messageService.info( + nls.localize( + 'arduino/theme/currentThemeNotFound', + 'Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.', + currentTheme.label + ) + ) + ) + ); + } + } +} + +/** + * An indexedDB registered theme is obsolete if it is in the indexedDB but was registered + * from neither a `vsix` nor `compiled` source during the app startup. + */ +export function collectObsoleteThemeIds( + indexedDBThemes: MonacoThemeState[], + summary: Record<MonacoThemeRegistrationSource, string[]> +): string[] { + const vsixThemeIds = summary['vsix']; + const compiledThemeIds = summary['compiled']; + return indexedDBThemes + .map(({ id }) => id) + .filter( + (id) => !vsixThemeIds.includes(id) && !compiledThemeIds.includes(id) + ); } diff --git a/arduino-ide-extension/src/test/browser/theming.test.ts b/arduino-ide-extension/src/test/browser/theming.test.ts new file mode 100644 index 000000000..89265e61a --- /dev/null +++ b/arduino-ide-extension/src/test/browser/theming.test.ts @@ -0,0 +1,179 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { BuiltinThemeProvider } from '@theia/core/lib/browser/theming'; +import { Theme } from '@theia/core/lib/common/theme'; +import { expect } from 'chai'; +import { + ArduinoThemeType, + ArduinoThemes, + arduinoThemeTypeOf, + darkThemeLabel, + deprecatedThemeLabel, + hcThemeLabel, + lightThemeLabel, + themeLabelForSettings, + userConfigurableThemes, + userThemeLabel, +} from '../../browser/theia/core/theming'; + +disableJSDOM(); + +const testTheme: Theme = { + id: 'testTheme', + label: 'Test Theme', + type: 'light', +}; +const anotherTestTheme: Theme = { + id: 'anotherTestTheme', + label: 'Another Test Theme', + type: 'light', +}; +const darkTestTheme: Theme = { + id: 'darkTestTheme', + label: 'Dark Test Theme', + type: 'dark', +}; +const anotherDarkTestTheme: Theme = { + id: 'anotherTestTheme', + label: 'AAAnother Dark Test Theme', + type: 'dark', +}; + +describe('theming', () => { + describe('userConfigurableThemes', () => { + it('should show only built-in and user installed themes but not deprecated (Theia) ones if current theme is a built-in', () => { + const actual = userConfigurableThemes({ + themes: () => [ + BuiltinThemeProvider.darkTheme, + BuiltinThemeProvider.lightTheme, + ArduinoThemes.dark, + ArduinoThemes.light, + testTheme, + BuiltinThemeProvider.hcTheme, + anotherTestTheme, + ], + currentTheme: () => BuiltinThemeProvider.hcTheme, + }).reduce((acc, curr) => acc.concat(curr), []); + expect(actual.length).to.be.equal(5); + 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); + }); + + it('should show only built-in and user installed themes but not deprecated (Theia) ones if current theme is a user', () => { + const actual = userConfigurableThemes({ + themes: () => [ + BuiltinThemeProvider.hcTheme, + BuiltinThemeProvider.lightTheme, + BuiltinThemeProvider.darkTheme, + ArduinoThemes.dark, + testTheme, + anotherTestTheme, + ArduinoThemes.light, + ], + currentTheme: () => testTheme, + }).reduce((acc, curr) => acc.concat(curr), []); + expect(actual.length).to.be.equal(5); + 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); + }); + + it('should show built-in, user installed, and deprecated (Theia) themes if current theme is a deprecated (Theia)', () => { + const actual = userConfigurableThemes({ + themes: () => [ + ArduinoThemes.dark, + ArduinoThemes.light, + testTheme, + BuiltinThemeProvider.hcTheme, + anotherTestTheme, + darkTestTheme, + anotherDarkTestTheme, + BuiltinThemeProvider.lightTheme, + BuiltinThemeProvider.darkTheme, + ], + currentTheme: () => BuiltinThemeProvider.lightTheme, + }).reduce((acc, curr) => acc.concat(curr), []); + expect(actual.length).to.be.equal(8); + 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); + }); + + it('should group the themes by arduino theme types', () => { + const actual = userConfigurableThemes({ + themes: () => [ + ArduinoThemes.dark, + ArduinoThemes.light, + testTheme, + BuiltinThemeProvider.hcTheme, + anotherTestTheme, + darkTestTheme, + anotherDarkTestTheme, + BuiltinThemeProvider.lightTheme, + BuiltinThemeProvider.darkTheme, + ], + currentTheme: () => BuiltinThemeProvider.lightTheme, + }); + expect(actual.length).to.be.equal(3); + expect(actual[0].length).to.be.equal(3); + expect(actual[1].length).to.be.equal(4); + expect(actual[2].length).to.be.equal(1); + }); + }); + + describe('arduinoThemeTypeOf', () => { + ( + [ + [BuiltinThemeProvider.lightTheme, 'deprecated'], + [BuiltinThemeProvider.darkTheme, 'deprecated'], + [BuiltinThemeProvider.hcTheme, 'built-in'], + [ArduinoThemes.light, 'built-in'], + [ArduinoThemes.dark, 'built-in'], + [testTheme, 'user'], + [anotherTestTheme, 'user'], + [darkTestTheme, 'user'], + [anotherDarkTestTheme, 'user'], + ] as [Theme, ArduinoThemeType][] + ).map(([theme, expected]) => + it(`should detect the '${theme.label}' theme as '${expected}' theme`, () => + expect(arduinoThemeTypeOf(theme)).to.be.equal(expected)) + ); + }); + + describe('themeLabelForSettings', () => { + ( + [ + [ + BuiltinThemeProvider.lightTheme, + deprecatedThemeLabel(BuiltinThemeProvider.lightTheme), + ], + [ + BuiltinThemeProvider.darkTheme, + deprecatedThemeLabel(BuiltinThemeProvider.darkTheme), + ], + [BuiltinThemeProvider.hcTheme, hcThemeLabel], + [ArduinoThemes.light, lightThemeLabel], + [ArduinoThemes.dark, darkThemeLabel], + [testTheme, userThemeLabel(testTheme)], + [anotherTestTheme, userThemeLabel(anotherTestTheme)], + [darkTestTheme, userThemeLabel(darkTestTheme)], + [anotherDarkTestTheme, userThemeLabel(anotherDarkTestTheme)], + ] as [Theme, string][] + ).map(([theme, expected]) => { + it(`should map the theme with ID '${theme.id}' to ${expected} in the settings UI`, () => { + expect(themeLabelForSettings(theme)).to.be.equal(expected); + }); + }); + }); +}); diff --git a/i18n/en.json b/i18n/en.json index 320be23f1..08a47309e 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -474,6 +474,14 @@ "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" }, From 54f210d4deaa1192e859804524ea67d7ec93a590 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 11 Apr 2023 10:06:12 +0200 Subject: [PATCH 183/384] fix: try fetch the sketch by path if not in the cache The sketch cache might be empty, when trying to generate the secrets include in the main sketch file from the `secrets` property. Closes #1999 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/create/create-api.ts | 61 ++++++++++++++++++- .../cloud-sketchbook/cloud-sketch-cache.ts | 12 +++- .../src/test/browser/create-api.test.ts | 34 +++++++++++ 3 files changed, 102 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 72c27cbb0..b2aac2b02 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -57,6 +57,30 @@ export class CreateApi { return result; } + /** + * `sketchPath` is not the POSIX path but the path with the user UUID, username, etc. + * See [Create.Resource#path](./typings.ts). If `cache` is `true` and a sketch exists with the path, + * the cache will be updated with the new state of the sketch. + */ + // TODO: no nulls in API + async sketchByPath( + sketchPath: string, + cache = false + ): Promise<Create.Sketch | null> { + const url = new URL(`${this.domain()}/sketches/byPath/${sketchPath}`); + const headers = await this.headers(); + const sketch = await this.run<Create.Sketch>(url, { + method: 'GET', + headers, + }); + if (sketch && cache) { + this.sketchCache.addSketch(sketch); + const posixPath = createPaths.toPosixPath(sketch.path); + this.sketchCache.purgeByPath(posixPath); + } + return sketch; + } + async sketches(limit = 50): Promise<Create.Sketch[]> { const url = new URL(`${this.domain()}/sketches`); url.searchParams.set('user_id', 'me'); @@ -86,7 +110,11 @@ export class CreateApi { async createSketch( posixPath: string, - contentProvider: MaybePromise<string> = this.sketchesService.defaultInoContent() + contentProvider: MaybePromise<string> = this.sketchesService.defaultInoContent(), + payloadOverride: Record< + string, + string | boolean | number | Record<string, unknown> + > = {} ): Promise<Create.Sketch> { const url = new URL(`${this.domain()}/sketches`); const [headers, content] = await Promise.all([ @@ -97,6 +125,7 @@ export class CreateApi { ino: btoa(content), path: posixPath, user_id: 'me', + ...payloadOverride, }; const init = { method: 'PUT', @@ -212,7 +241,17 @@ export class CreateApi { return data; } - const sketch = this.sketchCache.getSketch(createPaths.parentPosix(path)); + const posixPath = createPaths.parentPosix(path); + let sketch = this.sketchCache.getSketch(posixPath); + // Workaround for https://github.com/arduino/arduino-ide/issues/1999. + if (!sketch) { + // Convert the ordinary sketch POSIX path to the Create path. + // For example, `/sketch_apr6a` will be transformed to `8a694e4b83878cc53472bd75ee928053:kittaakos/sketches_v2/sketch_apr6a`. + const createPathPrefix = this.sketchCache.createPathPrefix; + if (createPathPrefix) { + sketch = await this.sketchByPath(createPathPrefix + posixPath, true); + } + } if ( sketch && @@ -448,13 +487,18 @@ export class CreateApi { await this.run(url, init, ResponseResultProvider.NOOP); } + private fetchCounter = 0; private async run<T>( requestInfo: URL, init: RequestInit | undefined, resultProvider: ResponseResultProvider = ResponseResultProvider.JSON ): Promise<T> { - console.debug(`HTTP ${init?.method}: ${requestInfo.toString()}`); + const fetchCount = `[${++this.fetchCounter}]`; + const fetchStart = performance.now(); + const method = init?.method ? `${init.method}: ` : ''; + const url = requestInfo.toString(); const response = await fetch(requestInfo.toString(), init); + const fetchEnd = performance.now(); if (!response.ok) { let details: string | undefined = undefined; try { @@ -465,7 +509,18 @@ export class CreateApi { const { statusText, status } = response; throw new CreateError(statusText, status, details); } + const parseStart = performance.now(); const result = await resultProvider(response); + const parseEnd = performance.now(); + console.debug( + `HTTP ${fetchCount} ${method} ${url} [fetch: ${( + fetchEnd - fetchStart + ).toFixed(2)} ms, parse: ${(parseEnd - parseStart).toFixed( + 2 + )} ms] body: ${ + typeof result === 'string' ? result : JSON.stringify(result) + }` + ); return result; } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketch-cache.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketch-cache.ts index 21469d2de..0b0fc024a 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketch-cache.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketch-cache.ts @@ -1,12 +1,13 @@ import { FileStat } from '@theia/filesystem/lib/common/files'; import { injectable } from '@theia/core/shared/inversify'; -import { toPosixPath } from '../../create/create-paths'; +import { splitSketchPath } from '../../create/create-paths'; import { Create } from '../../create/typings'; @injectable() export class SketchCache { sketches: Record<string, Create.Sketch> = {}; fileStats: Record<string, FileStat> = {}; + private _createPathPrefix: string | undefined; init(): void { // reset the data @@ -32,7 +33,10 @@ export class SketchCache { addSketch(sketch: Create.Sketch): void { const { path } = sketch; - const posixPath = toPosixPath(path); + const [pathPrefix, posixPath] = splitSketchPath(path); + if (pathPrefix !== this._createPathPrefix) { + this._createPathPrefix = pathPrefix; + } this.sketches[posixPath] = sketch; } @@ -40,6 +44,10 @@ export class SketchCache { return this.sketches[path] || null; } + get createPathPrefix(): string | undefined { + return this._createPathPrefix; + } + toString(): string { return JSON.stringify({ sketches: this.sketches, 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 a623854c6..a18609cb1 100644 --- a/arduino-ide-extension/src/test/browser/create-api.test.ts +++ b/arduino-ide-extension/src/test/browser/create-api.test.ts @@ -1,6 +1,7 @@ import { Container, ContainerModule } from '@theia/core/shared/inversify'; import { assert, expect } from 'chai'; import fetch from 'cross-fetch'; +import { posix } from 'path'; import { v4 } from 'uuid'; import { ArduinoPreferences } from '../../browser/arduino-preferences'; import { AuthenticationClientService } from '../../browser/auth/authentication-client-service'; @@ -251,6 +252,39 @@ describe('create-api', () => { expect(sketch).to.be.undefined; }); }); + + it("should fetch the sketch when transforming the 'secrets' into '#include' and the sketch is not in the cache", async () => { + const name = v4(); + const posixPath = toPosix(name); + const newSketch = await createApi.createSketch( + posixPath, + 'void setup(){} void loop(){}', + { + secrets: { + data: [ + { + name: 'SECRET_THING', + value: '❤︎', + }, + ], + }, + } + ); + expect(newSketch).to.be.not.undefined; + expect(newSketch.secrets).to.be.not.undefined; + expect(Array.isArray(newSketch.secrets)).to.be.true; + expect(newSketch.secrets?.length).to.be.equal(1); + expect(newSketch.secrets?.[0]).to.be.deep.equal({ + name: 'SECRET_THING', + value: '❤︎', + }); + createApi.sketchCache.init(); // invalidate the cache + const content = await createApi.readFile( + posix.join(posixPath, `${name}.ino`) + ); + expect(content.includes(`#include "${Create.arduino_secrets_file}"`)).to.be + .true; + }); }); // Using environment variables is recommended for testing but you can modify the module too. From 4c2f0fb841698bd1d8c5ad35a502719aa837410a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 02:19:03 +0000 Subject: [PATCH 184/384] Updated translation files --- i18n/af.json | 49 ++++- i18n/ar.json | 49 ++++- i18n/az.json | 49 ++++- i18n/bg.json | 49 ++++- i18n/bn.json | 538 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/ca_ES.json | 101 ++++++--- i18n/cs.json | 49 ++++- i18n/da.json | 49 ++++- i18n/de.json | 107 +++++---- i18n/el.json | 53 ++++- i18n/es.json | 63 ++++-- i18n/eu.json | 49 ++++- i18n/fa.json | 49 ++++- i18n/fil.json | 51 ++++- i18n/fr.json | 49 ++++- i18n/he.json | 49 ++++- i18n/hi.json | 234 ++++++++++++++++---- i18n/hu.json | 49 ++++- i18n/id.json | 49 ++++- i18n/it.json | 103 ++++++--- i18n/ja.json | 57 ++++- i18n/ko.json | 49 ++++- i18n/my_MM.json | 49 ++++- i18n/ne.json | 49 ++++- i18n/nl.json | 173 +++++++++------ i18n/pl.json | 49 ++++- i18n/pt.json | 299 ++++++++++++++------------ i18n/ro.json | 51 ++++- i18n/ru.json | 55 ++++- i18n/sl.json | 49 ++++- i18n/sr.json | 49 ++++- i18n/sv.json | 538 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/th.json | 49 ++++- i18n/tr.json | 49 ++++- i18n/uk.json | 49 ++++- i18n/vi.json | 49 ++++- i18n/zh-Hant.json | 49 ++++- i18n/zh.json | 63 ++++-- i18n/zh_TW.json | 49 ++++- 39 files changed, 3078 insertions(+), 584 deletions(-) create mode 100644 i18n/bn.json create mode 100644 i18n/sv.json diff --git a/i18n/af.json b/i18n/af.json index 383b19186..f991c25ed 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -4,6 +4,12 @@ "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", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Wolk Skets", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Jou Sketsboek is leeg", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Meer inligting", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Weergawe {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "Een lêer by skets gevoeg", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "tools": "Gereedskap" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Wagterugkeer", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nuwe lyn", "newLineCarriageReturn": "Beide NL & CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Aflyn", + "offlineText": "Aflyn", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/ar.json b/i18n/ar.json index dea546143..fff35a478 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "حول {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "اللوحة {0}", "boardConfigDialogTitle": "أختر متحكم و منفذ مختلفين ", @@ -83,13 +89,12 @@ "mouseError": "تعذر ايجاد الفأرة 'Mouse' . هل يحتوي مشروعك على '#include <Mouse.h>' ؟" }, "cloud": { - "account": "الحساب", "chooseSketchVisibility": "اختر خصوصية مشروعك:", "cloudSketchbook": "مشاريع على السحابة", "connected": "متصل", "continue": "استئناف", - "donePulling": "تم السحب بنجاح '{0}'", - "donePushing": "تم الدفع بنجاح '{0}'", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "تضمين:", "emptySketchbook": "ملف المشاريع الخاص بك فارغ", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "بواسطة", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "ترشيح بحثك...", "install": "تنصيب", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "عرض المزيد", + "otherVersions": "Other Versions", + "remove": "حذف", + "title": "{0} by {1}", "uninstall": "الغاء التثبيت", "uninstallMsg": "هل تريد الغاء تثبيت {0}؟", - "version": "النسخة {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "اضف ملف...", "fileAdded": "تمت اضافة ملف واحد الى المشروع", @@ -188,6 +202,7 @@ "copyError": "نسخ رسالة الخطأ", "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", @@ -313,6 +328,13 @@ "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": "تعذر اغلاق مقبس الويب", "unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "تمرير تلقائي", "carriageReturn": "اعادة الحمل", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "سطر جديد", "newLineCarriageReturn": " NL & CR معاً", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "يتم النقل", "movingMsg": "الملف \"{0}\" يجب ان يكون داخل مجلد مشروع مسمى \"{1}\"\nهل انشئ المجلد , ثم انقل الملف و اكمل ؟", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "Update Indexes", "updateLibraryIndex": "Update Library Index", @@ -483,6 +517,7 @@ "couldNotSave": "تعذر حفظ المشروع . الرجاء نسخ عملك الغير محفوظ الى محرر النصوص المفضل لديك و اعادة تشغيل Arduino IDE", "daemonOffline": "CLI Daemon غير متصل", "offline": "غير متصل", + "offlineText": "غير متصل", "quitTitle": "هل انت متاكد بانك تريد الخروج؟" }, "editor": { diff --git a/i18n/az.json b/i18n/az.json index d4e949964..99fd7271a 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Haqqında {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Əlaqə Yaradıldı", "continue": "Davam Et", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Yüklə", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Sil", + "title": "{0} by {1}", "uninstall": "Sil", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Fayl Əlavə Et", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offlayn", + "offlineText": "Offlayn", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/bg.json b/i18n/bg.json index 56b3a9393..a5ea1899f 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Относно {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Платка{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Изберете видимост на вашата скица:", "cloudSketchbook": "Облачен скицник", "connected": "Свързано", "continue": "Продължи", - "donePulling": "Изтеглянето на „{0}“ приключи.", - "donePushing": "Изпращането на „{0}“ приключи.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Вграждане:", "emptySketchbook": "Вашият Скицник е празен", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "от", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Филтрирайте търсенето си...", "install": "Инсталирай", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Повече информация", + "otherVersions": "Other Versions", + "remove": "Премахване", + "title": "{0} by {1}", "uninstall": "Деинсталиране", "uninstallMsg": "Искате ли да деинсталирате {0}?", - "version": "Версия {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Добави файл", "fileAdded": "Към скицата е добавен един файл.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Автоматично превъртане", "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нов ред", "newLineCarriageReturn": "Както NL, така и CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Преместване", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Скицата не можа да бъде запазена. Моля, копирайте незапазената си работа в любимия си текстов редактор и рестартирайте IDE-то.", "daemonOffline": "CLI Daemon офлайн", "offline": "Офлайн", + "offlineText": "Офлайн", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/bn.json b/i18n/bn.json new file mode 100644 index 000000000..08a47309e --- /dev/null +++ b/i18n/bn.json @@ -0,0 +1,538 @@ +{ + "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 <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.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_ES.json b/i18n/ca_ES.json index 43017de46..224a0cd01 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -4,6 +4,12 @@ "detail": "Versió: {0}\nData: {1}{2}\nVersió de CLI: {3}{4} [{5}]\n\n{6}", "label": "Sobre{0}" }, + "account": { + "goToCloudEditor": "Ves a l'editor del núvol", + "goToIoTCloud": "Ves al núvol de l'IoT", + "goToProfile": "Ves al perfil", + "menuTitle": "Núvol d'Arduino" + }, "board": { "board": "Placa {0}", "boardConfigDialogTitle": "Selecciona una altra placa i port", @@ -83,13 +89,12 @@ "mouseError": "No s'ha trobat \"Mouse\". El teu programa té la línia \"#include <Mouse.h>\"?" }, "cloud": { - "account": "Compte", "chooseSketchVisibility": "Trieu la visibilitat del vostre programa:", "cloudSketchbook": "Quadern de programes del núvol", "connected": "Connectat", "continue": "Continua", "donePulling": "Descarregat correctament \"{0}\".", - "donePushing": "Enviat correctament \"{0}\".", + "donePushing": "Pujat correctament \"{0}\".", "embed": "Encasta:", "emptySketchbook": "El teu quadern de programes està buit", "goToCloud": "Ves al núvol", @@ -112,7 +117,7 @@ "remote": "Remot", "share": "Comparteix...", "shareSketch": "Comparteix programa...", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Mostra/Amaga el quadern de programes del núvol", "signIn": "Inicia sessió", "signInToCloud": "Inicia la sessió a Arduino Cloud", "signOut": "Tanca sessió", @@ -121,14 +126,14 @@ "visitArduinoCloud": "Visiteu Arduino Cloud per crear programes al núvol." }, "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.", + "alreadyExists": "El programa del núvol \"{0}\" ja existeix.", + "creating": "Creant programa al núvol \"{0}\"...", + "new": "Programa al núvol nou", + "notFound": "No s'ha pogut baixar el programa del núvol \"{0}\". No existeix.", "pulling": "Sincronitzant quadern de programes, descarregant \"{0}\"...", - "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "pushing": "Sincronitzant el quadern de programes, pujant \"{0}\"...", + "renaming": "Reanomenant el programa del núvol de \"{0}\" a \"{1}\"...", + "synchronizingSketchbook": "Sincronitzant el quadern de programes..." }, "common": { "all": "Tot", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Plaques incloses al paquet:", "by": "per", + "clickToOpen": "Fes clic per obrir-ho al navegador: {0}", "filterSearch": "Filtra la teva cerca...", "install": "Instal·la", - "installed": "Instal·lat", + "installLatest": "Instal·la l'última", + "installVersion": "Instal·la {0}", + "installed": "{0} instal·lada", "moreInfo": "Més informació", + "otherVersions": "Altres versions", + "remove": "Elimina", + "title": "{0} en {1}", "uninstall": "Desinstal·la", "uninstallMsg": "Vols desinstal·lar {0}?", - "version": "Versió {0}" + "update": "Actualitza" }, "configuration": { "cli": { "inaccessibleDirectory": "No s'ha pogut accedir a la ubicació del quadern de programes a \"{0}\": {1}" } }, + "connectionStatus": { + "connectionLost": "Connexió perduda. Les accions i actualitzacions del programa del núvol no estaran disponibles." + }, "contributions": { "addFile": "Afegeix un fitxer", "fileAdded": "S'ha afegit un fitxer al programa.", @@ -188,6 +202,7 @@ "copyError": "Còpia els missatges d'error", "noBoardSelected": "No s'ha seleccionat cap placa. Tria una placa Arduino des d'Eines > Plaques" }, + "createCloudCopy": "Puja el programa al núvol", "daemon": { "restart": "Reinicia el servei", "start": "Inicia el servei", @@ -313,11 +328,18 @@ "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.", "unableToCloseWebSocket": "No s'ha pogut tancar la ranura web", "unableToConnectToWebSocket": "No s'ha pogut connectar a la ranura web" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Nom del nou programa del núvol" }, "portProtocol": { "network": "Xarxa", @@ -386,13 +408,14 @@ } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Nou nom del programa del núvol" }, "replaceMsg": "Substitueix la versió existent de {0}?", "selectZip": "Seleccioneu un fitxer zip que contingui la llibreria que voleu afegir", "serial": { "autoscroll": "Desplaçament automàtic", "carriageReturn": "Retorn de carro", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Missatge (escriu per enviar un missatge a \"{0}\" en \"{1}\")", "newLine": "Línia nova", "newLineCarriageReturn": "Ambdós NL & CR", @@ -411,22 +434,22 @@ "createdArchive": "S'ha creat l'arxiu \"{0}\".", "doneCompiling": "Compilació enllestida.", "doneUploading": "Pujada enllestida.", - "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": "Vols provar guardant el programa en una ubicació diferent?", + "editInvalidSketchFolderQuestion": "Vols provar guardant el programa amb un nom diferent?", "exportBinary": "Exporta el binari compilat", - "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidCloudSketchName": "El nom ha de començar amb una lletra, un número o una barra baixa, seguit per lletres, números, guions, punts i barres baixes. La llargària màxima és de 36 caràcters.", + "invalidSketchFolderLocationDetails": "No pots guardar un programa en una carpeta dins d'ell mateix.", + "invalidSketchFolderLocationMessage": "La carpeta d'ubicació del programa no és vàlida: \"{0}\"", + "invalidSketchFolderNameMessage": "El nom de la carpeta del programa no és vàlid: \"{0}\"", + "invalidSketchName": "El nom ha de començar amb una lletra, un número o una barra baixa, seguit per lletres, números, guions, punts i barres baixes. La llargària màxima és de 63 caràcters.", "moving": "Movent-se", "movingMsg": "El fitxer \"{0}\" ha d'estar dins d'una carpeta anomenada \"{1}\".\nVoleu crear aquesta carpeta, moure el fitxer i continuar?", "new": "Programa nou", - "noTrailingPeriod": "A filename cannot end with a dot", + "noTrailingPeriod": "Un nom de fitxer no pot acabar amb un punt", "openFolder": "Obri la carpeta", "openRecent": "Obri recent", "openSketchInNewWindow": "Obri el programa en una finestra nova", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "\"{0}\" és un nom de fitxer reservat.", "saveFolderAs": "Desa la carpeta del programa com a...", "saveSketch": "Guarda el fitxer per obrir-lo de nou més tard.", "saveSketchAs": "Desa la carpeta del programa com a...", @@ -443,7 +466,7 @@ "verifyOrCompile": "Verifica/Compila" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", + "newCloudSketch": "Programa del núvol nou", "newSketch": "Programa nou" }, "survey": { @@ -451,6 +474,17 @@ "dismissSurvey": "No ho tornes a mostrar", "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)" + }, + "title": { + "cloud": "Núvol" + }, "updateIndexes": { "updateIndexes": "Actualitza els índexs", "updateLibraryIndex": "Actualitza l'índex de la llibreria", @@ -465,15 +499,15 @@ "upload": "Carrega" }, "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": "El programa encara no és vàlid. Vols corregir els problemes persistents? Clicant \"{0}\" s'obrirà un nou programa.", + "abortFixTitle": "El programa no és vàlid", + "renameSketchFileMessage": "L'arxiu del programa \"{0}\" no es pot usar. {1} Vols reanomenar-lo ara?", + "renameSketchFileTitle": "El nom del fitxer del programa no és vàlid", + "renameSketchFolderMessage": "El programa \"{0}\" no es pot usar. {1} Per obtindre detalls del missatge, reanomena el programa. Vols reanomenar-lo ara?", + "renameSketchFolderTitle": "El nom del programa no és vàlid" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "\"{0}\" ja existeix." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "No s'ha pogut desar el programa. Copieu el vostre treball no desat al vostre editor de text preferit i reinicieu l'IDE.", "daemonOffline": "El servei CLI està fora de línia", "offline": "Fora de línia", + "offlineText": "Fora de línia", "quitTitle": "Segur que vols eixir?" }, "editor": { @@ -493,8 +528,8 @@ "expand": "Expandeix" }, "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": "El programa del núvol \"{0}\" s'eliminarà per sempre dels servidors d'Arduino i de les memòries cau locals. Aquesta acció no es pot desfer. Vols eliminar el programa actual?", + "deleteCurrentSketch": "Voleu eliminar el programa actual?", "fileNewName": "Nom del nou fitxer", "invalidExtension": ". {0} no és una extensió vàlida", "newFileName": "Nou nom per al fitxer" diff --git a/i18n/cs.json b/i18n/cs.json index d4a2e9eff..10fc40e72 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "O {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Deska {0}", "boardConfigDialogTitle": "Zvolit jinou Desku a Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Účet", "chooseSketchVisibility": "Zvolte viditelnost sketche:", "cloudSketchbook": "Cloudové umístění projektů", "connected": "Připojen", "continue": "Pokračovat", - "donePulling": "Stahování dokončeno ’{0}’.", - "donePushing": "Odesílání dokončeno ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Vložit: ", "emptySketchbook": "Umístění projektů je prázdné", "goToCloud": "Jít na Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "od", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtrovat vyhledávání... ", "install": "Instalovat", - "installed": "Nainstalováno", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Více informací", + "otherVersions": "Other Versions", + "remove": "Odstranit", + "title": "{0} by {1}", "uninstall": "Odinstalovat", "uninstallMsg": "Chcete odinstalovat {0}?", - "version": "Verze {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": "Přidat soubor", "fileAdded": "Soubor byl přidán do sketche.", @@ -188,6 +202,7 @@ "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": "Spustit Daemon", @@ -313,6 +328,13 @@ "tools": "Nástroje" }, "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Enter (CR)", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nový řádek (NL)", "newLineCarriageReturn": "Oba NL & CR", @@ -414,11 +437,11 @@ "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": "Exportovat kompilované soubory", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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": "Přesouvám", "movingMsg": "Soubor \"{0}\" musí být uvnitř složky která je shodná názvem \"{1}\".\nVytvořit složku, přesunout tam- soubor a pokračovat? ", "new": "New Sketch", @@ -451,6 +474,17 @@ "dismissSurvey": "Znovu nezobrazovat", "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", @@ -483,6 +517,7 @@ "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. ", "daemonOffline": "CLI Daemon nepřipojen", "offline": "Nepřipojen", + "offlineText": "Nepřipojen", "quitTitle": "Jste si jisti že chcete odejít" }, "editor": { diff --git a/i18n/da.json b/i18n/da.json index 8fd1a3a1b..08a47309e 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -4,6 +4,12 @@ "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", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/de.json b/i18n/de.json index fbce134f0..f36fe6e4c 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -1,9 +1,15 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Version: {0}\nDatum: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", "label": "Über {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Profil aufrufen", + "menuTitle": "Arduino-Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Anderes Boards und Ports wählen", @@ -18,10 +24,10 @@ "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": "Native serial port, can't obtain info.", + "noNativeSerialPort": "Nativer serieller Port, keine Informationen verfügbar.", "noPortsDiscovered": "Keine Ports gefunden", "noPortsSelected": "Kein Port für das Board : '{0}' ausgewählt.", - "nonSerialPort": "Non-serial port, can't obtain info.", + "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.", @@ -38,7 +44,7 @@ "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", "typeOfPorts": "{0} Ports", - "unknownBoard": "Unknown board" + "unknownBoard": "Unbekanntes Board" }, "boardsManager": "Board-Verwaltung", "boardsType": { @@ -83,7 +89,6 @@ "mouseError": "'Mouse' nicht gefunden. Enthält ihr Sketch die Zeile '#include <Mouse.h>'?" }, "cloud": { - "account": "Konto", "chooseSketchVisibility": "Wähle die Sichtbarkeit deines Sketches:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Verbunden", @@ -121,13 +126,13 @@ "visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen." }, "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.", + "alreadyExists": "Cloud-Sketch '{0}' existiert bereits.", + "creating": "Cloud-Sketch '{0}' wird erstellt...", + "new": "Neuer Cloud-Sketch", + "notFound": "Cloud-Sketch '{0}' konnte nicht heruntergeladen werden. Er existiert nicht.", "pulling": "Synchronizing sketchbook, pulling '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "renaming": "Cloud-Sketch wird von '{0}' nach '{1}' umbenannt ...", "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "In diesem Paket enthaltene Boards:", "by": "von", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtern Sie Ihre Suche ...", "install": "Installieren", - "installed": "Installiert", + "installLatest": "Install Latest", + "installVersion": "Installiere {0}", + "installed": "{0} installiert", "moreInfo": "Mehr Information", + "otherVersions": "Andere Versionen", + "remove": "Entfernen", + "title": "{0} durch {1}", "uninstall": "Deinstallieren", "uninstallMsg": "Möchten Sie {0} deinstallieren?", - "version": "Version {0}" + "update": "Aktualisieren" }, "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": "Datei hinzufügen...", "fileAdded": "Eine Datei wurde zum Sketch hinzugefügt.", @@ -188,6 +202,7 @@ "copyError": "Fehlermeldungen kopieren", "noBoardSelected": "Kein Board ausgewählt. Bitte Arduino Board im Menü wählen mit Werkzeuge > Board" }, + "createCloudCopy": "Sketch in Cloud hochladen", "daemon": { "restart": "Daemon neustarten", "start": "Daemon starten", @@ -313,11 +328,18 @@ "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.", "unableToCloseWebSocket": "Websocket wurde nicht geschlossen", "unableToConnectToWebSocket": "Websocket wurde nicht verbunden" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Name des neuen Cloud-Sketches" }, "portProtocol": { "network": "Netzwerk", @@ -361,7 +383,7 @@ "manualProxy": "Manuelle Proxy Einstellung", "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "CLI-Konfiguration konnte nicht geladen werden", "noProxy": "Kein Proxy", "proxySettings": { "hostname": "Hostname", @@ -371,7 +393,7 @@ }, "showVerbose": "Compiler-Meldungen anzeigen beim", "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": "Absoluter Dateipfad zur Standard-'.ino'-Dateivorlage. Wenn angegeben, wird der Inhalt der Dateivorlage für jeden, mit der IDE erstellten, Sketch verwendet. Wenn nicht angegeben, werden die Sketches mit dem Standard-Arduino-Inhalt erstellt. Unauffindbare Dateivorlagen werden ignoriert. **Ein Neustarten der IDE ist erforderlich**, um diese Einstellung zu übernehmen." }, "sketchbook.location": "Dateipfad des Sketchbooks", "sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardgemäß deaktiviert. ", @@ -382,17 +404,18 @@ "verifyAfterUpload": "Code nach Hochladen überprüfen ", "window.autoScale": "Wenn aktiviert: Benutzeroberfläche soll mit Schriftgröße skalieren.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Veraltet. Bitte 'window.zommLevel' stattdessen benutzen." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Neuer Name des Cloud-Sketches" }, "replaceMsg": "Existierende Version von {0} ersetzen?", "selectZip": "Wähle die ZIP-Datei, welche die hinzuzufügende Bibliothek enthält", "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Zeilenumbruch", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Nachicht (Enter um Nachricht für '{0}' auf '{1}' zu senden)", "newLine": "Neue Zeile", "newLineCarriageReturn": "Sowohl NL als auch CR", @@ -411,22 +434,22 @@ "createdArchive": "Archiv '{0}' erstellt.", "doneCompiling": "Kompilieren erfolgreich!", "doneUploading": "Hochladen erfolgreich! ", - "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": "Wollen Sie versuchen, den Sketch an einer anderen Stelle abzuspeichern?", + "editInvalidSketchFolderQuestion": "Wollen Sie versuchen, den Sketch mit einem anderen Namen abzuspeichern?", "exportBinary": "Kompilierte Binärdatei exportieren", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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}'", - "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", - "invalidSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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...", "movingMsg": "Die Datei \"{0}\" muss sich in einen Sketch Ordner \"{1}\" befinden.\nOrdner erstellen, Datei verschieben und fortfahren?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "new": "Neu", + "noTrailingPeriod": "Ein Dateiname kann nicht mit einem Punkt enden", "openFolder": "Ordner öffnen", "openRecent": "Zuletzt geöffnet", "openSketchInNewWindow": "Sketch in neuen Fenster öffnen", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "'{0}' ist ein reservierter Dateiname.", "saveFolderAs": "Sketch Ordner speichern als...", "saveSketch": "Sketch speichern und später wieder öffnen", "saveSketchAs": "Sketch Ordner speichern als...", @@ -443,14 +466,25 @@ "verifyOrCompile": "Überprüfen/Kompilieren" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Neuer Cloud-Sketch", + "newSketch": "Neu" }, "survey": { "answerSurvey": "Umfrage beantworten", "dismissSurvey": "Nicht erneut anzeigen", "surveyMessage": "Helfen Sie uns, uns zu verbessern, indem Sie diese kurze Umfrage ausfüllen. Wir wissen unsere Community wertzuschätzen und möchten unsere Unterstützer gerne ein wenig besser kennenlernen." }, + "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": "Indizes aktualisieren", "updateLibraryIndex": "Bibliotheksverzeichnis aktualisieren", @@ -465,15 +499,15 @@ "upload": "Hochladen" }, "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": "Der Sketch ist noch immer ungültig. Sollen die verbliebenen Probleme behoben werden? Durch Klicken auf '{0}' wird ein neuer Sketch geöffnet.", + "abortFixTitle": "Ungültiger Sketch", + "renameSketchFileMessage": "Die Sketch-Datei '{0}' kann nicht verwendet werden. {1} Soll die Sketch-Datei jetzt umbenannt werden?", + "renameSketchFileTitle": "Ungültiger Sketch-Dateiname", + "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Nachricht loszuwerden, muss der Sketch umbenannt werden. Wollen Sie den Sketch jetzt umbenennen?", + "renameSketchFolderTitle": "Ungültiger Sketch-Name" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "{0} existiert bereits." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "Der Sketch konnte nicht gesichert werden. Bitte kopiere deine ungesicherte Arbeit in deinen bevorzugten Texteditor und starte die IDE neu.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Sind Sie sicher, dass das Fenster schließen möchten?" }, "editor": { @@ -493,8 +528,8 @@ "expand": "Ausklappen" }, "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": "Der Cloud-Sketch '{0}' wird dauerhaft vpn den Arduino-Servern und den lokalen Caches gelöscht. Diese Aktion ist nicht umkehrbar. Wollen Sie den aktuellen Sketch löschen?", + "deleteCurrentSketch": "Der Sketch '{0}' wird dauerhaft gelöscht. Diese Aktion ist nicht umkehrbar. Wollen Sie den aktuellen Sketch löschen?", "fileNewName": "Name für die neue Datei", "invalidExtension": "\".{0}\" ist keine gültige Dateierweiterung.", "newFileName": "Neuer Name für die Datei" diff --git a/i18n/el.json b/i18n/el.json index b12595f4e..f69125e70 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Σχετικά με {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Πλακέτα{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -55,7 +61,7 @@ "certificate": { "addNew": "Προσθήκη Νέου", "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", + "boardAtPort": "{0} στο {1}", "certificatesUploaded": "Certificates uploaded.", "enterURL": "Enter URL", "noSupportedBoardConnected": "No supported board connected", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Επίλεξε την ορατότητα του Σχεδίου σου:", "cloudSketchbook": "Σχέδια Cloud", "connected": "Συνδέθηκε", "continue": "Συνέχεια", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Ενσωμάτωση:", "emptySketchbook": "Τα Σχέδια σου είναι άδεια.", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "από", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Εγκατάσταση", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Περισσότερες πληροφορίες", + "otherVersions": "Other Versions", + "remove": "Αφαίρεση", + "title": "{0} by {1}", "uninstall": "Απεγκατάσταση", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Έκδοση {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Προσθήκη αρχείου", "fileAdded": "Ένα αρχείο προστέθηκε στον κώδικα.", @@ -188,6 +202,7 @@ "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", @@ -216,7 +231,7 @@ "revealError": "Reveal Error" }, "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", + "couldNotSave": "Δεν έγινε αποθήκευση του προγράμματος. Παρακαλώ αντιγράψτε ό,τι δεν έχει αποθηκευθεί στον αγαπημένο σας επεξεργαστή κειμένου, και επανεκινήστε το Ολοκληρωμένο Περιβάλλον Ανάπτυξης IDE.", "unsavedChanges": "Οι μη αποθηκευμένες αλλαγές θα χαθούν." }, "examples": { @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Νέα γραμμή", "newLineCarriageReturn": "Both NL & CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Δεν έγινε αποθήκευση του προγράμματος. Παρακαλώ αντιγράψτε ό,τι δεν έχει αποθηκευθεί στον αγαπημένο σας επεξεργαστή κειμένου, και επανεκινήστε το Ολοκληρωμένο Περιβάλλον Ανάπτυξης IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Εκτός Σύνδεσης", + "offlineText": "Εκτός Σύνδεσης", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/es.json b/i18n/es.json index c498a5476..6cb212da6 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Acerca de {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Ir al Perfil", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Placa{0}", "boardConfigDialogTitle": "Seleccionar Otra Placa y Puerto", @@ -38,7 +44,7 @@ "succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente", "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente", "typeOfPorts": "{0} puertos", - "unknownBoard": "Unknown board" + "unknownBoard": "Placa desconocida" }, "boardsManager": "Gestor de placas", "boardsType": { @@ -83,13 +89,12 @@ "mouseError": "'Mouse' no encontrado. ¿Tiene tu proyecto incluida la linea '#include <Mouse.h>'?" }, "cloud": { - "account": "Cuenta", "chooseSketchVisibility": "Elige la visibilidad de tu Sketch:", "cloudSketchbook": "Libro de bocetos en la nube", "connected": "Conectado", "continue": "Continuar", - "donePulling": "Extracción de '{0}' realizada.", - "donePushing": "Envío a '{0}' realizado.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Incrustado:", "emptySketchbook": "Tu Sketchbook está vacío", "goToCloud": "Ir al Cloud", @@ -128,7 +133,7 @@ "pulling": "Synchronizing sketchbook, pulling '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "synchronizingSketchbook": "Sincronizando carpeta..." }, "common": { "all": "Todo", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Placas incluidas en este paquete:", "by": "de", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtre su búsqueda...", "install": "Instalar", - "installed": "Instalado", + "installLatest": "Install Latest", + "installVersion": "Instalar {0}", + "installed": "{0}instalado", "moreInfo": "Más información", + "otherVersions": "Otras versiones", + "remove": "Eliminar", + "title": "{0} by {1}", "uninstall": "Desinstalar", "uninstallMsg": "¿Quieres desinstalar {0}?", - "version": "Versión {0}" + "update": "Actualizar" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Añadir fichero...", "fileAdded": "Un archivo añadido al sketch.", @@ -188,6 +202,7 @@ "copyError": "Copiar mensajes de error", "noBoardSelected": "Ninguna placa seleccionada. Por favor selecciona una placa Arduino en el menú Herramientas > Placas" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Reiniciar Daemon", "start": "Iniciar Daemon", @@ -313,6 +328,13 @@ "tools": "Herramientas" }, "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": "No se puede cerrar websocket", "unableToConnectToWebSocket": "No se puede conectar al websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Retorno de carro", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Mensaje (Intro para mandar el mensaje de '{0}' a '{1}')", "newLine": "Nueva línea", "newLineCarriageReturn": "Ambos NL & CR", @@ -411,18 +434,18 @@ "createdArchive": "Archivo '{0}' creado.", "doneCompiling": "Compilación completada.", "doneUploading": "Carga completada.", - "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": "¿Quieres intentar guardar el código en una ubicación diferente?", + "editInvalidSketchFolderQuestion": "¿Quieres intentar guardar el código con un nombre diferente?", "exportBinary": "Exportar binario compilado", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidCloudSketchName": "El nombre debe comenzar con una letra, un número, o un guión bajo, seguido de letras, números, guiones, puntos y guiones bajos. El máximo número de caracteres es 36.", "invalidSketchFolderLocationDetails": "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "El nombre debe comenzar con una letra, un número, o un guión bajo, seguido de letras, números, guiones, puntos y guiones bajos. El máximo número de caracteres es 63.", "moving": "Moviendo", "movingMsg": "El archivo \"{0}\" tiene que estar dentro de una carpeta de bocetos llamada \"{1}\".\n¿Crear esta carpeta, mover el archivo y continuar?", "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "noTrailingPeriod": "El nombre del archivo no puede terminar con un punto.", "openFolder": "Abrir carpeta", "openRecent": "Abierto recientemente", "openSketchInNewWindow": "Abrir Sketch en una ventana nueva", @@ -451,6 +474,17 @@ "dismissSurvey": "No volver a mostrar", "surveyMessage": "Por favor ayudenos mejorar completando esta breve encuesta. Valoramos nuestra comunidad y nos gustaría conocer algo mejor a los que nos apoyan." }, + "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": "Actualizar indices", "updateLibraryIndex": "Actualizar Indice de librerías", @@ -473,7 +507,7 @@ "renameSketchFolderTitle": "Invalid sketch name" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' ya existe." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "No se ha podido guardar el sketch. Por favor, copia tu trabajo no guardado en tu editor de texto favorito y reinicia el IDE.", "daemonOffline": "Demonio del CLI fuera de línea", "offline": "Desconectado", + "offlineText": "Desconectado", "quitTitle": "Seguro que quiere salir ?" }, "editor": { @@ -494,7 +529,7 @@ }, "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?", + "deleteCurrentSketch": "El código '{0}' será permanentemente eliminado. Esta acción es irreversible. ¿Quieres eliminar el código actual?", "fileNewName": "Nombre del nuevo archivo", "invalidExtension": "\".{0}\" no es una extensión válida", "newFileName": "Nuevo nombre para el archivo" diff --git a/i18n/eu.json b/i18n/eu.json index 71b238814..1603763c3 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "{0}ri buruz" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "{0} plaka", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Aukeratu zure programaren ikusgaitasuna:", "cloudSketchbook": "Hodeiko programa bilduma", "connected": "Konektatuta", "continue": "Jarraitu", - "donePulling": "Hodeitik kargatzea burututa: '{0}'.", - "donePushing": "Hodeian gordetzea burututa: '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Kapsulatu:", "emptySketchbook": "Zure programa bilduma hutsik dago", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "Egilea:", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Iragazi zure bilaketa...", "install": "Instalatu", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Informazio gehiago", + "otherVersions": "Other Versions", + "remove": "Kendu", + "title": "{0} by {1}", "uninstall": "Desinstalatu", "uninstallMsg": "{0} desinstalatu nahi duzu?", - "version": "{0} bertsioa" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Gehitu fitxategia", "fileAdded": "Fitxategi bat gehitu da programara.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "tools": "Tresnak" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Korritze automatikoa", "carriageReturn": "Orga-itzulera", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Lerro berria", "newLineCarriageReturn": "NL & CR biak", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Esportatu konpilatutako bitarra", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Lekuz aldatzen", "movingMsg": "\"{0}\" fitxategiak \"{1}\" izeneko programa-karpetaren barruan egon behar du.\nSortu karpeta, eraman fitxategia bertara eta jarraitu?", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Ezin izan da programa gorde. Kopiatu gorde gabeko zure lana zure testu-editore gogokoenera eta berrabiarazi IDEa.", "daemonOffline": "CLI daemon-a lineaz kanpo", "offline": "Lineaz kanpo", + "offlineText": "Lineaz kanpo", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/fa.json b/i18n/fa.json index 40a13963e..b0af6dd47 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "درباره {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "بورد {0}", "boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر", @@ -83,13 +89,12 @@ "mouseError": "\"موس\" پیدا نشد. آیا طرح شما شامل خط \"#include <Mouse.h>\" است؟" }, "cloud": { - "account": "حساب کاربری", "chooseSketchVisibility": "قابلیت مشاهده طرح خود را انتخاب کنید:", "cloudSketchbook": "منبع ابری طرح ها", "connected": "متصل", "continue": "ادامه", - "donePulling": "پایان دریافت {0}", - "donePushing": "پایان ارسال {0}", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "قرار دادن:", "emptySketchbook": "طرح شما خالی است", "goToCloud": "به فضای ابری بروید", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "بردهای موجود در این بسته :", "by": "توسط", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "محدود کردن جستجوی شما ...", "install": "نصب", - "installed": "نصب شده است", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "اطلاعات بیشتر", + "otherVersions": "Other Versions", + "remove": "حذف", + "title": "{0} by {1}", "uninstall": "لغو نصب", "uninstallMsg": "آیا شما می خواهید {0} را لغو نصب کنید؟", - "version": "ورژن {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "فایل اظافه کن", "fileAdded": "یک فایل به طرح افزوده شد.", @@ -188,6 +202,7 @@ "copyError": "کپی پیام های خطا", "noBoardSelected": "هیچ بردی انتخاب نشده است. لطفاً برد آردوینو خود را از منوی Tools > Board انتخاب کنید" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "راه اندازی مجدد Daemon", "start": "شروع Daemon", @@ -313,6 +328,13 @@ "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": "بسته شدن وب سوکت ممکن نیست", "unableToConnectToWebSocket": "اتصال به وب سوکت امکان پذیر نیست" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "پیمایش خودکار", "carriageReturn": "رفتن به سر سطر", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "پیام (برای ارسال پیام به '' د{0}ر '' وارد شوید{1})", "newLine": "خط جدید", "newLineCarriageReturn": "هم NL و هم CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "جابجا کردن", "movingMsg": "فایل \"{0}\" باید داخل یک پوشه طرح به نام \"{1}\" باشد.\nاین پوشه را ایجاد کنید، فایل را منتقل کنید و ادامه دهید؟", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "به روز رسانی شاخص ها", "updateLibraryIndex": "به روز رسانی فهرست کتابخانه", @@ -483,6 +517,7 @@ "couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.", "daemonOffline": "CLI آفلاین پس زمینه", "offline": "آفلاین", + "offlineText": "آفلاین", "quitTitle": "آیا مطمئن هستید که می خواهید خارج شوید؟" }, "editor": { diff --git a/i18n/fil.json b/i18n/fil.json index 710477141..8520aa969 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -4,6 +4,12 @@ "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", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -233,7 +248,7 @@ "install": "Install", "installingFirmware": "Installing firmware.", "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", + "selectBoard": "Pumili ng board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", "updater": "WiFi101 / WiFiNINA Firmware Updater" @@ -313,6 +328,13 @@ "tools": "Mga Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/fr.json b/i18n/fr.json index dced35c4d..0ea17712a 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "A propos de {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Carte{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Compte", "chooseSketchVisibility": "Choisissez la visibilité du croquis :", "cloudSketchbook": "Carnet de Croquis Cloud", "connected": "Connecté", "continue": "Continuer", - "donePulling": "Récupération de '{0}' terminée.", - "donePushing": "Téléchargement terminé pour '{0}'", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embarqué : ", "emptySketchbook": "Votre carnet de croquis est vide", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "par", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtrez votre recherche...", "install": "Installer", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Plus d'information", + "otherVersions": "Other Versions", + "remove": "Supprimer ", + "title": "{0} by {1}", "uninstall": "Désinstaller", "uninstallMsg": "Voulez vous désinstaller {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Ajouter un fichier", "fileAdded": "Un fichier a été ajouté au croquis", @@ -188,6 +202,7 @@ "copyError": "Copier les messages d'erreur", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Redémarrer Daemon", "start": "Démarrer Daemon", @@ -313,6 +328,13 @@ "tools": "Outils" }, "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": "Impossible de fermer le web socket", "unableToConnectToWebSocket": "Impossible de se connecter au web socket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Défilement automatique", "carriageReturn": "Retour chariot", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Nouvelle ligne", "newLineCarriageReturn": "Les deux, NL et CR", @@ -414,11 +437,11 @@ "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": "Exporter les binaires compilés", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Déplacement", "movingMsg": "Le fichier \"{0}\" à besoin d'être à l'intérieur d'un dossier de croquis appelé \"{1}\".\nCréer ce dossier, déplacer le fichier et continuer ?", "new": "New Sketch", @@ -451,6 +474,17 @@ "dismissSurvey": "Ne pas montrer de nouveau", "surveyMessage": "Aide-nous à nous améliorer en répondant à cette enquête très courte. Nous apprécions notre communauté et nous aimerions connaître un peu mieux nos supporters." }, + "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", @@ -483,6 +517,7 @@ "couldNotSave": "Impossible d'enregistrer le croquis. Veuillez copier votre travail non enregistré dans votre éditeur de texte favori et redémarrer l'IDE.", "daemonOffline": "CLI Deamon hors ligne", "offline": "Hors-ligne", + "offlineText": "Hors-ligne", "quitTitle": "Est que-vous sur vous voulez quitter? " }, "editor": { diff --git a/i18n/he.json b/i18n/he.json index 0f55630b2..2b727b281 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "פרטים על {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "לוח{0}", "boardConfigDialogTitle": "יש לבחור לוח ופורט אחר", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "חשבון", "chooseSketchVisibility": "בחר.י נראות של הסקיצה שלך:", "cloudSketchbook": "Cloud Sketchbook", "connected": "מחובר", "continue": "המשך", - "donePulling": "סיים למשוך '{0}'.", - "donePushing": "סיים לדחוף '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "הטמע:", "emptySketchbook": "הסקיצה ריקה.", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "לוחות המוכלים בחבילות הבאות:", "by": "על ידי", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "סנן את החיפוש...", "install": "התקן", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "מידע נוסף", + "otherVersions": "Other Versions", + "remove": "הסר", + "title": "{0} by {1}", "uninstall": "הסרה", "uninstallMsg": "האם ברצונך להסיר את {0}?", - "version": "גירסה {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "הוסף קובץ", "fileAdded": "קובץ אחד נוסף לסקיצה.", @@ -188,6 +202,7 @@ "copyError": "העתקת הודעת שגיאה", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "איתחול מחדש של Daemon", "start": "התחל Daemon", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "גלילה אוטומטית", "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "שורה חדשה", "newLineCarriageReturn": "Both NL & CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "מעביר", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", "new": "New Sketch", @@ -451,6 +474,17 @@ "dismissSurvey": "אל תראה שוב.", "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." }, + "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", @@ -483,6 +517,7 @@ "couldNotSave": "לא ניתן לשמור את הסקיצה. נא להעתיק את העבודה הלא שמורה לתוך עורך טקסט חיצוני, ולהפעיל מחדש את הIDE.", "daemonOffline": "CLI daemon במצב לא מקוון", "offline": "מנותק", + "offlineText": "מנותק", "quitTitle": "בטוח.ה שתרצה.י לצאת?" }, "editor": { diff --git a/i18n/hi.json b/i18n/hi.json index 19a3645e0..08a47309e 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -1,41 +1,58 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", + "boardConfigDialogTitle": "Select Other Board and Port", "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.", - "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?", + "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…", - "platformMissing": "The platform for the selected '{0}' board is not installed.", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", "portLabel": "Port: {0}", + "ports": "ports", "programmer": "Programmer", "reselectLater": "Reselect later", + "searchBoard": "Search board", "selectBoard": "Select Board", - "selectBoardForInfo": "Please select a board to obtain board info.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}" + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, "bootloader": { "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", "doneBurningBootloader": "Done burning bootloader." }, "burnBootloader": { @@ -58,19 +75,29 @@ "uploadRootCertificates": "Upload SSL Root Certificates", "uploadingCertificates": "Uploading certificates." }, + "checkForUpdates": { + "checkForUpdates": "Check for Arduino Updates", + "installAll": "Install All", + "noUpdates": "There are no recent updates available.", + "promptUpdateBoards": "Updates are available for some of your boards.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." + }, "cli-error-parser": { "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", @@ -88,10 +115,9 @@ "pushSketch": "Push Sketch", "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", "remote": "Remote", - "remoteSketchbook": "Remote Sketchbook", "share": "Share...", "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", "signIn": "SIGN IN", "signInToCloud": "Sign in to Arduino Cloud", "signOut": "Sign Out", @@ -99,38 +125,84 @@ "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", - "selectBoard": "Select Board", + "recommended": "Recommended", + "retired": "Retired", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", - "unknown": "Unknown" + "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", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", + "plotter": { + "couldNotOpen": "Couldn't open serial plotter" + }, "replaceTitle": "Replace" }, + "core": { + "compilerWarnings": { + "all": "All", + "default": "Default", + "more": "More", + "none": "None" + } + }, "coreContribution": { - "copyError": "Copy error messages" + "copyError": "Copy error messages", + "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -140,7 +212,8 @@ "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging" + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" }, "dialog": { "dontAskAgain": "Don't ask again" @@ -154,7 +227,8 @@ "increaseFontSize": "Increase Font Size", "increaseIndent": "Increase Indent", "nextError": "Next Error", - "previousError": "Previous 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.", @@ -192,7 +266,7 @@ "visit": "Visit Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE updates", + "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", "downloadButton": "Download", @@ -212,12 +286,12 @@ "addZip": "Add .ZIP Library...", "arduinoLibraries": "Arduino libraries", "contributedLibraries": "Contributed libraries", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", "include": "Include Library", - "installAll": "Install all", + "installAll": "Install All", + "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", - "installOnly": "Install {0} only", + "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", "manageLibraries": "Manage Libraries...", @@ -230,15 +304,47 @@ "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", "zipLibrary": "Library" }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, "menu": { "advanced": "Advanced", "sketch": "Sketch", "tools": "Tools" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, "preferences": { "additionalManagerURLs": "Additional Boards Manager URLs", "auth.audience": "The OAuth2 audience.", @@ -248,6 +354,7 @@ "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.", @@ -276,8 +383,18 @@ "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.", @@ -286,14 +403,20 @@ "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." + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" }, "replaceMsg": "Replace the existing version of {0}?", "selectZip": "Select a zip file containing the library you'd like to add", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", @@ -306,20 +429,30 @@ "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", "doneCompiling": "Done compiling.", "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Moving", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Open Folder", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", "showFolder": "Show Sketch Folder", "sketch": "Sketch", "sketchbook": "Sketchbook", @@ -327,26 +460,56 @@ "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." } }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, "theia": { "core": { "cannotConnectBackend": "Cannot connect to the backend.", @@ -354,14 +517,9 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", + "offlineText": "Offline", "quitTitle": "Are you sure you want to quit?" }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, "editor": { "unsavedTitle": "Unsaved – {0}" }, @@ -370,10 +528,10 @@ "expand": "Expand" }, "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", + "deleteCloudSketch": "The cloud sketch '{0}' will be permanently deleted from the Arduino servers and the local caches. This action is irreversible. Do you want to delete the current sketch?", + "deleteCurrentSketch": "The sketch '{0}' will be permanently deleted. This action is irreversible. Do you want to delete the current sketch?", "fileNewName": "Name for new file", "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", "newFileName": "New name for file" } } diff --git a/i18n/hu.json b/i18n/hu.json index cff9eebc3..ab78b060a 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "About {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Alaplap {0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Válaszd ki a vázlat/sketch láthatóságát: ", "cloudSketchbook": "Felhő vázlatfüzet/sketchbook ", "connected": "Kapcsolódva", "continue": "Tovább", - "donePulling": "Letöltés kész: '{0}'.", - "donePushing": "Feltöltés kész: '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Beágyazva:", "emptySketchbook": "A vázlatfüzeted/Sketchbook-od üres ", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "által", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Keresési eredmény szűrése... ", "install": "Telepítés", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Több info", + "otherVersions": "Other Versions", + "remove": "Eltávolítás", + "title": "{0} by {1}", "uninstall": "Eltávolítás", "uninstallMsg": "El szeretnéd távolítani a következőt: {0}? ", - "version": "Verzió: {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Fájl hozzáadása", "fileAdded": "Egy fájl hozzáadása megtörtént a vázlathoz/sketch-hez. ", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "tools": "Eszközök" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Automatikus görgetés", "carriageReturn": "Kocsi vissza", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Új sor", "newLineCarriageReturn": "Mindkettő: Új sor és Kocsi vissza - NL&CR", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Összeállított bináris exportálása", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Mozgatás", "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Nem sikerült menteni a vázlatot/sketch-et. Másold át a nem mentett munkát kedvenc szövegszerkesztődbe és indítsd újra az IDE-t. ", "daemonOffline": "CLI Daemon offline/elérhetetlen ", "offline": "Offline / nincs hálózat", + "offlineText": "Offline / nincs hálózat", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/id.json b/i18n/id.json index 8fd1a3a1b..08a47309e 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -4,6 +4,12 @@ "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", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/it.json b/i18n/it.json index 4d37bae14..535028fb9 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -4,6 +4,12 @@ "detail": "Versione: {0}\nData: {1}{2}\nVersione CLI: {3}\n\n{4}", "label": "Informazioni su {0}" }, + "account": { + "goToCloudEditor": "Vai all'editor del cloud", + "goToIoTCloud": "Vai al cloud IoT", + "goToProfile": "Vai al profilo", + "menuTitle": "Cloud di Arduino" + }, "board": { "board": "Scheda{0}", "boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' non è stato trovato. Il tuo sketch include la linea '#include <Mouse.h>' nel codice?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Scegli a chi far vedere il tuo Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connesso", "continue": "Continua", - "donePulling": "Pulling terminato ‘{0}’.", - "donePushing": "Invio terminato ‘{0}’.", + "donePulling": "Scaricamento di '{0}' effettuato.", + "donePushing": "Invio di '{0}' effettuato.", "embed": "Includi:", "emptySketchbook": "La raccolta degli sketch è vuota", "goToCloud": "Vai al Cloud", @@ -112,7 +117,7 @@ "remote": "Remoto", "share": "Condividi...", "shareSketch": "Condividi sketch", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Mostra/Nascondi la raccolta remota degli sketch", "signIn": "ACCEDI", "signInToCloud": "Effettua la registrazione su Arduino Cloud", "signOut": "Disconnetti", @@ -121,14 +126,14 @@ "visitArduinoCloud": "Visita Arduino Cloud per creare Cloud 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.", + "alreadyExists": "Lo sketch remoto '{0}' è già presente.", + "creating": "Creazione in corso dello sketch remoto '{0}'...", + "new": "Nuovo Sketch remoto", + "notFound": "Impossibile scaricare lo sketch remoto '{0}'. Non esiste.", "pulling": "Sincronizzazione degli sketch, pulling \"{0}\"...", - "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "pushing": "Sincronizzazione della raccolta degli sketch in corso, sto inviando '{0}'...", + "renaming": "Sto rinominando lo sketch remoto da '{0}' a '{1}'...", + "synchronizingSketchbook": "Sincronizzazione della raccolta degli sketch in corso..." }, "common": { "all": "Tutti", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Schede incluse in questo pacchetto:", "by": "da", + "clickToOpen": "Cliccare per aprire nel browser: {0}", "filterSearch": "Filtra la tua ricerca...", "install": "Installa", - "installed": "Installata", + "installLatest": "Installa il più recente", + "installVersion": "Installa {0}", + "installed": "{0} installato", "moreInfo": "Maggiori informazioni", + "otherVersions": "Altre versioni", + "remove": "Rimuovi", + "title": "{0} di {1}", "uninstall": "Disinstalla", "uninstallMsg": "Vuoi veramente disinstallare {0}?", - "version": "Versione {0}" + "update": "Aggiornamento" }, "configuration": { "cli": { "inaccessibleDirectory": "Impossibile accedere alla raccolta degli sketch presenti in '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connessione persa. Le azioni e gli aggiornamenti degli sketch del cloud non saranno disponibili." + }, "contributions": { "addFile": "Aggiungi file", "fileAdded": "Aggiunto un file allo sketch.", @@ -188,6 +202,7 @@ "copyError": "Copia messaggi di errore", "noBoardSelected": "Non è stata selezionata alcuna scheda. Selezionare la tua scheda Arduino dal menu Strumenti > Scheda." }, + "createCloudCopy": "Invia lo sketch nel cloud", "daemon": { "restart": "Riavvia il demone", "start": "Avvia il demone", @@ -313,11 +328,18 @@ "tools": "Strumenti" }, "monitor": { + "alreadyConnectedError": "Impossibile connettere alla porta {0} {1}. Già connesso.", + "baudRate": "{0} baud", + "connectionFailedError": "Impossibile connettere alla porta {0} {1}.", + "connectionFailedErrorWithDetails": "{0} Impossibile connettere alla porta {1} {2}.", + "connectionTimeout": "Tempo scaduto. L'IDE non ha ricevuto il messaggio di 'successo' dal monitor dopo essersi connesso con esso.", + "missingConfigurationError": "Impossibile connettere alla porta {0} {1}. Manca la configurazione del monitor.", + "notConnectedError": "Non connesso alla porta {0} {1}.", "unableToCloseWebSocket": "Impossibile chiudere il websocket", "unableToConnectToWebSocket": "Impossibile connettersi al websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Nome del nuovo sketch remoto" }, "portProtocol": { "network": "Rete", @@ -386,13 +408,14 @@ } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Nuovo nome dello sketch remoto" }, "replaceMsg": "Sostituire la versione esistente con la versione {0}?", "selectZip": "Scegli il file zip che contiene la libreria che vuoi aggiungere", "serial": { "autoscroll": "Scorrimento automatico", "carriageReturn": "Ritorno carrello (CR)", + "connecting": "Connessione in corso di '{0}' su '{1}'...", "message": "Messaggio (premi Enter per inviare il messaggio a '{0}' on '{1}')", "newLine": "A capo (NL)", "newLineCarriageReturn": "Entrambi NL & CR", @@ -411,22 +434,22 @@ "createdArchive": "Creato l'archivio '{0}'.", "doneCompiling": "Compilazione completata.", "doneUploading": "Caricamento terminato.", - "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": "Vuoi provare a salvare lo sketch in una posizione diversa?", + "editInvalidSketchFolderQuestion": "Vuoi provare a salvare lo sketch con un nome diverso?", "exportBinary": "Esporta sketch compilato", - "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidCloudSketchName": "Il nome deve iniziare con una lettera, un numero o un trattino basso, seguito da lettere, numeri, trattini, punti e trattini bassi. La lunghezza massima è di 36 caratteri.", + "invalidSketchFolderLocationDetails": "Non è possibile salvare uno sketch in una cartella al suo interno.", + "invalidSketchFolderLocationMessage": "Posizione della cartella degli sketch non valida: '{0}'", + "invalidSketchFolderNameMessage": "Nome della cartella degli sketch non valida: '{0}'", + "invalidSketchName": "Il nome deve iniziare con una lettera, un numero o un trattino basso, seguito da lettere, numeri, trattini, punti e trattini bassi. La lunghezza massima è di 63 caratteri.", "moving": "Spostando", "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", "new": "Nuovo Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "noTrailingPeriod": "Il nome di un file non può terminare con un punto", "openFolder": "Apri Cartella", "openRecent": "Apri recenti", "openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "'{0}' è il nome di un file riservato.", "saveFolderAs": "Salva la cartella sketch come...", "saveSketch": "Salva il tuo sketch per riaprirlo in seguito.", "saveSketchAs": "Salva la cartella dello sketch come...", @@ -443,7 +466,7 @@ "verifyOrCompile": "Verifica/Compila" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", + "newCloudSketch": "Nuovo sketch remoto", "newSketch": "Nuovo Sketch" }, "survey": { @@ -451,6 +474,17 @@ "dismissSurvey": "Non mostrare più", "surveyMessage": "Aiutaci a migliorare rispondendo a questo brevissimo questionario. Abbiamo a cuore la nostra comunità e vorremmo conoscere meglio chi ci supporta!" }, + "theme": { + "currentThemeNotFound": "Impossibile trovare il tema attualmente selezionato: {0}. Arduino IDE ha selezionato un tema integrato compatibile con quello mancante.", + "dark": "Scuro", + "deprecated": "{0} (deprecato)", + "hc": "Alto contrasto", + "light": "Luce", + "user": "{0} (utente)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "Aggiorna gli indici", "updateLibraryIndex": "Aggiorna l'indice di libreria", @@ -465,15 +499,15 @@ "upload": "Carica" }, "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": "Lo sketch non è ancora valido. Vuoi risolvere i problemi rimanenti? Facendo clic su '{0}', si aprirà un nuovo sketch.", + "abortFixTitle": "Lo sketch non è valido", + "renameSketchFileMessage": "Il file dello sketch '{0}' non può essere usato. {1} Vuoi rinominare adesso lo sketch?", + "renameSketchFileTitle": "Il nome del file dello sketch non è valido", + "renameSketchFolderMessage": "Lo sketch '{0}' non può essere usato. {1} Per eliminare questo messaggio, rinomina lo sketch. Vuoi rinominare adesso lo sketch?", + "renameSketchFolderTitle": "Il nome dello sketch non è valido" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' è già presente." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "Non è stato possibile salvare lo sketch. Si consiglia di copiarlo è salvarlo su un file di testo e solo successivamente riavviare l' Arduino IDE. ", "daemonOffline": "Il CLI Daemon è disconnesso", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Sei sicuro di volere chiudere?" }, "editor": { @@ -493,8 +528,8 @@ "expand": "Espandi" }, "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": "Lo sketch remoto '{0}' sarà eliminato definitivamente dai server di Arduino e dalle cache locali. Questa azione è irreversibile. Vuoi eliminare lo sketch?", + "deleteCurrentSketch": "Vuoi eliminare lo sketch attuale?", "fileNewName": "Nome per il nuovo file", "invalidExtension": "\".{0}\" non è un'estensione valida", "newFileName": "Nuovo nome del file" diff --git a/i18n/ja.json b/i18n/ja.json index 0d8981ba7..857e377d8 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -4,6 +4,12 @@ "detail": "バージョン:{0}\n日付:{1}{2}\nCLIバージョン:{3}\n\n{4}", "label": "{0}について" }, + "account": { + "goToCloudEditor": "クラウドエディターへ移動", + "goToIoTCloud": "IoTクラウドへ移動", + "goToProfile": "プロファイルへ移動", + "menuTitle": "Arduinoクラウド" + }, "board": { "board": "ボード{0}", "boardConfigDialogTitle": "他のボードとポートを選択", @@ -83,13 +89,12 @@ "mouseError": "'Mouse'が見つかりません。スケッチに'#include <Mouse.h>'という行はありますか?" }, "cloud": { - "account": "アカウント", "chooseSketchVisibility": "スケッチの可視性を選択:", "cloudSketchbook": "クラウドスケッチブック", "connected": "接続済み", "continue": "続ける", - "donePulling": "‘{0}’のプルが完了しました。", - "donePushing": "‘{0}’のプッシュが完了しました。", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "埋め込み:", "emptySketchbook": "スケッチブックは空です", "goToCloud": "クラウドへ", @@ -97,7 +102,7 @@ "link": "リンク:", "notYetPulled": "クラウドにプッシュできません。まだプルされていません。", "offline": "オフライン", - "openInCloudEditor": "クラウドエディタで開く", + "openInCloudEditor": "クラウドエディターで開く", "options": "オプション…", "privateVisibility": "プライベート:スケッチを見られるのは自分だけです。", "profilePicture": "プロフィール画像", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "このパッケージに含まれるボード:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "検索をフィルタ…", "install": "インストール", - "installed": "インストール済み", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "詳細情報", + "otherVersions": "Other Versions", + "remove": "削除", + "title": "{0} by {1}", "uninstall": "アンインストール", "uninstallMsg": "{0}をアンインストールしますか?", - "version": "バージョン{0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "'{0}': {1}にあるスケッチブックにアクセスできませんでした" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "ファイルを追加...", "fileAdded": "スケッチにファイルが1つ追加されました。", @@ -188,6 +202,7 @@ "copyError": "エラーメッセージをコピー", "noBoardSelected": "ボードが選択されていません。ツール > ボードメニューからArduinoボードを選択してください。" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Daemonを再起動", "start": "Daemonを開始", @@ -216,7 +231,7 @@ "revealError": "エラーを表示" }, "electron": { - "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディタにコピーして、IDEを再起動してください。", + "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディターにコピーして、IDEを再起動してください。", "unsavedChanges": "未保存の変更は保存されません。" }, "examples": { @@ -313,6 +328,13 @@ "tools": "ツール" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "websocketを閉じることができません", "unableToConnectToWebSocket": "websocketに接続することができません" }, @@ -353,7 +375,7 @@ "ide.updateBaseUrl": "アップデートをダウンロードするためのベースURL。デフォルトは 'https://downloads.arduino.cc/arduino-ide' です。", "ide.updateChannel": "アップデート元のリリースチャンネル。stableは安定版リリース、nightlyは最新の開発用ビルドです。", "interfaceScale": "インターフェイスのスケール", - "invalid.editorFontSize": "エディタのフォントサイズが無効です。正の整数でなければなりません。", + "invalid.editorFontSize": "エディターのフォントサイズが無効です。正の整数でなければなりません。", "invalid.sketchbook.location": "スケッチブックの場所が無効です: {0}", "invalid.theme": "無効なテーマです。", "language.log": "Arduino Language Serverがスケッチフォルダにログファイルを生成した方がよい場合はtrue。それ以外はfalse。デフォルトではfalse。", @@ -393,6 +415,7 @@ "serial": { "autoscroll": "自動スクロール", "carriageReturn": "CRのみ", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "メッセージ('{1}'の{0}にメッセージを送信するにはEnter)", "newLine": "LFのみ", "newLineCarriageReturn": "CRおよびLF", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "スケッチを別の場所に保存してみますか?", "editInvalidSketchFolderQuestion": "スケッチを別の名前で保存しますか?", "exportBinary": "コンパイル済みバイナリをエクスポート", - "invalidCloudSketchName": "名前は、文字または数字で始まり、文字、数字、ダッシュ、ドット、アンダースコアが続く必要があります。最大文字数は36文字です。", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", "invalidSketchFolderLocationDetails": "スケッチは、それ自身の中のフォルダに保存することはできません。", "invalidSketchFolderLocationMessage": "無効なスケッチフォルダの場所:'{0}'。", "invalidSketchFolderNameMessage": "スケッチフォルダの名前が無効です:'{0}'", - "invalidSketchName": "名前は、文字または数字で始まり、文字、数字、ダッシュ、ドット、アンダースコアが続く必要があります。最大文字数は63文字です。", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "移動", "movingMsg": "ファイル\"{0}\"は、\"{1}\"という名前のスケッチフォルダの中にあることが必要です。\nこのフォルダを作成し、ファイルを移動させ、継続しますか?", "new": "新規スケッチ", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "インデックスを更新", "updateLibraryIndex": "ライブラリのインデックスを更新", @@ -480,9 +514,10 @@ "core": { "cannotConnectBackend": "バックエンドに接続できません。", "cannotConnectDaemon": "CLI daemonに接続できません。", - "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディタにコピーして、IDEを再起動してください。", + "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディターにコピーして、IDEを再起動してください。", "daemonOffline": "CLI Daemonはオフラインです", "offline": "オフライン", + "offlineText": "オフライン", "quitTitle": "本当に終了しますか?" }, "editor": { diff --git a/i18n/ko.json b/i18n/ko.json index 3c7a507cf..7ed1df8ac 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "프로그램 정보 {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "보드{0}", "boardConfigDialogTitle": "보드 및 포트 선택", @@ -83,13 +89,12 @@ "mouseError": "'Mouse'를 찾을 수 없습니다. 스케치에 '#include <Mouse.h>' 줄이 포함되어 있습니까?" }, "cloud": { - "account": "계정", "chooseSketchVisibility": "보여질 스케치를 선택하세요", "cloudSketchbook": "Cloud Sketchbook", "connected": "연결됨", "continue": "계속", - "donePulling": "pulling 완료 ‘{0}’.", - "donePushing": "pushing 완료 ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "스케치북이 비어 있습니다.", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "이 패키지에 포함된 보드:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "필터 검색...", "install": "설치", - "installed": "설치됨", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "더 많은 정보", + "otherVersions": "Other Versions", + "remove": "제거", + "title": "{0} by {1}", "uninstall": "설치해제", "uninstallMsg": "설치해제를 원하십니까 {0}?", - "version": "버전 {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "파일 추가", "fileAdded": "스케치에 하나의 파일이 추가되었습니다.", @@ -188,6 +202,7 @@ "copyError": "에러 메시지 복사", "noBoardSelected": "보드가 선택되지 않았습니다. Tools > Board menu 에서 당신의 보드를 선택해주세요." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "데몬 재시작", "start": "데몬 시작", @@ -313,6 +328,13 @@ "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": "웹소켓을 닫을 수 없습니다.", "unableToConnectToWebSocket": "웹소켓에 연결 할 수 없습니다." }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "자동스크롤", "carriageReturn": "캐리지 리턴", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "새 줄", "newLineCarriageReturn": "Both NL & CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "dismissSurvey": "다시보지 않기", "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." }, + "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", @@ -483,6 +517,7 @@ "couldNotSave": "스케치를 저장할 수 없습니다. 저장하지 않은 작업을 즐겨 사용하는 텍스트 편집기에 복사하고 IDE를 다시 시작하세요.", "daemonOffline": "CLI 데몬 오프라인", "offline": "오프라인", + "offlineText": "오프라인", "quitTitle": "정말 종료하시겠습니까?" }, "editor": { diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 13ab1710b..4556ad438 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "{0} အကြောင်း" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "ဘုတ်{0}", "boardConfigDialogTitle": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ပါ", @@ -83,13 +89,12 @@ "mouseError": "'မောက်စ်' ရှာမတွေ့ပါ။ '#include <Mouse.h>' ကုတ်စာကြောင်းကို သင့်ကုတ်ပုံကြမ်းထဲတွင် ထည့်ရေးထားပါသလား?" }, "cloud": { - "account": "အကောင့်", "chooseSketchVisibility": "သင့်ကုတ်ပုံကြမ်း၏ မြင်နိုင်စွမ်းအား ရွေးချယ်ခြင်း - ", "cloudSketchbook": "တိမ်တိုက် Sketchbook ဖိုင်တွဲ", "connected": "ချိတ်ဆက်ထားသည်", "continue": "ဆက်သွားမည်", - "donePulling": "‘{0}’ကိုဆွဲယူပြီးပါပြီ။", - "donePushing": "‘{0}’တွန်းပို့ပြီးပါပြီ။", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "မြှုပ်သွင်းထားသော -", "emptySketchbook": "သင့်ကုတ်ပုံကြမ်းဖိုင်တွဲထဲတွင် ဘာမှမရှိပါ", "goToCloud": "ကလောက်သို့သွားမည်", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "ဤပတ်ကေ့တွင်ပါဝင်သောဘုတ်များ-", "by": "မှ", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "သင်၏ရှာဖွေမှုရလဒ်ကိုစစ်ထုတ်မည်…", "install": "တပ်ဆင်မည်", - "installed": "တပ်ဆင်ထားပြီး", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "နောက်ထပ်အချက်အလက်များ", + "otherVersions": "Other Versions", + "remove": "ဖယ်ရှားမည်", + "title": "{0} by {1}", "uninstall": "ဖြုတ်ချ", "uninstallMsg": "သင် {0} ကိုဖြုတ်ချချင်ပါသလား?", - "version": "ဗားရှင်း {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "ဖိုင်လ်ထည့်မည်", "fileAdded": "ကုတ်ပုံကြမ်းထဲသို့ ဖိုင်တစ်ခု ထည့်လိုက်သည်။", @@ -188,6 +202,7 @@ "copyError": "အမှားပြစာများကို ကော်ပီဆွဲသည်", "noBoardSelected": "မည်သည့်ဘုတ်မှ မရွေးထားပါ။ သင်၏အာဒီနိုဘုတ်ကို ကိရိယာများ>ဘုတ် မီနူးတွင် ရွေးချယ်ပါ။" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Daemon ပြန်စမည်", "start": "Daemon စတင်မည်", @@ -313,6 +328,13 @@ "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": "ဝက်ဘ်ဆော့ကတ်ကိုမပိတ်နိုင်ပါ", "unableToConnectToWebSocket": "ဝက်ဘ်ဆော့ကတ်သို့မချိတ်ဆက်နိုင်ပါ" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "အလိုအလျောက်လှိမ့်ဆွဲခြင်း", "carriageReturn": "လက်နှိပ်စက်အတံပြန်အက္ခရာ", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "စာတို (စာတိုကို '{0}'သို့ '{1}'တွင် ပို့ရန် ရိုက်နှိပ်ပါ)", "newLine": "စာကြောင်းအသစ်အက္ခရာ", "newLineCarriageReturn": "စာကြောင်းအသစ်နှင့်လက်နှိပ်စက်အတံပြန်အက္ခရာနှစ်ခုလုံး", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "ရွှေ့နေသည်", "movingMsg": "ဖိုင်လ် \"{0}\" သည် ကုတ်ဖိုင်လ်ဖိုလ်ဒါ \"{1}\"အတွင်းရှိရန်လိုသည်။\nဖိုလ်ဒါတည်ဆောက်ပြီးဖိုင်လ်ကိုရွှေ့မည်လား။", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "အပ်ဒိတ်စာရင်းများ", "updateLibraryIndex": "ကုတ်ကြည့်တိုက်အပ်ဒိတ်စာရင်း", @@ -483,6 +517,7 @@ "couldNotSave": "ကုတ်ဖိုင်လ်ကိုမသိမ်းဆည်းနိုင်ခဲ့ပါ။ မသိမ်းဆည်းရသေးသော ကုတ်များကို သင်နှစ်သက်ရာစာသားတည်းဖြတ်ပရိုဂရမ်သို့ ကူးယူပြီး အိုင်ဒီအီး ပြန်စတင်ပါ။", "daemonOffline": "CLIနောက်ကွယ်လုပ်ဆောင်ပရိုဂရမ် အော့ဖ်လိုင်းဖြစ်နေသည်", "offline": "အော့ဖ်လိုင်း", + "offlineText": "အော့ဖ်လိုင်း", "quitTitle": "သင်ထွက်မှာသေချာပါသလား။" }, "editor": { diff --git a/i18n/ne.json b/i18n/ne.json index f45c811aa..3788879f2 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -4,6 +4,12 @@ "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", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/nl.json b/i18n/nl.json index 95f6f82c3..a369e991a 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -1,14 +1,20 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Versie: {0}\nDatum: {1}{2}\nCLI Versie: {3}\n\n{4}\n ", "label": "Over {0}" }, + "account": { + "goToCloudEditor": "Ga naar de Cloud Editor", + "goToIoTCloud": "Ga naar de IoT Cloud", + "goToProfile": "Ga naar profiel", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Bord{0}", "boardConfigDialogTitle": "Selecteer Ander Bord en Poort", "boardInfo": "Bord Informatie", - "boards": "boards", + "boards": "borden", "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?", @@ -16,29 +22,29 @@ "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": "No boards found for \"{0}\"", + "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": "Native serial port, can't obtain info.", + "noNativeSerialPort": "Oorpronkelijke seriële poort, ik kan geen info verkrijgen", "noPortsDiscovered": "Geen poorten gevonden", "noPortsSelected": "Geen poorten geselecteerd voor bord: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", + "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": "ports", + "ports": "poorten", "programmer": "Programmeerapparaat", "reselectLater": "Later opnieuw selecteren", "searchBoard": "Bord zoeken", "selectBoard": "Selecteer Bord", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", "showAllAvailablePorts": "Toont alle beschikbare poorten indien ingeschakeld", - "showAllPorts": "Show all ports", + "showAllPorts": "Toon alle poorten", "succesfullyInstalledPlatform": "Platform {0}:{1} succesvol geïnstalleerd", "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" + "typeOfPorts": "\"{0}\" poorten", + "unknownBoard": "Onbekend bord" }, "boardsManager": "Borden Beheerder", "boardsType": { @@ -46,7 +52,7 @@ }, "bootloader": { "burnBootloader": "Bootloader branden", - "burningBootloader": "Bootloader branden...", + "burningBootloader": "Bootloader aan het branden", "doneBurningBootloader": "Klaar met het branden van de bootloader." }, "burnBootloader": { @@ -83,16 +89,15 @@ "mouseError": "'Mouse' niet gevonden. Bevat je schets de regel '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Kies de zichtbaarheid van je Sketch:", "cloudSketchbook": "Cload Schetsboek", "connected": "Verbonden", "continue": "Doorgaan", - "donePulling": "Klaar met trekken van '{0}'.", - "donePushing": "Klaar met pushen van '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Integreren:", "emptySketchbook": "Je schetsboek is leeg", - "goToCloud": "Go to Cloud", + "goToCloud": "Ga naar de Cloud", "learnMore": "Leer meer", "link": "Koppeling:", "notYetPulled": "Kan niet pushen naar Cloud. Het is nog niet getrokken.", @@ -112,7 +117,7 @@ "remote": "Op Afstand", "share": "Delen...", "shareSketch": "Schets Delen", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Toon / Verberg het Cloud Schetsboek", "signIn": "INLOGGEN", "signInToCloud": "Aanmelden bij Arduino Cloud", "signOut": "Uitloggen", @@ -121,14 +126,14 @@ "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken." }, "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": "Cloud sketch '{0}' bestaat al", + "creating": "cloud sketch '{0}'  maken...", + "new": "Nieuwe Cloud Sketch", + "notFound": "Kan de cloud sketch '{0}'niet vinden, het bestaat niet.", + "pulling": "Schetsboek synchroniseren, ik haal '{0}'. op .....", + "pushing": "Schetsboek synchroniseren, ik sla '{0}' op.......", + "renaming": "Cloud schets hernoemen van '{0}' naar '{1}' ...", + "synchronizingSketchbook": "Schetsboek synchroniseren..." }, "common": { "all": "Alle", @@ -155,39 +160,49 @@ "component": { "boardsIncluded": "Borden in dit pakket:", "by": "door", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter je zoekopdracht...", "install": "Installeren", - "installed": "Geïnstalleerd", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Meer informatie", + "otherVersions": "Other Versions", + "remove": "Verwijder", + "title": "{0} by {1}", "uninstall": "Verwijderen", "uninstallMsg": "Wil je {0} verwijderen?", - "version": "Versie {0}" + "update": "Update" }, "configuration": { "cli": { - "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + "inaccessibleDirectory": "Geen toegang tot schetsboek locatie in '{0}': {1} " } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Bestand Toevoegen", "fileAdded": "Één bestand toegevoegd aan de schets.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "Kon de seriële plotter niet openen" }, "replaceTitle": "Vervangen" }, "core": { "compilerWarnings": { "all": "Alle", - "default": "Default", - "more": "More", - "none": "None" + "default": "Standaard", + "more": "Meer", + "none": "Geen" } }, "coreContribution": { "copyError": "Foutmeldingen kopiëren", "noBoardSelected": "Geen bord geselecteerd. Selecteer je Arduino-bord in het menu Extra > Board." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Daemon opnieuw starten", "start": "Daemon starten", @@ -198,7 +213,7 @@ "debuggingNotSupported": "Foutopsporing wordt niet ondersteund door '{0}'", "noPlatformInstalledFor": "Platform is niet geïnstalleerd voor '{0}'", "optimizeForDebugging": "Optimaliseren voor foutopsporing", - "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": "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?" }, "dialog": { "dontAskAgain": "Niet meer vragen" @@ -273,10 +288,10 @@ "contributedLibraries": "Bijgedragen bibliotheken", "include": "Bibliotheek Gebruiken", "installAll": "Alles installeren", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "Installeer de bibliotheek afhankelijkheden", "installMissingDependencies": "Wilt u de ontbrekende afhankelijkheid installeren?", "installOneMissingDependency": "Wilt u de ontbrekende afhankelijkheid installeren?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Installeer zonder afhankelijkheden", "installedSuccessfully": "Bibliotheek {0}:{1} succesvol geïnstalleerd", "libraryAlreadyExists": "Er bestaat al een bibliotheek. Wil U het overschrijven? ", "manageLibraries": "Bibliotheken Beheren...", @@ -313,15 +328,22 @@ "tools": "Hulpmiddelen" }, "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": "Kan websocket niet sluiten", "unableToConnectToWebSocket": "Kan geen verbinding maken met websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Naam van de nieuwe Cloud schets" }, "portProtocol": { "network": "Netwerk", - "serial": "Serial" + "serial": "Seriëel" }, "preferences": { "additionalManagerURLs": "Bijkomende Borden Beheerder URL's", @@ -361,17 +383,17 @@ "manualProxy": "Manuele proxy configuratie", "network": "Netwerk", "newSketchbookLocation": "Selecteer een nieuwe schetsboeklocatie.", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "De Cloud kon de CLI configuratie niet laden", "noProxy": "Geen proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "Naam van de host", + "password": "Wachtwoord", + "port": "Poortnummer", + "username": "Gebruikersnaam" }, "showVerbose": "Uitgebreide uitvoer weergeven tijdens", "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": "Absoluut pad naar het standaard `.ino` systeem blauwdrukbestand. Indien gespecificeerd,, zal de inhoud van het systeem blauwdrukbestand gebruikt worden voor elke nieuwe schets gemaakt met behulp van de IDE. De schetsen zullen gegenereerd worden met de standaard Arduino inhoud indien niet gespecificeerd. Ontoegangelijke blauwdrukbestanden worden genegeerd. **Een herstart van de IDE is nodig** om deze instelling te activeren." }, "sketchbook.location": "Schetsboek locatie", "sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.", @@ -382,18 +404,19 @@ "verifyAfterUpload": "Verifieer de code na het uploaden", "window.autoScale": "Waar als de gebruikersinterface automatisch wordt geschaald met de lettergrootte.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Niet langer valide. Gebruik 'window.zoomLevel' in plaats daarvan." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Nieuwe naam van de Cloud schets" }, "replaceMsg": "De bestaande versie van {0} vervangen?", "selectZip": "Selecteer een zipbestand met de bibliotheek die U wilt toevoegen", "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Carriage Return", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Bericht (Enter om het bericht naar '{0}' op '{1}' te zenden)", "newLine": "Nieuwe Regel", "newLineCarriageReturn": "Zowel NL & CR", "noLineEndings": "Geen RegelEinde", @@ -407,26 +430,26 @@ "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": "Configure and Upload", + "configureAndUpload": "Configureer en upload", "createdArchive": "Archief '{0}' gemaakt.", "doneCompiling": "Klaar met compileren.", "doneUploading": "Klaar met uploaden.", - "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": "Wil je proberen om de schets op een andere locatie op te slaan?", + "editInvalidSketchFolderQuestion": "Wil je proberen om de schets onder een andere naam op te slaan?", "exportBinary": "Gecompileerd binair bestand exporteren", - "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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": "Je kunt de schets niet opslaan in een map in de eigen map", + "invalidSketchFolderLocationMessage": "Foute locatie van de schets map: '{0}'", + "invalidSketchFolderNameMessage": "Ongeldige schets mapnaam: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Verplaatsten", "movingMsg": "Het bestand \"{0}\" moet binnen een schetsmap met de naam \"{1}\" staan.\nMaak deze map, verplaats het bestand, en ga verder?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "new": "Nieuwe schets", + "noTrailingPeriod": "Een bestandsnaam kan niet met een punt eindigen", "openFolder": "Map Openen", "openRecent": "Recentelijk geopend", "openSketchInNewWindow": "Schets openen in nieuw venster", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "'{0}' is een gereserveerde bestandsnaam.", "saveFolderAs": "Sla de schets map op als...", "saveSketch": "Bewaar je schets om hem later weer te openen.", "saveSketchAs": "Sla de schetsmap op als...", @@ -443,18 +466,29 @@ "verifyOrCompile": "Verifiëren/Compileren" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Nieuwe Cloud Sketch", + "newSketch": "Nieuwe schets" }, "survey": { "answerSurvey": "Antwoord enquête", "dismissSurvey": "Niet meer laten zien", "surveyMessage": "Help ons alsjeblieft te verbeteren door deze super korte enquête te beantwoorden. We waarderen onze gemeenschap en willen onze supporters graag wat beter leren kennen." }, + "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" + "updateIndexes": "Update de indices", + "updateLibraryIndex": "Update de bibliotheek index", + "updatePackageIndex": "Update de index van het pakket" }, "upload": { "error": "{0} fout: {1}" @@ -465,15 +499,15 @@ "upload": "Uploaden" }, "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": "De schets is nog steeds niet correct. Wil je de problemen oplossen? Door op '{0}' te klikken, zal een nieuwe schets worden geopend.", + "abortFixTitle": "Incorrecte schets", + "renameSketchFileMessage": "De schetsnaam '{0}' kan niet gebruikt worden. {1} Wil je de schets nu hernoemen?", + "renameSketchFileTitle": "Ongeldige bestandsnaam van de schets", + "renameSketchFolderMessage": "De schets '{0}' kan niet gebruikt worden. {1} Om van deze melding af te komen, hernoem de schets. Wil je de schets nu hernoemen?", + "renameSketchFolderTitle": "Ongeldige schetsnaam" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' bestaat al." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en start de IDE opnieuw. ", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Weet je zeker dat je wilt stoppen?" }, "editor": { @@ -493,8 +528,8 @@ "expand": "Uitvouwen" }, "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": "De Cloud schets '{0}' zal permanent verwijderd worden van de Arduino servers en van de locale caches. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", + "deleteCurrentSketch": "De schets '{0}' zal permanent verwijderd worden. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", "fileNewName": "Naam voor nieuw bestand", "invalidExtension": ".{0} is geen geldige extensie", "newFileName": "Nieuwe naam voor bestand" diff --git a/i18n/pl.json b/i18n/pl.json index a57e4d7e5..b8eba6602 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "O {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Płytka{0}", "boardConfigDialogTitle": "Wybierz inną płytkę i port", @@ -83,13 +89,12 @@ "mouseError": "Nie znaleziono myszy. Czy szkic posiada linię kodu: '#include <Mouse.h>'?" }, "cloud": { - "account": "Konto", "chooseSketchVisibility": "Wybierz widoczność swojego Szkicu:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Połączony", "continue": "Kontynuuj", - "donePulling": "Zakończono zaciąganie ‘{0}’.", - "donePushing": "Gotowe pchanie ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Osadzić:", "emptySketchbook": "Twój Szkicownik jest pusty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Płytka dołączona w pakiecie:", "by": "przez", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtruj przeszukiwanie....", "install": "Zainstaluj", - "installed": "Zainstalowane", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Więcej informacji", + "otherVersions": "Other Versions", + "remove": "Usuń", + "title": "{0} by {1}", "uninstall": "Odinstaluj", "uninstallMsg": "Czy chcesz odinstalować {0}?", - "version": "Wersja {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": "Dodaj plik", "fileAdded": "Jeden plik dodany do szkicu.", @@ -188,6 +202,7 @@ "copyError": "Kopiuj komunikat błędu", "noBoardSelected": "Nie wybrano płytki. Proszę wybierz płytkę z Narzędzia > Lista płytek" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Restartuj Daemon", "start": "Start Daemon", @@ -313,6 +328,13 @@ "tools": "Narzędzia" }, "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": "Nie można zamknąć gniazda sieciowego", "unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Powrót karetki", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message(Kliknij aby wysłać wiadomość do '{0}' od '{1}')", "newLine": "Nowa linia", "newLineCarriageReturn": "Nowa linia i powrót karetki", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Eksportuj skompilowane binarnie", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Przenoszenie", "movingMsg": "Plik \"{0}\" musi znajdować się w folderze szkiców o nazwie \"{1}\".\nCzy utworzyć ten folder, przenieść podany plik i kontynuować?", "new": "New Sketch", @@ -451,6 +474,17 @@ "dismissSurvey": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają.", "surveyMessage": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają." }, + "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": "Aktualizuj indeksy", "updateLibraryIndex": "Aktualizuj indeksy bibliotek", @@ -483,6 +517,7 @@ "couldNotSave": "Nie można zapisać szkicu. Skopiuj niezapisany szkic do edytora tekstu i zrestartuj IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Offline", "quitTitle": "Jesteś pewien, że chcesz wyjść?" }, "editor": { diff --git a/i18n/pt.json b/i18n/pt.json index 8734ca9a3..a175c9adc 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -1,52 +1,58 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Versão: {0}\nData: {1}{2}\nVersão do CLI : {3}{4} [{5}]\n\n{6}", "label": "Sobre {0}" }, + "account": { + "goToCloudEditor": "Ir para Editor em Nuvem", + "goToIoTCloud": "Ir para Nuvem IoT", + "goToProfile": "Ir para Perfil", + "menuTitle": "Nuvem Arduino" + }, "board": { "board": "Placa{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Selecionar Outra Placa e Porta", "boardInfo": "Informações da Placa", - "boards": "boards", + "boards": "placas", "configDialog1": "Selecione uma placa e uma porta se quiser fazer o upload de um sketch.", - "configDialog2": "Se você selecionar apenas uma Placa, você será capaz de compilar, mas não de carregar o seu sketch.", + "configDialog2": "Se você selecionar apenas uma Placa, você será capaz de compilar, mas não de enviar o seu esboço.", "couldNotFindPreviouslySelected": "Não foi possível encontrar a placa selecionada anteriormente '{0}' na plataforma instalada '{1}'. Por favor, selecione manualmente a placa que deseja usar. Você deseja selecioná-la novamente agora?", "disconnected": "Desconectado", "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": "No boards found for \"{0}\"", + "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": "Native serial port, can't obtain info.", + "noNativeSerialPort": "Porta serial nativa, não é possível obter informações.", "noPortsDiscovered": "Nenhuma porta detectada", "noPortsSelected": "Nenhuma porta selecionada para placa: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", + "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": "ports", + "ports": "portas", "programmer": "Programador/Gravador", "reselectLater": "Selecionar novamente mais tarde", "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", "showAllAvailablePorts": "Mostrar todas as portas disponíveis quando habilitado", - "showAllPorts": "Show all ports", + "showAllPorts": "Mostrar todas as portas", "succesfullyInstalledPlatform": "Plataforma instalada com sucesso {0}: {1}", "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" + "typeOfPorts": "{0} portas", + "unknownBoard": "Placa desconhecida" }, "boardsManager": "Gerenciador de Placas", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Certificado pelo Arduino" }, "bootloader": { "burnBootloader": "Gravar bootloader", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "Gravando carregador de inicialização...", "doneBurningBootloader": "Feita a gravação do bootloader." }, "burnBootloader": { @@ -70,49 +76,48 @@ "uploadingCertificates": "Enviando certificados." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", + "checkForUpdates": "Verificar se há Atualizações do Arduino", "installAll": "Instalar todas", "noUpdates": "Não há atualizações recentes disponíveis.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", + "promptUpdateBoards": "Atualizações estão disponíveis para algumas de suas placas.", + "promptUpdateLibraries": "Atualizações estão disponíveis para algumas de suas bibliotecas.", "updatingBoards": "Atualizando placas...", "updatingLibraries": "Atualizando bibliotecas..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' não encontrado. O seu sketch inclue a linha '#include <Keyboard.h>'?", - "mouseError": "\"Mouse\" não encontrado. O seu sketch inclue a linha '#include <Mouse.h>' ?" + "keyboardError": "'Keyboard' não encontrado. O seu esboço inclui a linha '#include <Keyboard.h>'?", + "mouseError": "\"Mouse\" não encontrado. O seu esboço inclui a linha '#include <Mouse.h>' ?" }, "cloud": { - "account": "Conta", - "chooseSketchVisibility": "Escolha a visibilidade do seu Sketch:", - "cloudSketchbook": "Sketchbook na nuvem", + "chooseSketchVisibility": "Escolha a visibilidade do seu Esboço:", + "cloudSketchbook": "Caderno de Esboços na Nuvem", "connected": "Conectado", "continue": "Continuar", - "donePulling": "Terminou de baixar '{0}'.", - "donePushing": "Concluído o envio de ‘{0}’.", + "donePulling": "'{0}' terminou de baixar.", + "donePushing": "'{0}' foi enviado.", "embed": "Embutir:", - "emptySketchbook": "O seu Sketchbook está vazio", - "goToCloud": "Go to Cloud", + "emptySketchbook": "O seu Caderno de Esboços está vazio", + "goToCloud": "Ir para Nuvem", "learnMore": "Saiba mais", "link": "Endereço", "notYetPulled": "Não é possível enviar para a nuvem. Ainda não foi baixado.", "offline": "Desconectado", "openInCloudEditor": "Abrir no Cloud Editor", "options": "Opções...", - "privateVisibility": "Privado. Só você poderá ver o Sketch.", + "privateVisibility": "Particular. Apenas você poderá ver o Esboço.", "profilePicture": "Foto do perfil", - "publicVisibility": "Público. Qualquer pessoa com o link poderá visualizar o Sketch.", + "publicVisibility": "Público. Qualquer pessoa com o link poderá ver o Esboço.", "pull": "Baixar", "pullFirst": "Você precisa baixar primeiro para poder enviar para a nuvem.", - "pullSketch": "Baixar Sketch", - "pullSketchMsg": "Baixar este Sketch da nuvem irá sobrescrever sua versão local. Você tem certeza que deseja continuar?", + "pullSketch": "Baixar Esboço", + "pullSketchMsg": "Baixar esse Esboço da Nuvem irá sobrescrever a sua versão local. Você tem certeza que deseja continuar?", "push": "Enviar", - "pushSketch": "Enviar Sketch", - "pushSketchMsg": "Este é um Sketch Público. Antes de enviar, verifique qualquer informação sensível que esteja denifinda nos arquivos arduino_secrets.h. Você pode tornar um Sketch privado a partir do painel Compartilhar.", + "pushSketch": "Enviar Esboço", + "pushSketchMsg": "Esse é um Esboço Público. Antes de enviá-lo, tenha certeza que qualquer informação sensível esteja definida nos arquivos arduino_secrets.h. Você pode tornar um Esboço particular no painel Compartilhar.", "remote": "Remoto", "share": "Compartilhar...", - "shareSketch": "Compartilhar Sketch", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "shareSketch": "Compartilhar Esboço", + "showHideSketchbook": "Mostrar/Esconder Caderno de esboços na Nuvem", "signIn": "ENTRAR", "signInToCloud": "Faça login no Arduino Cloud", "signOut": "Sair", @@ -121,17 +126,17 @@ "visitArduinoCloud": "Visite Arduino Cloud para criar 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..." + "alreadyExists": "Esboço na nuvem '{0}' já existe.", + "creating": "Criando esboço na nuvem '{0}'...", + "new": "Novo Esboço na Nuvem", + "notFound": "Não foi possível baixar o esboço na nuvem '{0}'. Esboço inexistente.", + "pulling": "Sincronizando cadernos de esboços, baixando '{0}'...", + "pushing": "Sincronizando cadernos de esboço, enviando '{0}'.", + "renaming": "Renomeando esboço na nuvem de '{0}' para '{1}'...", + "synchronizingSketchbook": "Sincronizando cadernos de esboço..." }, "common": { - "all": "All", + "all": "Todos", "contributed": "Contribuído", "installManually": "Instalar Manualmente", "later": "Depois", @@ -139,15 +144,15 @@ "notConnected": "[não está conectado]", "offlineIndicator": "Parece que você está offline. Sem conexão com a Internet, o Arduino CLI não será capaz de baixar os recursos exigidos e poderá provovar mau funcionamento. Por favor, conecte-se à Internet e reinicie o aplicativo.", "oldFormat": "O '{0}' ainda utiliza o formato antigo `.pde`. Deseja mudar para a nova extensão `.ino`?", - "partner": "Partner", + "partner": "Parceiro", "processing": "Em processamento", "recommended": "Recomendado", - "retired": "Retired", + "retired": "Afastado", "selectedOn": "em {0}", "serialMonitor": "Monitor Serial", "type": "Tipo", "unknown": "Desconhecido", - "updateable": "Updatable" + "updateable": "Atualizável" }, "compile": { "error": "Erro de compilação: {0}" @@ -155,39 +160,49 @@ "component": { "boardsIncluded": "Placas incluídas nesse pacote:", "by": "por", + "clickToOpen": "Aperte para abrir no navegador: {0}", "filterSearch": "Filtrar a sua pesquisa…", "install": "Instalar", - "installed": "Installed", + "installLatest": "Instalar mais recente", + "installVersion": "Instalar {0}", + "installed": "{0} instalado", "moreInfo": "Mais informações", + "otherVersions": "Outras Versões", + "remove": "Remover", + "title": "{0} por {1}", "uninstall": "Desinstalar", "uninstallMsg": "Deseja desinstalar {0}?", - "version": "Versão {0}" + "update": "Atualizar" }, "configuration": { "cli": { - "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + "inaccessibleDirectory": "Não foi possível acessar a localização do caderno de esboço em '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Conexão perdida. Atualizações e Ações de Esboço na Nuvem não estarão disponíveis." + }, "contributions": { "addFile": "Adicionar Arquivo", "fileAdded": "Um arquivo adicionado ao sketch.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "Não foi possível abrir o planejador serial" }, "replaceTitle": "Substituir" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "Todos", + "default": "Padrão", + "more": "Mais", + "none": "Nenhum" } }, "coreContribution": { "copyError": "Mensagem de erro Copiar", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Nenhuma placa selecionada. Por favor, selecione a sua placa Arduino do menu Ferramentas -> Placas." }, + "createCloudCopy": "Enviar Esboço para Nuvem", "daemon": { "restart": "Reiniciar Daemon", "start": "Iniciar Daemon", @@ -198,7 +213,7 @@ "debuggingNotSupported": "A depuração não é suportada por '{0}'", "noPlatformInstalledFor": "A plataforma não está instalada para '{0}'", "optimizeForDebugging": "Otimizar para Depuração", - "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": "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?" }, "dialog": { "dontAskAgain": "Não perguntar novamente" @@ -213,7 +228,7 @@ "increaseIndent": "Aumentar Recuo", "nextError": "Próximo Erro", "previousError": "Erro Anterior", - "revealError": "Reveal Error" + "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.", @@ -273,10 +288,10 @@ "contributedLibraries": "Bibliotecas contribuídas", "include": "Incluir Biblioteca", "installAll": "Instalar todas", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "Instalar dependências da biblioteca", "installMissingDependencies": "Deseja instalar todas as dependências ausentes?", "installOneMissingDependency": "Deseja instalar a dependência ausente?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Instalar sem dependências", "installedSuccessfully": "Biblioteca instalada com sucesso {0}: {1}", "libraryAlreadyExists": "Essa biblioteca já existe. Você deseja sobrescreve-la?", "manageLibraries": "Gerenciar bibliotecas...", @@ -290,22 +305,22 @@ "zipLibrary": "Biblioteca" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Tópico" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Comunicação", + "dataProcessing": "Processamento de Dados", + "dataStorage": "Armazenamento de Dados", + "deviceControl": "Controle do Dispositivo", + "display": "Mostrar", + "other": "Outros", + "sensors": "Sensores", + "signalInputOutput": "Sinal de Entrada/Saída", + "timing": "Temporização", + "uncategorized": "Sem categoria" }, "libraryType": { - "installed": "Installed" + "installed": "Instalados" }, "menu": { "advanced": "Avançado", @@ -313,11 +328,18 @@ "tools": "Ferramentas" }, "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": "Impossível fechar websocket", "unableToConnectToWebSocket": "Impossível conectar ao websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Nome do novo Esboço na Nuvem" }, "portProtocol": { "network": "Rede", @@ -332,14 +354,14 @@ "automatic": "Automático", "board.certificates": "Lista de certificados que podem ser carregados nas placas", "browse": "Procurar", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Receba notificações de atualizações disponíveis para a IDE, placas, e bibliotecas. Requer que a IDE seja reinicializada depois de mudanças. Verdadeiro por padrão.", "choose": "Escolher", "cli.daemonDebug": "Habilite o log de depuração das chamadas gRPC para a CLI do Arduino. Uma reinicialização do IDE é necessária para que essa configuração tenha efeito. É falso por padrão.", - "cloud.enabled": "Verdadeiro se as funções de sincronização de sketch estiverem ativadas. O padrão é verdadeiro.", - "cloud.pull.warn": "Verdadeiro se os usuários devem ser avisados antes de baixar um sketch da nuvem. O padrão é verdadeiro.", - "cloud.push.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um sketch para a nuvem. O padrão é verdadeiro.", - "cloud.pushpublic.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um sketch público para a nuvem. O padrão é verdadeiro.", - "cloud.sketchSyncEndpoint": "O endpoint usado para enviar e baixar os sketches de um backend. Por padrão, ele aponta para a Arduino Cloud API.", + "cloud.enabled": "Verdadeiro se as funções de sincronização de Esboço estiverem habilitadas. O padrão é verdadeiro.", + "cloud.pull.warn": "Verdadeiro se os usuários devem ser avisados antes de baixar um esboço da nuvem. O padrão é verdadeiro.", + "cloud.push.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um esboço para a nuvem. O padrão é verdadeiro.", + "cloud.pushpublic.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um esboço público para a nuvem. O padrão é verdadeiro.", + "cloud.sketchSyncEndpoint": "O endpoint usado para enviar e baixar os esboços de um backend. Por padrão, ele aponta para a API da Nuvem Arduino.", "compile": "compilar", "compile.experimental": "Verdadeiro se o IDE deve trabalhar com múltiplos erros de compilação. Falso por padrão", "compile.revealRange": "Ajusta como os erros do compilador são revelados no editor após uma falha na verificação/upload. Valores possíveis: 'auto': Role verticalmente conforme necessário e revele uma linha. 'center': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente. 'top': Role verticalmente conforme necessário e revele uma linha próxima ao topo da janela de visualização, otimizada para visualizar uma definição de código. 'centerIfOutsideViewport': Role verticalmente conforme necessário e revele uma linha centralizada verticalmente somente se estiver fora da viewport. O valor padrão é '{0}'.", @@ -349,32 +371,32 @@ "editorFontSize": "Tamanho da fonte do editor", "editorQuickSuggestions": "Dicas do editor", "enterAdditionalURLs": "Insira URLs adicionais, uma por linha", - "files.inside.sketches": "Mostrar arquivos dentro dos Sketches", + "files.inside.sketches": "Mostrar arquivos dentro dos Esboços", "ide.updateBaseUrl": "A URL base de onde baixar atualizações. Padrão para 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "Canal de lançamento para se atualizar. 'stable' é o lançamento estável, 'nightly' é o último build de desenvolvimento.", "interfaceScale": "Dimensões da interface", "invalid.editorFontSize": "Tamanho da fonte do editor inválido. Deve ser um número inteiro positivo.", - "invalid.sketchbook.location": "Localização inválida para o sketchbook: {0}", + "invalid.sketchbook.location": "Localização inválida para o caderno de esboços: {0}", "invalid.theme": "Tema inválido", - "language.log": "Verdadeiro se o Arduino Language Server deverá gerar arquivos de log na pasta do sketch. Caso contrário, falso. Falso é padrão.", + "language.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", "network": "Rede", - "newSketchbookLocation": "Escolher", - "noCliConfig": "Could not load the CLI configuration", + "newSketchbookLocation": "Escolher nova localização para o Caderno de Esboços", + "noCliConfig": "Não foi possível carregar a configuração CLI", "noProxy": "Sem proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "Nome do Hospedeiro", + "password": "Senha", + "port": "número da Porta", + "username": "Nome de usuário" }, "showVerbose": "Mostrar a saída detalhada durante", "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": "Caminho absoluto do sistema de arquivos para o arquivo de projeto `.ino`. Se especificado, o conteúdo do arquivo de projeto vai ser usado a cada esboço novo criado pela IDE. Se não especificado, os esboços vão ser gerados com o conteúdo padrão do Arduino. Arquivos de projeto inacessíveis são ignorados. **Uma reinicialização da IDE é necessária** para que essa configuração entre em efeito." }, - "sketchbook.location": "Localização dos Sketchbooks", - "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de sketch dentro do sketch. Falso é padrão.", + "sketchbook.location": "Localização do Caderno de Esboços", + "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de esboço dentro do esboço. O padrão é falso.", "survey.notification": "Verdadeiro se o usuário deve ser notificado se uma pesquisa estiver disponível. Verdadeiro por padrão", "unofficialBoardSupport": "Clique para obter uma lista de URLs de placas não oficiais suportadas", "upload": "enviar", @@ -382,18 +404,19 @@ "verifyAfterUpload": "Verificar o código após enviar", "window.autoScale": "Verdadeiro se a interface do usuário for dimensionada automaticamente com o tamanho da fonte.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Descontinuada. Use 'window.zoomLevel' ao invés disso." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Novo nome para o Esboço na Nuvem" }, "replaceMsg": "Substituir a versão existente de {0}?", "selectZip": "Selecione um arquivo zip contendo a biblioteca que deseja adicionar", "serial": { "autoscroll": "Avanço automático de linha", "carriageReturn": "Retorno de linha", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Mensagem ({0} + Enter para enviar mensagem para '{1}' em '{2}'", "newLine": "Nova linha", "newLineCarriageReturn": "Nova linha e retorno de linha", "noLineEndings": "Sem final de linha", @@ -403,77 +426,88 @@ "toggleTimestamp": "Mudar Data e Hora" }, "sketch": { - "archiveSketch": "Arquivar Sketch", - "cantOpen": "Directoria chamada \"{0}\" já existe. Não é possível abrir o rascunho.", - "close": "Tem certeza que deseja fechar o sketch?", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", + "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}'.", "doneCompiling": "Compilação concluída.", "doneUploading": "Envio concluído.", - "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": "Você quer tentar salvar o esboço para um local diferente?", + "editInvalidSketchFolderQuestion": "Você quer tentar salvar o esboço com um nome diferente?", "exportBinary": "Exportar Binário Compilado", - "invalidCloudSketchName": "The name must start with a letter or number, 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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidCloudSketchName": "O nome deve começar com uma letra, número, ou underline, seguido por letras, números, hífens, pontos ou underlines. O tamanho máximo é 36 caracteres. ", + "invalidSketchFolderLocationDetails": "Você não pode salvar um esboço em um diretório dentro de si mesmo.", + "invalidSketchFolderLocationMessage": "Localização de diretório de esboço inválida: '{0}'", + "invalidSketchFolderNameMessage": "Nome de diretório de esboço inválido: '{0}'", + "invalidSketchName": "O nome deve começar com uma letra, número, ou underline, seguido por letras, números, hífens, pontos ou underlines. O tamanho máximo é 63 caracteres. ", "moving": "Movendo", "movingMsg": "O ficheiro \"{0}\" tem que estar dentro de uma pasta de esboços chamada \"{1}\".\nCriar esta pasta, mover o ficheiro e continuar?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "new": "Novo Esboço", + "noTrailingPeriod": "Um nome de arquivo não pode terminar com um ponto.", "openFolder": "Abrir Pasta", "openRecent": "Abrir Recente", - "openSketchInNewWindow": "Abrir sketch em uma nova janela", - "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "Salvar a pasta de sketch como...", - "saveSketch": "Salve seu sketch para abrí-lo novamente mais tarde", - "saveSketchAs": "Salvar a pasta de sketch como...", - "showFolder": "Mostrar a pasta de Sketches", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Sketchbook Local", - "titleSketchbook": "Sketchbook", + "openSketchInNewWindow": "Abrir Esboço em uma Nova Janela", + "reservedFilename": "'{0}' é um nome de arquivo reservado.", + "saveFolderAs": "Salvar diretório de esboço como...", + "saveSketch": "Salve o seu esboço para abrí-lo novamente mais tarde.", + "saveSketchAs": "Salvar o diretório de esboços como...", + "showFolder": "Mostrar o diretório de Esboços...", + "sketch": "Esboço", + "sketchbook": "Caderno de Esboços", + "titleLocalSketchbook": "Caderno de Esboços local", + "titleSketchbook": "Caderno de Esboços", "upload": "Enviar usando Programador", "uploadUsingProgrammer": "Enviar Usando Programador", - "uploading": "Uploading...", + "uploading": "Enviando...", "userFieldsNotFoundError": "Não é possível encontrar dados de usuário para placa conectada", "verify": "Verificar", "verifyOrCompile": "Verificar/Compilar" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Novo Esboço na Nuvem", + "newSketch": "Novo Esboço" }, "survey": { "answerSurvey": "Responder a pesquisa", "dismissSurvey": "Não mostrar novamente", "surveyMessage": "Por favor, ajude-nos a melhorar respondendo essa pequena pesquisa. Nós valorizamos nossa comunidade e gostaríamos de conhecer nossos colaboradores um pouco melhor." }, + "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": "Nuvem" + }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "Atualizar Índices", + "updateLibraryIndex": "Atualizar Índice de Biblioteca", + "updatePackageIndex": "Atualizar Índice de Pacote" }, "upload": { "error": "{0} erro: {1}" }, "userFields": { "cancel": "Cancelar", - "enterField": "Enter {0}", + "enterField": "Insira {0}", "upload": "Carregar" }, "validateSketch": { - "abortFixMessage": "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": "O esboço ainda é inválido. Você quer consertar os problemas restantes? Ao apertar '{0}', um novo esboço irá abrir.", + "abortFixTitle": "Esboço inválido", + "renameSketchFileMessage": "O arquivo de esboço '{0}' não pode ser usado. {1} Você quer renomear o nome do arquivo de esboço agora?", + "renameSketchFileTitle": "Nome de arquivo de esboço inválido.", + "renameSketchFolderMessage": "O esboço '{0}' não pode ser usado. {1} Para se livrar dessa mensagem, renomeie o esboço. Você quer renomear o esboço agora?", + "renameSketchFolderTitle": "Nome de esboço inválido." }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' já existe." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "Não foi possível salvar o sketch. Copie seu trabalho não salvo em seu editor de texto favorito e reinicie a IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", + "offlineText": "Desconectado", "quitTitle": "Você tem certeza que quer sair?" }, "editor": { @@ -493,8 +528,8 @@ "expand": "Expandir" }, "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": "O Esboço na Nuvem '{0}' vai ser permanentemente deletado dos servidores Arduino e das memórias locais. Essa ação é irreversível. Você quer deletar o esboço atual?", + "deleteCurrentSketch": "O Esboço '{0}' vai ser permanentemente deletado. Essa ação é irreversível. Você quer deletar o esboço atual?", "fileNewName": "Nome para o novo arquivo", "invalidExtension": "\".{0}\" não é uma extensão válida.", "newFileName": "Novo nome para o arquivo" diff --git a/i18n/ro.json b/i18n/ro.json index bd5ef08fd..fc74bc520 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Despre {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Conectat", "continue": "Continuă", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "de", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filtrează căutarea...", "install": "Instalează", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Mai multe informații", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Dezinstalează", "uninstallMsg": "Dorești să dezinstalezi {0}?", - "version": "Versiunea {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Adaugă Fișier", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "tools": "Unelte" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", "unableToConnectToWebSocket": "Unable to connect to websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoderulare", "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Linie Nouă", "newLineCarriageReturn": "NL și CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -431,7 +454,7 @@ "saveSketch": "Save your sketch to open it again later.", "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", - "sketch": "Sketch", + "sketch": "Schița", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Deconectat", + "offlineText": "Deconectat", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/ru.json b/i18n/ru.json index 16d640bad..06f0ae305 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "О программе {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Плата{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' не найдено. В вашем скетче есть строка '#include <Mouse.h>'?" }, "cloud": { - "account": "Аккаунт", "chooseSketchVisibility": "Выберите видимость своего скетча:", "cloudSketchbook": "Альбом в облаке", "connected": "Подключено", "continue": "Продолжить", - "donePulling": "Закончить вытягивание ‘{0}’.", - "donePushing": "Отправлено ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Встроить:", "emptySketchbook": "Ваш альбом пуст", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "от", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Отфильтровать результаты поиска...", "install": "Установка", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Дополнительная информация", + "otherVersions": "Other Versions", + "remove": "Удалить", + "title": "{0} by {1}", "uninstall": "Удалить", "uninstallMsg": "Вы хотите удалить {0}?", - "version": "Версия {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Добавить файл...", "fileAdded": "Один файл добавлен в скетч.", @@ -188,6 +202,7 @@ "copyError": "Скопировать сообщения ошибок", "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "Перезапустить Daemon", "start": "Запустить Daemon", @@ -313,6 +328,13 @@ "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": "Не удалось закрыть веб-сокет.", "unableToConnectToWebSocket": "Не удается подключиться к веб-сокету." }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Автопрокрутка", "carriageReturn": "CR Возврат каретки", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Новая строка", "newLineCarriageReturn": "NL & CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Переместить", "movingMsg": "Файл «{0}» должен быть в папке с именем скетча «{1}». \nСоздать эту папку, переместить файл и продолжить?", "new": "New Sketch", @@ -426,7 +449,7 @@ "openFolder": "Открыть папку", "openRecent": "Открыть предыдущий", "openSketchInNewWindow": "Открыть скетч в новом окне", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "{0} это зарезервированное имя файла.", "saveFolderAs": "Сохранить папку со скетчем как...", "saveSketch": "Сохраните свой скетч, чтобы открыть его позже.", "saveSketchAs": "Сохранить папку скетча как...", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "Update Indexes", "updateLibraryIndex": "Update Library Index", @@ -470,10 +504,10 @@ "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." + "alreadyExists": "{0} уже существует." } }, "theia": { @@ -483,6 +517,7 @@ "couldNotSave": "Скетч не сохранён. Пожалуйста, скопируйте вашу не сохраненную работу в ваш внешний текстовый редактор и перезапустите IDE.", "daemonOffline": "CLI демон не подключен", "offline": "Не подключено", + "offlineText": "Не подключено", "quitTitle": "Вы уверены, что хотите выйти?" }, "editor": { diff --git a/i18n/sl.json b/i18n/sl.json index 8fd1a3a1b..08a47309e 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -4,6 +4,12 @@ "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", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/sr.json b/i18n/sr.json index b6d06fd8c..989a1a542 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "О {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Плоча{0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Одабери видљивост твог рада:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Повезан", "continue": "Наставите", - "donePulling": "Готово повлачење ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Угради:", "emptySketchbook": "Твоја радна свеска је празна", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "од", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Филтрирај претрагу...", "install": "Инсталирај", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Више информација", + "otherVersions": "Other Versions", + "remove": "Избаци", + "title": "{0} by {1}", "uninstall": "Деинсталирај", "uninstallMsg": "Да ли желиш да деинсталираш {0}? ", - "version": "Верзија {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Додај датотеку", "fileAdded": "Датотека је додата у рад.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Аутоматско скроловање", "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нова линија", "newLineCarriageReturn": "И нова линија и CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Премјешта се", "movingMsg": "Датотека \"{0}\" мора да буде унутар радног директоријума \"{1}\".\nКреирај овај директоријум, премјести датотеку, и настави?", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", "daemonOffline": "CLI Daemon Offline", "offline": "Није на мрежи", + "offlineText": "Није на мрежи", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/sv.json b/i18n/sv.json new file mode 100644 index 000000000..08a47309e --- /dev/null +++ b/i18n/sv.json @@ -0,0 +1,538 @@ +{ + "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 <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.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/th.json b/i18n/th.json index c9644f06d..c00cfd34c 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "เกี่ยวกับ{0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "บอร์ด{0}", "boardConfigDialogTitle": "เลือกบอร์ดและพอร์ตอื่นๆ", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Install", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "Remove", + "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Add File", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "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", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/tr.json b/i18n/tr.json index c319e02c6..afef553bb 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -4,6 +4,12 @@ "detail": "Versiyon: {0}\nTarih: {1}{2}\nCLI Versiyonu: {3}\n\n{4}", "label": "{0} Hakkında" }, + "account": { + "goToCloudEditor": "Bulut Düzenleyici'ye Git", + "goToIoTCloud": "IoT Bulut'a Git", + "goToProfile": "Profile Git", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Kart{0}", "boardConfigDialogTitle": "Başka Kart ve Port Seç", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' bulunamadı. Eskiziniz '#include <Mouse.h>' satırını içeriyor mu? " }, "cloud": { - "account": "Hesap", "chooseSketchVisibility": "Eskizinizin görünürlüğünü seçin", "cloudSketchbook": "Bulut Eskiz Defteri", "connected": "Bağlandı", "continue": "Devam et", - "donePulling": "Çekme bitti: ‘{0}’.", - "donePushing": "Gönderme bitti: ‘{0}’.", + "donePulling": "Çekme bitti: '{0}'.", + "donePushing": "Gönderme bitti: '{0}'.", "embed": "Yerleştir:", "emptySketchbook": "Eskiz Defteriniz boş", "goToCloud": "Buluta Git", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Bu pakete dahil kartlar:", "by": "-", + "clickToOpen": "Tarayıca açmak için tıkla: {0}", "filterSearch": "Aramayı Filtrele...", "install": "Kur", - "installed": "Kurulu", + "installLatest": "En Yeniyi Kur", + "installVersion": "{0}'i kur", + "installed": "{0} kuruldu", "moreInfo": "Daha fazla bilgi", + "otherVersions": "Diğer Sürümler", + "remove": "Kaldır", + "title": "{0} / {1}", "uninstall": "Kaldır", "uninstallMsg": "{0} kaldırılsın mı?", - "version": "Versiyon {0}" + "update": "Güncelle" }, "configuration": { "cli": { "inaccessibleDirectory": "'{0}': {1} konumundaki eskiz defterine erişilemedi" } }, + "connectionStatus": { + "connectionLost": "Bağlantı koptu. Bulut eskiz işlemleri ve güncellemeleri kullanılamayacak." + }, "contributions": { "addFile": "Dosya Ekle", "fileAdded": "Eskize bir dosya eklendi.", @@ -188,6 +202,7 @@ "copyError": "Hata mesajlarını kopyala", "noBoardSelected": "Kart seçili değil. Lütfen Araçlar > Kart menüsünden Arduino kartınızı seçin." }, + "createCloudCopy": "Eskizi Bulut'a Gönder", "daemon": { "restart": "Arthizmeti Yeniden Başlat", "start": "Arthizmeti Başlat", @@ -313,6 +328,13 @@ "tools": "Araçlar" }, "monitor": { + "alreadyConnectedError": " {0} {1} portuna bağlanılamadı. Zaten bağlı.", + "baudRate": "{0} baud", + "connectionFailedError": "{0} {1} portuna bağlanılamadı.", + "connectionFailedErrorWithDetails": "{0} {1} {2} portuna bağlanılamadı.", + "connectionTimeout": "Zaman aşımı. IDE başarılı bağlantıdan sonra ekrandan 'başarılı' mesajını almadı", + "missingConfigurationError": " {0} {1} portuna bağlanılamadı. Ekran yapılandırması eksik.", + "notConnectedError": " {0} {1} portuna bağlı değil.", "unableToCloseWebSocket": "Websocket kapatılamadı ", "unableToConnectToWebSocket": "Websocket'e bağlanılamadı" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Otomatik Kaydırma", "carriageReturn": "Satır Başı", + "connecting": "'{1}' üzerindeki '{0}' bağlantısı kuruluyor...", "message": "Mesaj ('{0}' - '{1}''a mesaj göndermek için Enter'a basın)", "newLine": "Yeni Satır", "newLineCarriageReturn": "NL ve CR ile Birlikte", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "Eskizi farklı bir konuma kaydetmeyi denemek ister misiniz?", "editInvalidSketchFolderQuestion": "Eskizi farklı bir isimle kaydetmeyi denemek ister misiniz?", "exportBinary": "Derlenmiş Dosyayı Dışa Aktar", - "invalidCloudSketchName": "İsim bir harf veya rakam ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 36 karakterdir.", + "invalidCloudSketchName": "İsim bir harf, rakam veya altçizgi ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 36 karakterdir.", "invalidSketchFolderLocationDetails": "Bir eskizi kendi içindeki bir klasöre kaydedemezsiniz.", "invalidSketchFolderLocationMessage": "Hatalı eskiz klasörü konumu: {0}", "invalidSketchFolderNameMessage": "Hatalı eskiz klasörü adı: {0}", - "invalidSketchName": "İsim bir harf veya rakam ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 63 karakterdir.", + "invalidSketchName": "İsim bir harf, rakam veya altçizgi ile başlamalı, harfler, rakamlar, orta çizgi, nokta veya altçizgi ile devam etmelidir. Azami uzunluk 63 karakterdir.", "moving": "Taşınıyor", "movingMsg": "\"{0}\" dosyasının \"{1}\" isminde bir eskiz klasörünün içinde olması gerekiyor.\nKlasörü oluştur, dosyayı taşı ve devam et?", "new": "Yeni Eskiz", @@ -451,6 +474,17 @@ "dismissSurvey": "Tekrar gösterme", "surveyMessage": "Lütfen bu çok kısa anketi yanıtlayarak gelişmemize yardım edin. Topluluğumuza değer veriyoruz e destekçilerimizi biraz daha iyi tanımak isteriz." }, + "theme": { + "currentThemeNotFound": "Mevcut seçili tema bulunamadı: {0}. Arduino IDE kayıp olanın yerine uyumlu dahili bir tane seçti.", + "dark": "Koyu", + "deprecated": "{0} (kaldırıldı)", + "hc": "Yüksek Karşıtlık", + "light": "Açık", + "user": "{0} (kullanıcı)" + }, + "title": { + "cloud": "Bulut" + }, "updateIndexes": { "updateIndexes": "Katalogları Güncelle", "updateLibraryIndex": "Kütüphane Kataloğunu Güncelle", @@ -483,6 +517,7 @@ "couldNotSave": "Eskiz kaydedilemedi. Lütfen kaydedilmeyen işinizi favori metin düzenleyicinize kopyalayın ve IDE'yi yeniden başlatın.", "daemonOffline": "CLI Daemon Çevrimdışı", "offline": "Çevrimdışı", + "offlineText": "Çevrimdışı", "quitTitle": "Çıkmak istediğinizden emin misiniz?" }, "editor": { diff --git a/i18n/uk.json b/i18n/uk.json index 9c7ec97c1..48106a3db 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Про {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "Плата {0}", "boardConfigDialogTitle": "Оберіть іншу плату або порт", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Connected", "continue": "Продовжити", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Embed:", "emptySketchbook": "Your Sketchbook is empty", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Filter your search...", "install": "Встановити", - "installed": "Встановлено ", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Більше інформації ", + "otherVersions": "Other Versions", + "remove": "Видалити ", + "title": "{0} by {1}", "uninstall": "Видалити", "uninstallMsg": "Do you want to uninstall {0}?", - "version": "Version {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "Додати Файл", "fileAdded": "One file added to the sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Нова лінія", "newLineCarriageReturn": "Both NL & CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "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": { diff --git a/i18n/vi.json b/i18n/vi.json index 9f4cea759..7b65daa25 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {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" + }, "board": { "board": "Bo mạch {0}", "boardConfigDialogTitle": "Select Other Board and Port", @@ -83,13 +89,12 @@ "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" }, "cloud": { - "account": "Account", "chooseSketchVisibility": "Chọn khả năng hiển thị của Sketch của bạn:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Đã kết nối", "continue": "Tiếp tục", - "donePulling": "Hoàn tất tải xuống '{0}'.", - "donePushing": "Hoàn tất đẩy lên '{0}'.", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "Nhúng: ", "emptySketchbook": "Sketchbook của bạn đang trống", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "bởi", + "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", - "installed": "Installed", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "Thêm thông tin", + "otherVersions": "Other Versions", + "remove": "Loại bỏ", + "title": "{0} by {1}", "uninstall": "Gỡ cài đặt", "uninstallMsg": "Bạn có muốn gỡ cài đặt {0}?", - "version": "Phiên bản {0}" + "update": "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": "Thêm tệp...", "fileAdded": "Một tệp đã được thêm vào sketch.", @@ -188,6 +202,7 @@ "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", @@ -313,6 +328,13 @@ "tools": "Công cụ" }, "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" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "Tự động cuộn", "carriageReturn": "Về đầu dòng", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "Dòng mới", "newLineCarriageReturn": "Vừa xuống dòng & về đầu dòng", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Xuất tệp nhị phân đã biên dịch", - "invalidCloudSketchName": "The name must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "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", @@ -451,6 +474,17 @@ "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", @@ -483,6 +517,7 @@ "couldNotSave": "Không thể lưu sketch. Hãy sao chép tất cả những phần việc chưa được lưu lại vào trình chỉnh sửa văn bản yêu thích của bạn, và khởi động lại IDE.", "daemonOffline": "Trình chạy nền CLI ngoại tuyến", "offline": "Ngoại tuyến", + "offlineText": "Ngoại tuyến", "quitTitle": "Are you sure you want to quit?" }, "editor": { diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index 91ffe68e7..cff284a55 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -4,6 +4,12 @@ "detail": "版本: {0}\n日期: {1}{2}\n命令列版本: {3}\n\n{4}", "label": "關於 {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "{0} 開發板", "boardConfigDialogTitle": "選擇其他開發板和序列埠", @@ -83,13 +89,12 @@ "mouseError": "找不到 'Mouse', 請檢查草稿碼中是否有 '#include <Mouse.h>'?" }, "cloud": { - "account": "帳戶", "chooseSketchVisibility": "選擇草稿碼的能見度:", "cloudSketchbook": "Cloud Sketchbook", "connected": "已連線", "continue": "繼續", - "donePulling": "已完成拉取 '{0}'。", - "donePushing": "已完成推送 '{0}'。", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "嵌入:", "emptySketchbook": "您的草稿碼簿是空的", "goToCloud": "前往 Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "包含在此套件的開發版:", "by": "提供者:", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "篩選搜尋結果...", "install": "安裝", - "installed": "已安装", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "詳細資訊", + "otherVersions": "Other Versions", + "remove": "移除", + "title": "{0} by {1}", "uninstall": "移除安裝", "uninstallMsg": "你要移除 {0} 嗎?", - "version": "版本 {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "無法存取位於 '{0}' :{1} 的草稿碼簿。" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "加入檔案", "fileAdded": "已加入一個檔案到草稿碼中", @@ -188,6 +202,7 @@ "copyError": "複製錯誤訊息", "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取您的開發版" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "重新啟動背景服務程式", "start": "啟動背景服務程式", @@ -313,6 +328,13 @@ "tools": "工具" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "無法關閉 websocket", "unableToConnectToWebSocket": "無法連線到 websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "自動捲動", "carriageReturn": "歸位", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "訊息 (按 Enter 將訊息發送連接到 {1} 的 {0})", "newLine": "換行", "newLineCarriageReturn": "換行加歸位", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "移動", "movingMsg": "檔案{0}需要放在草稿碼資料夾內名稱為{1}的資料夾,\n要建立此資料夾, 搬移檔案再繼續嗎?", "new": "建立新草稿碼", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "更新索引", "updateLibraryIndex": "更新函式庫索引", @@ -483,6 +517,7 @@ "couldNotSave": "無法儲存草稿, 請先將尚未存檔的內容複製到慣用的文字編輯器中, 再重新啟動 IDE。", "daemonOffline": "CLI 背景服務程式離線", "offline": "離線", + "offlineText": "離線", "quitTitle": "你確定要退出嗎?" }, "editor": { diff --git a/i18n/zh.json b/i18n/zh.json index 4311c2ac5..d68eff8ab 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -4,6 +4,12 @@ "detail": "版本:{0}\n日期:{1}{2}\nCLI 版本:{3}\n\n{4}", "label": "关于 {0}" }, + "account": { + "goToCloudEditor": "转到云编辑器", + "goToIoTCloud": "转到物联网云", + "goToProfile": "转到个人资料", + "menuTitle": "Arduino 云" + }, "board": { "board": "开发板 {0}", "boardConfigDialogTitle": "选择其他开发板和端口", @@ -46,7 +52,7 @@ }, "bootloader": { "burnBootloader": "烧录引导程序", - "burningBootloader": "正在烧录引导程序。。。", + "burningBootloader": "正在烧录引导程序…", "doneBurningBootloader": "完成烧录引导程序。" }, "burnBootloader": { @@ -83,13 +89,12 @@ "mouseError": "没有找到 ‘Mouse’,请检查您的项目是否包含 ‘#include<Mouse.h>’?" }, "cloud": { - "account": "账户", "chooseSketchVisibility": "选择项目的可见性:", "cloudSketchbook": "云项目文件夹", "connected": "已连接", "continue": "继续", - "donePulling": "已完成拉取 ‘{0}’。", - "donePushing": "已完成推送 ‘{0}’。", + "donePulling": "拉取完成 ‘{0}’。", + "donePushing": "推送完成 ‘{0}’。", "embed": "嵌入:", "emptySketchbook": "你的项目文件夹是空的", "goToCloud": "前往 Cloud", @@ -123,7 +128,7 @@ "cloudSketch": { "alreadyExists": "云端项目 '{0}' 已经存在。", "creating": "正在创建云端项目 '{0}'...", - "new": "新的云端草图", + "new": "新的云端项目", "notFound": "无法拉取云端项目 '{0}'。它并不存在。", "pulling": "正在同步远程项目文件夹,拉取“{0}”中...", "pushing": "同步项目中,正在推送 '{0}'...", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "包含在此包中的开发板:", "by": "by", - "filterSearch": "筛选搜索结果......", + "clickToOpen": "单击以在浏览器中打开:{0}", + "filterSearch": "筛选搜索结果…", "install": "安装", - "installed": "已安装", + "installLatest": "安装最新版本", + "installVersion": "安装 {0}", + "installed": "{0} 已安装", "moreInfo": "更多信息", + "otherVersions": "其他版本", + "remove": "移除", + "title": "{0} by {1}", "uninstall": "卸载", "uninstallMsg": "是否要卸载 {0}?", - "version": "版本 {0}" + "update": "更新" }, "configuration": { "cli": { "inaccessibleDirectory": "无法访问位于 ‘{0}’ 的项目文件夹:{1}。" } }, + "connectionStatus": { + "connectionLost": "连接丢失。云项目操作和更新操作将不可用。" + }, "contributions": { "addFile": "添加文件", "fileAdded": "将一个文件添加到项目中。", @@ -188,6 +202,7 @@ "copyError": "复制错误信息", "noBoardSelected": "未选择开发板。请从工具 > 板菜单中选择您的 Arduino 开发板。" }, + "createCloudCopy": "推送项目到云端", "daemon": { "restart": "重启守护进程", "start": "启动守护进程", @@ -313,6 +328,13 @@ "tools": "工具" }, "monitor": { + "alreadyConnectedError": "无法连接至 {0} {1} 端口。已有连接。", + "baudRate": "波特率 {0}", + "connectionFailedError": "无法连接至 {0} {1} 端口。", + "connectionFailedErrorWithDetails": "{0} 无法连接至 {1} {2} 端口。", + "connectionTimeout": "超时。IDE 在连接到监视器后,没有收到“成功”消息", + "missingConfigurationError": "无法连接至 {0} {1} 端口。监视器配置缺失。", + "notConnectedError": "没有连接至 {0} {1} 端口。", "unableToCloseWebSocket": "无法关闭 websocket", "unableToConnectToWebSocket": "无法连接 websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "自动滚屏", "carriageReturn": "回车", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "消息(按回车将消息发送到“{1}”上的“{0}”)", "newLine": "换行", "newLineCarriageReturn": "换行 和 回车 两者都是", @@ -406,7 +429,7 @@ "archiveSketch": "项目存档", "cantOpen": "“{0}” 文件夹已存在。无法打开项目。", "close": "是否确实要关闭项目?", - "compile": "正在编译项目。。。", + "compile": "正在编译项目…", "configureAndUpload": "配置并上传", "createdArchive": "已创建存档 ‘{0}’。", "doneCompiling": "编译完成", @@ -414,11 +437,11 @@ "editInvalidSketchFolderLocationQuestion": "你想试试把项目保存到不同的位置吗?", "editInvalidSketchFolderQuestion": "你想尝试用不同的名字保存项目吗?", "exportBinary": "导出已编译的二进制文件", - "invalidCloudSketchName": "名称必须以字母或数字开头,后面可以是字母、数字、破折号、点和下划线。最大长度为 36 个字符。", + "invalidCloudSketchName": "名称必须以字母、数字或下划线开头,后面接着字母、数字、破折号、点和下划线。最大长度为 36 个字符。", "invalidSketchFolderLocationDetails": "你不能把一个项目保存到它本身的一个文件夹里。", "invalidSketchFolderLocationMessage": "无效的项目文件夹位置: '{0}'", "invalidSketchFolderNameMessage": "无效的项目文件夹名称:'{0}'", - "invalidSketchName": "名称必须以字母或数字开头,后面可以是字母、数字、破折号、点和下划线。最大长度为 63 个字符。", + "invalidSketchName": "名称必须以字母、数字或下划线开头,后面接着字母、数字、破折号、点和下划线。最大长度为 63 个字符。", "moving": "移动", "movingMsg": "“{0}” 文件需要位于 “{1}” 项目文件夹中。\n创建此文件夹,移动文件,然后继续?", "new": "新建项目", @@ -427,9 +450,9 @@ "openRecent": "打开最近", "openSketchInNewWindow": "在新窗口打开项目", "reservedFilename": "'{0}' 是一个保留的文件名。", - "saveFolderAs": "将项目文件夹另存为。。。", + "saveFolderAs": "将项目文件夹另存为…", "saveSketch": "保存你的项目,以便以后再次打开它。", - "saveSketchAs": "将项目文件夹另存为。。。", + "saveSketchAs": "将项目文件夹另存为…", "showFolder": "显示项目文件夹", "sketch": "项目", "sketchbook": "项目文件夹", @@ -437,7 +460,7 @@ "titleSketchbook": "项目文件夹", "upload": "上传", "uploadUsingProgrammer": "使用编程器上传", - "uploading": "正在上传。。。", + "uploading": "正在上传…", "userFieldsNotFoundError": "找不到已连接开发板的用户字段", "verify": "验证", "verifyOrCompile": "验证/编译" @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "云" + }, "updateIndexes": { "updateIndexes": "更新索引", "updateLibraryIndex": "更新库索引", @@ -483,6 +517,7 @@ "couldNotSave": "无法保存项目。请将未保存的工作复制到您喜爱的文本编辑器中,然后重新启动 IDE。", "daemonOffline": "CLI 守护进程离线", "offline": "离线", + "offlineText": "离线", "quitTitle": "你确定你要退出吗?" }, "editor": { diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index fd5e14c65..f39db000d 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -4,6 +4,12 @@ "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "關於 {0}" }, + "account": { + "goToCloudEditor": "Go to Cloud Editor", + "goToIoTCloud": "Go to IoT Cloud", + "goToProfile": "Go to Profile", + "menuTitle": "Arduino Cloud" + }, "board": { "board": "{0} 開發板", "boardConfigDialogTitle": "選擇其他開發板和埠", @@ -83,13 +89,12 @@ "mouseError": "找不到 'Mouse',請檢查項目是否包含 '#include <Mouse.h>'。" }, "cloud": { - "account": "帳戶", "chooseSketchVisibility": "選擇草稿的能見度:", "cloudSketchbook": "雲端草稿資料夾", "connected": "已連接", "continue": "繼續", - "donePulling": "完成讀取'{0}'。", - "donePushing": "完成更改'{0}'。", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", "embed": "嵌入:", "emptySketchbook": "您的草稿資料夾是空的", "goToCloud": "Go to Cloud", @@ -155,19 +160,28 @@ "component": { "boardsIncluded": "包含在此包的開發版:", "by": "by", + "clickToOpen": "Click to open in browser: {0}", "filterSearch": "過濾你的搜尋 ...", "install": "安裝", - "installed": "安裝", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", "moreInfo": "更多資訊", + "otherVersions": "Other Versions", + "remove": "移除", + "title": "{0} by {1}", "uninstall": "移除安裝", "uninstallMsg": "你要移除 {0}?", - "version": "版本 {0}" + "update": "Update" }, "configuration": { "cli": { "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" } }, + "connectionStatus": { + "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + }, "contributions": { "addFile": "加入檔案", "fileAdded": "一個檔案加入到 Sketch", @@ -188,6 +202,7 @@ "copyError": "複製錯誤訊息", "noBoardSelected": "未選擇開發版。請從 工具 > 開發版 中選擇您的開發版" }, + "createCloudCopy": "Push Sketch to Cloud", "daemon": { "restart": "重啟進程", "start": "開啟進程", @@ -313,6 +328,13 @@ "tools": "工具" }, "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "無法關閉 websocket", "unableToConnectToWebSocket": "無法連接到 websocket" }, @@ -393,6 +415,7 @@ "serial": { "autoscroll": "自動滾頁面", "carriageReturn": "回車", + "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "換行", "newLineCarriageReturn": "兩者都是NL和CR", @@ -414,11 +437,11 @@ "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "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 or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "移動", "movingMsg": "\"{0}\"必須在命名為\"{1}\"的草稿資料夾中。建立這個資料夾,移動草稿並繼續?", "new": "New Sketch", @@ -451,6 +474,17 @@ "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", + "deprecated": "{0} (deprecated)", + "hc": "High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, "updateIndexes": { "updateIndexes": "Update Indexes", "updateLibraryIndex": "Update Library Index", @@ -483,6 +517,7 @@ "couldNotSave": "無法儲存草稿,請複製你未存檔的工作到你偏好的文字編輯器中並重新啟動 IDE 整合開發環境", "daemonOffline": "CLI 命令列常駐程式離線", "offline": "離線", + "offlineText": "離線", "quitTitle": "你確定要退出嗎?" }, "editor": { From 9fff553f1a628b6e50be8e07545ddafe33095409 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 17 Apr 2023 08:32:51 +0200 Subject: [PATCH 185/384] chore: Prepared for the `2.1.0` release Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 37e682b7f..9d9eb0a7b 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.0.5", + "version": "2.1.0", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 1ffc8860b..d7d71539a 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.0.5", + "version": "2.1.0", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "1.31.1", "@theia/terminal": "1.31.1", "@theia/workspace": "1.31.1", - "arduino-ide-extension": "2.0.5" + "arduino-ide-extension": "2.1.0" }, "devDependencies": { "@theia/cli": "1.31.1", diff --git a/package.json b/package.json index 2e97fea6e..6b274847a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.0.5", + "version": "2.1.0", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 2c74ad6437429bb547934a90a1e87348b162e98d Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 18 Apr 2023 00:12:46 -0700 Subject: [PATCH 186/384] Don't upload "channel update info files" related to manual builds to S3 on release Arduino IDE offers an update to the user when a newer version is available. The availability of an update is determined by comparing the user's IDE version against data file ("channel update info file") stored on Arduino's download server. These "channel update info files" are automatically generated by the build workflow. Previously the release process was fully automated, including the upload of the "channel update info files" to the server. As a temporary workaround for limitations of the GitHub Actions runner machines used to produce the automated builds, some release builds are now produced manually: - Linux build (because the Ubuntu 18.04 runner was shut down and newer runner versions produce builds incompatible with older Linux versions) - macOS Apple Silicon build (because GitHub hosted Apple Silicon runners are not available) The automatic upload of the "channel update info files" produced by the build workflow is problematic because if users receive update offers before the "channel update info files" are updated for the manually produced builds, they can receive an update to a different build than intended: - Users of older Linux versions would update to a build that won't start on their machine - macOS Apple Silicon users would update to macOS x86 build that is less performant on their machine For this reason, the build workflow is adjusted to no longer upload the Linux and macOS "channel update info files" to the download server on release. These files will now be manually uploaded after they have been updated to provide the manually produced builds. This workaround will be reverted once a fully automated release system is regained. --- .github/workflows/build.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6213a4a88..77c506bff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -245,6 +245,15 @@ jobs: file_glob: true body: ${{ needs.changelog.outputs.BODY }} + # Temporary measure to prevent release update offers before the manually produced builds are uploaded. + # The step must be removed once fully automated builds are regained. + - name: Remove "channel update info files" related to manual builds + run: | + # See: https://github.com/arduino/arduino-ide/issues/2018 + rm "${{ env.JOB_TRANSFER_ARTIFACT }}/stable-linux.yml" + # See: https://github.com/arduino/arduino-ide/issues/408 + rm "${{ env.JOB_TRANSFER_ARTIFACT }}/stable-mac.yml" + - name: Publish Release [S3] if: github.repository == 'arduino/arduino-ide' uses: docker://plugins/s3 From 80afd382adbc6a793f914eb77cb6df82e3811564 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 20 Apr 2023 11:00:15 +0200 Subject: [PATCH 187/384] chore: Updated to the next version after release. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 9d9eb0a7b..23e7bcf33 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.1.0", + "version": "2.1.1", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index d7d71539a..5300ec866 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.1.0", + "version": "2.1.1", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "1.31.1", "@theia/terminal": "1.31.1", "@theia/workspace": "1.31.1", - "arduino-ide-extension": "2.1.0" + "arduino-ide-extension": "2.1.1" }, "devDependencies": { "@theia/cli": "1.31.1", diff --git a/package.json b/package.json index 6b274847a..eca3ced89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.1.0", + "version": "2.1.1", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From b3b94948a38ffb21a9fc6b041e47903069562339 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 19 Apr 2023 22:58:58 -0700 Subject: [PATCH 188/384] Document 3rd party theme installation in "Advanced Usage" Arduino IDE comes with a selection of officially maintained and supported built-in themes: - Light - Dark - High Contrast Although these three should be sufficient for most users, some users may have other requirements or preferences for the Arduino IDE UI theming. Fortunately, because it is built on the Eclipse Theia IDE framework, Arduino IDE supports VS Code theme extensions. This makes a large variety of 3rd party themes available to the user, and even the ability to create custom themes. Instructions for installing VS Code theme extensions are here added to the "Advanced Usage" document hosted in the repository. --- docs/advanced-usage.md | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index bd5d96c3b..a21dad1a1 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -12,3 +12,57 @@ These advanced settings can be accessed by the following procedure: 1. Select the "**Preferences: Open Settings (UI)**" command from the menu. This will open a "**Preferences**" view in the IDE. Once you are finished adjusting settings, it can be closed by clicking the **X** icon on the "**Preferences**" tab. + +## 3rd party themes + +Arduino IDE is built on the [**Eclipse Theia** IDE framework](https://theia-ide.org/), which allows it to use [**VS Code**](https://code.visualstudio.com/) themes. + +--- + +❗ Arduino does not maintain or provide support for individual 3rd party themes. If you experience problems with a theme, report it to the theme's maintainer. + +--- + +### Obtaining themes + +A large selection of free VS Code themes are available from the **Visual Studio Marketplace** website: + +1. Find a theme you want to install: <br /> + https://marketplace.visualstudio.com/search?target=VSCode&category=Themes +1. Click on the theme to open its extension page. +1. Click the "**Download Extension**" link on the right side of the extension page. +1. Wait for the download to finish. + +### Installation + +1. If Arduino IDE is running, select **File > Quit** from the Arduino IDE menus to exit all windows. +1. Create a folder named `plugins` under Arduino IDE's configuration folder: + - **Windows:** + ```text + C:\Users\<username>\.arduinoIDE\ + ``` + (where `<username>` is your Windows username) + - **Linux:** + ```text + ~/.arduinoIDE/ + ``` + ❗ The `.arduinoIDE` folder is hidden by default in the file manager and terminal. + - **macOS:** + ```text + ~/.arduinoIDE/ + ``` + ❗ The `.arduinoIDE` folder is hidden by default. You can make it visible by pressing the <kbd>**Command**</kbd>+<kbd>**Shift**</kbd>+<kbd>**.**</kbd> keyboard shortcut. +1. Copy the downloaded theme file to the `plugins` folder you created. +1. Start Arduino IDE. +1. Select **File > Preferences** from the Arduino IDE menus. <br /> + The "**Preferences**" dialog will open. +1. Select the name of the new theme from the "**Theme**" menu in the "**Preferences**" dialog. +1. Click the "**OK**" button. + +### Uninstall + +If you later decide you would like to remove a 3rd party theme you installed, it can be done by following these instructions: + +1. If Arduino IDE is running, select **File > Quit** from the Arduino IDE menus to exit all windows. +1. Delete the theme's `.vsix` file from [the location you installed it to](#installation). <br /> + ⚠ Please be careful when deleting things from your computer. When in doubt, back up! From b451e2db8c35aa119f33385de5adcf291d2fba02 Mon Sep 17 00:00:00 2001 From: Muhammad Zaheer <me@nmzaheer.in> Date: Tue, 1 Nov 2022 14:04:43 +0530 Subject: [PATCH 189/384] Corrected library.properties assignment w.r.t description and summary Ref: arduino/arduino-ide#1611 --- arduino-ide-extension/src/node/library-service-impl.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index 1bb836dcc..e31020995 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -221,8 +221,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()), @@ -462,9 +462,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(), }; From 097c92d904ca9b126e54b6a58030b5f4c650f075 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 12 Apr 2023 19:16:23 +0200 Subject: [PATCH 190/384] fix: reduced unnecessary `GET /sketches` request Ref: #1849 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/create/create-api.ts | 33 ++++--- .../src/test/browser/create-api.test.ts | 95 ++++++++++++++++++- 2 files changed, 107 insertions(+), 21 deletions(-) diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index b2aac2b02..beebf0a1e 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( 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..13bd8686e 100644 --- a/arduino-ide-extension/src/test/browser/create-api.test.ts +++ b/arduino-ide-extension/src/test/browser/create-api.test.ts @@ -1,4 +1,8 @@ -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'; @@ -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); + createApi = + createContainer(accessToken).get<TestCreateApi>(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 @@ -224,6 +229,47 @@ describe('create-api', () => { expect(findByName(otherName, sketches)).to.be.not.undefined; }); + [ + [-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<unknown>); + + 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); + }) + ); + ['.', '-', '_'].map((char) => { it(`should create a new sketch with '${char}' in the sketch folder name although it's disallowed from the Create Editor`, async () => { const name = `sketch${char}`; @@ -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 }; +} From 51f69f6a5930ed1c947ac708b2d7280ea3e0cd57 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 14 Apr 2023 17:33:45 +0200 Subject: [PATCH 191/384] test: gRPC core client init integration test - Copied the env-variable server from Theia and made it possible to customize it for the tests. Each test has its own `data` folder. - Relaxed the primary package and library index error detection. This should make the init error detection locale independent. - Kill the daemon process subtree when stopping the daemon. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- .../src/browser/create/create-api.ts | 2 +- .../src/node/arduino-daemon-impl.ts | 16 +- .../src/node/arduino-ide-backend-module.ts | 6 +- .../src/node/core-client-provider.ts | 3 - .../env-variables/env-variables-server.ts | 119 ++++++- .../node/boards-service-impl.slow-test.ts | 11 +- .../node/core-client-provider.slow-test.ts | 337 ++++++++++++++++++ .../test/node/core-service-impl.slow-test.ts | 22 +- .../node/library-service-impl.slow-test.ts | 17 +- .../node/sketches-service-impl.slow-test.ts | 11 +- .../src/test/node/test-bindings.ts | 136 +++++-- yarn.lock | 5 - 13 files changed, 596 insertions(+), 91 deletions(-) create mode 100644 arduino-ide-extension/src/test/node/core-client-provider.slow-test.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 23e7bcf33..aaa55f0f3 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -68,7 +68,7 @@ "cpy": "^8.1.2", "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", - "deepmerge": "2.0.1", + "deepmerge": "^4.2.2", "electron-updater": "^4.6.5", "fast-json-stable-stringify": "^2.1.0", "fast-safe-stringify": "^2.1.1", diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index beebf0a1e..89244a427 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -512,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/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 327544555..6008cdc95 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -16,6 +16,7 @@ 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'; @injectable() export class ArduinoDaemonImpl @@ -34,6 +35,9 @@ 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<string>(); private readonly onDaemonStoppedEmitter = new Emitter<void>(); @@ -84,8 +88,16 @@ export class ArduinoDaemonImpl ).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.'); 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..d40a462e2 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, @@ -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/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 05b32d357..eb6f020ab 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -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/theia/env-variables/env-variables-server.ts b/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts index 7380cb71e..888817d35 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 'os'; +import { join } from '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<string> { + return process.execPath; + } + + async getVariables(): Promise<EnvVariable[]> { + return Object.keys(this.envs).map((key) => this.envs[key]); + } + + async getValue(key: string): Promise<EnvVariable | undefined> { + if (isWindows) { + key = key.toLowerCase(); + } + return this.envs[key]; + } + + async getConfigDirUri(): Promise<string> { + return this.configDirUriProvider.configDirUri().toString(); + } + + async getHomeDirUri(): Promise<string> { + return this.homeDirUri; + } + + async getDrives(): Promise<string[]> { + const uris: string[] = []; + const drives = await listDrives(); + for (const drive of drives) { + for (const mountpoint of drive.mountpoints) { + if (this.filterHiddenPartitions(mountpoint.path)) { + uris.push(FileUri.create(mountpoint.path).toString()); + } + } + } + return uris; + } + + /** + * Filters hidden and system partitions. + */ + private filterHiddenPartitions(path: string): boolean { + // OS X: This is your sleep-image. When your Mac goes to sleep it writes the contents of its memory to the hard disk. (https://bit.ly/2R6cztl) + if (path === '/private/var/vm') { + return false; + } + // Ubuntu: This system partition is simply the boot partition created when the computers mother board runs UEFI rather than BIOS. (https://bit.ly/2N5duHr) + if (path === '/boot/efi') { + return false; + } + return true; + } } diff --git a/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts index fe89cc4b2..de243d2f6 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 './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>(BoardsService); }); @@ -94,7 +89,7 @@ describe('boards-service-impl', () => { }); }); -function createContainer(): Container { +async function createContainer(): Promise<Container> { return createBaseContainer(); } 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..5e7c92ebf --- /dev/null +++ b/arduino-ide-extension/src/test/node/core-client-provider.slow-test.ts @@ -0,0 +1,337 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { waitForEvent } from '@theia/core/lib/common/promise-util'; +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 { promises as fs } from 'fs'; +import { join } from '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 { ConfigDirUriProvider } from '../../node/theia/env-variables/env-variables-server'; +import { ErrnoException } from '../../node/utils/errors'; +import { + createBaseContainer, + createCliConfig, + newTempConfigDirPath, + startDaemon, +} from './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 now = new Date().toISOString(); + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + const libUpdateTimestamp = indexUpdateSummaryBeforeInit['library']; + expect(libUpdateTimestamp).to.be.not.empty; + expect(libUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); + const platformUpdateTimestamp = indexUpdateSummaryBeforeInit['platform']; + expect(platformUpdateTimestamp).to.be.not.empty; + expect(platformUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); + }); + }); + + 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 now = new Date().toISOString(); + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit['library']).to.be.undefined; + const platformUpdateTimestamp = indexUpdateSummaryBeforeInit['platform']; + expect(platformUpdateTimestamp).to.be.not.empty; + expect(platformUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); + }); + 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 now = new Date().toISOString(); + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli(container, ({ coreClientProvider }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + const libUpdateTimestamp = indexUpdateSummaryBeforeInit['library']; + expect(libUpdateTimestamp).to.be.not.empty; + expect(libUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); + expect(indexUpdateSummaryBeforeInit['platform']).to.be.undefined; + }); + 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 } }, + ({ boardsService }) => assertTeensyAvailable(boardsService) + ); + const thirdPartyPackageIndexPath = join( + configDirPath, + 'data', + 'Arduino15', + 'package_teensy_index.json' + ); + deleteSync(thirdPartyPackageIndexPath); + + const container = await startCli(configDirPath, toDispose); + await assertFunctionalCli( + container, + async ({ coreClientProvider, boardsService, coreService }) => { + const { indexUpdateSummaryBeforeInit } = coreClientProvider; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; + + // IDE2 cannot recover from a 3rd party package index issue. + // Only when the primary package or library index is corrupt. + // https://github.com/arduino/arduino-ide/issues/2021 + await coreService.updateIndex({ types: ['platform'] }); + + await assertTeensyAvailable(boardsService); + } + ); + }); +}); + +interface Services { + coreClientProvider: CoreClientProvider; + coreService: CoreService; + libraryService: LibraryService; + boardsService: BoardsService; +} + +async function assertFunctionalCli( + container: Container, + otherAsserts?: (services: Services) => MaybePromise<void> +): Promise<void> { + const coreClientProvider = + container.get<CoreClientProvider>(CoreClientProvider); + const coreService = container.get<CoreService>(CoreService); + const libraryService = container.get<LibraryService>(LibraryService); + const boardsService = container.get<BoardsService>(BoardsService); + expect(coreClientProvider).to.be.not.undefined; + expect(coreService).to.be.not.undefined; + expect(libraryService).to.be.not.undefined; + expect(boardsService).to.be.not.undefined; + + const coreClient = coreClientProvider.tryGetClient; + expect(coreClient).to.be.not.undefined; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { client, instance } = coreClient!; + + const installedBoards = await boardsService.getInstalledBoards(); + expect(installedBoards.length).to.be.equal(0); + + const libraries = await libraryService.search({ + query: 'cmaglie', + type: 'Contributed', + }); + expect(libraries.length).to.be.greaterThanOrEqual(1); + expect( + libraries.filter(({ name }) => name === 'KonnektingFlashStorage').length + ).to.be.greaterThanOrEqual(1); + + // IDE2 runs `board list -w` equivalent, but running a single `board list` + // is sufficient for the tests to check if the serial discover tool is OK. + await new Promise<void>((resolve, reject) => + client.boardList(new BoardListRequest().setInstance(instance), (err) => { + if (err) { + reject(err); + } + resolve(); // The response does not matter. Tests must be relaxed. Maybe there are environments without a serial port? + }) + ); + + return otherAsserts?.({ + coreClientProvider, + coreService, + libraryService, + boardsService, + }); +} + +/** + * Initializes the CLI by creating a temporary config folder including the correctly initialized + * `directories.data` folder so that tests can corrupt it and test it the CLI initialization can recover. + * The resolved path is pointing the temporary config folder. By the time the promise resolves, the CLI + * daemon is stopped. This function should be used to initialize a correct `directories.data` folder and + * the config folder. + */ +async function prepareTestConfigDir( + configOverrides: Partial<DefaultCliConfig> = {}, + otherExpect?: (services: Services) => MaybePromise<void> +): Promise<string> { + const toDispose = new DisposableCollection(); + const params = { configDirPath: newTempConfigDirPath(), configOverrides }; + const container = await createContainer(params); + try { + await start(container, toDispose); + await assertFunctionalCli(container, otherExpect); + const configDirUriProvider = + container.get<ConfigDirUriProvider>(ConfigDirUriProvider); + return FileUri.fsPath(configDirUriProvider.configDirUri()); + } finally { + const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); + // Wait for the daemon stop event. All subprocesses (such as `serial-discovery` and `mdns-discovery`) must terminate. + // Otherwise, `EPERM: operation not permitted, unlink` is thrown on Windows when "corrupting" the `directories.data` folder for the tests. + await Promise.all([ + waitForEvent(daemon.onDaemonStopped, 5_000), + Promise.resolve(toDispose.dispose()), + ]); + } +} + +async function startCli( + configDirPath: string, + toDispose: DisposableCollection +): Promise<Container> { + const cliConfigPath = join(configDirPath, CLI_CONFIG); + try { + await fs.readFile(cliConfigPath); + } catch (err) { + if (ErrnoException.isENOENT(err)) { + throw new Error( + `The CLI configuration was not found at ${cliConfigPath} when starting the tests.` + ); + } + throw err; + } + const container = await createContainer(configDirPath); + await start(container, toDispose); + return container; +} + +async function start( + container: Container, + toDispose: DisposableCollection +): Promise<void> { + await startDaemon(container, toDispose); +} + +async function createContainer( + params: + | { configDirPath: string; configOverrides: Partial<DefaultCliConfig> } + | string = newTempConfigDirPath() +): Promise<Container> { + if (typeof params === 'string') { + return createBaseContainer({ configDirPath: params }); + } + const { configDirPath, configOverrides } = params; + const cliConfig = await createCliConfig(configDirPath, configOverrides); + return createBaseContainer({ configDirPath, cliConfig }); +} diff --git a/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts index 700673c32..faac7b6c7 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 @@ -10,11 +10,7 @@ import { CoreService, SketchesService, } from '../../common/protocol'; -import { - configureBackendApplicationConfigProvider, - createBaseContainer, - startDaemon, -} from './test-bindings'; +import { createBaseContainer, startDaemon } from './test-bindings'; const testTimeout = 30_000; const setupTimeout = 5 * 60 * 1_000; // five minutes @@ -25,14 +21,10 @@ 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); }); @@ -97,10 +89,12 @@ async function start( }); } -function createContainer(): Container { - return createBaseContainer((bind) => { - bind(TestCommandRegistry).toSelf().inSingletonScope(); - bind(CommandRegistry).toService(TestCommandRegistry); +async function createContainer(): Promise<Container> { + return createBaseContainer({ + additionalBindings: (bind, rebind) => { + bind(TestCommandRegistry).toSelf().inSingletonScope(); + rebind(CommandRegistry).toService(TestCommandRegistry); + }, }); } 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..694b86d96 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 './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>(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<Container> { + return createBaseContainer(); } async function start( 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..90ceb6679 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 @@ -11,11 +11,7 @@ import { sync as rimrafSync } from 'rimraf'; 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'; +import { createBaseContainer, startDaemon } from './test-bindings'; const testTimeout = 10_000; @@ -24,9 +20,8 @@ describe('sketches-service-impl', () => { let toDispose: DisposableCollection; before(async () => { - configureBackendApplicationConfigProvider(); toDispose = new DisposableCollection(); - container = createContainer(); + container = await createContainer(); await start(container, toDispose); }); @@ -257,6 +252,6 @@ async function start( await startDaemon(container, toDispose); } -function createContainer(): Container { +async function createContainer(): Promise<Container> { return createBaseContainer(); } diff --git a/arduino-ide-extension/src/test/node/test-bindings.ts b/arduino-ide-extension/src/test/node/test-bindings.ts index 80a3eea7c..279c260a5 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/test-bindings.ts @@ -13,13 +13,20 @@ 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 * as deepmerge from 'deepmerge'; +import { promises as fs, mkdirSync } from 'fs'; +import { dump as dumpYaml } from 'js-yaml'; +import { join } from 'path'; +import { path as tempPath, track } from 'temp'; import { ArduinoDaemon, AttachedBoardsChangeEvent, @@ -33,6 +40,7 @@ import { IndexUpdateDidFailParams, IndexUpdateParams, LibraryPackage, + LibraryService, NotificationServiceClient, NotificationServiceServer, OutputMessage, @@ -44,10 +52,12 @@ import { import { ArduinoDaemonImpl } from '../../node/arduino-daemon-impl'; import { BoardDiscovery } from '../../node/board-discovery'; import { BoardsServiceImpl } from '../../node/boards-service-impl'; +import { CLI_CONFIG, CliConfig, 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,7 +66,12 @@ 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'; +import { + ConfigDirUriProvider, + EnvVariablesServer, +} from '../../node/theia/env-variables/env-variables-server'; + +const tracked = track(); @injectable() class ConsoleLogger extends MockLogger { @@ -234,12 +249,64 @@ 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<CliConfig>); + readonly configDirPath?: string; + readonly additionalBindings?: ( bind: interfaces.Bind, rebind: interfaces.Rebind - ) => void -): Container { + ) => void; +} + +export async function createBaseContainer( + params?: CreateBaseContainerParams +): Promise<Container> { + const configDirUriProvider = new TestConfigDirUriProvider( + params?.configDirPath || newTempConfigDirPath() + ); + if (params?.cliConfig) { + const config = + typeof params.cliConfig === 'function' + ? await params.cliConfig() + : params.cliConfig; + await writeCliConfigFile( + FileUri.fsPath(configDirUriProvider.configDirUri()), + config + ); + } const container = new Container({ defaultScope: 'Singleton' }); const module = new ContainerModule((bind, unbind, isBound, rebind) => { bind(CoreClientProvider).toSelf().inSingletonScope(); @@ -263,6 +330,7 @@ export function createBaseContainer( return child.get<MonitorService>(MonitorService); } ); + bind(ConfigDirUriProvider).toConstantValue(configDirUriProvider); bind(EnvVariablesServer).toSelf().inSingletonScope(); bind(TheiaEnvVariablesServer).toService(EnvVariablesServer); bind(SilentArduinoDaemon).toSelf().inSingletonScope(); @@ -274,6 +342,7 @@ export function createBaseContainer( bind(NotificationServiceServer).toService(TestNotificationServiceServer); bind(ConfigServiceImpl).toSelf().inSingletonScope(); bind(ConfigService).toService(ConfigServiceImpl); + bind(CommandRegistry).toSelf().inSingletonScope(); bind(CommandService).toService(CommandRegistry); bindContributionProvider(bind, CommandContribution); bind(TestBoardDiscovery).toSelf().inSingletonScope(); @@ -282,14 +351,48 @@ export function createBaseContainer( 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<void> { + await fs.mkdir(containerFolderPath, { recursive: true }); + const yaml = dumpYaml(cliConfig); + const cliConfigPath = join(containerFolderPath, CLI_CONFIG); + await fs.writeFile(cliConfigPath, yaml); + console.debug(`Created CLI configuration file at ${cliConfigPath}: +${yaml} +`); +} + +export async function createCliConfig( + configDirPath: string, + configOverrides: Partial<DefaultCliConfig> = {} +): Promise<DefaultCliConfig> { + const directories = { + data: join(configDirPath, 'data', 'Arduino15'), + downloads: join(configDirPath, 'data', 'Arduino15', 'staging'), + 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, <DefaultCliConfig>{ + logging: { level: 'trace' }, + }); + return deepmerge(config, mergedOverrides); +} + export async function startDaemon( container: Container, toDispose: DisposableCollection, @@ -313,18 +416,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/yarn.lock b/yarn.lock index 44833b671..42abbace7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6296,11 +6296,6 @@ deepmerge@*, deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -deepmerge@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" - integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== - default-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" From e6828f86d787715ae07f12fb7f91d520b83f05b8 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 28 Apr 2023 15:10:49 +0200 Subject: [PATCH 192/384] fix: do not exclude cloud sketch diagnostics PROEDITOR-50: error markers have been disabled for built-ins (daedae1). Relaxed the error marker filtering for cloud sketches. Closes #669 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/create/create-features.ts | 8 ++++++-- .../local-cache/local-cache-fs-provider.ts | 6 +++++- .../browser/theia/markers/problem-manager.ts | 20 +++++++++++++++++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/create/create-features.ts b/arduino-ide-extension/src/browser/create/create-features.ts index befce589d..23ab77c21 100644 --- a/arduino-ide-extension/src/browser/create/create-features.ts +++ b/arduino-ide-extension/src/browser/create/create-features.ts @@ -8,6 +8,10 @@ import { AuthenticationSession } from '../../node/auth/types'; 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/local-cache/local-cache-fs-provider.ts b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts index e65c56e85..3bfefeccf 100644 --- a/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts +++ b/arduino-ide-extension/src/browser/local-cache/local-cache-fs-provider.ts @@ -16,6 +16,10 @@ import { import { AuthenticationClientService } from '../auth/authentication-client-service'; import { AuthenticationSession } from '../../common/protocol/authentication-service'; import { ConfigService } from '../../common/protocol'; +import { + ARDUINO_CLOUD_FOLDER, + REMOTE_SKETCHBOOK_FOLDER, +} from '../utils/constants'; export namespace LocalCacheUri { export const scheme = 'arduino-local-cache'; @@ -107,7 +111,7 @@ export class LocalCacheFsProvider return; } this._localCacheRoot = localCacheUri; - for (const segment of ['RemoteSketchbook', 'ArduinoCloud']) { + for (const segment of [REMOTE_SKETCHBOOK_FOLDER, ARDUINO_CLOUD_FOLDER]) { this._localCacheRoot = this._localCacheRoot.resolve(segment); await fileService.createFolder(this._localCacheRoot); } diff --git a/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts b/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts index 4d1e0d084..73b98163c 100644 --- a/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts +++ b/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts @@ -9,6 +9,10 @@ import { Marker } from '@theia/markers/lib/common/marker'; import { ProblemManager as TheiaProblemManager } from '@theia/markers/lib/browser/problem/problem-manager'; import { ConfigServiceClient } from '../../config/config-service-client'; import debounce = require('lodash.debounce'); +import { + ARDUINO_CLOUD_FOLDER, + REMOTE_SKETCHBOOK_FOLDER, +} from '../../utils/constants'; @injectable() export class ProblemManager extends TheiaProblemManager { @@ -16,12 +20,18 @@ export class ProblemManager extends TheiaProblemManager { private readonly configService: ConfigServiceClient; private dataDirUri: URI | undefined; + private cloudCacheDirUri: URI | undefined; @postConstruct() protected override init(): void { super.init(); this.dataDirUri = this.configService.tryGetDataDirUri(); - this.configService.onDidChangeDataDirUri((uri) => (this.dataDirUri = uri)); + this.configService.onDidChangeDataDirUri((uri) => { + this.dataDirUri = uri; + this.cloudCacheDirUri = this.dataDirUri + ?.resolve(REMOTE_SKETCHBOOK_FOLDER) + .resolve(ARDUINO_CLOUD_FOLDER); + }); } override setMarkers( @@ -29,7 +39,13 @@ export class ProblemManager extends TheiaProblemManager { owner: string, data: Diagnostic[] ): Marker<Diagnostic>[] { - if (this.dataDirUri && this.dataDirUri.isEqualOrParent(uri)) { + if ( + this.dataDirUri && + this.dataDirUri.isEqualOrParent(uri) && + this.cloudCacheDirUri && // Do not disable the diagnostics for cloud sketches https://github.com/arduino/arduino-ide/issues/669 + !this.cloudCacheDirUri.isEqualOrParent(uri) + ) { + // If in directories.data folder but not in the cloud sketchbook cache folder. return []; } return super.setMarkers(uri, owner, data); From 964ea3bc0cb51c87592757ca7b8b73002c475033 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 4 May 2023 14:30:38 +0200 Subject: [PATCH 193/384] fix: copy when punctuation marks in sketch path Changed the `source` and `cwd` args to avoid accidentally creating an invalid `glob` patterns when doing the brace expansion by `cpy`. Closes #2043 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/sketches-service-impl.ts | 5 +- .../node/sketches-service-impl.slow-test.ts | 89 +++++++++++++++++-- 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index c6fd56a8a..d5c82ff13 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -444,7 +444,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<string> { + private createTempFolder(): Promise<string> { return new Promise<string>((resolve, reject) => { temp.mkdir({ prefix: TempSketchPrefix }, (createError, dirPath) => { if (createError) { @@ -523,13 +523,14 @@ export class SketchesServiceImpl } else { filter = () => true; } - await cpy(source, destination, { + 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; 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 90ceb6679..8daf3a6e5 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,6 +2,7 @@ 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'; @@ -226,16 +227,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<SketchesServiceImpl>(SketchesService); + const content = `// special content when ${name} are in the path`; + const tempRoot = await sketchesService['createTempFolder'](); + toDispose.push(disposeFolder(tempRoot)); + const sketch = await sketchesService.createNewSketch( + 'punctuation_marks', + content + ); + toDispose.push(disposeSketch(sketch)); + + // the destination path contains punctuation marks + const tempRootUri = FileUri.create(tempRoot); + const testSegment = `path segment with ${open}${name}${close}`; + const firstDestinationUri = tempRootUri + .resolve(testSegment) + .resolve('first') + .resolve(sketch.name); + + const firstSketchCopy = await sketchesService.copy(sketch, { + destinationUri: firstDestinationUri.toString(), + }); + expect(firstSketchCopy).to.be.not.undefined; + expect(firstSketchCopy.mainFileUri).to.be.equal( + firstDestinationUri.resolve(`${sketch.name}.ino`).toString() + ); + const firstCopyContent = await mainFileContentOf(firstSketchCopy); + expect(firstCopyContent).to.be.equal(content); + + // the source path contains punctuation marks. yes, the target too, but it does not matter + const secondDestinationUri = tempRootUri + .resolve(testSegment) + .resolve('second') + .resolve(sketch.name); + const secondSketchCopy = await sketchesService.copy(firstSketchCopy, { + destinationUri: secondDestinationUri.toString(), + }); + expect(secondSketchCopy).to.be.not.undefined; + expect(secondSketchCopy.mainFileUri).to.be.equal( + secondDestinationUri.resolve(`${sketch.name}.ino`).toString() + ); + const secondCopyContent = await mainFileContentOf(secondSketchCopy); + expect(secondCopyContent).to.be.equal(content); + }) + ); }); }); function disposeSketch(...sketch: Sketch[]): Disposable { + return disposeFolder(...sketch.map(({ uri }) => FileUri.fsPath(uri))); +} + +function disposeFolder(...paths: string[]): Disposable { return new DisposableCollection( - ...sketch - .map(({ uri }) => FileUri.fsPath(uri)) - .map((path) => - Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 })) - ) + ...paths.map((path) => + Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 })) + ) ); } From 192aac5a810d8ff1da788e15156009095999b656 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 13 Mar 2023 14:40:31 +0100 Subject: [PATCH 194/384] chore: updated to Theia `1.37.0` - Updated `@theia/*` to `1.37.0`. - Fixed all `yarn audit` security vulnerabilities. - Updated to `electron@23.2.4`: - `contextIsolation` is `true`, - `nodeIntegration` is `false`, and the - `webpack` target is moved from `electron-renderer` to `web`. - Updated to `typescript@4.9.3`. - Updated the `eslint` plugins. - Added the new `Light High Contrast` theme to the IDE2. - High contrast themes use Theia APIs for style adjustments. - Support for ESM modules: `"moduleResolution": "node16"`. - Node.js >= 16.14 is required. - VISX langage packs were bumped to `1.70.0`. - Removed undesired editor context menu items. (Closes #1394) Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .eslintrc.js | 1 + .github/workflows/build.yml | 6 +- .github/workflows/check-i18n-task.yml | 4 +- .github/workflows/i18n-nightly-push.yml | 4 +- .github/workflows/i18n-weekly-pull.yml | 4 +- .gitignore | 2 +- arduino-ide-extension/package.json | 60 +- .../src/browser/app-service.ts | 13 + .../browser/arduino-frontend-contribution.tsx | 269 +- .../browser/arduino-ide-frontend-module.ts | 73 +- .../auth/authentication-client-service.ts | 6 +- .../boards/boards-data-menu-updater.ts | 2 +- .../src/browser/contributions/about.ts | 65 +- .../src/browser/contributions/add-file.ts | 15 +- .../browser/contributions/add-zip-library.ts | 32 +- .../browser/contributions/archive-sketch.ts | 20 +- .../browser/contributions/board-selection.ts | 3 +- .../src/browser/contributions/close.ts | 62 +- .../src/browser/contributions/contribution.ts | 4 + .../browser/contributions/delete-sketch.ts | 10 +- .../src/browser/contributions/examples.ts | 21 +- .../browser/contributions/include-library.ts | 2 +- .../src/browser/contributions/ino-language.ts | 16 +- .../browser/contributions/interface-scale.ts | 2 +- .../contributions/open-sketch-external.ts | 5 +- .../contributions/open-sketch-files.ts | 1 + .../src/browser/contributions/open-sketch.ts | 34 +- .../src/browser/contributions/quit-app.ts | 11 +- .../browser/contributions/save-as-sketch.ts | 33 +- .../src/browser/contributions/startup-task.ts | 52 - .../contributions/startup-tasks-executor.ts | 65 + .../browser/contributions/validate-sketch.ts | 16 +- .../src/browser/create/create-features.ts | 2 +- .../src/browser/dialog-service.ts | 15 + .../dialogs/cloud-share-sketch-dialog.tsx | 59 +- .../firmware-uploader-component.tsx | 2 +- .../ide-updater/ide-updater-component.tsx | 45 +- .../ide-updater/ide-updater-dialog.tsx | 8 +- .../monitor-manager-proxy-client-impl.ts | 6 +- .../src/browser/monitor-model.ts | 2 +- .../browser/serial/monitor/monitor-widget.tsx | 2 +- .../monitor/serial-monitor-send-output.tsx | 2 +- .../plotter/plotter-frontend-contribution.ts | 98 +- .../src/browser/style/arduino-select.css | 11 - .../browser/style/boards-config-dialog.css | 10 - .../src/browser/style/ide-updater-dialog.css | 18 + .../src/browser/style/index.css | 25 - .../src/browser/style/list-widget.css | 12 - .../src/browser/style/main.css | 73 - .../src/browser/style/sketchbook.css | 16 - .../theia/core/connection-status-service.ts | 27 +- .../src/browser/theia/core/tab-bars.ts | 2 +- .../src/browser/theia/core/theming.ts | 20 +- .../browser/theia/core/window-service-ext.ts | 5 +- .../theia/core/window-title-updater.ts | 5 +- .../src/browser/theia/debug/debug-action.tsx | 29 - .../debug/debug-configuration-manager.ts | 2 +- .../theia/debug/debug-session-contribution.ts | 3 +- .../theia/debug/debug-session-manager.ts | 120 - .../src/browser/theia/debug/debug-session.ts | 231 +- .../browser/theia/debug/debug-stack-frame.ts | 32 - .../src/browser/theia/debug/debug-thread.ts | 22 - .../theia/debug/debug-toolbar-widget.tsx | 85 - .../browser/theia/filesystem/file-resource.ts | 37 +- .../browser/theia/markers/problem-manager.ts | 2 +- .../src/browser/theia/monaco/monaco-menu.ts | 24 + .../browser/theia/plugin-ext/debug-main.ts | 66 - .../browser/theia/plugin-ext/hosted-plugin.ts | 33 +- .../plugin-debug-session-factory.ts | 37 - .../theia/plugin-ext/plugin-debug-session.ts | 62 - .../plugin-ext/plugin-menu-command-adapter.ts | 73 - .../theia/workspace/workspace-service.ts | 5 +- .../src/browser/utils/dom.ts | 2 +- .../src/browser/widgets/arduino-select.tsx | 13 +- .../cloud-sketchbook-composite-widget.tsx | 2 +- .../cloud-sketchbook-contributions.ts | 4 + .../cloud-sketchbook-tree-model.ts | 1 + .../cloud-sketchbook-tree-widget.tsx | 13 +- .../filterable-list-container.tsx | 2 +- .../sketchbook-widget-contribution.ts | 3 +- .../src/common/ipc-communication.ts | 2 - .../common/protocol/authentication-service.ts | 12 +- .../src/common/protocol/installable.ts | 22 +- .../src/common/protocol/monitor-service.ts | 10 +- .../src/common/protocol/sketches-service.ts | 2 +- .../electron-browser/electron-app-service.ts | 26 + .../electron-arduino-module.ts | 12 + .../electron-dialog-service.ts | 25 + .../src/electron-browser/preload.ts | 131 + .../core/electron-context-menu-renderer.ts | 21 +- .../theia/core/electron-main-menu-factory.ts | 133 +- .../theia/core/electron-menu-contribution.ts | 148 +- .../theia/core/electron-menu-module.ts | 8 +- .../theia/core/electron-window-module.ts | 13 - .../theia/core/electron-window-service.ts | 90 +- .../src/electron-common/electron-arduino.ts | 92 + .../electron-main-window-service-ext.ts | 7 - .../src/electron-common/electron-messages.ts | 1 - .../src/electron-common/startup-task.ts | 68 +- .../arduino-electron-main-module.ts | 20 +- .../src/electron-main/electron-arduino.ts | 189 + .../theia/electron-main-application.ts | 141 +- .../theia/electron-main-window-service.ts | 57 +- .../theia/electron-messaging-contribution.ts | 44 - .../theia/theia-electron-window.ts | 57 +- .../src/electron-main/theia/window.ts | 33 - .../src/node/arduino-daemon-impl.ts | 4 +- .../src/node/auth/arduino-auth-provider.ts | 5 +- .../src/node/auth/authentication-server.ts | 8 +- .../node/auth/authentication-service-impl.ts | 4 +- arduino-ide-extension/src/node/auth/types.ts | 15 +- arduino-ide-extension/src/node/auth/utils.ts | 4 +- .../src/node/clang-formatter.ts | 6 +- .../cc/arduino/cli/commands/v1/board_pb.js | 8 +- .../cc/arduino/cli/commands/v1/commands_pb.js | 8 +- .../cc/arduino/cli/commands/v1/common_pb.js | 8 +- .../cc/arduino/cli/commands/v1/compile_pb.js | 8 +- .../cc/arduino/cli/commands/v1/core_pb.js | 8 +- .../cc/arduino/cli/commands/v1/lib_pb.js | 8 +- .../cc/arduino/cli/commands/v1/monitor_pb.js | 8 +- .../cc/arduino/cli/commands/v1/port_pb.js | 8 +- .../cc/arduino/cli/commands/v1/upload_pb.js | 8 +- .../cc/arduino/cli/debug/v1/debug_pb.js | 8 +- .../cc/arduino/cli/settings/v1/settings_pb.js | 8 +- .../node/cli-protocol/google/rpc/status_pb.js | 8 +- .../src/node/config-service-impl.ts | 4 +- .../src/node/core-client-provider.ts | 2 +- .../src/node/core-service-impl.ts | 2 +- .../src/node/daemon-watcher.ts | 9 +- .../src/node/examples-service-impl.ts | 4 +- arduino-ide-extension/src/node/exec-util.ts | 16 +- .../i18n/arduino-localization-contribution.ts | 2 +- .../src/node/is-temp-sketch.ts | 4 +- .../src/node/monitor-manager-proxy-impl.ts | 6 +- .../src/node/monitor-manager.ts | 6 +- .../src/node/monitor-service.ts | 20 +- .../monitor-settings-provider-impl.ts | 10 +- .../monitor-settings-provider.ts | 8 +- .../monitor-settings-utils.ts | 2 +- .../plotter/plotter-backend-contribution.ts | 2 +- .../src/node/settings-reader.ts | 4 +- .../src/node/sketches-service-impl.ts | 28 +- .../env-variables/env-variables-server.ts | 4 +- .../filesystem/nsfw-watcher/nsfw-bindings.ts | 2 +- .../node/theia/plugin-ext/plugin-deployer.ts | 4 +- .../node/theia/plugin-ext/plugin-reader.ts | 8 + .../workspace/default-workspace-server.ts | 2 +- .../src/test/browser/create-api.test.ts | 86 +- .../src/test/browser/theming.test.ts | 44 +- .../test/browser/workspace-commands.test.ts | 2 + .../src/test/node/arduino-daemon-impl.test.ts | 12 +- .../node/core-client-provider.slow-test.ts | 4 +- .../src/test/node/exec-util.test.ts | 2 +- .../test/node/monitor-settings-utils.test.ts | 2 +- .../node/sketches-service-impl.slow-test.ts | 4 +- .../test/node/sketches-service-impl.test.ts | 10 +- .../src/test/node/test-bindings.ts | 6 +- arduino-ide-extension/tsconfig.json | 4 +- docs/development.md | 1 - electron-app/package.json | 35 +- electron-app/webpack.config.js | 17 + electron/build/template-package.json | 4 +- electron/packager/index.js | 3 +- electron/packager/package.json | 2 +- i18n/en.json | 8 +- package.json | 50 +- yarn.lock | 8502 ++++++++--------- 167 files changed, 6220 insertions(+), 6514 deletions(-) create mode 100644 arduino-ide-extension/src/browser/app-service.ts delete mode 100644 arduino-ide-extension/src/browser/contributions/startup-task.ts create mode 100644 arduino-ide-extension/src/browser/contributions/startup-tasks-executor.ts create mode 100644 arduino-ide-extension/src/browser/dialog-service.ts delete mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-action.tsx delete mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts delete mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-stack-frame.ts delete mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-thread.ts delete mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-toolbar-widget.tsx create mode 100644 arduino-ide-extension/src/browser/theia/monaco/monaco-menu.ts delete mode 100644 arduino-ide-extension/src/browser/theia/plugin-ext/debug-main.ts delete mode 100644 arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session-factory.ts delete mode 100644 arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session.ts delete mode 100644 arduino-ide-extension/src/browser/theia/plugin-ext/plugin-menu-command-adapter.ts delete mode 100644 arduino-ide-extension/src/common/ipc-communication.ts create mode 100644 arduino-ide-extension/src/electron-browser/electron-app-service.ts create mode 100644 arduino-ide-extension/src/electron-browser/electron-arduino-module.ts create mode 100644 arduino-ide-extension/src/electron-browser/electron-dialog-service.ts create mode 100644 arduino-ide-extension/src/electron-browser/preload.ts create mode 100644 arduino-ide-extension/src/electron-common/electron-arduino.ts delete mode 100644 arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts delete mode 100644 arduino-ide-extension/src/electron-common/electron-messages.ts create mode 100644 arduino-ide-extension/src/electron-main/electron-arduino.ts delete mode 100644 arduino-ide-extension/src/electron-main/theia/electron-messaging-contribution.ts delete mode 100644 arduino-ide-extension/src/electron-main/theia/window.ts create mode 100644 electron-app/webpack.config.js diff --git a/.eslintrc.js b/.eslintrc.js index 49ff5c4e3..812c8a718 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,6 +16,7 @@ module.exports = { 'docs/*', 'scripts/*', 'electron-app/*', + '!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..d6933c39d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,7 +42,7 @@ jobs: - 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,10 +57,10 @@ 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' - name: Install Python 3.x diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index d4bb68bb6..52e9fab59 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -29,10 +29,10 @@ jobs: - 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' - name: Install Go diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index a2c649593..09a82f082 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -16,10 +16,10 @@ 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' - name: Install Go diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 9398b0e4f..5812c91f5 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -16,10 +16,10 @@ 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' - name: Install Go diff --git a/.gitignore b/.gitignore index 126d46d96..d70eb4a3f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ build/ arduino-ide-extension/Examples/ !electron/build/ src-gen/ -webpack.config.js +electron/build/webpack.config.js gen-webpack.config.js .DS_Store # switching from `electron` to `browser` in dev mode. diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index aaa55f0f3..2d78a1225 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -9,7 +9,7 @@ "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 ./build/i18n", "download-ls": "node ./scripts/download-ls.js", "download-examples": "node ./scripts/download-examples.js", "generate-protocol": "node ./scripts/generate-protocol.js", @@ -21,28 +21,28 @@ "test:watch": "mocha --watch --watch-files lib \"./lib/test/**/*.test.js\"" }, "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.37.0", + "@theia/core": "1.37.0", + "@theia/debug": "1.37.0", + "@theia/editor": "1.37.0", + "@theia/electron": "1.37.0", + "@theia/filesystem": "1.37.0", + "@theia/keymaps": "1.37.0", + "@theia/markers": "1.37.0", + "@theia/messages": "1.37.0", + "@theia/monaco": "1.37.0", + "@theia/monaco-editor-core": "1.72.3", + "@theia/navigator": "1.37.0", + "@theia/outline-view": "1.37.0", + "@theia/output": "1.37.0", + "@theia/plugin-ext": "1.37.0", + "@theia/preferences": "1.37.0", + "@theia/scm": "1.37.0", + "@theia/search-in-workspace": "1.37.0", + "@theia/terminal": "1.37.0", + "@theia/typehierarchy": "1.37.0", + "@theia/workspace": "1.37.0", "@tippyjs/react": "^4.2.5", "@types/auth0-js": "^9.14.0", "@types/btoa": "^1.2.3", @@ -51,6 +51,7 @@ "@types/glob": "^7.2.0", "@types/google-protobuf": "^3.7.2", "@types/js-yaml": "^3.12.2", + "@types/jsdom": "^21.1.1", "@types/keytar": "^4.4.0", "@types/lodash.debounce": "^4.0.6", "@types/node-fetch": "^2.5.7", @@ -65,7 +66,7 @@ "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": "^4.2.2", @@ -76,8 +77,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", @@ -88,6 +90,7 @@ "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,6 +104,7 @@ "temp": "^0.9.1", "temp-dir": "^2.0.0", "tree-kill": "^1.2.1", + "util": "^0.12.5", "which": "^1.3.1" }, "devDependencies": { @@ -147,6 +151,9 @@ "examples" ], "theiaExtensions": [ + { + "preload": "lib/electron-browser/preload" + }, { "backend": "lib/node/arduino-ide-backend-module", "frontend": "lib/browser/arduino-ide-frontend-module" @@ -157,6 +164,9 @@ { "frontendElectron": "lib/electron-browser/theia/core/electron-window-module" }, + { + "frontendElectron": "lib/electron-browser/electron-arduino-module" + }, { "electronMain": "lib/electron-main/arduino-electron-main-module" } 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..20557f412 --- /dev/null +++ b/arduino-ide-extension/src/browser/app-service.ts @@ -0,0 +1,13 @@ +import type { Disposable } from '@theia/core/lib/common/disposable'; +import type { StartupTasks } from '../electron-common/startup-task'; +import type { Sketch } from './contributions/contribution'; + +export const AppService = Symbol('AppService'); +export interface AppService { + quit(): void; + version(): Promise<string>; + 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..5113b1a14 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 * as 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; @@ -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) { + // <input> 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..89d13fd93 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'; @@ -295,7 +295,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 +341,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 +351,29 @@ 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'; + +// 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); @@ -722,7 +726,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); @@ -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,12 @@ 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 + ); }); 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<void> { 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-data-menu-updater.ts b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts index 23b1e2504..f323621d3 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.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 { CommandRegistry } from '@theia/core/lib/common/command'; import { MenuModelRegistry } from '@theia/core/lib/common/menu'; diff --git a/arduino-ide-extension/src/browser/contributions/about.ts b/arduino-ide-extension/src/browser/contributions/about.ts index cf22508f4..03eae0cbf 100644 --- a/arduino-ide-extension/src/browser/contributions/about.ts +++ b/arduino-ide-extension/src/browser/contributions/about.ts @@ -1,26 +1,27 @@ -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 { ConfigService } from '../../common/protocol'; +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; - + private readonly clipboardService: ClipboardService; @inject(ConfigService) - protected readonly configService: ConfigService; + private readonly configService: ConfigService; + @inject(AppService) + private readonly appService: AppService; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(About.Commands.ABOUT_APP, { @@ -40,17 +41,20 @@ export class About extends Contribution { }); } - async showAbout(): Promise<void> { - const version = await this.configService.getVersion(); + private async showAbout(): Promise<void> { + const [appVersion, cliVersion] = await Promise.all([ + this.appService.version(), + this.configService.getVersion(), + ]); const buildDate = this.buildDate; 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 +64,31 @@ 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 { + private 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<void> { 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..3e7558c83 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -1,5 +1,4 @@ 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, @@ -65,7 +64,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', 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<void> { @@ -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<Prompt> { - 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..085558a05 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -67,6 +67,7 @@ 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'; export { Command, @@ -115,6 +116,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()); 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<Sketch | undefined> { diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index 02c19694d..16fc6a380 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, @@ -143,19 +139,6 @@ export abstract class Examples extends SketchContribution { }): 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( diff --git a/arduino-ide-extension/src/browser/contributions/include-library.ts b/arduino-ide-extension/src/browser/contributions/include-library.ts index a8a2f3f4b..cb6479f18 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'; diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index c5096e64f..2577d5a73 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -1,4 +1,7 @@ -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 { @@ -120,6 +123,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 +183,13 @@ export class InoLanguage extends SketchContribution { ]); this.languageServerFqbn = await Promise.race([ - new Promise<undefined>((_, reject) => - setTimeout( + new Promise<undefined>((_, reject) => { + const timer = setTimeout( () => reject(new Error(`Timeout after ${20_000} ms.`)), 20_000 - ) - ), + ); + toDisposeOnRelease.push(Disposable.create(() => clearTimeout(timer))); + }), this.commandService.executeCommand<string>( 'arduino.languageserver.start', { @@ -206,6 +211,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-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<Sketch | undefined> { 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<Sketch | undefined> { - 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..876f9c872 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'; @@ -95,7 +94,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 +164,13 @@ export class SaveAsSketch extends CloudSketchContribution { ): Promise<string | undefined> { 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 +221,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/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<void> { + 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/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<boolean> { - 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-features.ts b/arduino-ide-extension/src/browser/create/create-features.ts index 23ab77c21..2bbb32170 100644 --- a/arduino-ide-extension/src/browser/create/create-features.ts +++ b/arduino-ide-extension/src/browser/create/create-features.ts @@ -4,7 +4,7 @@ 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'; 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<MessageBoxReturnValue>; + showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue>; + showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue>; +} diff --git a/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx index 7bcd10ecf..215478614 100644 --- a/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx @@ -1,12 +1,14 @@ -import * as React from '@theia/core/shared/react'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; +import { DialogProps } from '@theia/core/lib/browser/dialogs'; +import { TreeNode } from '@theia/core/lib/browser/tree/tree'; +import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; +import { nls } from '@theia/core/lib/common/nls'; +import { MaybePromise } from '@theia/core/lib/common/types'; import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { clipboard } from '@theia/core/electron-shared/@electron/remote'; -import { ReactWidget, DialogProps } from '@theia/core/lib/browser'; -import { AbstractDialog } from '../theia/dialogs/dialogs'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import * as React from '@theia/core/shared/react'; import { CreateApi } from '../create/create-api'; -import { nls } from '@theia/core/lib/common'; +import { AbstractDialog } from '../theia/dialogs/dialogs'; const RadioButton = (props: { id: string; @@ -35,15 +37,18 @@ export const ShareSketchComponent = ({ treeNode, createApi, domain = 'https://create.arduino.cc', + writeClipboard, }: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any treeNode: any; createApi: CreateApi; domain?: string; + writeClipboard: (text: string) => MaybePromise<void>; }): React.ReactElement => { - const [loading, setloading] = React.useState<boolean>(false); + const [loading, setLoading] = React.useState<boolean>(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" /> <button - onClick={() => clipboard.writeText(sketchLink)} + onClick={() => writeClipboard(sketchLink)} value="copy" className="theia-button secondary" > @@ -121,44 +126,52 @@ export const ShareSketchComponent = ({ ); }; -@injectable() export class ShareSketchWidget extends ReactWidget { - constructor(private treeNode: any, private createApi: CreateApi) { + private readonly writeClipboard = (text: string) => + this.clipboardService.writeText(text); + + constructor( + private treeNode: TreeNode, + private createApi: CreateApi, + private clipboardService: ClipboardService + ) { super(); } - protected render(): React.ReactNode { + protected override render(): React.ReactNode { return ( <ShareSketchComponent treeNode={this.treeNode} createApi={this.createApi} + writeClipboard={this.writeClipboard} /> ); } } -@injectable() export class ShareSketchDialogProps extends DialogProps { - readonly node: any; + readonly node: TreeNode; readonly createApi: CreateApi; + readonly clipboardService: ClipboardService; } -@injectable() export class ShareSketchDialog extends AbstractDialog<void> { protected widget: ShareSketchWidget; - constructor( - @inject(ShareSketchDialogProps) - protected override readonly props: ShareSketchDialogProps - ) { + constructor(protected override readonly props: ShareSketchDialogProps) { super({ title: props.title }); this.contentNode.classList.add('arduino-share-sketch-dialog'); - this.widget = new ShareSketchWidget(props.node, props.createApi); + this.widget = new ShareSketchWidget( + props.node, + props.createApi, + props.clipboardService + ); } - get value(): void { + override get value(): void { return; } + protected override onAfterAttach(msg: Message): void { if (this.widget.isAttached) { Widget.detach(this.widget); diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx index 8dd12e681..a8db65627 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx @@ -157,7 +157,7 @@ export const FirmwareUploaderComponent = ({ options={firmwareOptions} value={selectedFirmware} tabSelectsValue={false} - onChange={(value) => { + onChange={(value: FirmwareOption | null) => { if (value) { setInstallFeedback(null); setSelectedFirmware(value); diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx index ecb4be944..bbe358b77 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx @@ -1,10 +1,15 @@ -import { nls } from '@theia/core/lib/common'; -import { shell } from '@theia/core/electron-shared/@electron/remote'; +import { nls } from '@theia/core/lib/common/nls'; import * as React from '@theia/core/shared/react'; -import ReactMarkdown from 'react-markdown'; +// @ts-expect-error see https://github.com/microsoft/TypeScript/issues/49721#issuecomment-1319854183 +import type { Options } from 'react-markdown'; import { ProgressInfo, UpdateInfo } from '../../../common/protocol/ide-updater'; import ProgressBar from '../../components/ProgressBar'; +const ReactMarkdown = React.lazy<React.ComponentType<Options>>( + // @ts-expect-error see above + () => import('react-markdown') +); + export interface UpdateProgress { progressInfo?: ProgressInfo | undefined; downloadFinished?: boolean; @@ -15,6 +20,7 @@ export interface UpdateProgress { export interface IDEUpdaterComponentProps { updateInfo: UpdateInfo; updateProgress: UpdateProgress; + openExternal: (url: string) => undefined; } export const IDEUpdaterComponent = ({ @@ -25,6 +31,7 @@ export const IDEUpdaterComponent = ({ progressInfo, error, }, + openExternal, }: IDEUpdaterComponentProps): React.ReactElement => { const { version, releaseNotes } = updateInfo; const [changelog, setChangelog] = React.useState<string>(''); @@ -95,20 +102,26 @@ export const IDEUpdaterComponent = ({ {changelog && ( <div className="dialogRow changelog-container"> <div className="changelog"> - <ReactMarkdown - components={{ - a: ({ href, children, ...props }) => ( - <a - onClick={() => href && shell.openExternal(href)} - {...props} - > - {children} - </a> - ), - }} + <React.Suspense + fallback={ + <div className="fallback"> + <div className="spinner" /> + </div> + } > - {changelog} - </ReactMarkdown> + <ReactMarkdown + components={{ + // @ts-expect-error see imports. There is no ESM type-only import in CommonJS modules. + a: ({ href, children, ...props }) => ( + <a onClick={() => href && openExternal(href)} {...props}> + {children} + </a> + ), + }} + > + {changelog} + </ReactMarkdown> + </React.Suspense> </div> </div> )} diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index c4f2d940b..e8d5f6371 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -18,8 +18,6 @@ import { import { LocalStorageService } from '@theia/core/lib/browser'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; -const DOWNLOAD_PAGE_URL = 'https://www.arduino.cc/en/software'; - @injectable() export class IDEUpdaterDialogProps extends DialogProps {} @@ -76,11 +74,15 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { <IDEUpdaterComponent updateInfo={this.updateInfo} updateProgress={this.updateProgress} + openExternal={this.openExternal} /> ) ); } + private readonly openExternal = (url: string) => + this.windowService.openNewWindow(url, { external: true }); + get value(): UpdateInfo | undefined { return this.updateInfo; } @@ -164,7 +166,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { } private openDownloadPage(): void { - this.windowService.openNewWindow(DOWNLOAD_PAGE_URL, { external: true }); + this.openExternal('https://www.arduino.cc/en/software'); this.close(); } diff --git a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts index ebbafa385..04793674c 100644 --- a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts +++ b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts @@ -14,11 +14,9 @@ import { Monitor, MonitorManagerProxyClient, MonitorManagerProxyFactory, -} from '../common/protocol/monitor-service'; -import { - PluggableMonitorSettings, MonitorSettings, -} from '../node/monitor-settings/monitor-settings-provider'; + PluggableMonitorSettings, +} from '../common/protocol/monitor-service'; import { BoardsConfig } from './boards/boards-config'; import { BoardsServiceProvider } from './boards/boards-service-provider'; diff --git a/arduino-ide-extension/src/browser/monitor-model.ts b/arduino-ide-extension/src/browser/monitor-model.ts index c3c8a26f4..d2d285272 100644 --- a/arduino-ide-extension/src/browser/monitor-model.ts +++ b/arduino-ide-extension/src/browser/monitor-model.ts @@ -10,10 +10,10 @@ import { monitorConnectionStatusEquals, MonitorEOL, MonitorManagerProxyClient, + MonitorSettings, MonitorState, } from '../common/protocol'; import { isNullOrUndefined } from '../common/utils'; -import { MonitorSettings } from '../node/monitor-settings/monitor-settings-provider'; @injectable() export class MonitorModel implements FrontendApplicationContribution { diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index c2311a11c..0e790706b 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -23,9 +23,9 @@ import { nls } from '@theia/core/lib/common'; import { MonitorEOL, MonitorManagerProxyClient, + MonitorSettings, } from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; -import { MonitorSettings } from '../../../node/monitor-settings/monitor-settings-provider'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @injectable() diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx index 2ddd2c565..70a275b5c 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx @@ -2,7 +2,7 @@ import * as React from '@theia/core/shared/react'; import { Event } from '@theia/core/lib/common/event'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { areEqual, FixedSizeList as List } from 'react-window'; -import dateFormat = require('dateformat'); +import dateFormat from 'dateformat'; import { messagesToLines, truncateLines } from './monitor-utils'; import { MonitorManagerProxyClient } from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; diff --git a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts index c403c4201..23ba248f9 100644 --- a/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/serial/plotter/plotter-frontend-contribution.ts @@ -1,26 +1,16 @@ +import { Endpoint } from '@theia/core/lib/browser/endpoint'; import { ThemeService } from '@theia/core/lib/browser/theming'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { - Command, - CommandRegistry, - MaybePromise, - MenuModelRegistry, -} from '@theia/core'; -import { ArduinoMenus } from '../../menu/arduino-menus'; -import { Contribution } from '../../contributions/contribution'; -import { Endpoint, FrontendApplication } from '@theia/core/lib/browser'; -import { ipcRenderer } from '@theia/electron/shared/electron'; +import { Command, CommandRegistry } from '@theia/core/lib/common/command'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import type { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import queryString from 'query-string'; import { MonitorManagerProxyClient } from '../../../common/protocol'; -import { BoardsServiceProvider } from '../../boards/boards-service-provider'; +import { Contribution } from '../../contributions/contribution'; +import { ArduinoMenus } from '../../menu/arduino-menus'; import { MonitorModel } from '../../monitor-model'; import { ArduinoToolbar } from '../../toolbar/arduino-toolbar'; -import { - CLOSE_PLOTTER_WINDOW, - SHOW_PLOTTER_WINDOW, -} from '../../../common/ipc-communication'; -import { nls } from '@theia/core/lib/common/nls'; - -const queryString = require('query-string'); export namespace SerialPlotterContribution { export namespace Commands { @@ -44,38 +34,31 @@ export namespace SerialPlotterContribution { @injectable() export class PlotterFrontendContribution extends Contribution { - protected window: Window | null; - protected url: string; - protected wsPort: number; + private readonly endpointUrl = new Endpoint({ path: '/plotter' }) + .getRestUrl() + .toString(); + private readonly toDispose = new DisposableCollection(); + private _plotterUrl: string | undefined; @inject(MonitorModel) - protected readonly model: MonitorModel; - + private readonly model: MonitorModel; @inject(ThemeService) - protected readonly themeService: ThemeService; - + private readonly themeService: ThemeService; @inject(MonitorManagerProxyClient) - protected readonly monitorManagerProxy: MonitorManagerProxyClient; + private readonly monitorManagerProxy: MonitorManagerProxyClient; - @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider; - - override onStart(app: FrontendApplication): MaybePromise<void> { - this.url = new Endpoint({ path: '/plotter' }).getRestUrl().toString(); - - ipcRenderer.on(CLOSE_PLOTTER_WINDOW, async () => { - if (!!this.window) { - this.window = null; - } - }); + override onStart(): void { + this.toDispose.push( + window.electronArduino.registerPlotterWindowCloseHandler(() => { + this._plotterUrl = undefined; + }) + ); this.monitorManagerProxy.onMonitorShouldReset(() => this.reset()); - - return super.onStart(app); } override registerCommands(registry: CommandRegistry): void { registry.registerCommand(SerialPlotterContribution.Commands.OPEN, { - execute: this.startPlotter.bind(this), + execute: () => this.startPlotter(), }); registry.registerCommand(SerialPlotterContribution.Commands.RESET, { execute: () => this.reset(), @@ -85,7 +68,7 @@ export class PlotterFrontendContribution extends Contribution { { isVisible: (widget) => ArduinoToolbar.is(widget) && widget.side === 'right', - execute: this.startPlotter.bind(this), + execute: () => this.startPlotter(), } ); } @@ -98,10 +81,13 @@ export class PlotterFrontendContribution extends Contribution { }); } - async startPlotter(): Promise<void> { + private async startPlotter(forceReload = false): Promise<void> { await this.monitorManagerProxy.startMonitor(); - if (!!this.window) { - ipcRenderer.send(SHOW_PLOTTER_WINDOW); + if (this._plotterUrl) { + window.electronArduino.showPlotterWindow({ + url: this._plotterUrl, + forceReload, + }); return; } const wsPort = this.monitorManagerProxy.getWebSocketPort(); @@ -117,26 +103,30 @@ export class PlotterFrontendContribution extends Contribution { } } - protected async open(wsPort: number): Promise<void> { + private open(wsPort: number): void { const initConfig = { - darkTheme: this.themeService.getCurrentTheme().type === 'dark', + darkTheme: this.isDarkTheme, wsPort, serialPort: this.model.serialPort, }; - const urlWithParams = queryString.stringifyUrl( + this._plotterUrl = queryString.stringifyUrl( { - url: this.url, + url: this.endpointUrl, query: initConfig, }, { arrayFormat: 'comma' } ); - this.window = window.open(urlWithParams, 'serialPlotter'); + window.electronArduino.showPlotterWindow({ url: this._plotterUrl }); + } + + private get isDarkTheme(): boolean { + const themeType = this.themeService.getCurrentTheme().type; + return themeType === 'dark' || themeType === 'hc'; } - protected async reset(): Promise<void> { - if (!!this.window) { - this.window.close(); - await this.startPlotter(); + private async reset(): Promise<void> { + if (this._plotterUrl) { + await this.startPlotter(true); } } } diff --git a/arduino-ide-extension/src/browser/style/arduino-select.css b/arduino-ide-extension/src/browser/style/arduino-select.css index 001c1bd9b..25b4989bb 100644 --- a/arduino-ide-extension/src/browser/style/arduino-select.css +++ b/arduino-ide-extension/src/browser/style/arduino-select.css @@ -49,14 +49,3 @@ padding-top: 0 !important; padding-bottom: 0 !important; } - - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .arduino-select__option--is-selected { - outline: 1px solid var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .arduino-select__option--is-focused { - outline: 1px dashed var(--theia-focusBorder); -} diff --git a/arduino-ide-extension/src/browser/style/boards-config-dialog.css b/arduino-ide-extension/src/browser/style/boards-config-dialog.css index a7c474e8d..90938ca70 100644 --- a/arduino-ide-extension/src/browser/style/boards-config-dialog.css +++ b/arduino-ide-extension/src/browser/style/boards-config-dialog.css @@ -276,16 +276,6 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { border-top: 1px solid var(--theia-dropdown-border); } -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc #select-board-dialog .selectBoardContainer .list .item:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc div#select-board-dialog .selectBoardContainer .list .item.selected { - outline: 1px solid var(--theia-focusBorder); -} - @media only screen and (max-height: 400px) { div.dialogContent.select-board-dialog > div.head { display: none; diff --git a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css index 5bd5fac44..9282a5b11 100644 --- a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css +++ b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css @@ -41,6 +41,17 @@ overflow: auto; padding: 0 12px; cursor: text; + width: 100%; +} + +.ide-updater-dialog .changelog .fallback { + min-height: 180px; + width: 100%; + display: flex; +} + +.ide-updater-dialog .changelog .fallback .spinner { + align-self: center; } .dialogContent.ide-updater-dialog @@ -104,3 +115,10 @@ margin-left: 79px; margin-right: auto; } + +/* https://github.com/arduino/arduino-ide/pull/2027#issuecomment-1533174638 */ +/* https://github.com/eclipse-theia/theia/commit/1b5ff9ee459df14cedc0e8266dd02dae93fcd1bf#diff-d8d45a890507a01141c010ad4a6891edf2ae727cfa6dfe604cebbd667812cccbR68 */ +/* Use normal whitespace handling for the changelog content in the update dialog. */ +.p-Widget.dialogOverlay .dialogContent.ide-updater-dialog { + white-space: normal; +} diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index 4698d4a33..4f9422aa7 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -54,12 +54,6 @@ body.theia-dark { background-color: var(--theia-warningBackground); } -.hc-black.hc-theia.theia-hc .theia-input.warning, -.hc-black.hc-theia.theia-hc .theia-input.warning::placeholder { - color: var(--theia-warningBackground); - background-color: var(--theia-warningForeground); -} - .theia-input.error:focus { outline-width: 1px; outline-style: solid; @@ -170,25 +164,6 @@ button.theia-button.message-box-dialog-button { font-size: 14px; } -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc button.theia-button:hover, -.hc-black.hc-theia.theia-hc .theia-button:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc button.theia-button, -.hc-black.hc-theia.theia-hc .theia-button, -.hc-black.hc-theia.theia-hc button.theia-button.secondary { - border: 1px solid var(--theia-button-border); -} - -.hc-black.hc-theia.theia-hc .theia-notification-list-item:hover:not(:focus) { - background-color: var(--theia-notifications-background); - outline: 1px dashed var(--theia-focusBorder); - outline-offset: -2px; -} - .debug-toolbar .debug-action>div { font-family: var(--theia-ui-font-family); font-size: var(--theia-ui-font-size0); diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index 0ce86919c..19bd45150 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -219,15 +219,3 @@ div.filterable-list-container > div > div > div > div:nth-child(1) > div.separat width: 65px; min-width: 65px; } - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .component-list-item .header .installed-version:hover:before { - background-color: transparent; - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .component-list-item .header .installed-version:before { - color: var(--theia-button-background); - border: 1px solid var(--theia-button-border); -} diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 874db8448..2e310e212 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -137,24 +137,6 @@ color: var(--theia-titleBar-activeForeground); } -.p-TabBar-toolbar .item > div.arduino-toggle-advanced-mode { - display: flex; - width: 24px; - height: 24px; - justify-content: center; - align-items: center; -} - -.arduino-toggle-advanced-mode-icon { - mask: none; - -webkit-mask: none; - background: none; - display: flex; - justify-content: center; - align-items: center; - color: var(--theia-titleBar-activeBackground); -} - .arduino-open-boards-control-icon { mask: none; -webkit-mask: none; @@ -202,61 +184,6 @@ background-color: var(--theia-terminal-background); } - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div { - background: var(--theia-arduino-toolbar-button-background); - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-plotter, -.hc-black.hc-theia.theia-hc .p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-monitor { - background: transparent; -} - -.hc-black.hc-theia.theia-hc .item.arduino-tool-item.toggled .arduino-verify-sketch--toolbar, -.hc-black.hc-theia.theia-hc .item.arduino-tool-item.toggled .arduino-upload-sketch--toolbar { - background-color: var(--theia-arduino-toolbar-button-background) !important; - outline: 1px solid var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .arduino-boards-dropdown-item:hover { - background: var(--theia-dropdown-background); -} - -.hc-black.hc-theia.theia-hc .arduino-boards-dropdown-item:hover { - outline: 1px dashed var(--theia-focusBorder); - outline-offset: -2px; -} - -.hc-black.hc-theia.theia-hc #theia-main-content-panel .p-TabBar .p-TabBar-tab.p-mod-current { - outline: 1px solid var(--theia-focusBorder); - outline-offset: -4px; -} - -.hc-black.hc-theia.theia-hc #theia-main-content-panel .p-TabBar .p-TabBar-tab:hover { - outline: 1px dashed var(--theia-focusBorder); - outline-offset: -4px; -} - -.hc-black.hc-theia.theia-hc .p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable > .p-TabBar-tabCloseIcon:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .quick-input-list .monaco-list-row.focused { - outline: 1px dotted var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .quick-input-list .monaco-list-row:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .quick-input-widget { - outline: 1px solid var(--theia-contrastBorder); - outline-offset: -1px; -} - .monaco-hover .hover-row.markdown-hover:first-child p { margin-top: 8px; } diff --git a/arduino-ide-extension/src/browser/style/sketchbook.css b/arduino-ide-extension/src/browser/style/sketchbook.css index 8a9270c36..3ff64000c 100644 --- a/arduino-ide-extension/src/browser/style/sketchbook.css +++ b/arduino-ide-extension/src/browser/style/sketchbook.css @@ -80,19 +80,3 @@ widget width. background: var(--theia-list-inactiveSelectionBackground); color: var(--theia-list-inactiveSelectionForeground) !important; } - - -/* High Contrast Theme rules */ -/* TODO: Remove it when the Theia version is upgraded to 1.27.0 and use Theia APIs to implement it*/ -.hc-black.hc-theia.theia-hc .theia-TreeNode:hover { - outline: 1px dashed var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .theia-Tree .theia-TreeNode.theia-mod-selected { - outline: 1px dotted var(--theia-focusBorder); -} - -.hc-black.hc-theia.theia-hc .theia-Tree:focus .theia-TreeNode.theia-mod-selected, -.hc-black.hc-theia.theia-hc .theia-Tree .ReactVirtualized__List:focus .theia-TreeNode.theia-mod-selected { - outline: 1px solid var(--theia-focusBorder); -} diff --git a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index a0eb05941..983850d0c 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -20,8 +20,7 @@ import { ArduinoDaemon } from '../../../common/protocol'; import { assertUnreachable } from '../../../common/utils'; import { CreateFeatures } from '../../create/create-features'; import { NotificationCenter } from '../../notification-center'; -import debounce = require('lodash.debounce'); -import isOnline = require('is-online'); +import debounce from 'lodash.debounce'; @injectable() export class IsOnline implements FrontendApplicationContribution { @@ -30,17 +29,19 @@ export class IsOnline implements FrontendApplicationContribution { private stopped = false; onStart(): void { - const checkOnline = async () => { - if (!this.stopped) { - try { - const online = await isOnline(); - this.setOnline(online); - } finally { - window.setTimeout(() => checkOnline(), 6_000); // 6 seconds poll interval + import('is-online').then((module) => { + const checkOnline = async () => { + if (!this.stopped) { + try { + const online = await module.default(); + this.setOnline(online); + } finally { + window.setTimeout(() => checkOnline(), 6_000); // 6 seconds poll interval + } } - } - }; - checkOnline(); + }; + checkOnline(); + }); } onStop(): void { @@ -56,7 +57,7 @@ export class IsOnline implements FrontendApplicationContribution { return this.onDidChangeOnlineEmitter.event; } - private setOnline(online: boolean) { + private setOnline(online: boolean): void { const oldOnline = this._online; this._online = online; if (!this.stopped && this._online !== oldOnline) { diff --git a/arduino-ide-extension/src/browser/theia/core/tab-bars.ts b/arduino-ide-extension/src/browser/theia/core/tab-bars.ts index c6d5adc08..90f650b6d 100644 --- a/arduino-ide-extension/src/browser/theia/core/tab-bars.ts +++ b/arduino-ide-extension/src/browser/theia/core/tab-bars.ts @@ -4,7 +4,7 @@ import { TabBarRenderer as TheiaTabBarRenderer, ToolbarAwareTabBar as TheiaToolbarAwareTabBar, } from '@theia/core/lib/browser/shell/tab-bars'; -import debounce = require('lodash.debounce'); +import debounce from 'lodash.debounce'; export class TabBarRenderer extends TheiaTabBarRenderer { // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/arduino-ide-extension/src/browser/theia/core/theming.ts b/arduino-ide-extension/src/browser/theia/core/theming.ts index b46f04b9b..c191cb2d7 100644 --- a/arduino-ide-extension/src/browser/theia/core/theming.ts +++ b/arduino-ide-extension/src/browser/theia/core/theming.ts @@ -25,8 +25,8 @@ const builtInThemeIds = new Set( [ ArduinoThemes.light, ArduinoThemes.dark, + BuiltinThemeProvider.hcLightTheme, BuiltinThemeProvider.hcTheme, - // TODO: add the HC light theme after Theia 1.36 ].map(({ id }) => id) ); const deprecatedThemeIds = new Set( @@ -37,7 +37,14 @@ const deprecatedThemeIds = new Set( export const lightThemeLabel = nls.localize('arduino/theme/light', 'Light'); export const darkThemeLabel = nls.localize('arduino/theme/dark', 'Dark'); -export const hcThemeLabel = nls.localize('arduino/theme/hc', 'High Contrast'); +export const hcLightThemeLabel = nls.localize( + 'arduino/theme/hcLight', + 'Light High Contrast' +); +export const hcThemeLabel = nls.localize( + 'arduino/theme/hc', + 'Dark High Contrast' +); export function userThemeLabel(theme: Theme): string { return nls.localize('arduino/theme/user', '{0} (user)', theme.label); } @@ -57,6 +64,8 @@ export function themeLabelForSettings(theme: Theme): string { return darkThemeLabel; case BuiltinThemeProvider.hcTheme.id: return hcThemeLabel; + case BuiltinThemeProvider.hcLightTheme.id: + return hcLightThemeLabel; case BuiltinThemeProvider.lightTheme.id: // fall-through case BuiltinThemeProvider.darkTheme.id: return deprecatedThemeLabel(theme); @@ -73,6 +82,8 @@ export function compatibleBuiltInTheme(theme: Theme): Theme { return ArduinoThemes.dark; case 'hc': return BuiltinThemeProvider.hcTheme; + case 'hcLight': + return BuiltinThemeProvider.hcLightTheme; default: { console.warn( `Unhandled theme type: ${theme.type}. Theme ID: ${theme.id}, label: ${theme.label}` @@ -91,7 +102,7 @@ interface ThemeProvider { /** * Returns with a list of built-in themes officially supported by IDE2 (https://github.com/arduino/arduino-ide/issues/1283). * The themes in the array follow the following order: - * - built-in themes first (in `Light`, `Dark`, `High Contrast`), // TODO -> High Contrast will be split up to HC Dark and HC Light after the Theia version uplift + * - built-in themes first (in `Light`, `Dark`, `Light High Contrast`, and `Dark High Contrast`), * - followed by user installed (VSIX) themes grouped by theme type, then alphabetical order, * - if the `currentTheme` is either Light (Theia) or Dark (Theia), the last item of the array will be the selected theme with `(deprecated)` suffix. */ @@ -171,7 +182,8 @@ const arduinoThemeTypeOrder: Record<ArduinoThemeType, number> = { const themeTypeOrder: Record<ThemeType, number> = { light: 0, dark: 1, - hc: 2, + hcLight: 2, + hc: 3, }; export function arduinoThemeTypeOf(theme: Theme | string): ArduinoThemeType { diff --git a/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts b/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts index a34f6882b..868cfd5f0 100644 --- a/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts +++ b/arduino-ide-extension/src/browser/theia/core/window-service-ext.ts @@ -1,4 +1,4 @@ -import type { StartupTask } from '../../../electron-common/startup-task'; +import type { StartupTasks } from '../../../electron-common/startup-task'; export const WindowServiceExt = Symbol('WindowServiceExt'); export interface WindowServiceExt { @@ -6,5 +6,6 @@ export interface WindowServiceExt { * Returns with a promise that resolves to `true` if the current window is the first window. */ isFirstWindow(): Promise<boolean>; - reload(options?: StartupTask.Owner): void; + reload(tasks?: StartupTasks): void; + close(): void; } diff --git a/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts index 6d5b70cab..0fcd046c5 100644 --- a/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts +++ b/arduino-ide-extension/src/browser/theia/core/window-title-updater.ts @@ -1,4 +1,3 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; import { NavigatableWidget } from '@theia/core/lib/browser/navigatable-types'; @@ -118,10 +117,8 @@ export class WindowTitleUpdater extends TheiaWindowTitleUpdater { if (widget instanceof EditorWidget) { const { uri } = widget.editor; const filename = uri.path.toString(); - // Do not necessarily require the current window if not needed. It's a synchronous, blocking call. if (this.previousRepresentedFilename !== filename) { - const currentWindow = remote.getCurrentWindow(); - currentWindow.setRepresentedFilename(uri.path.toString()); + window.electronArduino.setRepresentedFilename(uri.path.fsPath()); this.previousRepresentedFilename = filename; } } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-action.tsx b/arduino-ide-extension/src/browser/theia/debug/debug-action.tsx deleted file mode 100644 index c0f691b49..000000000 --- a/arduino-ide-extension/src/browser/theia/debug/debug-action.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from '@theia/core/shared/react'; -import { DebugAction as TheiaDebugAction } from '@theia/debug/lib/browser/view/debug-action'; -import { - codiconArray, - DISABLED_CLASS, -} from '@theia/core/lib/browser/widgets/widget'; - -// customized debug action to show the contributed command's label when there is no icon -export class DebugAction extends TheiaDebugAction { - override render(): React.ReactNode { - const { enabled, label, iconClass } = this.props; - const classNames = ['debug-action', ...codiconArray(iconClass, true)]; - if (enabled === false) { - classNames.push(DISABLED_CLASS); - } - return ( - <span - tabIndex={0} - className={classNames.join(' ')} - title={label} - onClick={this.props.run} - ref={this.setRef} - > - {!iconClass || - (iconClass.match(/plugin-icon-\d+/) && <div>{label}</div>)} - </span> - ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts index eda81804b..c763c3e9e 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts @@ -1,4 +1,4 @@ -import debounce = require('p-debounce'); +import debounce from 'p-debounce'; import { inject, injectable, diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts b/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts index d0ba503ef..769c3c930 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts @@ -43,7 +43,8 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory this.messages, this.fileService, this.debugContributionProvider, - this.workspaceService + this.workspaceService, + 2_000 ); } } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts deleted file mode 100644 index f641a6535..000000000 --- a/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts +++ /dev/null @@ -1,120 +0,0 @@ -import type { ContextKey } from '@theia/core/lib/browser/context-key-service'; -import { injectable, postConstruct } from '@theia/core/shared/inversify'; -import { - DebugSession, - DebugState, -} from '@theia/debug/lib/browser/debug-session'; -import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; -import type { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; - -function debugStateLabel(state: DebugState): string { - switch (state) { - case DebugState.Initializing: - return 'initializing'; - case DebugState.Stopped: - return 'stopped'; - case DebugState.Running: - return 'running'; - default: - return 'inactive'; - } -} - -@injectable() -export class DebugSessionManager extends TheiaDebugSessionManager { - protected debugStateKey: ContextKey<string>; - - @postConstruct() - protected override init(): void { - this.debugStateKey = this.contextKeyService.createKey<string>( - 'debugState', - debugStateLabel(this.state) - ); - super.init(); - } - - protected override fireDidChange(current: DebugSession | undefined): void { - this.debugTypeKey.set(current?.configuration.type); - this.inDebugModeKey.set(this.inDebugMode); - this.debugStateKey.set(debugStateLabel(this.state)); - this.onDidChangeEmitter.fire(current); - } - - protected override async doStart( - sessionId: string, - options: DebugConfigurationSessionOptions - ): Promise<DebugSession> { - const parentSession = - options.configuration.parentSession && - this._sessions.get(options.configuration.parentSession.id); - const contrib = this.sessionContributionRegistry.get( - options.configuration.type - ); - const sessionFactory = contrib - ? contrib.debugSessionFactory() - : this.debugSessionFactory; - const session = sessionFactory.get(sessionId, options, parentSession); - this._sessions.set(sessionId, session); - - this.debugTypeKey.set(session.configuration.type); - // this.onDidCreateDebugSessionEmitter.fire(session); // defer the didCreate event after start https://github.com/eclipse-theia/theia/issues/11916 - - let state = DebugState.Inactive; - session.onDidChange(() => { - if (state !== session.state) { - state = session.state; - if (state === DebugState.Stopped) { - this.onDidStopDebugSessionEmitter.fire(session); - } - } - this.updateCurrentSession(session); - }); - session.onDidChangeBreakpoints((uri) => - this.fireDidChangeBreakpoints({ session, uri }) - ); - session.on('terminated', async (event) => { - const restart = event.body && event.body.restart; - if (restart) { - // postDebugTask isn't run in case of auto restart as well as preLaunchTask - this.doRestart(session, !!restart); - } else { - await session.disconnect(false, () => - this.debug.terminateDebugSession(session.id) - ); - await this.runTask( - session.options.workspaceFolderUri, - session.configuration.postDebugTask - ); - } - }); - - // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars - session.on('exited', async (event) => { - await session.disconnect(false, () => - this.debug.terminateDebugSession(session.id) - ); - }); - - session.onDispose(() => this.cleanup(session)); - session - .start() - .then(() => { - this.onDidCreateDebugSessionEmitter.fire(session); // now fire the didCreate event - this.onDidStartDebugSessionEmitter.fire(session); - }) - // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars - .catch((e) => { - session.stop(false, () => { - this.debug.terminateDebugSession(session.id); - }); - }); - session.onDidCustomEvent(({ event, body }) => - this.onDidReceiveDebugSessionCustomEventEmitter.fire({ - event, - body, - session, - }) - ); - return session; - } -} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-session.ts b/arduino-ide-extension/src/browser/theia/debug/debug-session.ts index 7db51c2ac..5b3ad61bb 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-session.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-session.ts @@ -1,231 +1,12 @@ -import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { Mutable } from '@theia/core/lib/common/types'; -import { URI } from '@theia/core/lib/common/uri'; import { DebugSession as TheiaDebugSession } from '@theia/debug/lib/browser/debug-session'; -import { DebugFunctionBreakpoint } from '@theia/debug/lib/browser/model/debug-function-breakpoint'; -import { DebugSourceBreakpoint } from '@theia/debug/lib/browser/model/debug-source-breakpoint'; -import { - DebugThreadData, - StoppedDetails, -} from '@theia/debug/lib/browser/model/debug-thread'; -import { DebugProtocol } from '@vscode/debugprotocol'; -import { DebugThread } from './debug-thread'; export class DebugSession extends TheiaDebugSession { - /** - * The `send('initialize')` request resolves later than `on('initialized')` emits the event. - * Hence, the `configure` would use the empty object `capabilities`. - * Using the empty `capabilities` could result in missing exception breakpoint filters, as - * always `capabilities.exceptionBreakpointFilters` is falsy. This deferred promise works - * around this timing issue. - * See: https://github.com/eclipse-theia/theia/issues/11886. - */ - protected didReceiveCapabilities = new Deferred(); - - protected override async initialize(): Promise<void> { - const clientName = FrontendApplicationConfigProvider.get().applicationName; - try { - const response = await this.connection.sendRequest('initialize', { - clientID: clientName.toLocaleLowerCase().replace(/ /g, '_'), - clientName, - adapterID: this.configuration.type, - locale: 'en-US', - linesStartAt1: true, - columnsStartAt1: true, - pathFormat: 'path', - supportsVariableType: false, - supportsVariablePaging: false, - supportsRunInTerminalRequest: true, - }); - this.updateCapabilities(response?.body || {}); - this.didReceiveCapabilities.resolve(); - } catch (err) { - this.didReceiveCapabilities.reject(err); - throw err; - } - } - - protected override async configure(): Promise<void> { - await this.didReceiveCapabilities.promise; - return super.configure(); - } - - override async stop(isRestart: boolean, callback: () => void): Promise<void> { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const _this = this as any; - if (!_this.isStopping) { - _this.isStopping = true; - if (this.configuration.lifecycleManagedByParent && this.parentSession) { - await this.parentSession.stop(isRestart, callback); - } else { - if (this.canTerminate()) { - const terminated = this.waitFor('terminated', 5000); - try { - await this.connection.sendRequest( - 'terminate', - { restart: isRestart }, - 5000 - ); - await terminated; - } catch (e) { - console.error('Did not receive terminated event in time', e); - } - } else { - const terminateDebuggee = - this.initialized && this.capabilities.supportTerminateDebuggee; - // Related https://github.com/microsoft/vscode/issues/165138 - try { - await this.sendRequest( - 'disconnect', - { restart: isRestart, terminateDebuggee }, - 2000 - ); - } catch (err) { - if ( - 'message' in err && - typeof err.message === 'string' && - err.message.test(err.message) - ) { - // VS Code ignores errors when sending the `disconnect` request. - // Debug adapter might not send the `disconnected` event as a response. - } else { - throw err; - } - } - } - callback(); - } - } + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + protected override handleDisconnectError(err: unknown): void { + // NOOP } - - protected override async sendFunctionBreakpoints( - affectedUri: URI - ): Promise<void> { - const all = this.breakpoints - .getFunctionBreakpoints() - .map( - (origin) => - new DebugFunctionBreakpoint(origin, this.asDebugBreakpointOptions()) - ); - const enabled = all.filter((b) => b.enabled); - if (this.capabilities.supportsFunctionBreakpoints) { - try { - const response = await this.sendRequest('setFunctionBreakpoints', { - breakpoints: enabled.map((b) => b.origin.raw), - }); - // Apparently, `body` and `breakpoints` can be missing. - // https://github.com/eclipse-theia/theia/issues/11885 - // https://github.com/microsoft/vscode/blob/80004351ccf0884b58359f7c8c801c91bb827d83/src/vs/workbench/contrib/debug/browser/debugSession.ts#L448-L449 - if (response && response.body) { - response.body.breakpoints.forEach((raw, index) => { - // node debug adapter returns more breakpoints sometimes - if (enabled[index]) { - enabled[index].update({ raw }); - } - }); - } - } catch (error) { - // could be error or promise rejection of DebugProtocol.SetFunctionBreakpoints - if (error instanceof Error) { - console.error(`Error setting breakpoints: ${error.message}`); - } else { - // handle adapters that send failed DebugProtocol.SetFunctionBreakpoints for invalid breakpoints - const genericMessage = - 'Function breakpoint not valid for current debug session'; - const message = error.message ? `${error.message}` : genericMessage; - console.warn( - `Could not handle function breakpoints: ${message}, disabling...` - ); - enabled.forEach((b) => - b.update({ - raw: { - verified: false, - message, - }, - }) - ); - } - } - } - this.setBreakpoints(affectedUri, all); - } - - protected override async sendSourceBreakpoints( - affectedUri: URI, - sourceModified?: boolean - ): Promise<void> { - const source = await this.toSource(affectedUri); - const all = this.breakpoints - .findMarkers({ uri: affectedUri }) - .map( - ({ data }) => - new DebugSourceBreakpoint(data, this.asDebugBreakpointOptions()) - ); - const enabled = all.filter((b) => b.enabled); - try { - const breakpoints = enabled.map(({ origin }) => origin.raw); - const response = await this.sendRequest('setBreakpoints', { - source: source.raw, - sourceModified, - breakpoints, - lines: breakpoints.map(({ line }) => line), - }); - response.body.breakpoints.forEach((raw, index) => { - // node debug adapter returns more breakpoints sometimes - if (enabled[index]) { - enabled[index].update({ raw }); - } - }); - } catch (error) { - // could be error or promise rejection of DebugProtocol.SetBreakpointsResponse - if (error instanceof Error) { - console.error(`Error setting breakpoints: ${error.message}`); - } else { - // handle adapters that send failed DebugProtocol.SetBreakpointsResponse for invalid breakpoints - const genericMessage = 'Breakpoint not valid for current debug session'; - const message = error.message ? `${error.message}` : genericMessage; - console.warn( - `Could not handle breakpoints for ${affectedUri}: ${message}, disabling...` - ); - enabled.forEach((b) => - b.update({ - raw: { - verified: false, - message, - }, - }) - ); - } - } - this.setSourceBreakpoints(affectedUri, all); - } - - protected override doUpdateThreads( - threads: DebugProtocol.Thread[], - stoppedDetails?: StoppedDetails - ): void { - const existing = this._threads; - this._threads = new Map(); - for (const raw of threads) { - const id = raw.id; - const thread = existing.get(id) || new DebugThread(this); // patched debug thread - this._threads.set(id, thread); - const data: Partial<Mutable<DebugThreadData>> = { raw }; - if (stoppedDetails) { - if (stoppedDetails.threadId === id) { - data.stoppedDetails = stoppedDetails; - } else if (stoppedDetails.allThreadsStopped) { - data.stoppedDetails = { - // When a debug adapter notifies us that all threads are stopped, - // we do not know why the others are stopped, so we should default - // to something generic. - reason: '', - }; - } - } - thread.update(data); - } - this.updateCurrentThread(stoppedDetails); + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + protected override handleTerminateError(err: unknown): void { + // NOOP } } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-stack-frame.ts b/arduino-ide-extension/src/browser/theia/debug/debug-stack-frame.ts deleted file mode 100644 index c52e238ae..000000000 --- a/arduino-ide-extension/src/browser/theia/debug/debug-stack-frame.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { WidgetOpenerOptions } from '@theia/core/lib/browser/widget-open-handler'; -import { Range } from '@theia/core/shared/vscode-languageserver-types'; -import { DebugStackFrame as TheiaDebugStackFrame } from '@theia/debug/lib/browser/model/debug-stack-frame'; -import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; - -export class DebugStackFrame extends TheiaDebugStackFrame { - override async open( - options: WidgetOpenerOptions = { - mode: 'reveal', - } - ): Promise<EditorWidget | undefined> { - if (!this.source) { - return undefined; - } - const { line, column, endLine, endColumn, source } = this.raw; - if (!source) { - return undefined; - } - // create selection based on VS Code - // https://github.com/eclipse-theia/theia/issues/11880 - const selection = Range.create( - line, - column, - endLine || line, - endColumn || column - ); - this.source.open({ - ...options, - selection, - }); - } -} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-thread.ts b/arduino-ide-extension/src/browser/theia/debug/debug-thread.ts deleted file mode 100644 index bb0d3313c..000000000 --- a/arduino-ide-extension/src/browser/theia/debug/debug-thread.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { DebugStackFrame as TheiaDebugStackFrame } from '@theia/debug/lib/browser/model/debug-stack-frame'; -import { DebugThread as TheiaDebugThread } from '@theia/debug/lib/browser/model/debug-thread'; -import { DebugProtocol } from '@vscode/debugprotocol'; -import { DebugStackFrame } from './debug-stack-frame'; - -export class DebugThread extends TheiaDebugThread { - protected override doUpdateFrames( - frames: DebugProtocol.StackFrame[] - ): TheiaDebugStackFrame[] { - const result = new Set<TheiaDebugStackFrame>(); - for (const raw of frames) { - const id = raw.id; - const frame = - this._frames.get(id) || new DebugStackFrame(this, this.session); // patched debug stack frame - this._frames.set(id, frame); - frame.update({ raw }); - result.add(frame); - } - this.updateCurrentFrame(); - return [...result.values()]; - } -} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-toolbar-widget.tsx b/arduino-ide-extension/src/browser/theia/debug/debug-toolbar-widget.tsx deleted file mode 100644 index bc6e135e8..000000000 --- a/arduino-ide-extension/src/browser/theia/debug/debug-toolbar-widget.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { ContextKeyService } from '@theia/core/lib/browser/context-key-service'; -import { CommandRegistry } from '@theia/core/lib/common/command'; -import { - ActionMenuNode, - CompositeMenuNode, - MenuModelRegistry, -} from '@theia/core/lib/common/menu'; -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 { DebugState } from '@theia/debug/lib/browser/debug-session'; -import { DebugAction } from './debug-action'; -import { DebugToolBar as TheiaDebugToolbar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; - -@injectable() -export class DebugToolbar extends TheiaDebugToolbar { - @inject(CommandRegistry) private readonly commandRegistry: CommandRegistry; - @inject(MenuModelRegistry) - private readonly menuModelRegistry: MenuModelRegistry; - @inject(ContextKeyService) - private readonly contextKeyService: ContextKeyService; - - protected override render(): React.ReactNode { - const { state } = this.model; - return ( - <React.Fragment> - {this.renderContributedCommands()} - {this.renderContinue()} - <DebugAction - enabled={state === DebugState.Stopped} - run={this.stepOver} - label={nls.localizeByDefault('Step Over')} - iconClass="debug-step-over" - ref={this.setStepRef} - /> - <DebugAction - enabled={state === DebugState.Stopped} - run={this.stepIn} - label={nls.localizeByDefault('Step Into')} - iconClass="debug-step-into" - /> - <DebugAction - enabled={state === DebugState.Stopped} - run={this.stepOut} - label={nls.localizeByDefault('Step Out')} - iconClass="debug-step-out" - /> - <DebugAction - enabled={state !== DebugState.Inactive} - run={this.restart} - label={nls.localizeByDefault('Restart')} - iconClass="debug-restart" - /> - {this.renderStart()} - </React.Fragment> - ); - } - - private renderContributedCommands(): React.ReactNode { - return this.menuModelRegistry - .getMenu(TheiaDebugToolbar.MENU) - .children.filter((node) => node instanceof CompositeMenuNode) - .map((node) => (node as CompositeMenuNode).children) - .reduce((acc, curr) => acc.concat(curr), []) - .filter((node) => node instanceof ActionMenuNode) - .map((node) => this.debugAction(node as ActionMenuNode)); - } - - private debugAction(node: ActionMenuNode): React.ReactNode { - const { label, command, when, icon: iconClass = '' } = node; - const run = () => this.commandRegistry.executeCommand(command); - const enabled = when ? this.contextKeyService.match(when) : true; - return ( - enabled && ( - <DebugAction - key={command} - enabled={enabled} - label={label} - iconClass={iconClass} - run={run} - /> - ) - ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts index 168883910..c4ef43539 100644 --- a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts +++ b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts @@ -1,5 +1,3 @@ -import { ResourceSaveOptions } from '@theia/core/lib/common/resource'; -import { Readable } from '@theia/core/lib/common/stream'; import URI from '@theia/core/lib/common/uri'; import { injectable } from '@theia/core/shared/inversify'; import { @@ -11,14 +9,13 @@ import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { FileOperationError, FileOperationResult, - FileStat, } from '@theia/filesystem/lib/common/files'; -import * as PQueue from 'p-queue'; +import PQueue from 'p-queue'; @injectable() export class FileResourceResolver extends TheiaFileResourceResolver { override async resolve(uri: URI): Promise<WriteQueuedFileResource> { - let stat: FileStat | undefined; + let stat; try { stat = await this.fileService.resolve(uri); } catch (e) { @@ -37,6 +34,7 @@ export class FileResourceResolver extends TheiaFileResourceResolver { ); } return new WriteQueuedFileResource(uri, this.fileService, { + isReadonly: stat?.isReadonly ?? false, shouldOverwrite: () => this.shouldOverwrite(uri), shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error), }); @@ -52,23 +50,32 @@ class WriteQueuedFileResource extends FileResource { options: FileResourceOptions ) { super(uri, fileService, options); + const originalDoWrite = this['doWrite']; + this['doWrite'] = (content, options) => + this.writeQueue.add(() => originalDoWrite.bind(this)(content, options)); + const originalSaveStream = this['saveStream']; + if (originalSaveStream) { + this['saveStream'] = (content, options) => + this.writeQueue.add(() => + originalSaveStream.bind(this)(content, options) + ); + } + const originalSaveContents = this['saveContents']; + if (originalSaveContents) { + this['saveContents'] = (content, options) => + this.writeQueue.add(() => + originalSaveContents.bind(this)(content, options) + ); + } const originalSaveContentChanges = this['saveContentChanges']; if (originalSaveContentChanges) { - this['saveContentChanges'] = (changes, options) => { - return this.writeQueue.add(() => + this['saveContentChanges'] = (changes, options) => + this.writeQueue.add(() => originalSaveContentChanges.bind(this)(changes, options) ); - }; } } - protected override async doWrite( - content: string | Readable<string>, - options?: ResourceSaveOptions - ): Promise<void> { - return this.writeQueue.add(() => super.doWrite(content, options)); - } - protected override async isInSync(): Promise<boolean> { // Let all the write operations finish to update the version (mtime) before checking whether the resource is in sync. // https://github.com/eclipse-theia/theia/issues/12327 diff --git a/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts b/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts index 73b98163c..8bff8c974 100644 --- a/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts +++ b/arduino-ide-extension/src/browser/theia/markers/problem-manager.ts @@ -8,7 +8,7 @@ import URI from '@theia/core/lib/common/uri'; import { Marker } from '@theia/markers/lib/common/marker'; import { ProblemManager as TheiaProblemManager } from '@theia/markers/lib/browser/problem/problem-manager'; import { ConfigServiceClient } from '../../config/config-service-client'; -import debounce = require('lodash.debounce'); +import debounce from 'lodash.debounce'; import { ARDUINO_CLOUD_FOLDER, REMOTE_SKETCHBOOK_FOLDER, diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-menu.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-menu.ts new file mode 100644 index 000000000..5d8ae055f --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-menu.ts @@ -0,0 +1,24 @@ +import type { MenuModelRegistry } from '@theia/core/lib/common/menu/menu-model-registry'; +import { injectable } from '@theia/core/shared/inversify'; +import { MonacoEditorMenuContribution as TheiaMonacoEditorMenuContribution } from '@theia/monaco/lib/browser/monaco-menu'; + +@injectable() +export class MonacoEditorMenuContribution extends TheiaMonacoEditorMenuContribution { + override registerMenus(registry: MenuModelRegistry): void { + super.registerMenus(registry); + // https://github.com/arduino/arduino-ide/issues/1394 + registry.unregisterMenuAction('editor.action.refactor'); // Refactor... + registry.unregisterMenuAction('editor.action.sourceAction'); // Source Action... + // https://github.com/arduino/arduino-ide/pull/2027#pullrequestreview-1414246614 + // Root editor context menu + registry.unregisterMenuAction('editor.action.revealDeclaration'); // Go to Declaration + registry.unregisterMenuAction('editor.action.goToTypeDefinition'); // Go to Type Definition + registry.unregisterMenuAction('editor.action.goToImplementation'); // Go to Implementations + registry.unregisterMenuAction('editor.action.goToReferences'); // Go to References + // Peek submenu + registry.unregisterMenuAction('editor.action.peekDeclaration'); // Peek Declaration + registry.unregisterMenuAction('editor.action.peekTypeDefinition'); // Peek Type Definition + registry.unregisterMenuAction('editor.action.peekImplementation'); // Peek Implementation + registry.unregisterMenuAction('editor.action.referenceSearch.trigger'); // Peek References + } +} diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/debug-main.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/debug-main.ts deleted file mode 100644 index 0845d6196..000000000 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/debug-main.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; -import { DebuggerDescription } from '@theia/debug/lib/common/debug-service'; -import { DebugMainImpl as TheiaDebugMainImpl } from '@theia/plugin-ext/lib/main/browser/debug/debug-main'; -import { PluginDebugAdapterContribution } from '@theia/plugin-ext/lib/main/browser/debug/plugin-debug-adapter-contribution'; -import { PluginDebugSessionFactory } from './plugin-debug-session-factory'; - -export class DebugMainImpl extends TheiaDebugMainImpl { - override async $registerDebuggerContribution( - description: DebuggerDescription - ): Promise<void> { - const debugType = description.type; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const _this = <any>this; - const terminalOptionsExt = await _this.debugExt.$getTerminalCreationOptions( - debugType - ); - - if (_this.toDispose.disposed) { - return; - } - - const debugSessionFactory = new PluginDebugSessionFactory( - _this.terminalService, - _this.editorManager, - _this.breakpointsManager, - _this.labelProvider, - _this.messages, - _this.outputChannelManager, - _this.debugPreferences, - async (sessionId: string) => { - const connection = await _this.connectionMain.ensureConnection( - sessionId - ); - return connection; - }, - _this.fileService, - terminalOptionsExt, - _this.debugContributionProvider, - _this.workspaceService - ); - - const toDispose = new DisposableCollection( - Disposable.create(() => _this.debuggerContributions.delete(debugType)) - ); - _this.debuggerContributions.set(debugType, toDispose); - toDispose.pushAll([ - _this.pluginDebugService.registerDebugAdapterContribution( - new PluginDebugAdapterContribution( - description, - _this.debugExt, - _this.pluginService - ) - ), - _this.sessionContributionRegistrator.registerDebugSessionContribution({ - debugType: description.type, - debugSessionFactory: () => debugSessionFactory, - }), - ]); - _this.toDispose.push( - Disposable.create(() => this.$unregisterDebuggerConfiguration(debugType)) - ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts index 666a6eedc..326e02ee4 100644 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts +++ b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts @@ -1,16 +1,7 @@ import { Emitter, Event, JsonRpcProxy } from '@theia/core'; import { injectable, interfaces } from '@theia/core/shared/inversify'; import { HostedPluginServer } from '@theia/plugin-ext/lib/common/plugin-protocol'; -import { RPCProtocol } from '@theia/plugin-ext/lib/common/rpc-protocol'; -import { - HostedPluginSupport as TheiaHostedPluginSupport, - PluginHost, -} from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; -import { PluginWorker } from '@theia/plugin-ext/lib/hosted/browser/plugin-worker'; -import { setUpPluginApi } from '@theia/plugin-ext/lib/main/browser/main-context'; -import { PLUGIN_RPC_CONTEXT } from '@theia/plugin-ext/lib/common/plugin-api-rpc'; -import { DebugMainImpl } from './debug-main'; -import { ConnectionImpl } from '@theia/plugin-ext/lib/common/connection'; +import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; @injectable() export class HostedPluginSupport extends TheiaHostedPluginSupport { @@ -41,26 +32,4 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport { // eslint-disable-next-line @typescript-eslint/no-explicit-any return (this as any).server; } - - // to patch the VS Code extension based debugger - // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars - protected override initRpc(host: PluginHost, pluginId: string): RPCProtocol { - const rpc = - host === 'frontend' ? new PluginWorker().rpc : this.createServerRpc(host); - setUpPluginApi(rpc, this.container); - this.patchDebugMain(rpc); - this.mainPluginApiProviders - .getContributions() - .forEach((p) => p.initialize(rpc, this.container)); - return rpc; - } - - private patchDebugMain(rpc: RPCProtocol): void { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const connectionMain = (rpc as any).locals.get( - PLUGIN_RPC_CONTEXT.CONNECTION_MAIN.id - ) as ConnectionImpl; - const debugMain = new DebugMainImpl(rpc, connectionMain, this.container); - rpc.set(PLUGIN_RPC_CONTEXT.DEBUG_MAIN, debugMain); - } } diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session-factory.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session-factory.ts deleted file mode 100644 index a84275e1a..000000000 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session-factory.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { DebugSession } from '@theia/debug/lib/browser/debug-session'; -import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection'; -import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; -import { PluginDebugSessionFactory as TheiaPluginDebugSessionFactory } from '@theia/plugin-ext/lib/main/browser/debug/plugin-debug-session-factory'; -import { PluginDebugSession } from './plugin-debug-session'; - -export class PluginDebugSessionFactory extends TheiaPluginDebugSessionFactory { - override get( - sessionId: string, - options: DebugConfigurationSessionOptions, - parentSession?: DebugSession - ): DebugSession { - const connection = new DebugSessionConnection( - sessionId, - this.connectionFactory, - this.getTraceOutputChannel() - ); - - return new PluginDebugSession( - sessionId, - options, - parentSession, - connection, - this.terminalService, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.editorManager as any, - this.breakpoints, - this.labelProvider, - this.messages, - this.fileService, - this.terminalOptionsExt, - this.debugContributionProvider, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.workspaceService as any - ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session.ts deleted file mode 100644 index 28b1de7ef..000000000 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-debug-session.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ContributionProvider, MessageClient } from '@theia/core'; -import { LabelProvider } from '@theia/core/lib/browser'; -import { BreakpointManager } from '@theia/debug/lib/browser/breakpoint/breakpoint-manager'; -import { DebugContribution } from '@theia/debug/lib/browser/debug-contribution'; -import { DebugSession as TheiaDebugSession } from '@theia/debug/lib/browser/debug-session'; -import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection'; -import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { TerminalOptionsExt } from '@theia/plugin-ext'; -import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service'; -import { - TerminalWidget, - TerminalWidgetOptions, -} from '@theia/terminal/lib/browser/base/terminal-widget'; -import { DebugSession } from '../debug/debug-session'; -import { EditorManager } from '../editor/editor-manager'; -import { WorkspaceService } from '../workspace/workspace-service'; - -// This class extends the patched debug session, and not the default debug session from Theia -export class PluginDebugSession extends DebugSession { - constructor( - override readonly id: string, - override readonly options: DebugConfigurationSessionOptions, - override readonly parentSession: TheiaDebugSession | undefined, - protected override readonly connection: DebugSessionConnection, - protected override readonly terminalServer: TerminalService, - protected override readonly editorManager: EditorManager, - protected override readonly breakpoints: BreakpointManager, - protected override readonly labelProvider: LabelProvider, - protected override readonly messages: MessageClient, - protected override readonly fileService: FileService, - protected readonly terminalOptionsExt: TerminalOptionsExt | undefined, - protected override readonly debugContributionProvider: ContributionProvider<DebugContribution>, - protected override readonly workspaceService: WorkspaceService - ) { - super( - id, - options, - parentSession, - connection, - terminalServer, - editorManager, - breakpoints, - labelProvider, - messages, - fileService, - debugContributionProvider, - workspaceService - ); - } - - protected override async doCreateTerminal( - terminalWidgetOptions: TerminalWidgetOptions - ): Promise<TerminalWidget> { - terminalWidgetOptions = Object.assign( - {}, - terminalWidgetOptions, - this.terminalOptionsExt - ); - return super.doCreateTerminal(terminalWidgetOptions); - } -} diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-menu-command-adapter.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-menu-command-adapter.ts deleted file mode 100644 index 156bbb2cb..000000000 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/plugin-menu-command-adapter.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { MenuPath } from '@theia/core'; -import { TAB_BAR_TOOLBAR_CONTEXT_MENU } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; -import { injectable, postConstruct } from '@theia/core/shared/inversify'; -import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; -import { DebugVariablesWidget } from '@theia/debug/lib/browser/view/debug-variables-widget'; -import { - ArgumentAdapter, - PluginMenuCommandAdapter as TheiaPluginMenuCommandAdapter, -} from '@theia/plugin-ext/lib/main/browser/menus/plugin-menu-command-adapter'; -import { - codeToTheiaMappings, - ContributionPoint, -} from '@theia/plugin-ext/lib/main/browser/menus/vscode-theia-menu-mappings'; - -function patch( - toPatch: typeof codeToTheiaMappings, - key: string, - value: MenuPath[] -): void { - const loose = toPatch as Map<string, MenuPath[]>; - if (!loose.has(key)) { - loose.set(key, value); - } -} -// mappings is a const and cannot be customized with DI -patch(codeToTheiaMappings, 'debug/variables/context', [ - DebugVariablesWidget.CONTEXT_MENU, -]); -patch(codeToTheiaMappings, 'debug/toolBar', [DebugToolBar.MENU]); - -@injectable() -export class PluginMenuCommandAdapter extends TheiaPluginMenuCommandAdapter { - @postConstruct() - protected override init(): void { - const toCommentArgs: ArgumentAdapter = (...args) => - this.toCommentArgs(...args); - const firstArgOnly: ArgumentAdapter = (...args) => [args[0]]; - const noArgs: ArgumentAdapter = () => []; - const toScmArgs: ArgumentAdapter = (...args) => this.toScmArgs(...args); - const selectedResource = () => this.getSelectedResources(); - const widgetURI: ArgumentAdapter = (widget) => - this.codeEditorUtil.is(widget) - ? [this.codeEditorUtil.getResourceUri(widget)] - : []; - (<Array<[ContributionPoint, ArgumentAdapter | undefined]>>[ - ['comments/comment/context', toCommentArgs], - ['comments/comment/title', toCommentArgs], - ['comments/commentThread/context', toCommentArgs], - ['debug/callstack/context', firstArgOnly], - ['debug/variables/context', firstArgOnly], - ['debug/toolBar', noArgs], - ['editor/context', selectedResource], - ['editor/title', widgetURI], - ['editor/title/context', selectedResource], - ['explorer/context', selectedResource], - ['scm/resourceFolder/context', toScmArgs], - ['scm/resourceGroup/context', toScmArgs], - ['scm/resourceState/context', toScmArgs], - ['scm/title', () => this.toScmArg(this.scmService.selectedRepository)], - ['timeline/item/context', (...args) => this.toTimelineArgs(...args)], - ['view/item/context', (...args) => this.toTreeArgs(...args)], - ['view/title', noArgs], - ]).forEach(([contributionPoint, adapter]) => { - if (adapter) { - const paths = codeToTheiaMappings.get(contributionPoint); - if (paths) { - paths.forEach((path) => this.addArgumentAdapter(path, adapter)); - } - } - }); - this.addArgumentAdapter(TAB_BAR_TOOLBAR_CONTEXT_MENU, widgetURI); - } -} diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts index ec8da1f97..f039d5816 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts @@ -15,8 +15,9 @@ import { SketchesService, } from '../../../common/protocol/sketches-service'; import { - StartupTask, StartupTaskProvider, + hasStartupTasks, + StartupTask, } from '../../../electron-common/startup-task'; import { WindowServiceExt } from '../core/window-service-ext'; @@ -128,7 +129,7 @@ export class WorkspaceService extends TheiaWorkspaceService { .getContributions() .map((contribution) => contribution.tasks()) .reduce((prev, curr) => prev.concat(curr), []); - if (StartupTask.has(options)) { + if (hasStartupTasks(options)) { tasks.push(...options.tasks); } return tasks; diff --git a/arduino-ide-extension/src/browser/utils/dom.ts b/arduino-ide-extension/src/browser/utils/dom.ts index 5d6e65d3c..938b496ab 100644 --- a/arduino-ide-extension/src/browser/utils/dom.ts +++ b/arduino-ide-extension/src/browser/utils/dom.ts @@ -1,4 +1,4 @@ -import { notEmpty } from '@theia/core'; +import { notEmpty } from '@theia/core/lib/common/objects'; /** * Finds the closest child HTMLButtonElement representing a Theia button. diff --git a/arduino-ide-extension/src/browser/widgets/arduino-select.tsx b/arduino-ide-extension/src/browser/widgets/arduino-select.tsx index da3ff5f53..31950ff8e 100644 --- a/arduino-ide-extension/src/browser/widgets/arduino-select.tsx +++ b/arduino-ide-extension/src/browser/widgets/arduino-select.tsx @@ -1,16 +1,9 @@ import * as React from '@theia/core/shared/react'; +import type { Props, StylesConfig, ThemeConfig } from 'react-select'; import Select from 'react-select'; -import type { StylesConfig } from 'react-select/dist/declarations/src/styles'; -import type { ThemeConfig } from 'react-select/dist/declarations/src/theme'; -import type { GroupBase } from 'react-select/dist/declarations/src/types'; -import type { StateManagerProps } from 'react-select/dist/declarations/src/useStateManager'; -export class ArduinoSelect< - Option, - IsMulti extends boolean = false, - Group extends GroupBase<Option> = GroupBase<Option> -> extends React.Component<StateManagerProps<Option, IsMulti, Group>> { - constructor(props: StateManagerProps<Option, IsMulti, Group>) { +export class ArduinoSelect extends React.Component<Props> { + constructor(props: Props) { super(props); } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx index 46e273b25..0d4b5eb82 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx @@ -12,8 +12,8 @@ import { AuthenticationClientService } from '../../auth/authentication-client-se import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; import { BaseSketchbookCompositeWidget } from '../sketchbook/sketchbook-composite-widget'; import { CreateNew } from '../sketchbook/create-new'; -import { AuthenticationSession } from '../../../node/auth/types'; import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; +import { AuthenticationSession } from '../../../common/protocol/authentication-service'; @injectable() export class CloudSketchbookCompositeWidget extends BaseSketchbookCompositeWidget<CloudSketchbookTreeWidget> { diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts index f58f747e7..f7136e253 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-contributions.ts @@ -34,6 +34,7 @@ import { SketchbookCommands } from '../sketchbook/sketchbook-commands'; import { CloudSketchbookCommands } from './cloud-sketchbook-commands'; import { CloudSketchbookTree } from './cloud-sketchbook-tree'; import { CreateUri } from '../../create/create-uri'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; const SKETCHBOOKSYNC__CONTEXT = ['arduino-sketchbook-sync--context']; @@ -61,6 +62,8 @@ export class CloudSketchbookContribution extends CloudSketchContribution { private readonly configServiceClient: ConfigServiceClient; @inject(ApplicationConnectionStatusContribution) private readonly connectionStatus: ApplicationConnectionStatusContribution; + @inject(ClipboardService) + private readonly clipboardService: ClipboardService; private readonly onDidChangeToolbarEmitter = new Emitter<void>(); private readonly toDisposeBeforeNewContextMenu = new DisposableCollection(); @@ -176,6 +179,7 @@ export class CloudSketchbookContribution extends CloudSketchContribution { node: arg.node, title: nls.localize('arduino/cloud/shareSketch', 'Share Sketch'), createApi: this.createApi, + clipboardService: this.clipboardService, }).open(); }, isEnabled: (arg) => this.isCloudSketchDirNodeCommandArg(arg), diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts index e57926465..986a10ac6 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-model.ts @@ -35,6 +35,7 @@ function sketchBaseDir(sketch: Create.Sketch): FileStat { isDirectory: true, isFile: false, isSymbolicLink: false, + isReadonly: false, resource: createPath, mtime, ctime, diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx index 8877d2381..375e874df 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx @@ -12,7 +12,6 @@ import { import { NodeProps } from '@theia/core/lib/browser/tree/tree-widget'; import { TreeNode } from '@theia/core/lib/browser/tree'; import { CompositeTreeNode } from '@theia/core/lib/browser'; -import { shell } from '@theia/core/electron-shared/@electron/remote'; import { SketchbookTreeWidget } from '../sketchbook/sketchbook-tree-widget'; import { nls } from '@theia/core/lib/common'; import { ApplicationConnectionStatusContribution } from '../../theia/core/connection-status-service'; @@ -60,7 +59,12 @@ export class CloudSketchbookTreeWidget extends SketchbookTreeWidget { </div> <button className="theia-button uppercase" - onClick={() => shell.openExternal('https://create.arduino.cc/editor')} + onClick={() => + this.windowService.openNewWindow( + 'https://create.arduino.cc/editor', + { external: true } + ) + } > {nls.localize('arduino/cloud/goToCloud', 'Go to Cloud')} </button> @@ -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/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index 05e0e95be..bf7eec3cf 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,5 +1,5 @@ import * as React from '@theia/core/shared/react'; -import debounce = require('lodash.debounce'); +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'; 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/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/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index 962f52aec..2b05cf819 100644 --- a/arduino-ide-extension/src/common/protocol/installable.ts +++ b/arduino-ide-extension/src/common/protocol/installable.ts @@ -1,8 +1,12 @@ -import * as semver from 'semver'; -import { ExecuteWithProgress } from './progressible'; +import type { MessageService } from '@theia/core/lib/common/message-service'; +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 interface Installable<T extends ArduinoComponent> { @@ -35,16 +39,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); diff --git a/arduino-ide-extension/src/common/protocol/monitor-service.ts b/arduino-ide-extension/src/common/protocol/monitor-service.ts index 6c9bbcac9..5eb793f5b 100644 --- a/arduino-ide-extension/src/common/protocol/monitor-service.ts +++ b/arduino-ide-extension/src/common/protocol/monitor-service.ts @@ -1,10 +1,12 @@ import { ApplicationError, Event, JsonRpcServer, nls } from '@theia/core'; -import { - PluggableMonitorSettings, - MonitorSettings, -} from '../../node/monitor-settings/monitor-settings-provider'; import { Board, Port } from './boards-service'; +export type PluggableMonitorSettings = Record<string, PluggableMonitorSetting>; +export interface MonitorSettings { + pluggableMonitorSettings?: PluggableMonitorSettings; + monitorUISettings?: Partial<MonitorState>; +} + export const MonitorManagerProxyFactory = Symbol('MonitorManagerProxyFactory'); export type MonitorManagerProxyFactory = () => MonitorManagerProxy; 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/electron-browser/electron-app-service.ts b/arduino-ide-extension/src/electron-browser/electron-app-service.ts new file mode 100644 index 000000000..968247566 --- /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 { 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(); + } + + version(): Promise<string> { + return window.electronArduino.appVersion(); + } + + registerStartupTasksHandler( + handler: (tasks: StartupTasks) => void + ): Disposable { + return window.electronArduino.registerStartupTasksHandler(handler); + } + + scheduleDeletion(sketch: Sketch): void { + window.electronArduino.scheduleDeletion(sketch); + } +} diff --git a/arduino-ide-extension/src/electron-browser/electron-arduino-module.ts b/arduino-ide-extension/src/electron-browser/electron-arduino-module.ts new file mode 100644 index 000000000..d0f97c1b0 --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/electron-arduino-module.ts @@ -0,0 +1,12 @@ +import { ContainerModule } from '@theia/core/shared/inversify'; +import { AppService } from '../browser/app-service'; +import { DialogService } from '../browser/dialog-service'; +import { ElectronAppService } from './electron-app-service'; +import { ElectronDialogService } from './electron-dialog-service'; + +export default new ContainerModule((bind) => { + bind(ElectronAppService).toSelf().inSingletonScope(); + bind(AppService).toService(ElectronAppService); + bind(ElectronDialogService).toSelf().inSingletonScope(); + bind(DialogService).toService(ElectronDialogService); +}); diff --git a/arduino-ide-extension/src/electron-browser/electron-dialog-service.ts b/arduino-ide-extension/src/electron-browser/electron-dialog-service.ts new file mode 100644 index 000000000..edb4cbd26 --- /dev/null +++ b/arduino-ide-extension/src/electron-browser/electron-dialog-service.ts @@ -0,0 +1,25 @@ +import { injectable } from '@theia/core/shared/inversify'; +import type { DialogService } from '../browser/dialog-service'; +import type { + MessageBoxOptions, + MessageBoxReturnValue, + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from '../electron-common/electron-arduino'; + +@injectable() +export class ElectronDialogService implements DialogService { + showMessageBox(options: MessageBoxOptions): Promise<MessageBoxReturnValue> { + return window.electronArduino.showMessageBox(options); + } + + showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue> { + return window.electronArduino.showOpenDialog(options); + } + + showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue> { + return window.electronArduino.showSaveDialog(options); + } +} diff --git a/arduino-ide-extension/src/electron-browser/preload.ts b/arduino-ide-extension/src/electron-browser/preload.ts new file mode 100644 index 000000000..feb24ba97 --- /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_VERSION, + CHANNEL_IS_FIRST_WINDOW, + CHANNEL_MAIN_MENU_ITEM_DID_CLICK, + CHANNEL_OPEN_PATH, + CHANNEL_PLOTTER_WINDOW_DID_CLOSE, + CHANNEL_QUIT_APP, + CHANNEL_SCHEDULE_DELETION, + CHANNEL_SEND_STARTUP_TASKS, + CHANNEL_SET_MENU_WITH_NODE_ID, + CHANNEL_SET_REPRESENTED_FILENAME, + CHANNEL_SHOW_MESSAGE_BOX, + CHANNEL_SHOW_OPEN_DIALOG, + CHANNEL_SHOW_PLOTTER_WINDOW, + CHANNEL_SHOW_SAVE_DIALOG, + ElectronArduino, + InternalMenuDto, + MessageBoxOptions, + OpenDialogOptions, + SaveDialogOptions, +} from '../electron-common/electron-arduino'; +import { hasStartupTasks, StartupTasks } from '../electron-common/startup-task'; + +let mainMenuHandlers: Map<string, () => void> = new Map(); + +function convertMenu( + menu: MenuDto[] | undefined, + handlerMap: Map<string, () => void> +): InternalMenuDto[] | undefined { + if (!menu) { + return undefined; + } + + return menu.map((item) => { + let nodeId = 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), + appVersion: () => ipcRenderer.invoke(CHANNEL_APP_VERSION), + 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<void> { @@ -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<void> { + try { + // This is workaround for https://github.com/eclipse-theia/theia/issues/446. + // Electron menus do not update based on the `isEnabled`, `isVisible` property of the command. + // We need to check if we can execute it. + if (this.menuCommandExecutor.isEnabled(menuPath, commandId, ...args)) { + await this.menuCommandExecutor.executeCommand( + menuPath, + commandId, + ...args + ); + if ( + this._menu && + this.menuCommandExecutor.isVisible(menuPath, commandId, ...args) + ) { + const item = this.findMenuById(this._menu, commandId); + if (item) { + item.checked = this.menuCommandExecutor.isToggled( + menuPath, + commandId, + ...args + ); + window.electronArduino.setMenu(this._menu); // overridden to call the IDE2-specific implementation. + } + } + } + } catch { + // no-op + } } // TODO: remove after https://github.com/eclipse-theia/theia/pull/9231 - private escapeAmpersand( - template: Electron.MenuItemConstructorOptions[] - ): Electron.MenuItemConstructorOptions[] { + private escapeAmpersand(template: MenuDto[]): MenuDto[] { for (const option of template) { if (option.label) { option.label = option.label.replace(/\&+/g, '&$&'); } if (option.submenu) { - this.escapeAmpersand( - option.submenu as Electron.MenuItemConstructorOptions[] - ); + this.escapeAmpersand(option.submenu); } } return template; } - protected override createOSXMenu(): Electron.MenuItemConstructorOptions { + protected override createOSXMenu(): MenuDto { const { submenu } = super.createOSXMenu(); const label = 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<boolean> | undefined; @postConstruct() protected override init(): void { // NOOP - // Does not listen on Theia's `window.zoomLevel` changes. - // TODO: IDE2 must switch to the Theia preferences and drop the custom one. + // 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<boolean> | undefined; async isFirstWindow(): Promise<boolean> { - if (this._firstWindow === undefined) { - this._firstWindow = new Deferred<boolean>(); - 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..2d5174981 --- /dev/null +++ b/arduino-ide-extension/src/electron-common/electron-arduino.ts @@ -0,0 +1,92 @@ +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'; +import type { Sketch } from '../common/protocol/sketches-service'; +import type { StartupTasks } from './startup-task'; + +export interface InternalMenuDto + extends Omit<TheiaInternalMenuDto, 'handlerId'> { + // Theia handles the menus with a running-index handler ID. https://github.com/eclipse-theia/theia/issues/12493 + // IDE2 keeps the menu `nodeId` instead of the running-index. + nodeId?: string; +} + +export type MessageBoxOptions = Omit< + ElectronMessageBoxOptions, + 'icon' | 'signal' +>; +export type MessageBoxReturnValue = ElectronMessageBoxReturnValue; +export type OpenDialogOptions = ElectronOpenDialogOptions; +export type OpenDialogReturnValue = ElectronOpenDialogReturnValue; +export type SaveDialogOptions = ElectronSaveDialogOptions; +export type SaveDialogReturnValue = ElectronSaveDialogReturnValue; + +export interface ShowPlotterWindowParams { + readonly url: string; + readonly forceReload?: boolean; +} +export function isShowPlotterWindowParams( + arg: unknown +): arg is ShowPlotterWindowParams { + return ( + typeof arg === 'object' && + typeof (<ShowPlotterWindowParams>arg).url === 'string' && + ((<ShowPlotterWindowParams>arg).forceReload === undefined || + typeof (<ShowPlotterWindowParams>arg).forceReload === 'boolean') + ); +} + +export interface ElectronArduino { + showMessageBox(options: MessageBoxOptions): Promise<MessageBoxReturnValue>; + showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue>; + showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue>; + appVersion(): Promise<string>; + quitApp(): void; + isFirstWindow(): Promise<boolean>; + requestReload(tasks: StartupTasks): void; + registerStartupTasksHandler( + handler: (tasks: StartupTasks) => void + ): Disposable; + scheduleDeletion(sketch: Sketch): void; + setRepresentedFilename(fsPath: string): void; + showPlotterWindow(params: { url: string; forceReload?: boolean }): void; + registerPlotterWindowCloseHandler(handler: () => void): Disposable; + openPath(fsPath: string): void; + // Unlike the Theia implementation, IDE2 uses the command IDs, and not the running-index handler IDs. + // https://github.com/eclipse-theia/theia/issues/12493 + setMenu(menu: MenuDto[] | undefined): void; +} + +declare global { + interface Window { + electronArduino: ElectronArduino; + } +} + +// renderer to main +export const CHANNEL_SHOW_MESSAGE_BOX = 'Arduino:ShowMessageBox'; +export const CHANNEL_SHOW_OPEN_DIALOG = 'Arduino:ShowOpenDialog'; +export const CHANNEL_SHOW_SAVE_DIALOG = 'Arduino:ShowSaveDialog'; +export const CHANNEL_APP_VERSION = 'Arduino:AppVersion'; +export const CHANNEL_QUIT_APP = 'Arduino:QuitApp'; +export const CHANNEL_IS_FIRST_WINDOW = 'Arduino:IsFirstWindow'; +export const CHANNEL_SCHEDULE_DELETION = 'Arduino:ScheduleDeletion'; +export const CHANNEL_SET_REPRESENTED_FILENAME = + 'Arduino:SetRepresentedFilename'; +export const CHANNEL_SHOW_PLOTTER_WINDOW = 'Arduino:ShowPlotterWindow'; +export const CHANNEL_OPEN_PATH = 'Arduino:OpenPath'; +export const CHANNEL_SET_MENU_WITH_NODE_ID = 'Arduino:SetMenuWithNodeId'; +// main to renderer +export const CHANNEL_SEND_STARTUP_TASKS = 'Arduino:SendStartupTasks'; +export const CHANNEL_PLOTTER_WINDOW_DID_CLOSE = 'Arduino:PlotterWindowDidClose'; +export const CHANNEL_MAIN_MENU_ITEM_DID_CLICK = 'Arduino:MainMenuItemDidClick'; diff --git a/arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts b/arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts deleted file mode 100644 index c0e52d353..000000000 --- a/arduino-ide-extension/src/electron-common/electron-main-window-service-ext.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const electronMainWindowServiceExtPath = '/services/electron-window-ext'; -export const ElectronMainWindowServiceExt = Symbol( - 'ElectronMainWindowServiceExt' -); -export interface ElectronMainWindowServiceExt { - isFirstWindow(windowId: number): Promise<boolean>; -} diff --git a/arduino-ide-extension/src/electron-common/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 ( + (<StartupTask>arg).command !== undefined && + typeof (<StartupTask>arg).command === 'string' + ) { return ( - 'tasks' in object && - Array.isArray(object['tasks']) && - object['tasks'].every(is) + (<StartupTask>arg).args === undefined || + ((<StartupTask>arg).args !== undefined && + Array.isArray((<StartupTask>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 ( + (<StartupTasks>arg).tasks !== undefined && + Array.isArray((<StartupTasks>arg).tasks) && + Boolean((<StartupTasks>arg).tasks.length) && + (<StartupTasks>arg).tasks.every(isStartupTask) + ); + } + return false; } diff --git a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts index a79385597..b1a1bfd10 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 @@ -5,7 +5,6 @@ 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 +12,11 @@ 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 { 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 { TheiaElectronWindow } from './theia/theia-electron-window'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -50,20 +48,8 @@ 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); }); 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..263ad87c0 --- /dev/null +++ b/arduino-ide-extension/src/electron-main/electron-arduino.ts @@ -0,0 +1,189 @@ +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 { + CHANNEL_APP_VERSION, + 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_VERSION, async () => { + return app.appVersion; + }); + ipcMain.on(CHANNEL_QUIT_APP, () => app.requestStop()); + ipcMain.handle(CHANNEL_IS_FIRST_WINDOW, async (event) => { + const window = BrowserWindow.fromWebContents(event.sender); + if (!window) { + return false; + } + return app.firstWindowId === window.id; + }); + ipcMain.on(CHANNEL_SET_REPRESENTED_FILENAME, (event, fsPath: string) => { + const window = BrowserWindow.fromWebContents(event.sender); + if (window) { + window.setRepresentedFilename(fsPath); + } + }); + ipcMain.on(CHANNEL_OPEN_PATH, (_, fsPath: string) => { + shell.openPath(fsPath); + }); + ipcMain.on( + CHANNEL_SET_MENU_WITH_NODE_ID, + (event, internalMenu: InternalMenuDto[] | undefined) => { + const electronMenu = internalMenu + ? Menu.buildFromTemplate(fromMenuDto(event.sender, internalMenu)) + : null; + if (isOSX) { + Menu.setApplicationMenu(electronMenu); + } else { + const window = BrowserWindow.fromWebContents(event.sender); + if (!window) { + console.warn( + `Failed to set the application menu. Could not find the browser window from the webContents. Sender ID: ${event.sender.id}` + ); + return; + } + window.setMenu(electronMenu); + } + } + ); + } +} + +function fromMenuDto( + sender: WebContents, + menuDto: InternalMenuDto[] +): MenuItemConstructorOptions[] { + return menuDto.map((dto) => { + const result: MenuItemConstructorOptions = { + id: dto.id, + label: dto.label, + type: dto.type, + checked: dto.checked, + enabled: dto.enabled, + visible: dto.visible, + role: dto.role, + accelerator: dto.accelerator, + }; + if (dto.submenu) { + result.submenu = fromMenuDto(sender, dto.submenu); + } + if (dto.nodeId) { + result.click = () => { + sender.send(CHANNEL_MAIN_MENU_ITEM_DID_CLICK, dto.nodeId); + }; + } + return result; + }); +} + +export namespace ElectronArduinoRenderer { + export function sendStartupTasks( + webContents: WebContents, + tasks: StartupTasks + ): void { + webContents.send(CHANNEL_SEND_STARTUP_TASKS, tasks); + } + + // Same as Theia's `onRequestReload` but can accept an arg from the renderer. + export function onRequestReload( + wc: WebContents, + handler: (arg?: unknown) => void + ): Disposable { + return createWindowListener(wc, CHANNEL_REQUEST_RELOAD, handler); + } + + function createWindowListener( + webContents: WebContents, + channel: string, + handler: (...args: unknown[]) => unknown + ): Disposable { + return createDisposableListener<IpcMainEvent>( + ipcMain, + channel, + (event, ...args) => { + if (webContents.id === event.sender.id) { + handler(...args); + } + } + ); + } +} diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index 84736969e..6f9a393d7 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,10 +6,10 @@ 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 { 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 { MaybePromise } 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'; @@ -20,22 +20,22 @@ 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 { + CHANNEL_PLOTTER_WINDOW_DID_CLOSE, + CHANNEL_SCHEDULE_DELETION, + CHANNEL_SHOW_PLOTTER_WINDOW, + isShowPlotterWindowParams, +} from '../../electron-common/electron-arduino'; app.commandLine.appendSwitch('disable-http-cache'); @@ -340,17 +340,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<number, BrowserWindow>(); + private handleShowPlotterWindow( + event: Electron.IpcMainEvent, + args: unknown + ): void { + if (!isShowPlotterWindowParams(args)) { + console.warn( + `Received unexpected params on the '${CHANNEL_SHOW_PLOTTER_WINDOW}' channel. Sender ID: ${ + event.sender.id + }, params: ${JSON.stringify(args)}` + ); + return; + } + const electronWindow = BrowserWindow.fromWebContents(event.sender); + if (!electronWindow) { + console.warn( + `Could not find the host window of event received on the '${CHANNEL_SHOW_PLOTTER_WINDOW}' channel. Sender ID: ${ + event.sender.id + }, params: ${JSON.stringify(args)}` + ); + return; + } + + const windowId = electronWindow.id; + let plotterWindow = this.plotterWindows.get(windowId); + if (plotterWindow) { + if (!args.forceReload) { + plotterWindow.focus(); + } else { + plotterWindow.loadURL(args.url); + } + return; + } + + plotterWindow = new BrowserWindow({ + width: 800, + minWidth: 620, + height: 500, + minHeight: 320, + x: 100, + y: 100, + webPreferences: <Electron.WebPreferences>{ + devTools: true, + nativeWindowOpen: true, + openerId: electronWindow.webContents.id, + }, + }); + this.plotterWindows.set(windowId, plotterWindow); + plotterWindow.setMenu(null); + plotterWindow.on('closed', () => { + this.plotterWindows.delete(windowId); + electronWindow.webContents.send(CHANNEL_PLOTTER_WINDOW_DID_CLOSE); + }); + plotterWindow.loadURL(args.url); } protected override async onSecondInstance( @@ -391,40 +447,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<number> { @@ -525,6 +549,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 +594,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 +615,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { return this._firstWindowId; } + get appVersion(): string { + return app.getVersion(); + } + private async delete(sketch: Sketch): Promise<void> { const sketchPath = FileUri.fsPath(sketch.uri); const disposable = Disposable.create(() => { 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<boolean> { - 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<BrowserWindow> { - 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-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<void> -): Promise<BrowserWindow> { - const { id } = electronWindow; - const toDispose = new DisposableCollection(); - const channel = StartupTask.Messaging.APP_READY_SIGNAL(id); - return new Promise<BrowserWindow>((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 6008cdc95..55d3ec96d 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'; 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..89d647a05 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 * as http from 'node:http'; +import * as 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<string> { reject(new Error('Closed')); }); - server.listen(serverPort); + server.listen(authServerPort); }); port.then(cancelPortTimer, cancelPortTimer); diff --git a/arduino-ide-extension/src/node/auth/authentication-service-impl.ts b/arduino-ide-extension/src/node/auth/authentication-service-impl.ts index d4be588c2..75e9607b8 100644 --- a/arduino-ide-extension/src/node/auth/authentication-service-impl.ts +++ b/arduino-ide-extension/src/node/auth/authentication-service-impl.ts @@ -5,12 +5,12 @@ import { } from '@theia/core/lib/common/disposable'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; import { + AuthOptions, AuthenticationService, AuthenticationServiceClient, AuthenticationSession, } from '../../common/protocol/authentication-service'; import { ArduinoAuthenticationProvider } from './arduino-auth-provider'; -import { AuthOptions } from './types'; @injectable() export class AuthenticationServiceImpl @@ -19,7 +19,7 @@ export class AuthenticationServiceImpl protected readonly delegate = new ArduinoAuthenticationProvider(); protected readonly clients: AuthenticationServiceClient[] = []; protected readonly toDispose = new DisposableCollection(); - + private initialized = false; async onStart(): Promise<void> { diff --git a/arduino-ide-extension/src/node/auth/types.ts b/arduino-ide-extension/src/node/auth/types.ts index 14ff39db1..303d36dc8 100644 --- a/arduino-ide-extension/src/node/auth/types.ts +++ b/arduino-ide-extension/src/node/auth/types.ts @@ -1,16 +1,9 @@ -import { AuthenticationSession } from '../../common/protocol/authentication-service'; +import { + AuthOptions, + AuthenticationSession, +} from '../../common/protocol/authentication-service'; export { AuthenticationSession }; -export type AuthOptions = { - redirectUri: string; - responseType: string; - clientID: string; - domain: string; - audience: string; - registerUri: string; - scopes: string[]; -}; - export interface AuthenticationProviderAuthenticationSessionsChangeEvent { readonly added?: ReadonlyArray<AuthenticationSession>; readonly removed?: ReadonlyArray<AuthenticationSession>; diff --git a/arduino-ide-extension/src/node/auth/utils.ts b/arduino-ide-extension/src/node/auth/utils.ts index f04e938b3..84a4d2250 100644 --- a/arduino-ide-extension/src/node/auth/utils.ts +++ b/arduino-ide-extension/src/node/auth/utils.ts @@ -1,7 +1,7 @@ import jwt_decode from 'jwt-decode'; import { sha256 } from 'hash.js'; -import { randomBytes } from 'crypto'; -import btoa = require('btoa'); // TODO: check why we cannot +import { randomBytes } from 'node:crypto'; +import btoa from 'btoa'; import { AuthenticationSession } from './types'; import { Unknown } from '../../common/nls'; diff --git a/arduino-ide-extension/src/node/clang-formatter.ts b/arduino-ide-extension/src/node/clang-formatter.ts index 20e10bc21..06f6c41d9 100644 --- a/arduino-ide-extension/src/node/clang-formatter.ts +++ b/arduino-ide-extension/src/node/clang-formatter.ts @@ -1,10 +1,10 @@ -import * as os from 'os'; +import * as os from 'node: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'; 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..89236154d 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); 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..ead2d3881 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); 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..dfbc4f507 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); 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..64ef4f711 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); 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..f9c7e24b6 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); 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..fa7cc1365 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); 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.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.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js index 8841575ad..c38618ad6 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); 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_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.js index e5aa89e6c..585bd6473 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,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.settings.v1.GetAllRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.settings.v1.GetAllResponse', null, global); 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..78b7d0cd3 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -1,5 +1,5 @@ -import { promises as fs } from 'fs'; -import { dirname } from 'path'; +import { promises as fs } from 'node:fs'; +import { dirname } from 'node:path'; import * as yaml from 'js-yaml'; import * as grpc from '@grpc/grpc-js'; import { injectable, inject, named } from '@theia/core/shared/inversify'; diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index eb6f020ab..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, diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 08cfe4260..5ab4506fa 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,6 +1,6 @@ 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'; diff --git a/arduino-ide-extension/src/node/daemon-watcher.ts b/arduino-ide-extension/src/node/daemon-watcher.ts index 9c94e0ee6..842a4e2f2 100644 --- a/arduino-ide-extension/src/node/daemon-watcher.ts +++ b/arduino-ide-extension/src/node/daemon-watcher.ts @@ -1,5 +1,5 @@ -import * as psTree from 'ps-tree'; -const kill = require('tree-kill'); +import psTree from 'ps-tree'; +import kill from 'tree-kill'; const [theiaPid, daemonPid] = process.argv .slice(2) .map((id) => Number.parseInt(id, 10)); @@ -11,7 +11,10 @@ setInterval(() => { } catch { psTree(daemonPid, function (_, children) { for (const { PID } of children) { - kill(PID); + const parsedPid = Number.parseInt(PID, 10); + if (!Number.isNaN(parsedPid)) { + kill(parsedPid); + } } kill(daemonPid, () => process.exit()); }); diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index 83cca1e1a..eca7a35fc 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 * as fs from 'node:fs'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { SketchRef, diff --git a/arduino-ide-extension/src/node/exec-util.ts b/arduino-ide-extension/src/node/exec-util.ts index 76ba08aed..984eff038 100644 --- a/arduino-ide-extension/src/node/exec-util.ts +++ b/arduino-ide-extension/src/node/exec-util.ts @@ -1,8 +1,8 @@ -import * as os from 'os'; -import * as which from 'which'; -import * as semver from 'semver'; -import { join } from 'path'; -import { spawn } from 'child_process'; +import os from 'node:os'; +import which from 'which'; +import semver from 'semver'; +import { join } from 'node:path'; +import { spawn } from 'node:child_process'; export async function getExecPath( commandName: string, @@ -38,7 +38,11 @@ export async function getExecPath( onError ); const pathShortVersion = (pathVersion.match(versionRegexp) || [])[0]; - if (semver.gt(pathShortVersion, buildShortVersion)) { + if ( + pathShortVersion && + buildShortVersion && + semver.gt(pathShortVersion, buildShortVersion) + ) { return pathCommand; } return buildCommand; 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..33aeeb05d 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -3,7 +3,7 @@ import { LocalizationRegistry, } from '@theia/core/lib/node/i18n/localization-contribution'; import { injectable } from '@theia/core/shared/inversify'; -import { join } from 'path'; +import { join } from 'node:path'; @injectable() export class ArduinoLocalizationContribution diff --git a/arduino-ide-extension/src/node/is-temp-sketch.ts b/arduino-ide-extension/src/node/is-temp-sketch.ts index 3bb3c4bda..4401a4432 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 * as 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/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..4eea5b46a 100644 --- a/arduino-ide-extension/src/node/monitor-manager.ts +++ b/arduino-ide-extension/src/node/monitor-manager.ts @@ -4,15 +4,13 @@ import { AlreadyConnectedError, Board, BoardsService, + MonitorSettings, + PluggableMonitorSettings, Port, } 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; 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<MonitorPortConfiguration | undefined> { 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..68eab4a5c 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 * as 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'; 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<string, PluggableMonitorSetting>; -export interface MonitorSettings { - pluggableMonitorSettings?: PluggableMonitorSettings; - monitorUISettings?: Partial<MonitorState>; -} +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/plotter/plotter-backend-contribution.ts b/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts index 2a0899491..aa97a8603 100644 --- a/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts +++ b/arduino-ide-extension/src/node/plotter/plotter-backend-contribution.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import * as path from 'node: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'; 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 d5c82ff13..d3ad0e58e 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -1,11 +1,11 @@ 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 { 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 { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; import { ILogger } from '@theia/core/lib/common/logger'; @@ -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; @@ -516,13 +510,15 @@ 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; } + const cpyModule = await import('cpy'); + const cpy = cpyModule.default; await cpy(sourceFolderBasename, destination, { rename: (basename) => sourceFolderBasename !== destinationFolderBasename && 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 888817d35..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 @@ -12,8 +12,8 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { list as listDrives } from 'drivelist'; -import { homedir } from 'os'; -import { join } from 'path'; +import { homedir } from 'node:os'; +import { join } from 'node:path'; @injectable() export class ConfigDirUriProvider { diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts index 77cdd11d7..e64b95e97 100644 --- a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts +++ b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/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, 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/test/browser/create-api.test.ts b/arduino-ide-extension/src/test/browser/create-api.test.ts index 13bd8686e..a9b52c11b 100644 --- a/arduino-ide-extension/src/test/browser/create-api.test.ts +++ b/arduino-ide-extension/src/test/browser/create-api.test.ts @@ -5,7 +5,7 @@ import { } 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'; @@ -15,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 */ @@ -229,47 +229,6 @@ describe('create-api', () => { expect(findByName(otherName, sketches)).to.be.not.undefined; }); - [ - [-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<unknown>); - - 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); - }) - ); - ['.', '-', '_'].map((char) => { it(`should create a new sketch with '${char}' in the sketch folder name although it's disallowed from the Create Editor`, async () => { const name = `sketch${char}`; @@ -331,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<unknown>); + + 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. 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/node/arduino-daemon-impl.test.ts b/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts index af9f66eea..26f12e3f3 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 fs from 'node:fs'; +import * as path from 'node:path'; import * as 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(); } 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 index 5e7c92ebf..e2e7d067d 100644 --- 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 @@ -4,8 +4,8 @@ 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 { promises as fs } from 'fs'; -import { join } from 'path'; +import { promises as fs } from 'node:fs'; +import { join } from 'node:path'; import { sync as deleteSync } from 'rimraf'; import { BoardsService, 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..24d947dbf 100644 --- a/arduino-ide-extension/src/test/node/exec-util.test.ts +++ b/arduino-ide-extension/src/test/node/exec-util.test.ts @@ -1,4 +1,4 @@ -import * as os from 'os'; +import * as os from 'node:os'; import { expect, use } from 'chai'; import { getExecPath } from '../../node/exec-util'; 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<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> }; 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 8daf3a6e5..908bc827d 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 @@ -6,8 +6,8 @@ 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 { promises as fs } from 'node:fs'; +import { basename, join } from 'node:path'; import { sync as rimrafSync } from 'rimraf'; import { Sketch, SketchesService } from '../../common/protocol'; import { SketchesServiceImpl } from '../../node/sketches-service-impl'; 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..83ca39fbd 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 * as assert from 'node:assert'; +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, diff --git a/arduino-ide-extension/src/test/node/test-bindings.ts b/arduino-ide-extension/src/test/node/test-bindings.ts index 279c260a5..30d8513a9 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/test-bindings.ts @@ -22,10 +22,10 @@ import { injectable, interfaces, } from '@theia/core/shared/inversify'; -import * as deepmerge from 'deepmerge'; -import { promises as fs, mkdirSync } from 'fs'; +import deepmerge from 'deepmerge'; +import { promises as fs, mkdirSync } from 'node:fs'; import { dump as dumpYaml } from 'js-yaml'; -import { join } from 'path'; +import { join } from 'node:path'; import { path as tempPath, track } from 'temp'; import { ArduinoDaemon, 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/development.md b/docs/development.md index 06ade68ce..fe593c10e 100644 --- a/docs/development.md +++ b/docs/development.md @@ -54,7 +54,6 @@ 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 diff --git a/electron-app/package.json b/electron-app/package.json index 5300ec866..d5875aab7 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -5,27 +5,25 @@ "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/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", + "@theia/core": "1.37.0", + "@theia/debug": "1.37.0", + "@theia/editor": "1.37.0", + "@theia/electron": "1.37.0", + "@theia/filesystem": "1.37.0", + "@theia/keymaps": "1.37.0", + "@theia/messages": "1.37.0", + "@theia/monaco": "1.37.0", + "@theia/navigator": "1.37.0", + "@theia/plugin-ext": "1.37.0", + "@theia/plugin-ext-vscode": "1.37.0", + "@theia/preferences": "1.37.0", + "@theia/terminal": "1.37.0", + "@theia/workspace": "1.37.0", "arduino-ide-extension": "2.1.1" }, "devDependencies": { - "@theia/cli": "1.31.1", - "electron": "^15.3.5" + "@theia/cli": "1.37.0", + "electron": "^23.2.4" }, "scripts": { "prepare": "theia build --mode development", @@ -41,6 +39,7 @@ "light": "arduino-theme", "dark": "arduino-theme-dark" }, + "defaultIconTheme": "none", "validatePreferencesSchema": false, "preferences": { "window.title": "${rootName}${activeEditorShort}${appName}", diff --git a/electron-app/webpack.config.js b/electron-app/webpack.config.js new file mode 100644 index 000000000..4ff6cca03 --- /dev/null +++ b/electron-app/webpack.config.js @@ -0,0 +1,17 @@ +const webpack = require('webpack'); +const configs = require('./gen-webpack.config.js'); + +// https://github.com/browserify/node-util/issues/57#issuecomment-764436352 +const mainWindowConfig = configs[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', + }) +); + +module.exports = configs; diff --git a/electron/build/template-package.json b/electron/build/template-package.json index a835ee23e..901ffcbfe 100644 --- a/electron/build/template-package.json +++ b/electron/build/template-package.json @@ -9,7 +9,7 @@ "node-log-rotate": "^0.1.5" }, "devDependencies": { - "@theia/cli": "1.31.1", + "@theia/cli": "1.37.0", "cross-env": "^7.0.2", "electron-builder": "23.6.0", "electron-notarize": "^1.1.1", @@ -25,7 +25,7 @@ "patch": "ncp ./patch/backend/main.js ./src-gen/backend/main.js" }, "engines": { - "node": ">=16.0.0 <17" + "node": ">=16.14.0 <17" }, "repository": { "type": "git", diff --git a/electron/packager/index.js b/electron/packager/index.js index 65c82d8df..a078833e9 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -86,7 +86,8 @@ //----------------------------------------------------+ // Copy the Theia preload, etc. from `./electron-app` | //----------------------------------------------------+ - for (const filename of foldersToSyncFromDev) { + const filesToSyncFromDev = ['webpack.config.js']; + for (const filename of [...foldersToSyncFromDev, ...filesToSyncFromDev]) { cp( '-rf', join(repoRoot, 'electron-app', filename), diff --git a/electron/packager/package.json b/electron/packager/package.json index ac35bf151..83637a3f1 100644 --- a/electron/packager/package.json +++ b/electron/packager/package.json @@ -33,7 +33,7 @@ "yargs": "^12.0.5" }, "engines": { - "node": ">=16.0.0 <17" + "node": ">=16.14.0 <17" }, "mocha": { "reporter": "spec", diff --git a/i18n/en.json b/i18n/en.json index 08a47309e..d58f478f6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -230,10 +230,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.", @@ -428,7 +424,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 +473,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/package.json b/package.json index eca3ced89..9c9c00f56 100644 --- a/package.json +++ b/package.json @@ -7,24 +7,22 @@ "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", + "@theia/cli": "1.37.0", "@types/sinon": "^2.3.5", - "@typescript-eslint/eslint-plugin": "^4.27.0", - "@typescript-eslint/parser": "^4.27.0", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.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", + "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", "lint-staged": "^11.0.0", "node-gyp": "^9.3.0", @@ -33,12 +31,12 @@ "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", + "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", @@ -77,20 +75,20 @@ "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-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.70.0/file/MS-CEINTL.vscode-language-pack-cs-1.70.0.vsix", + "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.70.0/file/MS-CEINTL.vscode-language-pack-de-1.70.0.vsix", + "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.70.0/file/MS-CEINTL.vscode-language-pack-es-1.70.0.vsix", + "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.70.0/file/MS-CEINTL.vscode-language-pack-fr-1.70.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.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-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.70.0/file/MS-CEINTL.vscode-language-pack-it-1.70.0.vsix", + "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.70.0/file/MS-CEINTL.vscode-language-pack-ja-1.70.0.vsix", + "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.70.0/file/MS-CEINTL.vscode-language-pack-ko-1.70.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.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-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.70.0/file/MS-CEINTL.vscode-language-pack-pl-1.70.0.vsix", + "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.70.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.70.0.vsix", + "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.70.0/file/MS-CEINTL.vscode-language-pack-ru-1.70.0.vsix", + "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.70.0/file/MS-CEINTL.vscode-language-pack-tr-1.70.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.53.2/file/MS-CEINTL.vscode-language-pack-zh-hans-1.53.2.vsix" + "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.70.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.70.0.vsix" } } diff --git a/yarn.lock b/yarn.lock index 42abbace7..58a12fc91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,61 +2,55 @@ # 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== +"@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: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@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== - dependencies: - "@babel/highlight" "^7.10.4" - -"@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.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@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.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== "@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.21.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" + integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.4" + "@babel/types" "^7.21.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@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.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.4" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -74,52 +68,52 @@ "@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== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" 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== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" + integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== 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-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@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== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz#40411a8ab134258ad2cf3a3d987ec6aa0723cee5" + integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + regexpu-core "^5.3.1" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== 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.17.7" + "@babel/helper-plugin-utils" "^7.16.7" 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": +"@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== @@ -131,13 +125,13 @@ dependencies: "@babel/types" "^7.18.6" -"@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-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -146,33 +140,33 @@ dependencies: "@babel/types" "^7.18.6" -"@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-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.0" -"@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== +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@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== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@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-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -181,12 +175,12 @@ 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-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.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.6": +"@babel/helper-remap-async-to-generator@^7.18.9": 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== @@ -196,30 +190,31 @@ "@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== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" -"@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== +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" -"@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== +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -228,36 +223,41 @@ 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-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== -"@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-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@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== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: - "@babel/helper-function-name" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@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== +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@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== @@ -266,10 +266,10 @@ 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.20.7", "@babel/parser@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -278,23 +278,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@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.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== 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.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@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== +"@babel/plugin-proposal-async-generator-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== 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/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.18.6": @@ -305,13 +305,13 @@ "@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== +"@babel/plugin-proposal-class-static-block@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.18.6": @@ -338,12 +338,12 @@ "@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== +"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": @@ -362,16 +362,16 @@ "@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== +"@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -381,13 +381,13 @@ "@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== +"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.18.6": @@ -398,14 +398,14 @@ "@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== +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== 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/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@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": @@ -451,12 +451,12 @@ 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.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -465,13 +465,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,21 +521,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^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== +"@babel/plugin-transform-arrow-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" -"@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-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== 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.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" @@ -551,40 +544,42 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@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== +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" -"@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== +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.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.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" -"@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.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" @@ -609,12 +604,12 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@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-for-of@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -639,35 +634,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@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-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== 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-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" -"@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-modules-commonjs@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== 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-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" -"@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-modules-systemjs@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== 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-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" @@ -677,13 +669,13 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@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-named-capturing-groups-regex@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -700,12 +692,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@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-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -714,13 +706,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@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-regenerator@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -730,15 +722,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@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" + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" + integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== + dependencies: + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.18.6": @@ -748,13 +740,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@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.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -777,12 +769,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@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.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -793,37 +785,37 @@ "@babel/helper-plugin-utils" "^7.18.6" "@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" + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.4.tgz#a952482e634a8dd8271a3fe5459a16eb10739c58" + integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" "@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-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions" "^7.20.7" "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.21.0" "@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-logical-assignment-operators" "^7.20.7" "@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-object-rest-spread" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.21.0" "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@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.20.0" "@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,44 +825,44 @@ "@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-arrow-functions" "^7.20.7" + "@babel/plugin-transform-async-to-generator" "^7.20.7" "@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-block-scoping" "^7.21.0" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.20.7" + "@babel/plugin-transform-destructuring" "^7.21.3" "@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-for-of" "^7.21.0" "@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-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.2" + "@babel/plugin-transform-modules-systemjs" "^7.20.11" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" "@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-parameters" "^7.21.3" "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.20.5" "@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-spread" "^7.20.7" "@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-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@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" + "@babel/types" "^7.21.4" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -884,51 +876,50 @@ "@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/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.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== +"@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.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: - regenerator-runtime "^0.13.10" + regenerator-runtime "^0.13.11" -"@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== +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@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== +"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" "@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/parser" "^7.21.4" + "@babel/types" "^7.21.4" 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.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@discoveryjs/json-ext@^0.5.0": @@ -936,22 +927,6 @@ 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,18 +942,12 @@ 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== - -"@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.10.6": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" + integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== 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" @@ -991,9 +960,9 @@ stylis "4.1.3" "@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== + version "11.10.7" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" + integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== dependencies: "@emotion/memoize" "^0.8.0" "@emotion/sheet" "^1.2.1" @@ -1012,12 +981,12 @@ integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== "@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.10.6" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.5" + "@emotion/babel-plugin" "^11.10.6" "@emotion/cache" "^11.10.5" "@emotion/serialize" "^1.1.1" "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" @@ -1061,50 +1030,67 @@ 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== +"@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: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.0.tgz#f6f729b02feee2c749f57e334b7a1b5f40a81724" + integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + +"@eslint/eslintrc@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.5.1" + globals "^13.19.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" 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== +"@eslint/js@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" + integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== + +"@floating-ui/core@^1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0" + integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== "@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== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.6.tgz#bcf0c7bada97c20d9d1255b889f35bac838c63fe" + integrity sha512-02vxFDuvuVPs22iJICacezYJyf7zwwOCWkPNkWNBr1U0Qt1cKFYzWvxts0AmqcOQGwt/3KJWcWIgtbUU38keyw== dependencies: - "@floating-ui/core" "^1.0.1" + "@floating-ui/core" "^1.2.6" "@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== +"@grpc/grpc-js@^1.8.14": + version "1.8.14" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.14.tgz#4fe0f9917d6f094cf59245763c275442b182e9ad" + integrity sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A== 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== + version "0.7.6" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.6.tgz#b71fdf92b184af184b668c4e9395a5ddc23d61de" + integrity sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw== dependencies: "@types/long" "^4.0.1" lodash.camelcase "^4.3.0" @@ -1112,16 +1098,21 @@ 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== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" + minimatch "^3.0.5" + +"@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== -"@humanwhocodes/object-schema@^1.2.0": +"@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== @@ -1131,747 +1122,163 @@ 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": - 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== - 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" - -"@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" - -"@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" - -"@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" - -"@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" - -"@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== - dependencies: - npmlog "^6.0.2" - -"@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" - -"@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== - 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" - -"@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" - -"@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== - dependencies: - semver "^7.3.4" - -"@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== - dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - upath "^2.0.1" - -"@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== - 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" - -"@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== - dependencies: - inquirer "^8.2.4" - npmlog "^6.0.2" - -"@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" +"@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== -"@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== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: - npmlog "^6.0.2" + "@sinclair/typebox" "^0.25.16" -"@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== +"@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/package-graph" "6.1.0" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -"@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== - dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - read-cmd-shim "^3.0.0" +"@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/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== - dependencies: - "@lerna/child-process" "6.1.0" - npmlog "^6.0.2" - path-exists "^4.0.0" - rimraf "^3.0.2" +"@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/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/source-map@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: - "@lerna/npm-conf" "6.1.0" - "@npmcli/run-script" "^4.1.7" - npmlog "^6.0.2" - p-queue "^6.6.2" + "@jridgewell/gen-mapping" "^0.3.0" + "@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/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/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/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== -"@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/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: - "@lerna/create-symlink" "6.1.0" - "@lerna/package" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" -"@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" +"@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/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== +"@lerna/child-process@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.6.1.tgz#e31bc411ad6d474cf7b676904da6f77f58fd64eb" + integrity sha512-yUCDCcRNNbI9UUsUB6FYEmDHpo5Tn/f0q5D7vhDP4i6Or8kBj82y7+e31hwfLvK2ykOYlDVs2MxAluH/+QUBOQ== 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" - -"@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== + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" -"@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/create@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-6.6.1.tgz#fc20f09e10b612d424a576775ad6eefe6aa96517" + integrity sha512-GDmHFhQ0mr0RcXWXrsLyfMV6ch/dZV/Ped1e6sFVQhsLL9P+FFXX1ZWxa/dQQ90VWF2qWcmK0+S/L3kUz2xvTA== 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" + "@lerna/child-process" "6.6.1" 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" + fs-extra "^9.1.0" + init-package-json "^3.0.2" + npm-package-arg "8.1.1" p-reduce "^2.1.0" - p-waterfall "^2.1.1" + pacote "^13.6.1" + 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 "^4.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== +"@lerna/legacy-package-management@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@lerna/legacy-package-management/-/legacy-package-management-6.6.1.tgz#1f44af40098b9396a4f698514ff2b87016b1ee3d" + integrity sha512-0EYxSFr34VgeudA5rvjGJSY7s4seITMVB7AJ9LRFv9QDUk6jpvapV13ZAaKnhDTxX5vNCfnJuWHXXWq0KyPF/Q== dependencies: - npmlog "^6.0.2" - write-file-atomic "^4.0.1" + "@npmcli/arborist" "6.2.3" + "@npmcli/run-script" "4.1.7" + "@nrwl/devkit" ">=15.5.2 < 16" + "@octokit/rest" "19.0.3" + byte-size "7.0.0" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "5.0.0" + columnify "1.6.0" + config-chain "1.1.12" + conventional-changelog-core "4.2.4" + conventional-recommended-bump "6.1.0" + cosmiconfig "7.0.0" + dedent "0.7.0" + dot-prop "6.0.1" + execa "5.0.0" + file-url "3.0.0" + find-up "5.0.0" + fs-extra "9.1.0" + 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.10" + has-unicode "2.0.1" + inquirer "8.2.4" + is-ci "2.0.0" + is-stream "2.0.0" + libnpmpublish "6.0.4" + load-json-file "6.2.0" + 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.3" + npmlog "6.0.2" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" + p-waterfall "2.1.1" + pacote "13.6.2" + pify "5.0.0" + pretty-format "29.4.3" + read-cmd-shim "3.0.0" + read-package-json "5.0.1" + resolve-from "5.0.0" + 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" + tempy "1.0.0" + upath "2.0.1" + uuid "8.3.2" + write-file-atomic "4.0.1" + write-pkg "4.0.0" + yargs "16.2.0" "@malept/cross-spawn-promise@^2.0.0": version "2.0.0" @@ -1881,9 +1288,9 @@ cross-spawn "^7.0.1" "@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.10" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== dependencies: detect-libc "^2.0.0" https-proxy-agent "^5.0.0" @@ -1895,43 +1302,35 @@ semver "^7.3.5" tar "^6.1.11" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@msgpackr-extract/msgpackr-extract-darwin-arm64@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-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-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-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-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-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-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-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-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-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-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== +"@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== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1946,12 +1345,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,54 +1353,60 @@ "@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== +"@npmcli/arborist@6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.2.3.tgz#31f8aed2588341864d3811151d929c01308f8e71" + integrity sha512-lpGOC2ilSJXcc2zfW9QtukcCTcMbl3fVI0z4wvFB2AFIl0C+Q6Wv7ccrpdrQa8rvJ1ZVuc6qkX7HVTyKlzGqKA== 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" + "@npmcli/fs" "^3.1.0" + "@npmcli/installed-package-contents" "^2.0.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^5.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^3.0.0" + "@npmcli/query" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + bin-links "^4.0.1" + cacache "^17.0.4" common-ancestor-path "^1.0.1" - json-parse-even-better-errors "^2.3.1" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" 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" + minimatch "^6.1.6" + nopt "^7.0.0" + npm-install-checks "^6.0.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-registry-fetch "^14.0.3" + npmlog "^7.0.1" + pacote "^15.0.8" + parse-conflict-json "^3.0.0" + proc-log "^3.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" + read-package-json-fast "^3.0.2" semver "^7.3.7" - ssri "^9.0.0" - treeverse "^2.0.0" + ssri "^10.0.1" + treeverse "^3.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== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== dependencies: "@gar/promisify" "^1.1.3" semver "^7.3.5" +"@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: + 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" @@ -2022,6 +1422,20 @@ semver "^7.3.5" which "^2.0.2" +"@npmcli/git@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" + integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + "@npmcli/installed-package-contents@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" @@ -2030,50 +1444,63 @@ 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== +"@npmcli/installed-package-contents@^2.0.0", "@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: - "@npmcli/name-from-folder" "^1.0.1" - glob "^8.0.1" - minimatch "^5.0.1" - read-package-json-fast "^2.0.3" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" -"@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== +"@npmcli/map-workspaces@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.3.tgz#476944b63cd1f65bf83c6fdc7f4ca7be56906b1f" + integrity sha512-HlCvFuTzw4UNoKyZdqiNrln+qMF71QJkxy2dsusV8QQdoa89e2TF4dATCzBxbl4zzRzdDoWWyP5ADVrNAH9cRQ== dependencies: - cacache "^16.0.0" - json-parse-even-better-errors "^2.3.1" - pacote "^13.0.3" + "@npmcli/name-from-folder" "^2.0.0" + glob "^9.3.1" + minimatch "^7.4.2" + read-package-json-fast "^3.0.0" + +"@npmcli/metavuln-calculator@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" + integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== + dependencies: + cacache "^17.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^15.0.0" semver "^7.3.5" "@npmcli/move-file@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02" - integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" rimraf "^3.0.2" -"@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== +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== "@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/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/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@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-3.0.0.tgz#c9219a197e1be8dbf43c4ef8767a72277c0533b6" + integrity sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg== dependencies: - json-parse-even-better-errors "^2.3.1" + json-parse-even-better-errors "^3.0.0" "@npmcli/promise-spawn@^3.0.0": version "3.0.0" @@ -2082,7 +1509,32 @@ dependencies: infer-owner "^1.0.4" -"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.1.7": +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/query@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.0.tgz#51a0dfb85811e04f244171f164b6bc83b36113a7" + integrity sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA== + dependencies: + postcss-selector-parser "^6.0.10" + +"@npmcli/run-script@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" + integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== + 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" + +"@npmcli/run-script@^4.1.0": version "4.2.1" resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== @@ -2093,30 +1545,86 @@ read-package-json-fast "^2.0.3" which "^2.0.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== +"@npmcli/run-script@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.0.tgz#f89e322c729e26ae29db6cc8cc76559074aac208" + integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nrwl/cli@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.9.2.tgz#82537d3d85410b0143d37a3b4fade09675356084" + integrity sha512-QoCmyrcGakHAYTJaNBbOerRQAmqJHMYGCdqtQidV+aP9p1Dy33XxDELfhd+IYmGqngutXuEWChNpWNhPloLnoA== dependencies: - nx "15.3.0" + nx "15.9.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== +"@nrwl/devkit@>=15.5.2 < 16": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.9.2.tgz#482b89f1bf88d3600b11f8b7e3e4452c5766eca4" + integrity sha512-2DvTstVZb91m+d4wqUJMBHQ3elxyabdmFE6/3aXmtOGeDxTyXyDzf/1O6JvBBiL8K6XC3ZYchjtxUHgxl/NJ5A== dependencies: - "@phenomnomnominal/tsquery" "4.1.1" ejs "^3.1.7" ignore "^5.0.4" semver "7.3.4" + 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" +"@nrwl/nx-darwin-arm64@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.2.tgz#612d8d714ec876cafd6f1483bf5565704d1b75be" + integrity sha512-Yv+OVsQt3C/hmWOC+YhJZQlsyph5w1BHfbp4jyCvV1ZXBbb8NdvwxgDHPWXxKPTc1EXuB7aEX3qzxM3/OWEUJg== + +"@nrwl/nx-darwin-x64@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.2.tgz#3f77bd90dbabf4782d81f773cfb2739a443e595f" + integrity sha512-qHfdluHlPzV0UHOwj1ZJ+qNEhzfLGiBuy1cOth4BSzDlvMnkuqBWoprfaXoztzYcus2NSILY1/7b3Jw4DAWmMw== + +"@nrwl/nx-linux-arm-gnueabihf@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.9.2.tgz#3374a5a1692b222ce18f2213a47b4d68fb509e70" + integrity sha512-0GzwbablosnYnnJDCJvAeZv8LlelSrNwUnGhe43saeoZdAew35Ay1E34zBrg/GCGTASuz+knEEYFM+gDD9Mc6A== + +"@nrwl/nx-linux-arm64-gnu@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.9.2.tgz#e3ec95c6ee3285c77422886cf4cbec1f04804460" + integrity sha512-3mFIY7iUTPG45hSIRaM2DmraCy8W6hNoArAGRrTgYw40BIJHtLrW+Rt7DLyvVXaYCvrKugWOKtxC+jG7kpIZVA== + +"@nrwl/nx-linux-arm64-musl@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.9.2.tgz#72ce601d256083ded7380c598f1b3eb4dc2a3472" + integrity sha512-FNBnXEtockwxZa4I3NqggrJp0YIbNokJvt/clrICP+ijOacdUDkv8mJedavobkFsRsNq9gzCbRbUScKymrOLrg== + +"@nrwl/nx-linux-x64-gnu@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.9.2.tgz#2da6bb50cd80d699310e91c7331baa6cfc8ce197" + integrity sha512-gHWsP5lbe4FNQCa1Q/VLxIuik+BqAOcSzyPjdUa4gCDcbxPa8xiE57PgXB5E1XUzOWNnDTlXa/Ll07/TIuKuog== + +"@nrwl/nx-linux-x64-musl@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.9.2.tgz#39b3bda5868a53b722f1d42700dce71c5ff3f6b9" + integrity sha512-EaFUukCbmoHsYECX2AS4pxXH933yesBFVvBgD38DkoFDxDoJMVt6JqYwm+d5R7S4R2P9U3l++aurljQTRq567Q== + +"@nrwl/nx-win32-arm64-msvc@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.9.2.tgz#bc350be5cb7d0bfa6c2c5ced40c5af163a457a2c" + integrity sha512-PGAe7QMr51ivx1X3avvs8daNlvv1wGo3OFrobjlu5rSyjC1Y3qHwT9+wdlwzNZ93FIqWOq09s+rE5gfZRfpdAg== + +"@nrwl/nx-win32-x64-msvc@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.9.2.tgz#3e46c3f7af196bdbf0deb336ec4f9448c54e4a9f" + integrity sha512-Q8onNzhuAZ0l9DNkm8D4Z1AEIzJr8JiT4L2fVBLYrV/R75C2HS3q7lzvfo6oqMY6mXge1cFPcrTtg3YXBQaSWA== + +"@nrwl/tao@15.9.2": + version "15.9.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.9.2.tgz#e970efa8b3fb828007b02286e9e505247032b5b3" + integrity sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA== + dependencies: + nx "15.9.2" "@octokit/auth-token@^2.4.4": version "2.5.0" @@ -2126,11 +1634,11 @@ "@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== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c" + integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" "@octokit/core@^3.5.1": version "3.6.0" @@ -2145,16 +1653,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.0.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" + integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== 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 +1676,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.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1" + integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA== 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 +1694,30 @@ 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.5" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2" + integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ== 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/plugin-enterprise-rest@^6.0.1": +"@octokit/openapi-types@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-17.0.0.tgz#7356d287f48b20e9a1f497ef8dfaabdff9cf8622" + integrity sha512-V8BVJGN0ZmMlURF55VFHFd/L92XQQ43KvFjNmY1IYbCN3V/h/uUFV6iQi19WEHM395Nn+1qhUbViCAD/1czzog== + +"@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 +1729,12 @@ 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@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" + integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^6.41.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" @@ -2236,12 +1749,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@^6.0.0": + version "6.8.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz#97391fda88949eb15f68dc291957ccbe1d3e8ad1" + integrity sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^8.1.1" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -2254,11 +1767,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 +1788,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.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4" + integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA== 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.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" + integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== + dependencies: + "@octokit/core" "^4.0.0" + "@octokit/plugin-paginate-rest" "^3.0.0" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^6.0.0" + "@octokit/rest@^18.12.0": version "18.12.0" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" @@ -2296,29 +1819,26 @@ "@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/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0", "@octokit/types@^6.41.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== dependencies: - "@octokit/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" "^12.11.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== +"@octokit/types@^8.1.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.2.1.tgz#a6de091ae68b5541f8d4fcf9a12e32836d4648aa" + integrity sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw== dependencies: - "@octokit/openapi-types" "^12.10.0" + "@octokit/openapi-types" "^14.0.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": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.1.1.tgz#8a71f05c4e72fe51aac2c66ed71999abdd7e2777" + integrity sha512-hFheiHJEZzE5qn/u4R2IeMLXqUzXgd1vSokHS5x4oq+klHhXNFLL69kanAtrlTqj3K9Dps9XhOqOtDhDmPdlxQ== dependencies: - "@octokit/openapi-types" "^14.0.0" + "@octokit/openapi-types" "^17.0.0" "@parcel/watcher@2.0.4": version "2.0.4" @@ -2328,13 +1848,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" @@ -2435,9 +1948,9 @@ "@phosphor/virtualdom" "^1.2.0" "@popperjs/core@^2.9.0": - version "2.11.5" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" - integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== + version "2.11.7" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" + integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -2492,22 +2005,41 @@ 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== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@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== + execa "^2.0.1" "@sindresorhus/is@^0.7.0": version "0.7.0" @@ -2519,23 +2051,21 @@ 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.3.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.3.0.tgz#0ec9264cf54a527671d990eb874e030b55b70dcc" + integrity sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw== + "@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 +2073,28 @@ 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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.37.0.tgz#10341b4e153a678b42381c510d57247397455b2b" + integrity sha512-ZSczn9K7TzkEUrog4D1pXdAK/MQHXfEHOOpDpu4N0yYD0vraj08ZjbLHx5uLTRM8fk+HHZQsN7gYHOko970SYg== 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.37.0" + "@theia/ffmpeg" "1.37.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" @@ -2577,89 +2113,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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.37.0.tgz#51797e73334e9a69e127586d99f8c3cc11a38fac" + integrity sha512-SgQM4ZNlNEDUtLjxfIkVaLN/yLOnZ/QQprJJSUEp7KKyEHeiJEnAICxrwdIEP9Wp4WsqXG23R0UwIkSUV/pNug== dependencies: + "@theia/request" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.37.0.tgz#e8f58f945fab8688b3d11572b2c1b7b68639b526" + integrity sha512-xq3eS4oYJnKQI0EkfBhbfNAoZnj6aVLOoA0N2VLRIut6zbdsuHJXC4MmeXJNgaRcYKj7XJAKn+BuAEOVH/A+dw== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/workspace" "1.37.0" + +"@theia/callhierarchy@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.37.0.tgz#27fa1af388d75d3870dd83ea0abce5704ca259d5" + integrity sha512-q7E0A03rgzR1BfjgeLybvtGEDSPrp9NMrvu85bNEW9b8ajqUhnBYwlHyX6BLTUtfyrC+zXFE3INFYoHXzeP5xg== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.37.0.tgz#0c0aa06ec0cefd238b5a4cc9cba55266952e45fe" + integrity sha512-cs++uYk8Kv82OPizM4yiGeCMe03aB7XC3vtnFo85ukn7Hwk/9hx+rEOTjNCZobZkv8sUbbVIXI3F7U28knS4+w== + dependencies: + "@theia/application-manager" "1.37.0" + "@theia/application-package" "1.37.0" + "@theia/ffmpeg" "1.37.0" + "@theia/localization-manager" "1.37.0" + "@theia/ovsx-client" "1.37.0" + "@theia/request" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.37.0.tgz#87144273a6550aef1a755cae19786feb352a0a91" + integrity sha512-82yuBXjTilsk3NPGJ2+mdRt7dHM7ylKUaQ6uEaz5AK5/Oix9wCIGFIe20bOidn1ArP1ECaje+C3TqJH3CzG1zw== dependencies: - "@theia/core" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" + "@theia/core" "1.37.0" + "@theia/monaco" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.37.0.tgz#0cba3cdbcb64ed9b7833ba48cdfbae255175717e" + integrity sha512-Smrlhkq8Zw0i0w++pnmEqUB1yH3XUU6MKQ9l/vtl1vzKljcaB+/EmTOz6lfouj1SLoEU/tH0rwsC2GXGA4iMxQ== dependencies: "@babel/runtime" "^7.10.0" "@phosphor/algorithm" "1" @@ -2672,8 +2210,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.37.0" + "@theia/request" "1.37.0" "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" @@ -2711,7 +2249,7 @@ 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 +2262,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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.37.0.tgz#87e45c73cc271a01a4ad8d0e536157f1209f5237" + integrity sha512-UU+A5TFMfAp/z5/NqO+y0+voJ0KgVOfoaOKPXJpg6hoZGU1CEKFbAuIGYjIwdKg1umca2lB2NpJNNl+/wT38kg== + dependencies: + "@theia/console" "1.37.0" + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/markers" "1.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/output" "1.37.0" + "@theia/process" "1.37.0" + "@theia/task" "1.37.0" + "@theia/terminal" "1.37.0" + "@theia/variable-resolver" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.37.0.tgz#ef62129b1a276de57384461597ed8ef3134d5202" + integrity sha512-jQHDvJuZoknnd/Jo2YCVAQmP9GQT58H77DY0ofegsdLx4tKqFOWF7g5EyrPOHa34AgLrP5noeCJrbHGEni/r0Q== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/navigator" "1.37.0" + +"@theia/editor@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.37.0.tgz#abf82a36becb883fb65accc040832c733552c033" + integrity sha512-ZfCg71kXhBgqoRsjInLTM8rYPD8JHi18V4JjJ9EWiBvogjphkZdVc6U1lpS0FjFl9G+QkAArvCBOuwYbrVogrw== dependencies: - "@theia/core" "1.31.1" - "@theia/variable-resolver" "1.31.1" + "@theia/core" "1.37.0" + "@theia/variable-resolver" "1.37.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/electron@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.37.0.tgz#a44608fad9a7ad62a0dd6cd657d62db6ad3015e6" + integrity sha512-d3aQ0E8g0FmVpT99fgrzRFpN9bl5LoIzEzwTTTFUOsDIN/TwGJ+AFmi1UpGn6nBMaszz1JClcrguuYvdJf3Djg== 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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.37.0.tgz#43100eae45f0b931f21c52e7cdb975c09fe2bf65" + integrity sha512-tW0eLSTQGYjMQrhjHjE8zip2yXD5M49Xh8b+ng+HQu327RrOsF+9E0pu9RDad8A48pub8PAGQkpieqQtOBlfjA== 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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.37.0.tgz#6bc87ea5303dc847311f6648998b705752b09bd4" + integrity sha512-xS3iVEIgSDuRbKmn3BDLlP8fzY9kbH3VO0jninDoUm7+G6V6N0HOvamdV9g/YnXLnpwTvkyTpZ/+hfpalDI7Iw== 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.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/process" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.37.0.tgz#9dca3804a05aaafb697ea048c3d54bdabebf2c95" + integrity sha512-RI7T6hzYxLA7q3QYOdjg8NPOj9RJrBCEQ7W2+njYKLoQejXRYP2pe4lqzERT2IZC23ZA79OrXLp166YMXO/rHA== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.37.0" "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" "@types/rimraf" "^2.0.2" @@ -2807,30 +2350,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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.37.0.tgz#ead53cd813de6a9525fc5a276f5bbb5f5aa65c9b" + integrity sha512-YtpL5aiTk/GsiHohcEabc3UYRplnvWxLIL53PnR901FcPop83z9QL+jiLrjgmlTFpz3/RaLlWY93n1ha/mw+CQ== 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.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/preferences" "1.37.0" + "@theia/userstorage" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.37.0.tgz#74d17c3e8c1afd8c90bb88c2ecfeb32366ac590a" + integrity sha512-4wj78eh625YkRwJ/bxxEjC/pL6eT6BQIm1rHDUyac+IXdt/kWAy+cdVYXrLzI3xlxxFpcPtLG6O0tguopJvGMg== dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2841,134 +2384,133 @@ 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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.37.0.tgz#ea6b36bf5a8e6a45165d31e699413595529fd8a7" + integrity sha512-TCzGzuYBctnxVs/dQUAU3Dce9LY/2KlVJ17ZSrCcatOjqMcuoz62hI29XpWmpyfoXZeovUPelt9Jtl3sgUR07w== dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/workspace" "1.31.1" + "@theia/core" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.37.0.tgz#ab51545943bd9aa9dc8f435a1c792b06968444a4" + integrity sha512-4wKPlAR9VoRqPDZ5xYysTNvMmzjabst1cd8yp1tm9DREs/0coVWsWYUdP0s0TZBE570OC0MIGQGew5VGB8p9kQ== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.37.0.tgz#8bd861c3b85f9627f4e4c50d59b1231362d96298" + integrity sha512-zRNivHfpCCRS8+B67IjtPaQPwvFZRAXyZaDyVHrTbjA30UmpRC7yVCoPrfswHrGJoswLFcwoM+VP1ZijhmmnIw== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/markers" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/outline-view" "1.37.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" - -"@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== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" + vscode-textmate "^7.0.3" + +"@theia/navigator@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.37.0.tgz#05b804479419a43042678023fa5a966be2126637" + integrity sha512-scMZfj5YBz6iSfc/3qQDRcPwXeMZEF3egMR7dDkWBn6t5PSG9XWj+wdwUKaUNLOswb22j+RVPMrWGJcruTSr/g== + dependencies: + "@theia/core" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/workspace" "1.37.0" + minimatch "^5.1.0" + +"@theia/outline-view@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.37.0.tgz#11ed2ba98f6f21557384df1b57fb825079b5b278" + integrity sha512-FYO5cm7tmkBQ1k1EBtEvqOnbD0Up6wkvbaj5voSznmsK1gKEMvomJlH6VF28mJLQY64mTKODt6ODsQ9ssGtD1A== + dependencies: + "@theia/core" "1.37.0" + +"@theia/output@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.37.0.tgz#ca35c23674e3a410e63c531d2f55936ffb34129d" + integrity sha512-AYrHy0n5xDPalom6Iy9ifNGZUfa39Pl6ZV54+6dVNAmWAex0x4/gf3bnbxuTj+KGxbVr8FLcjqtiNCggnqgwTA== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/monaco" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.37.0.tgz#6c76afaea6d7d7db72c45c08444a99d5eb03f8b0" + integrity sha512-qU2Qc1v4uSQh70K77zv05OXRRKVXqD0AnAlZrQPk7oA+DK686NYbCjOAuiCxjoNRab3A4bU54Urh5mG5+x1hwA== dependencies: - "@theia/request" "1.31.1" + "@theia/request" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.37.0.tgz#0a32f962d38f129bd4148c551576255f43bbfc2d" + integrity sha512-dTv9DdiobqtZ8qgXDy6QwsNwbqfCFFcx3QlBYeSWQmArruJTebOqPKGyTDRQVLNA6fzKRy+dk9pr7Izp09A0Lg== + dependencies: + "@theia/callhierarchy" "1.37.0" + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/navigator" "1.37.0" + "@theia/plugin" "1.37.0" + "@theia/plugin-ext" "1.37.0" + "@theia/terminal" "1.37.0" + "@theia/typehierarchy" "1.37.0" + "@theia/userstorage" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.37.0.tgz#09904a72c69381378e384fad96b7eb5723f95424" + integrity sha512-myodGqnb9AyNm8Nove7lrG0pfIrYZXoXKjTp9wPN+srUKMSvj+I9G7Y0NYfdsrMQC/t28zvjBjNaFR//6LiAsw== + dependencies: + "@theia/bulk-edit" "1.37.0" + "@theia/callhierarchy" "1.37.0" + "@theia/console" "1.37.0" + "@theia/core" "1.37.0" + "@theia/debug" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/editor-preview" "1.37.0" + "@theia/file-search" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/markers" "1.37.0" + "@theia/messages" "1.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/navigator" "1.37.0" + "@theia/output" "1.37.0" + "@theia/plugin" "1.37.0" + "@theia/preferences" "1.37.0" + "@theia/scm" "1.37.0" + "@theia/search-in-workspace" "1.37.0" + "@theia/task" "1.37.0" + "@theia/terminal" "1.37.0" + "@theia/timeline" "1.37.0" + "@theia/typehierarchy" "1.37.0" + "@theia/variable-resolver" "1.37.0" + "@theia/workspace" "1.37.0" "@types/mime" "^2.0.1" "@vscode/debugprotocol" "^1.51.0" decompress "^4.2.1" @@ -2980,154 +2522,155 @@ 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-proxy-agent "^0.12.0" + vscode-textmate "^7.0.3" + +"@theia/plugin@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.37.0.tgz#e63763b87d1dc161936e388d2880b2347f5d5d26" + integrity sha512-WfAGRtsPSvGEEtWL+sMGoL4nCKNT41ARJWKCWafGKreYVBnE9amc+VpIor9metCBqDKPHYGpCh35mYH27c94UA== + +"@theia/preferences@1.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.37.0.tgz#66e676b24791d293745381e2b31e7cfbabaf568a" + integrity sha512-AWx4gaIwbnhLkSL/Hd2K+FS5T1Ed1SqsdIn3xFV/f7MYiMwla05f2d8eetWXWeQP1ly6jKavP9dTe4qidDNfLw== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/userstorage" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.37.0.tgz#ea847e52f10e16bd466003054c81cdac9af60fe8" + integrity sha512-5qPOw0bE+9wB4FvHh/KG9eHKrqsdXrliTR5uJgmG2G01L5vpHl+77ouB1QfHJySLohs/ojX1Q6YHaspTgfjuqA== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.37.0.tgz#1925ab93f771a807ca9cee1ae68747afb0ba866d" + integrity sha512-US3wrXDOs4XNxFkWeW5Sz7dTQpDS+IMQu3i2RfFAknZOgadOJvSuQkIuKtt1tqvaP/Z1nOzQ+1Enmlr5hWWUIg== 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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.37.0.tgz#fd125ccabccd09e479838bbd8162dfcab51a1e80" + integrity sha512-mbsN2qW2tJq8XozE8O5xJp5gN0yux2jAgQxkmEUOJQ9GFXQNZ+jMUHutNpe1zPd8VFaMn5wyK1lXOLIICHD2xQ== dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.37.0.tgz#31c4ae18d261d98a659020588a0afeb52b0414f3" + integrity sha512-omBC+Q1/gLxVWGSb6aaJLZBqnpd7r8p8KwCFkiVVnH/i1Cb1uZT0nOczNCJf9hMsdu3NBNuaASD1RhGd3wmzOQ== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/navigator" "1.37.0" + "@theia/process" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.37.0.tgz#f662bbee9d324859b3851e3c1158b8ed0fbb3a07" + integrity sha512-bWnFYMB3bhmePoK5+EtAvedxMf9z3OHmvluaaDubPzwh446SzndyVDvGMuKyVuLBI/wUORNWupz23sF7K81RVg== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/markers" "1.37.0" + "@theia/monaco" "1.37.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/process" "1.37.0" + "@theia/terminal" "1.37.0" + "@theia/userstorage" "1.37.0" + "@theia/variable-resolver" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.37.0.tgz#af5e2d521d9fecaf09b5b270a8c6ddec72f9a39e" + integrity sha512-/QvvrNTO6qdZ+2Ho2oYGtdVzLzbIPMXeAIhNV/3tts1aT5xy0pohapMUKtj7feB1E8jfa6AsP7GI36iq/NqRAA== + dependencies: + "@theia/core" "1.37.0" + "@theia/editor" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/process" "1.37.0" + "@theia/variable-resolver" "1.37.0" + "@theia/workspace" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.37.0.tgz#5216056b14c340a6594eb41f7e4329034e244dbf" + integrity sha512-OWpDla/bw9CdA5qFD+nSNASDjbCjhyDkuTFvEZn1wD/uJcDaxz8suiaMMa9RXq5F0+B/cRiHv9cmQzj/65UGjQ== dependencies: - "@theia/core" "1.31.1" - "@theia/navigator" "1.31.1" + "@theia/core" "1.37.0" + "@theia/navigator" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.37.0.tgz#fd760d22135f8ef01d6b8a6ac7fb860b17cd60b8" + integrity sha512-nztCqJJLMPbSXrSGnIOq4rqJ0CHbbWO/uHJEC8/0On4eAu0dmz2RzPqGya6EndYTIM01OUY8zG4jbTCYkhQTzA== dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" + "@theia/core" "1.37.0" + "@theia/editor" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.37.0.tgz#8139a4715abbafa1f64bd12b7fcb390c2754fa16" + integrity sha512-qiMK9sFJhW7+oI7A8Sg0lQJ4eGzlNcJEBScCNIpvxbKfPA691WGIMAMd+4ZfP4V3ERH+1yo4dxjxFIpjlWvfJA== dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" + "@theia/core" "1.37.0" + "@theia/filesystem" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.37.0.tgz#6ca22f220b045864ce455f3e8765e8484276dc7e" + integrity sha512-ETgzcYylf7XqqZJos0VUl8ZloZERfZ5Ue7lktYkc/gJ6GWo5bPNUm9gTkYySXJ/FBOj97idhQWcERYSoEHYDFg== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.37.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.37.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.37.0.tgz#06de774fb4ec8085bfe70d62d1d3ff0e015e2a4f" + integrity sha512-NJqmre9kIowY3gb5y6c2beSwigLBbrwinbfrNwAUHJ5+6BCRfnA+3OmnCu0Wt0q1zYC3gSAd5cNCm1jq4Xh9YQ== dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/variable-resolver" "1.31.1" + "@theia/core" "1.37.0" + "@theia/filesystem" "1.37.0" + "@theia/variable-resolver" "1.37.0" jsonc-parser "^2.2.0" valid-filename "^2.0.1" @@ -3148,15 +2691,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.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.3.tgz#e6cb8a86834da7459a7c836cd892dee56b4bab44" + integrity sha512-mkFEqqRisi13DmR5pX4x+Zk97EiU8djTtpNW1GeuX410y/raAsq/T3ZCjwoRIZ8/cIBfW0olK/sywlAiWevDVw== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^7.4.6" + "@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.14.7" + resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.14.7.tgz#ffa07e66ba37b1e07c5299e877658c0c841c071e" + integrity sha512-Lfoj9XItsnjI/1lxHs4r5wlQjkD4XLy81tAVt6B3j3N9mJL4o4ZQu1SbNcq7aImdhkzss53vxubwBJ3rp3AjUQ== "@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,19 +2732,14 @@ "@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/responselike" "^1.0.0" "@types/chai-string@^1.4.2": version "1.4.2" @@ -3198,9 +2749,9 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.7": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/connect@*": version "3.4.35" @@ -3220,9 +2771,11 @@ 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" @@ -3249,9 +2802,9 @@ 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 +2817,39 @@ "@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.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== 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.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@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 +2860,15 @@ dependencies: "@types/node" "*" -"@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.2.0": +"@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.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== @@ -3332,7 +2888,7 @@ dependencies: "@types/unist" "*" -"@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== @@ -3342,31 +2898,20 @@ 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" + parse5 "^7.0.0" -"@types/json-buffer@~3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" - integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== - -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@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== - "@types/keytar@^4.4.0": version "4.4.2" resolved "https://registry.yarnpkg.com/@types/keytar/-/keytar-4.4.2.tgz#49ef917d6cbb4f19241c0ab50cd35097b5729b32" @@ -3374,7 +2919,7 @@ dependencies: keytar "*" -"@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 +2953,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.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/long@^4.0.1": version "4.0.2" @@ -3426,33 +2971,33 @@ "@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.11" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" + integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== dependencies: "@types/unist" "*" -"@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@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@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@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== -"@types/minimatch@*", "@types/minimatch@^3.0.3": +"@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 +3007,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 +3030,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.3" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.3.tgz#175d977f5e24d93ad0f57602693c435c57ad7e80" + integrity sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w== 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 "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== -"@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.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.24.tgz#f21925dd56cd3467b4e1e0c5071d0f2af5e9a316" + integrity sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3522,13 +3072,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" @@ -3567,35 +3110,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.0.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.37.tgz#7a784e2a8b8f83abb04dc6b9ed9c9b4c0aee9be7" + integrity sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw== 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,26 +3147,26 @@ "@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.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@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== + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== dependencies: - "@types/mime" "^1" + "@types/mime" "*" "@types/node" "*" "@types/sinon@^2.3.5": @@ -3678,9 +3202,9 @@ 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" @@ -3716,81 +3240,102 @@ 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/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: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz#c0e10eeb936debe5d1c3433cf36206a95befefd0" + integrity sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.0" + "@typescript-eslint/type-utils" "5.59.0" + "@typescript-eslint/utils" "5.59.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + 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.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.0.tgz#0ad7cd019346cc5d150363f64869eca10ca9977c" + integrity sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w== 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.59.0" + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/typescript-estree" "5.59.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.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz#86501d7a17885710b6716a23be2e93fc54a4fe8c" + integrity sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ== 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.59.0" + "@typescript-eslint/visitor-keys" "5.59.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.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz#8e8d1420fc2265989fa3a0d897bde37f3851e8c9" + integrity sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/typescript-estree" "5.59.0" + "@typescript-eslint/utils" "5.59.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.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.0.tgz#3fcdac7dbf923ec5251545acdd9f1d42d7c4fe32" + integrity sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA== + +"@typescript-eslint/typescript-estree@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz#8869156ee1dcfc5a95be3ed0e2809969ea28e965" + integrity sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg== + dependencies: + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/visitor-keys" "5.59.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.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.0.tgz#063d066b3bc4850c18872649ed0da9ee72d833d5" + integrity sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA== 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.59.0" + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/typescript-estree" "5.59.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.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz#a59913f2bf0baeb61b5cfcb6135d3926c3854365" + integrity sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.59.0" + eslint-visitor-keys "^3.3.0" "@virtuoso.dev/react-urx@^0.2.12": version "0.2.13" @@ -3805,142 +3350,142 @@ 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.32" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.32.tgz#9e27de90d509c69762b073719ba3bf46c3cd2530" + integrity sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg== "@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.59.0" + resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.59.0.tgz#f173ff725f60e4ff1002f089105634900c88bd77" + integrity sha512-Ks8NiZrCvybf9ebGLP8OUZQbEMIJYC8X0Ds54Q/szpT/SYEDjTksPvZlcWGTo7B9t5abjvbd0jkNH3blYaSuVw== "@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.2" + resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.2.tgz#85b55181353d6d204210e64e03853c5e2ee6edd9" + integrity sha512-8zmyoxV6F+CY1Rinaq7LO/bGShaX2+B333X+Nqo984nC6jg2OvfZtQHzU+PKNQte2fjhm9h2ZlZTufnJxHaX9w== 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== +"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" + integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" -"@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" + integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== -"@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" + integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== -"@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" + integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== -"@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" + integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" "@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" + integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== -"@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" + integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== 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.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" -"@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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" + integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== 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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" + integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== 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.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" + integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" + integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-wasm-section" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-opt" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + "@webassemblyjs/wast-printer" "1.11.5" + +"@webassemblyjs/wasm-gen@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" + integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" + +"@webassemblyjs/wasm-opt@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" + integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + +"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" + integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" + +"@webassemblyjs/wast-printer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" + integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== + dependencies: + "@webassemblyjs/ast" "1.11.5" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.3": @@ -3976,9 +3521,9 @@ 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== + version "3.0.0-rc.42" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.42.tgz#3814e90a81bb1f9c06cc83c6a009139c55efe94d" + integrity sha512-eW9Mbegmb5bJjwawJM9ghjUjUqciNMhC6L7XrQPF/clXS5bbP66MstsgCT5hy9VlfUh/CfBT+0Wucf531dMjHA== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -3998,7 +3543,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== @@ -4008,6 +3553,18 @@ abbrev@1, abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -4016,59 +3573,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-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.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 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 +3614,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 +3630,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" @@ -4105,14 +3650,14 @@ ajv-keywords@^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.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 +3667,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 +3764,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" @@ -4382,6 +3932,11 @@ 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-underline@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-underline/-/ansi-underline-0.1.1.tgz#dfc920f4c97b5977ea162df8ffb988308aaa71a4" @@ -4408,15 +3963,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== @@ -4460,13 +4007,21 @@ 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" +are-we-there-yet@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz#3ff397dc14f08b52dd8b2a64d3cee154ab8760d2" + integrity sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw== + dependencies: + delegates "^1.0.0" + readable-stream "^4.1.0" + are-we-there-yet@~1.1.2: version "1.1.7" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" @@ -4502,16 +4057,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 +4080,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.5, 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 +4100,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 +4122,38 @@ 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.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.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.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.3" - es-abstract "^1.19.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" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -4595,23 +4164,16 @@ 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== - dependencies: - safer-buffer "~2.1.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== - assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -4637,11 +4199,6 @@ 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-mutex@^0.3.0, async-mutex@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.3.2.tgz#1485eda5bda1b0ec7c8df1ac2e815757ad1831df" @@ -4675,15 +4232,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.20.2" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.20.2.tgz#c76f4bfda771105dcb735d8222588b08c0f25b70" + integrity sha512-a6tFTYYK2+DQA3+A/mTKAWt/XOaMeiGWu644SnyAL5P84K79G53QOwtn/ok3DbM9MRfRp+2jYE6U4czTLJnj/g== 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 +4257,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 +4278,24 @@ 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.3.6" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.6.tgz#1ace9a9fb994314b5f6327960918406fa92c6646" + integrity sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" 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 +4305,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.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -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.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" -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.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.3" bail@^2.0.0: version "2.0.2" @@ -4816,17 +4362,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 +4386,22 @@ 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== +bin-links@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" + integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== 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" + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.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== @@ -4901,10 +4438,10 @@ bluebird@~3.4.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== -body-parser@1.20.0, body-parser@^1.17.2, body-parser@^1.18.3: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.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 +4451,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 +4517,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.3, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== 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.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" btoa@^1.2.1: version "1.2.1" @@ -5068,10 +4618,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@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" + integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== bytes@3.1.2: version "3.1.2" @@ -5083,7 +4633,7 @@ 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: +cacache@^16.0.0, cacache@^16.1.0: version "16.1.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== @@ -5107,29 +4657,24 @@ cacache@^16.0.0, cacache@^16.0.6: 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, cacache@^17.0.4: + version "17.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.5.tgz#6dbec26c11f1f6a2b558bc11ed3316577c339ebc" + integrity sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA== 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 "^9.3.1" lru-cache "^7.7.1" - minipass "^3.1.6" + minipass "^4.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,6 +4696,24 @@ 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-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.9" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.9.tgz#6375833d2b99921d8870df9fdc26cb703c56f356" + integrity sha512-CaAMr53AS1Tb9evO1BIWFnZjSr8A4pbXofpsNVWPMDZZj3ZQKHwsQG9BrTqQ4x5ZYJXz1T2b8LLtTZODxSpzbg== + 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@^2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" @@ -5164,19 +4727,6 @@ cacheable-request@^2.1.1: 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-request@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" @@ -5198,11 +4748,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 +4780,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.30001449: + version "1.0.30001481" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz#f58a717afe92f9e69d0e35ff64df596bfad93912" + integrity sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ== capital-case@^1.0.4: version "1.0.4" @@ -5270,13 +4820,13 @@ chai-string@^1.5.0: 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" @@ -5370,7 +4920,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 +4935,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,16 +4950,18 @@ 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.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.6.tgz#a082151834083ed002624f12fa35e748817b2ee5" + integrity sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw== + dependencies: + mitt "3.0.0" + 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== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -5421,15 +4973,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 +4996,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.8.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.8.0.tgz#e97a3e2bd00e6d85aa0c13d7f9e3ce236f7787fc" + integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + 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 +5069,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== @@ -5557,13 +5121,18 @@ 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: +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.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -5612,11 +5181,11 @@ 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== -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 +5193,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,9 +5201,9 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: delayed-stream "~1.0.0" comma-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98" - integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^2.20.0, commander@^2.8.1: version "2.20.3" @@ -5674,14 +5243,6 @@ component-emitter@^1.2.1, component-emitter@^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 +5261,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 +5288,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,7 +5304,15 @@ conf@^10.1.2: pkg-up "^3.1.0" semver "^7.3.5" -config-chain@^1.1.11, config-chain@^1.1.12: +config-chain@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== @@ -5772,20 +5341,20 @@ content-disposition@0.5.4, content-disposition@^0.5.2: 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@5.0.12: + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== dependencies: compare-func "^2.0.0" q "^1.5.1" -conventional-changelog-core@^4.2.4: +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== @@ -5845,7 +5414,7 @@ conventional-commits-parser@^3.2.0: split2 "^3.0.0" through2 "^4.0.0" -conventional-recommended-bump@^6.1.0: +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== @@ -5860,11 +5429,9 @@ conventional-recommended-bump@^6.1.0: q "^1.5.1" convert-source-map@^1.5.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + 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 +5448,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,18 +5478,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.25.1: + version "3.30.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" + integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== dependencies: - browserslist "^4.21.2" - semver "7.0.0" - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + browserslist "^4.21.5" core-util-is@~1.0.0: version "1.0.3" @@ -5937,10 +5498,10 @@ cors@~2.8.5: object-assign "^4" vary "^1" -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== +cosmiconfig@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -5948,41 +5509,49 @@ 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.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: - 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== +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" -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== +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: - 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" + graceful-fs "^4.2.10" + nested-error-stacks "^2.1.1" + p-event "^5.0.1" + +cpy@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-10.0.0.tgz#372dfc731f8f1d72ab06888093084e3c558aec20" + integrity sha512-6aFIEPIDnUE98L4FNBEkfOL5A1XfMt+37fzYsdQ4KugSrVU6gWa1IgBbtc/Di3ohTzGw10LqCcCamw8bL8Erqw== + dependencies: + 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" create-frame@^1.0.0: version "1.0.0" @@ -6001,21 +5570,13 @@ cross-env@^7.0.2: dependencies: cross-spawn "^7.0.1" -cross-fetch@^3.1.5: +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== - dependencies: - lru-cache "^4.0.0" - which "^1.2.8" - cross-spawn@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -6035,7 +5596,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== @@ -6049,67 +5610,60 @@ crypto-js@^4.1.1: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + 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.7.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.19" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" 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" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -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" @@ -6130,7 +5684,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: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6144,7 +5698,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.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 +5719,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 +5732,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,10 +5749,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== +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@^3.3.0: version "3.3.0" @@ -6269,15 +5828,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" @@ -6292,9 +5851,9 @@ deep-is@^0.1.3, deep-is@~0.1.3: 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== + 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" @@ -6309,18 +5868,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== @@ -6330,10 +5884,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" @@ -6360,6 +5914,20 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6370,16 +5938,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" @@ -6400,11 +5963,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" @@ -6420,7 +5978,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,12 +5996,17 @@ diff@3.5.0, diff@^3.4.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-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== @@ -6453,9 +6021,9 @@ dir-glob@^3.0.1: path-type "^4.0.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" @@ -6488,17 +6056,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.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87" + integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== dot-case@^3.0.4: version "3.0.4" @@ -6508,6 +6076,13 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dot-prop@6.0.1, dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -6515,13 +6090,6 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - dotenv@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" @@ -6572,23 +6140,15 @@ duplexer@^0.1.1, duplexer@~0.1.1: 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" - 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" @@ -6613,17 +6173,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.284: + version "1.4.368" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.368.tgz#75901f97d3e23da2e66feb1e61fbb8e70ac96430" + integrity sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw== electron-updater@^4.6.5: version "4.6.5" @@ -6639,14 +6199,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.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-23.3.0.tgz#3e83e75d8bebe00764611c1d0c1bfa90cc197c7c" + integrity sha512-DVAtptpOSxM7ycgriphSxzlkb3R92d28sFKG1hMtmPkAwHl/e87reaHXhGwyj8Xu4GY69e6yUoAJqma20w0Vgw== 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,7 +6223,7 @@ emojis-list@^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== @@ -6682,26 +6242,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.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.4.0.tgz#88cd3082609ca86d7d3c12f0e746d12db4f47c91" + integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" engine.io-parser "~5.0.3" - ws "~8.2.3" + 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== + version "5.0.6" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" + integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== -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.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.1.tgz#8056b4526a88e779f9c280d820422d4e3eeaaae5" + integrity sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -6712,17 +6272,17 @@ engine.io@~6.2.0: cors "~2.8.5" debug "~4.3.1" engine.io-parser "~5.0.3" - ws "~8.2.3" + 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.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" + integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== 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== @@ -6734,6 +6294,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" @@ -6773,44 +6338,64 @@ 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.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + 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.0" 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" + object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + 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-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" 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.2.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + +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" @@ -6853,64 +6438,70 @@ 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: + 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.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== 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" @@ -6927,84 +6518,73 @@ 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.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== 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.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@^8.39.0: + version "8.39.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" + integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.2" + "@eslint/js" "8.39.0" + "@humanwhocodes/config-array" "^0.11.8" + "@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.0" + espree "^9.5.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + 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-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" 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.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -7016,10 +6596,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" @@ -7030,7 +6610,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== @@ -7063,26 +6643,35 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.2.2.tgz#e2ead472c2c31aad6f73f1ac956eef45e12320cb" - integrity 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" @@ -7110,6 +6699,21 @@ 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@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -7144,13 +6748,13 @@ expand-template@^2.0.3: integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== express@^4.16.3: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + 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" @@ -7169,7 +6773,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" @@ -7210,7 +6814,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== @@ -7238,25 +6842,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== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + optionalDependencies: + "@types/yauzl" "^2.9.1" "falsey@^0.3.2": version "0.3.2" @@ -7286,22 +6881,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.11, fast-glob@^3.2.5, 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" @@ -7320,24 +6903,24 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: 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" @@ -7348,6 +6931,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" @@ -7397,10 +6988,10 @@ file-uri-to-path@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== +file-url@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/file-url/-/file-url-3.0.0.tgz#247a586a746ce9f7a8ed05560290968afc262a77" + integrity sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA== filelist@^1.0.1: version "1.0.4" @@ -7488,6 +7079,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" @@ -7531,16 +7130,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== @@ -7550,6 +7144,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" @@ -7562,19 +7163,10 @@ 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== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== form-data@^3.0.0: version "3.0.1" @@ -7594,19 +7186,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.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.1.tgz#81269cbea1a613240049f5f61a9d97731517414f" + integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ== + 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" @@ -7648,7 +7243,17 @@ fs-exists-sync@^0.1.0: resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== -fs-extra@^10.0.0, fs-extra@^10.1.0: +fs-extra@9.1.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -7657,6 +7262,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.0: + 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" @@ -7675,23 +7289,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.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: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -7699,6 +7296,13 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.1.tgz#853809af15b6d03e27638d1ab6432e6b378b085d" + integrity sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw== + dependencies: + minipass "^4.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" @@ -7724,14 +7328,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" @@ -7747,12 +7343,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== @@ -7791,6 +7382,20 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" +gauge@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.0.tgz#e270ca9d97dae84abf64e5277ef1ebddc7dd1e2f" + integrity sha512-0s5T5eciEG7Q3ugkxAkFtaDhrrhXsCRivA5y8C9WMHWuI8UlMOJg7+Iwf7Mccii+Dfs3H5jHepU0joPVyQU0Lw== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -7825,10 +7430,10 @@ 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: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -7857,7 +7462,7 @@ 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== @@ -7874,6 +7479,11 @@ get-stream@3.0.0, get-stream@^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" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" @@ -7882,21 +7492,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== @@ -7909,30 +7519,11 @@ 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" @@ -7968,7 +7559,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== @@ -7987,25 +7578,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" @@ -8036,7 +7621,19 @@ 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@^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== @@ -8049,9 +7646,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" @@ -8059,6 +7656,16 @@ glob@^8.0.1, glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" +glob@^9.2.0, glob@^9.3.0, glob@^9.3.1: + 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" @@ -8071,36 +7678,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.1, 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== @@ -8112,6 +7709,17 @@ globby@^11.0.2, globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" +globby@^13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + 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" @@ -8124,48 +7732,24 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - google-protobuf@3.12.4: version "3.12.4" resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.4.tgz#fd89b7e5052cdb35a80f9b455612851d542a5c9f" integrity sha512-ItTn8YepDQMHEMHloUPH+FDaTPiHTnbsMvP50aXfbI65IK3AA5+wXlHSygJH8xz+h1g4gu7V+CK5X1/SaGITsA== google-protobuf@^3.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== @@ -8182,6 +7766,23 @@ got@^11.8.0: p-cancelable "^2.0.0" responselike "^2.0.0" +got@^12.0.0, got@^12.1.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.0.tgz#8d382ee5de4432c086e83c133efdd474484f6ac7" + integrity sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ== + 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" + got@^8.3.1: version "8.3.2" resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" @@ -8205,37 +7806,30 @@ got@^8.3.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: +graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +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.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== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== grpc-tools@^1.9.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.11.2.tgz#22d802d40012510ccc6591d11f9c94109ac07aab" - integrity sha512-4+EgpnnkJraamY++oyBCw5Hp9huRYfgakjNVKbiE3PgO9Tv5ydVlRo7ZyGJ0C0SEiA7HhbVc1sNNtIyK7FiEtg== + 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" @@ -8330,19 +7924,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" @@ -8363,13 +7944,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" @@ -8377,12 +7951,17 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +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-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +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== @@ -8401,7 +7980,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== @@ -8453,9 +8032,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" @@ -8498,6 +8077,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" @@ -8536,12 +8120,19 @@ hosted-git-info@^5.0.0: 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== +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: + 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@^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,10 +8147,10 @@ http-cache-semantics@3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-errors@2.0.0: version "2.0.0" @@ -8590,15 +8181,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" @@ -8612,15 +8194,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== @@ -8652,7 +8234,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== @@ -8670,9 +8252,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" @@ -8703,25 +8285,22 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" +ignore-walk@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.2.tgz#c48f48397cf8ef6174fcc28aa5f8c1de6203d389" + integrity sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg== + dependencies: + minimatch "^7.4.2" + 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: + 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" @@ -8754,6 +8333,11 @@ 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== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -8772,7 +8356,7 @@ 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== @@ -8782,7 +8366,7 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^3.0.2: +init-package-json@3.0.2, 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== @@ -8800,6 +8384,27 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + inquirer@^8.2.4: version "8.2.5" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" @@ -8821,12 +8426,12 @@ 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== +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.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -8887,6 +8492,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" @@ -8924,29 +8546,22 @@ 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@^2.0.0: +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-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.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" @@ -8995,9 +8610,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" @@ -9018,7 +8633,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== @@ -9040,14 +8655,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== @@ -9134,17 +8749,22 @@ 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-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -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== @@ -9154,7 +8774,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== @@ -9176,6 +8796,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" @@ -9220,6 +8845,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" @@ -9251,10 +8881,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" @@ -9285,16 +8921,16 @@ 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== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -9317,11 +8953,6 @@ 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" @@ -9354,6 +8985,11 @@ js-cookie@^2.2.0: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -9387,47 +9023,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.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.1.tgz#ab796361e3f6c01bcfaeda1fea3c06197ac9d8ae" + integrity sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w== + 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.2" + 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,7 +9075,7 @@ json-buffer@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== @@ -9459,6 +9090,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" @@ -9474,11 +9110,6 @@ 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" @@ -9489,24 +9120,24 @@ json-stringify-nice@^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== @@ -9516,11 +9147,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" @@ -9542,38 +9168,38 @@ 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.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: array-includes "^3.1.5" - object.assign "^4.1.2" + object.assign "^4.1.3" -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== + version "5.5.0" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" + integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== -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-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@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + +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" @@ -9603,19 +9229,11 @@ keyv@3.0.0: 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.2" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" + integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== 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: @@ -9666,39 +9284,87 @@ 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" + version "6.6.1" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.6.1.tgz#4897171aed64e244a2d0f9000eef5c5b228f9332" + integrity sha512-WJtrvmbmR+6hMB9b5pvsxJzew0lRL6hARgW/My9BM4vYaxwPIA2I0riv3qQu5Zd7lYse7FEqJkTnl9Kn1bXhLA== + dependencies: + "@lerna/child-process" "6.6.1" + "@lerna/create" "6.6.1" + "@lerna/legacy-package-management" "6.6.1" + "@npmcli/arborist" "6.2.3" + "@npmcli/run-script" "4.1.7" + "@nrwl/devkit" ">=15.5.2 < 16" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.3" + byte-size "7.0.0" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "5.0.0" + columnify "1.6.0" + config-chain "1.1.12" + conventional-changelog-angular "5.0.12" + conventional-changelog-core "4.2.4" + conventional-recommended-bump "6.1.0" + cosmiconfig "7.0.0" + dedent "0.7.0" + dot-prop "6.0.1" + envinfo "^7.7.4" + execa "5.0.0" + fs-extra "9.1.0" + 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.10" + has-unicode "2.0.1" import-local "^3.0.2" + init-package-json "3.0.2" inquirer "^8.2.4" + is-ci "2.0.0" + is-stream "2.0.0" + js-yaml "^4.1.0" + libnpmaccess "6.0.3" + libnpmpublish "6.0.4" + load-json-file "6.2.0" + 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.3" npmlog "^6.0.2" - nx ">=14.8.6 < 16" + nx ">=15.5.2 < 16" + 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 "13.6.2" + pify "5.0.0" + read-cmd-shim "3.0.0" + read-package-json "5.0.1" + 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 || ^4" + upath "^2.0.1" + uuid "8.3.2" + validate-npm-package-license "3.0.4" + validate-npm-package-name "4.0.0" + write-file-atomic "4.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" less@^3.0.3: version "3.13.1" @@ -9732,20 +9398,20 @@ levn@~0.3.0: 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== +libnpmaccess@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded" + integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg== dependencies: aproba "^2.0.0" minipass "^3.1.1" npm-package-arg "^9.0.1" npm-registry-fetch "^13.0.0" -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== +libnpmpublish@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.4.tgz#adb41ec6b0c307d6f603746a4d929dcefb8f1a0b" + integrity sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg== dependencies: normalize-package-data "^4.0.0" npm-package-arg "^9.0.1" @@ -9753,6 +9419,13 @@ libnpmpublish@^6.0.4: semver "^7.3.7" ssri "^9.0.0" +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: + just-performance "4.3.0" + line-height@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" @@ -9765,6 +9438,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" @@ -9811,6 +9489,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" @@ -9821,34 +9509,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" @@ -9877,6 +9555,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" @@ -9917,11 +9602,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" @@ -9942,12 +9622,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== @@ -9967,7 +9642,7 @@ log-symbols@3.0.0: dependencies: chalk "^2.4.2" -log-symbols@^4.1.0: +log-symbols@4.1.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== @@ -10012,9 +9687,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" @@ -10024,9 +9699,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,7 +9717,7 @@ lowercase-keys@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: +lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== @@ -10052,7 +9727,12 @@ lowercase-keys@^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== @@ -10060,6 +9740,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" @@ -10067,15 +9754,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.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.0.tgz#19efafa9d08d1c08eb8efd78876075f0b8b1b07b" + integrity sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ== lzma-native@^8.0.5: version "8.0.6" @@ -10091,6 +9778,13 @@ macaddress@^0.2.9: resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== +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, make-dir@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -10098,7 +9792,7 @@ make-dir@^1.0.0, make-dir@^1.2.0: 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== @@ -10106,17 +9800,10 @@ 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-fetch-happen@^10.0.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== dependencies: agentkeepalive "^4.2.1" cacache "^16.1.0" @@ -10135,27 +9822,26 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -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: + version "11.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz#f26b05e89317e960b75fd5e080e40d40f8d7b2a5" + integrity sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA== 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" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^4.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" @@ -10210,18 +9896,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.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" + integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" @@ -10237,28 +9923,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== @@ -10314,7 +9999,7 @@ merge-stream@^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== @@ -10467,10 +10152,10 @@ micromark-util-resolve-all@^1.0.0: 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.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" + integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== dependencies: micromark-util-character "^1.0.0" micromark-util-encode "^1.0.0" @@ -10497,9 +10182,9 @@ micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== 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.1.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" + integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -10519,7 +10204,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== @@ -10538,7 +10223,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.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== @@ -10551,7 +10236,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== @@ -10563,7 +10248,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: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== @@ -10578,7 +10263,7 @@ 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-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== @@ -10593,15 +10278,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.5" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" + integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== dependencies: schema-utils "^4.0.0" @@ -10624,17 +10314,45 @@ 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@^6.1.6: + version "6.2.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" + integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^7.4.2, minimatch@^7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" + integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== + 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" @@ -10648,9 +10366,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" @@ -10660,9 +10378,9 @@ minipass-collect@^1.0.2: 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== + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== dependencies: minipass "^3.1.6" minipass-sized "^1.0.3" @@ -10670,6 +10388,17 @@ minipass-fetch@^2.0.3: optionalDependencies: encoding "^0.1.13" +minipass-fetch@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.2.tgz#2f7275ae13f2fb0f2a469cee4f78250c25c80ab3" + integrity sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA== + dependencies: + minipass "^4.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -10699,34 +10428,22 @@ 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== + 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.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== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -10736,6 +10453,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" @@ -10765,7 +10487,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== @@ -10777,6 +10499,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" @@ -10831,14 +10580,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" @@ -10865,26 +10612,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.1: + 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.8.5" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.8.5.tgz#8cadfb935357680648f33699d0e833c9179dbfeb" + integrity sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg== optionalDependencies: - msgpackr-extract "^2.1.2" + msgpackr-extract "^3.0.1" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -10899,7 +10646,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== @@ -10916,9 +10663,9 @@ mute-stream@0.0.8, mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 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" @@ -10931,10 +10678,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" @@ -10968,6 +10720,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" @@ -10988,7 +10745,7 @@ 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== @@ -11007,9 +10764,9 @@ no-case@^3.0.4: 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== + version "3.40.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.40.0.tgz#51d8ed44534f70ff1357dfbc3a89717b1ceac1b4" + integrity sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA== dependencies: semver "^7.3.5" @@ -11020,11 +10777,6 @@ 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@^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" @@ -11035,6 +10787,11 @@ node-addon-api@^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" resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" @@ -11042,6 +10799,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" @@ -11050,43 +10812,43 @@ 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-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== +node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" -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-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: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^5.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" + 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@^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-gyp-build@^4.2.1, node-gyp-build@^4.3.0: + 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, node-gyp@^9.3.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" + integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== dependencies: env-paths "^2.2.0" glob "^7.1.4" @@ -11106,15 +10868,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.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== noop-logger@^0.1.1: version "0.1.1" @@ -11135,6 +10892,13 @@ nopt@^6.0.0: dependencies: abbrev "^1.0.0" +nopt@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.1.0.tgz#91f6a3366182176e72ecab93a09c19b63b485f28" + integrity sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q== + dependencies: + abbrev "^2.0.0" + normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -11165,6 +10929,16 @@ normalize-package-data@^4.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -11179,17 +10953,17 @@ normalize-url@2.0.1: 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.1, 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== @@ -11203,7 +10977,14 @@ npm-bundled@^2.0.0: dependencies: npm-normalize-package-bin "^2.0.0" -npm-conf@^1.1.0, npm-conf@^1.1.3: +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: + npm-normalize-package-bin "^3.0.0" + +npm-conf@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== @@ -11218,6 +10999,13 @@ npm-install-checks@^5.0.0: dependencies: semver "^7.1.1" +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" + npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" @@ -11228,6 +11016,11 @@ npm-normalize-package-bin@^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.0" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz#6097436adb4ef09e2628b59a7882576fe53ce485" + integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== + npm-package-arg@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" @@ -11237,6 +11030,16 @@ npm-package-arg@8.1.1: semver "^7.0.0" validate-npm-package-name "^3.0.0" +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + npm-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" @@ -11247,7 +11050,17 @@ npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: semver "^7.3.5" validate-npm-package-name "^4.0.0" -npm-packlist@^5.1.0, npm-packlist@^5.1.1: +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 "^1.1.2" + npm-normalize-package-bin "^1.0.1" + +npm-packlist@^5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.3.tgz#69d253e6fd664b9058b85005905012e00e69274b" integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== @@ -11257,6 +11070,13 @@ npm-packlist@^5.1.0, npm-packlist@^5.1.1: npm-bundled "^2.0.0" npm-normalize-package-bin "^2.0.0" +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@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz#1d372b4e7ea7c6712316c0e99388a73ed3496e84" @@ -11267,7 +11087,30 @@ npm-pick-manifest@^7.0.0: npm-package-arg "^9.0.0" semver "^7.3.5" -npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3.0: +npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: + 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 "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-registry-fetch@14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz#8545e321c2b36d2c6fe6e009e77e9f0e527f547b" + integrity sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: 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== @@ -11280,12 +11123,18 @@ npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3 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== +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: + version "14.0.4" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.4.tgz#43dfa55ce7c0d0c545d625c7a916bab5b95f7038" + integrity sha512-pMS2DRkwg+M44ct65zrN/Cr9IHK1+n6weuefAo6Er4lc+/8YBCU0Czq04H3ZiSigluh7pb2rMM5JpgcytctB+Q== dependencies: - path-key "^1.0.0" + make-fetch-happen "^11.0.0" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-path@^2.0.0: version "2.0.2" @@ -11294,6 +11143,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +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.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -11301,6 +11157,16 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npmlog@6.0.2, npmlog@^6.0.0, npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + npmlog@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -11321,47 +11187,46 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" -npmlog@^6.0.0, npmlog@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== +npmlog@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" + integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== dependencies: - are-we-there-yet "^3.0.0" + are-we-there-yet "^4.0.0" console-control-strings "^1.1.0" - gauge "^4.0.3" + gauge "^5.0.0" 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.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== -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@15.9.2, "nx@>=15.5.2 < 16": + version "15.9.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-15.9.2.tgz#d7ace1e5ae64a47f1b553dc5da08dbdd858bde96" + integrity sha512-wtcs+wsuplSckvgk+bV+/XuGlo+sVWzSG0RpgWBjQYeqA3QsVFEAPVY66Z5cSoukDbTV77ddcAjEw+Rz8oOR1A== dependencies: - "@nrwl/cli" "15.3.0" - "@nrwl/tao" "15.3.0" + "@nrwl/cli" "15.9.2" + "@nrwl/tao" "15.9.2" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18" "@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" @@ -11370,11 +11235,12 @@ 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" @@ -11383,16 +11249,21 @@ nx@15.3.0, "nx@>=14.8.6 < 16": 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: + "@nrwl/nx-darwin-arm64" "15.9.2" + "@nrwl/nx-darwin-x64" "15.9.2" + "@nrwl/nx-linux-arm-gnueabihf" "15.9.2" + "@nrwl/nx-linux-arm64-gnu" "15.9.2" + "@nrwl/nx-linux-arm64-musl" "15.9.2" + "@nrwl/nx-linux-x64-gnu" "15.9.2" + "@nrwl/nx-linux-x64-musl" "15.9.2" + "@nrwl/nx-win32-arm64-msvc" "15.9.2" + "@nrwl/nx-win32-x64-msvc" "15.9.2" object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -11408,10 +11279,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" @@ -11435,51 +11306,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.3, 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" @@ -11488,14 +11360,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" @@ -11519,9 +11391,9 @@ onetime@^5.1.0, onetime@^5.1.2: mimic-fn "^2.1.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" @@ -11585,36 +11457,29 @@ 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 "^3.0.0" + p-some "^6.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@^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" @@ -11632,25 +11497,30 @@ p-event@^2.1.0: 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-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@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" @@ -11675,7 +11545,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== @@ -11703,41 +11573,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== @@ -11745,18 +11617,23 @@ 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== +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: - aggregate-error "^3.0.0" - p-cancelable "^2.0.0" + aggregate-error "^4.0.0" + p-cancelable "^3.0.0" p-timeout@^2.0.1: version "2.0.1" @@ -11765,31 +11642,36 @@ p-timeout@^2.0.1: dependencies: p-finally "^1.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: +pacote@13.6.2, pacote@^13.6.1: version "13.6.2" resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== @@ -11816,6 +11698,30 @@ pacote@^13.0.3, pacote@^13.6.1: ssri "^9.0.0" tar "^6.1.11" +pacote@^15.0.0, pacote@^15.0.8: + version "15.1.2" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.2.tgz#78b4c1403231fab368c752943f1969c6d8f026bb" + integrity sha512-EAGJrMiIjBTBB6tWGrx9hFJTOo14B3HSAoa/W9SawFEBhUqjxN7qqaFlGVF9jfY/mIri8Mb2xafmkRgWxYXxIQ== + 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 "^4.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -11831,13 +11737,13 @@ 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== +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== dependencies: - json-parse-even-better-errors "^2.3.1" - just-diff "^5.0.1" + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" just-diff-apply "^5.2.0" parse-json@^4.0.0: @@ -11872,10 +11778,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" @@ -11908,11 +11816,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" @@ -11928,11 +11831,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,6 +11846,26 @@ path-parse@^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.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" + integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== + dependencies: + lru-cache "^9.0.0" + minipass "^5.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" @@ -11987,11 +11905,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" @@ -12002,7 +11915,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== @@ -12017,11 +11935,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" @@ -12055,11 +11968,6 @@ 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== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -12093,10 +12001,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -12106,12 +12014,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.19: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -12196,9 +12104,18 @@ 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.7" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" + integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + +pretty-format@29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" + integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" private@~0.1.5: version "0.1.8" @@ -12210,12 +12127,22 @@ proc-log@^2.0.0, proc-log@^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== @@ -12226,9 +12153,9 @@ promise-all-reject-late@^1.0.0: 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== + version "1.0.2" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" + integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== promise-inflight@^1.0.1: version "1.0.1" @@ -12250,7 +12177,7 @@ promzard@^0.3.0: dependencies: read "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.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== @@ -12260,9 +12187,9 @@ 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== + version "6.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" + integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== proto-list@~1.2.1: version "1.2.4" @@ -12270,9 +12197,9 @@ proto-list@~1.2.1: integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== 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== + version "7.2.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.3.tgz#01af019e40d9c6133c49acbb3ff9e30f4f0f70b2" + integrity sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -12284,22 +12211,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" @@ -12314,7 +12240,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== @@ -12336,18 +12262,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: @@ -12366,12 +12292,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.10.1, puppeteer-core@^19.7.2: + version "19.10.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.10.1.tgz#b16263e201612e9145d063092e6cdf994584ad7c" + integrity sha512-vD4ojslBtnIWd56IQIEADIcAWrNel/Qt7YGlAxcSNB0b33U3tYe0A+0FLmPNgSa7UTlCOCCVEmzXi5QlDtLGjQ== + dependencies: + "@puppeteer/browsers" "0.5.0" + chromium-bidi "0.4.6" + 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== @@ -12381,45 +12324,36 @@ 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== +puppeteer@^19.7.2: + version "19.10.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.10.1.tgz#1d2bf9e1f1440dbe55dbeb6743191657a6b9878b" + integrity sha512-HqpY8sWqz28JfyZE8cGG9kBPgASD7iRHn/ryWLvVLXE10poR5AyU/mMsLmL175qoYl/chwMTN2pxKSz7HobaCg== 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" + "@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.10.1" 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== - dependencies: - side-channel "^1.0.4" - -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== +qs@^6.10.1, qs@^6.10.3, qs@^6.11.0, qs@^6.9.4: + version "6.11.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" query-string@^5.0.1: version "5.1.1" @@ -12431,15 +12365,20 @@ query-string@^5.0.1: strict-uri-encode "^1.0.0" query-string@^7.0.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.1.tgz#754620669db978625a90f635f12617c271a088e1" - integrity sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: - decode-uri-component "^0.2.0" + decode-uri-component "^0.2.2" filter-obj "^1.1.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +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" @@ -12477,6 +12416,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" @@ -12549,9 +12498,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.2" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.2.tgz#ccd40071b9429277983bf15526e7a5773a060e09" + integrity sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -12572,17 +12521,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" @@ -12598,9 +12547,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" @@ -12612,12 +12561,17 @@ 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@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" + integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog== + +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: +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== @@ -12625,7 +12579,25 @@ read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" -read-package-json@^5.0.0, read-package-json@^5.0.1: +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + 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: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" + integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== + dependencies: + glob "^8.0.1" + json-parse-even-better-errors "^2.3.1" + normalize-package-data "^4.0.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json@^5.0.0: 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== @@ -12635,6 +12607,16 @@ read-package-json@^5.0.0, read-package-json@^5.0.1: normalize-package-data "^4.0.0" npm-normalize-package-bin "^2.0.0" +read-package-json@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.1.tgz#566cb06bc05dbddefba4607e9096d5a9efbcd836" + integrity sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA== + dependencies: + glob "^9.3.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -12678,29 +12660,19 @@ read@1, read@^1.0.7: 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== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" 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== + 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" @@ -12710,15 +12682,15 @@ 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@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.3.0.tgz#0914d0c72db03b316c9733bb3461d64a3cc50cba" + integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ== dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" readdirp@~3.2.0: version "3.2.0" @@ -12771,10 +12743,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" @@ -12783,20 +12755,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.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-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-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" @@ -12808,41 +12775,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: + 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" - -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== + define-properties "^1.2.0" + functions-have-names "^1.2.3" -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" - -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== +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" @@ -12900,56 +12857,6 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.82.0, request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -requestretry@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-7.1.0.tgz#d16a1a57a95295211147841550603f3dc527541e" - integrity sha512-TqVDgp251BW4b8ddQ2ptaj/57Z3LZHLscAUT7v6qs70buqF2/IoOVjYbpjJ6HiW7j5+waqegGI8xKJ/+uzgDmw== - dependencies: - extend "^3.0.2" - lodash "^4.17.15" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -12970,7 +12877,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== @@ -12982,15 +12894,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" @@ -12998,15 +12917,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== @@ -13015,7 +12934,7 @@ 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: +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== @@ -13029,6 +12948,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" @@ -13071,6 +12997,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" @@ -13095,6 +13028,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" @@ -13107,17 +13045,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.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" @@ -13128,7 +13059,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== @@ -13138,6 +13079,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" @@ -13145,7 +13095,7 @@ 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: +"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== @@ -13155,6 +13105,13 @@ sax@^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" @@ -13171,24 +13128,24 @@ 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.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== 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.0.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" + integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== 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: version "1.0.6" @@ -13212,11 +13169,6 @@ semver-compare@^1.0.0: 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== - semver@7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" @@ -13224,22 +13176,22 @@ semver@7.3.4: 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@^7.0.0, semver@^7.1.1, semver@^7.3.7: +semver@7.3.8: 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@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@^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@^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: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" @@ -13278,6 +13230,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" @@ -13285,10 +13244,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" @@ -13399,11 +13358,20 @@ 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== +sigstore@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.3.2.tgz#2f70ec3e1192911484d9d148ecd9c98345cd172d" + integrity sha512-0KT1DjpVB11FK15ep7BIsZQV6j1jBm4SnXIInbBCRvql6II39IKONOMO+j036sGsArU/+2xqa1NDJwJkic0neA== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.1.3" + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -13427,20 +13395,20 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.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" @@ -13503,40 +13471,42 @@ 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.6.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.6.1.tgz#80d97d5eb0feca448a0fb6d69a7b222d3d547eab" + integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== 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.4.0" + socket.io-parser "~4.2.1" -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.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" + integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== 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.6.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.6.1.tgz#62ec117e5fce0692fa50498da9347cfb52c3bc70" + integrity sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA== dependencies: accepts "~1.3.4" base64id "~2.0.0" debug "~4.3.2" - engine.io "~6.2.0" - socket.io-adapter "~2.4.0" - socket.io-parser "~4.2.0" + engine.io "~6.4.1" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.1" socks-proxy-agent@^5.0.0: version "5.0.1" @@ -13557,9 +13527,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" @@ -13585,13 +13555,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" @@ -13646,14 +13609,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" @@ -13672,9 +13635,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" @@ -13719,28 +13682,20 @@ 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== - 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: +ssri@9.0.1, ssri@^9.0.0: 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" +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.3" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.3.tgz#7f83da39058ca1d599d174e9eee4237659710bf4" + integrity sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg== + dependencies: + minipass "^4.0.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -13754,11 +13709,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" @@ -13839,37 +13789,46 @@ 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.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" @@ -13878,11 +13837,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" @@ -13966,7 +13920,7 @@ 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.0, 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== @@ -13983,7 +13937,7 @@ striptags@^3.1.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== @@ -13993,9 +13947,9 @@ strong-log-transformer@^2.1.0: through "^2.3.4" 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.7.2" + resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.7.2.tgz#bb4e70b2c2020dfa3ea81f22adda252aaf31e0a4" + integrity sha512-Nd/qrPj1ikYX+sL/8PofMgfaJLRvGgT96Ty3dJLGNqtZmecVr3Xs+OZivMQEYmSCTiap/UyeV5SqwmAgn3/KKA== dependencies: chalk "^4.0.0" change-case "^4.1.2" @@ -14039,22 +13993,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" @@ -14089,27 +14043,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: - 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" +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== 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" @@ -14120,16 +14073,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" @@ -14154,20 +14097,7 @@ 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== - 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" - -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== @@ -14179,7 +14109,7 @@ tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^6.1.0: +tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== @@ -14191,7 +14121,7 @@ tar@^6.1.0: 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== @@ -14209,21 +14139,32 @@ 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== +tempy@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.0.tgz#4f192b3ee3328a2684d0e3fc5c491425395aab65" + integrity sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w== + dependencies: + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terser-webpack-plugin@^5.3.7: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== 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.5" -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.5: + version "5.17.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" + integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -14271,9 +14212,9 @@ timed-out@^4.0.1: 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" @@ -14318,11 +14259,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" @@ -14353,49 +14289,41 @@ 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== - dependencies: - psl "^1.1.28" - punycode "^2.1.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.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== 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" @@ -14407,10 +14335,10 @@ 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== +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== trim-lines@^3.0.0: version "3.0.1" @@ -14435,17 +14363,16 @@ trough@^2.0.0: integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== 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" @@ -14454,15 +14381,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.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tsutils@^3.21.0: version "3.21.0" @@ -14471,6 +14393,14 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tuf-js@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.4.tgz#e85a936b16859c7fae23e5f040bc0f7b559b3192" + integrity sha512-Lw2JRM3HTYhEtQJM2Th3aNCPbnXirtWMl065BawwmM2pX6XStH/ZO9e8T2hh0zk/HUa+1i6j+Lv6eDitKTau6A== + dependencies: + "@tufjs/models" "1.0.3" + make-fetch-happen "^11.0.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -14478,16 +14408,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" @@ -14512,6 +14432,11 @@ type-fest@^0.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -14542,10 +14467,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" @@ -14555,12 +14480,14 @@ 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-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" @@ -14574,10 +14501,10 @@ 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 || ^4", 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" @@ -14590,9 +14517,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" @@ -14613,7 +14540,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: 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== @@ -14639,15 +14566,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" @@ -14672,13 +14599,6 @@ 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" @@ -14686,12 +14606,12 @@ unique-filename@^2.0.0: 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== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== dependencies: - imurmurhash "^0.1.4" + unique-slug "^4.0.0" unique-slug@^3.0.0: version "3.0.0" @@ -14700,64 +14620,78 @@ unique-slug@^3.0.0: dependencies: imurmurhash "^0.1.4" -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: +unique-string@^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== + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-generated@^2.0.0: + 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" @@ -14776,15 +14710,7 @@ 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: +unzipper@^0.10.11: version "0.10.11" resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== @@ -14815,15 +14741,15 @@ unzipper@^0.9.11: readable-stream "~2.3.6" setimmediate "~1.0.4" -upath@^2.0.1: +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.10: + 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" @@ -14866,6 +14792,14 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +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: + querystringify "^2.1.1" + requires-port "^1.0.0" + url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" @@ -14893,12 +14827,28 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: 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@8.3.2, uuid@^8.0.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^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== @@ -14908,10 +14858,10 @@ uuid@^7.0.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.0.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + 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" @@ -14923,7 +14873,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== @@ -14940,7 +14890,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== @@ -14948,6 +14898,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@4.0.0, 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" + 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" @@ -14955,10 +14912,10 @@ 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== +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" @@ -14967,27 +14924,18 @@ vary@^1, vary@~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== - 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" @@ -14999,7 +14947,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== @@ -15011,53 +14959,52 @@ 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-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== +vscode-proxy-agent@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.12.0.tgz#0775f464b9519b0c903da4dcf50851e1453f4e48" + integrity sha512-jS7950hE9Kq6T18vYewVl0N9acEBD3d+scbPew2Nti7d61THBrhVF9FQjc8TLfrUZ//UzzOFO8why+F0kHDdNw== 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" @@ -15071,12 +15018,12 @@ vscode-windows-ca-certs@^0.3.0: 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" + xml-name-validator "^4.0.0" walk-up-path@^1.0.0: version "1.0.0" @@ -15088,7 +15035,7 @@ warning-symbol@^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== @@ -15103,15 +15050,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" @@ -15145,22 +15097,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.80.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.80.0.tgz#3e660b4ab572be38c5e954bdaae7e2bf76010fdc" + integrity sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA== 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" + "@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.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.13.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -15169,23 +15121,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.1.2" 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" @@ -15195,24 +15155,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" @@ -15234,7 +15176,19 @@ which-pm-runs@^1.0.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.2, which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + 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, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -15248,6 +15202,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.0.tgz#a9efd016db59728758a390d23f1687b6e8f59f8e" + integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== + 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" @@ -15290,6 +15251,11 @@ 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@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -15330,6 +15296,14 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + 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" @@ -15339,20 +15313,10 @@ 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== +write-file-atomic@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz#54303f117e109bf3d540261125c8ea5a7320fab0" + integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" @@ -15381,19 +15345,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== @@ -15402,68 +15354,56 @@ 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== + +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" @@ -15504,7 +15444,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== @@ -15550,11 +15490,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" @@ -15571,6 +15506,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" @@ -15587,6 +15532,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, yargs@^17.0.1, yargs@^17.6.2: + 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" @@ -15622,45 +15593,6 @@ 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== - 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" - yauzl@^2.10.0, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From 33ab2a69559dbda89daba2b98aea953b7d4e1064 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 26 Apr 2023 14:53:17 +0200 Subject: [PATCH 195/384] build: use `execFileSync` for npm scripts Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../scripts/download-examples.js | 30 +- .../scripts/download-fwuploader.js | 82 +---- .../scripts/generate-protocol.js | 308 ++++++++++-------- arduino-ide-extension/scripts/utils.js | 50 ++- 4 files changed, 223 insertions(+), 247 deletions(-) diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index 6d2d3debd..3b00d1bfe 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -4,31 +4,29 @@ 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 { promises: fs } = require('node:fs'); + const path = require('node:path'); const shell = require('shelljs'); const { v4 } = require('uuid'); + const { exec } = require('./utils'); 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); diff --git a/arduino-ide-extension/scripts/download-fwuploader.js b/arduino-ide-extension/scripts/download-fwuploader.js index 4c13b628a..ed4866acb 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')); @@ -86,81 +85,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/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index ca51d6d71..4b1970880 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -1,156 +1,184 @@ // @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; + 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 build = path.join(__dirname, '..', 'build'); + const cli = path.join( + build, + `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..4b18c74f3 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'); @@ -66,23 +98,17 @@ function buildFromGit(command, version, destinationPath, taskName) { 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}.`); } 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); From 36e2092398fa23b7089a4b4d9f4a35ea6072c68e Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 26 Apr 2023 15:14:01 +0200 Subject: [PATCH 196/384] build: use `execa` for the packager Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- electron/packager/config.js | 24 +- electron/packager/index.js | 108 +++++---- electron/packager/package.json | 7 +- electron/packager/test/utils.test.js | 4 +- electron/packager/utils.js | 32 ++- electron/packager/yarn.lock | 323 ++++++++------------------- 6 files changed, 197 insertions(+), 301 deletions(-) diff --git a/electron/packager/config.js b/electron/packager/config.js index caa1cd6b2..ed8a57833 100644 --- a/electron/packager/config.js +++ b/electron/packager/config.js @@ -1,15 +1,15 @@ //@ts-check -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const semver = require('semver'); const merge = require('deepmerge'); const dateFormat = require('dateformat'); const { isNightly, isRelease, git } = require('./utils'); -function artifactName() { +async function artifactName() { const { platform, arch } = process; - const id = (() => { + const id = await (() => { if (isRelease) { return getVersion(); } else if (isNightly) { @@ -69,8 +69,8 @@ function electronPlatform() { } } -function getVersion() { - const repositoryRootPath = git('rev-parse --show-toplevel'); +async function getVersion() { + const repositoryRootPath = await git(['rev-parse', '--show-toplevel']); let version = JSON.parse( fs.readFileSync(path.join(repositoryRootPath, 'package.json'), { encoding: 'utf8', @@ -85,7 +85,7 @@ function getVersion() { if (isNightly) { version = `${version}-nightly-${timestamp()}`; } else { - version = `${version}-snapshot-${currentCommitish()}`; + version = `${version}-snapshot-${await currentCommitish()}`; } if (!semver.valid(version)) { throw new Error(`Invalid patched version: '${version}'.`); @@ -109,18 +109,18 @@ function timestamp() { return dateFormat(new Date(), 'yyyymmdd'); } -function currentCommitish() { - return git('rev-parse --short HEAD'); +async function currentCommitish() { + return git(['rev-parse', '--short', 'HEAD']); } // function currentBranch() { // return git('rev-parse --abbrev-ref HEAD'); // } -function generateTemplate(buildDate) { +async 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 version = await getVersion(); const productName = 'Arduino IDE'; const name = 'arduino-ide'; const updateChannel = getChannel(); @@ -139,7 +139,7 @@ function generateTemplate(buildDate) { productName, appId: 'cc.arduino.IDE2', [electronPlatform()]: { - artifactName: artifactName(), + artifactName: await artifactName(), }, }, }; diff --git a/electron/packager/index.js b/electron/packager/index.js index a078833e9..c8fae293e 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -21,8 +21,8 @@ throw reason; }); - const fs = require('fs'); - const join = require('path').join; + const fs = require('node:fs'); + const join = require('node:path').join; const shell = require('shelljs'); const { echo, cp, mkdir, mv, rm } = shell; shell.config.fatal = true; @@ -32,7 +32,7 @@ // 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( + const template = await require('./config').generateTemplate( new Date().toISOString() ); const utils = require('./utils'); @@ -74,12 +74,14 @@ // 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, - } + await Promise.all( + foldersToSyncFromDev.map((filename) => + exec('git', [ + '-C', + join(repoRoot, 'electron', 'build', filename), + 'clean', + '-ffxdq', + ]) ) ); @@ -104,15 +106,20 @@ // Build and test the extensions | //-------------------------------+ for (const extension of extensions) { - exec( - `yarn --network-timeout 1000000 --cwd ${join(repoRoot, extension)}`, + await exec( + 'yarn', + ['--network-timeout', '1000000', '--cwd', join(repoRoot, extension)], `Building and testing ${extension}` ); - exec( - `yarn --network-timeout 1000000 --cwd ${join( - repoRoot, - extension - )} test:slow`, + await exec( + 'yarn', + [ + '--network-timeout', + '1000000', + '--cwd', + join(repoRoot, extension), + 'test:slow', + ], `Executing slow tests ${extension}` ); } @@ -142,11 +149,21 @@ 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`, + await 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. @@ -250,20 +267,26 @@ ${fs //-------------------------------------------------------------------------------------------+ // 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`, + await exec( + 'yarn', + [ + '--network-timeout', + '1000000', + '--cwd', + join(repoRoot, 'electron', 'build'), + '--registry', + 'http://localhost:4873', + ], 'Installing dependencies' ); - exec( - `yarn --cwd ${join(repoRoot, 'electron', 'build')} build`, + await exec( + 'yarn', + ['--cwd', join(repoRoot, 'electron', 'build'), 'build'], `Building the ${productName} application` ); - exec( - `yarn --cwd ${join(repoRoot, 'electron', 'build')} rebuild`, + await exec( + 'yarn', + ['--cwd', join(repoRoot, 'electron', 'build'), 'rebuild'], 'Rebuilding native dependencies' ); @@ -284,8 +307,9 @@ ${fs //-----------------------------------+ // Package the electron application. | //-----------------------------------+ - exec( - `yarn --cwd ${join(repoRoot, 'electron', 'build')} package`, + await exec( + 'yarn', + ['--cwd', join(repoRoot, 'electron', 'build'), 'package'], `Packaging the ${productName} application` ); @@ -317,15 +341,19 @@ ${fs //--------+ // Utils. | //--------+ - function exec(command, toEcho) { + /** + * @param {string} command + * @param {readonly string[]} args + */ + async function exec(command, args, toEcho = '') { if (toEcho) { echo(`⏱️ >>> ${toEcho}...`); } - const { stdout } = shell.exec(command); + const stdout = await utils.exec(command, args); if (toEcho) { echo(`👌 <<< ${toEcho}.`); } - return stdout; + return stdout.trim(); } async function copyFilesToBuildArtifacts() { @@ -437,13 +465,13 @@ ${fs } /** - * @param {import('fs').PathLike} file + * @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('crypto'); + const crypto = require('node:crypto'); return new Promise((resolve, reject) => { const hash = crypto.createHash(algorithm); hash.on('error', reject).setEncoding(encoding); @@ -500,11 +528,11 @@ ${fs /** * @param {string} configPath - * @return {Promise<import('child_process').ChildProcess>} + * @return {Promise<import('node:child_process').ChildProcess>} */ function startNpmRegistry(configPath) { return new Promise((resolve, reject) => { - const fork = require('child_process').fork( + const fork = require('node:child_process').fork( require.resolve('verdaccio/bin/verdaccio'), ['-c', configPath] ); diff --git a/electron/packager/package.json b/electron/packager/package.json index 83637a3f1..e0e315eaa 100644 --- a/electron/packager/package.json +++ b/electron/packager/package.json @@ -13,13 +13,11 @@ "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", + "execa": "^7.1.1", "file-type": "^14.1.4", "glob": "^7.1.6", "is-ci": "^2.0.0", @@ -29,8 +27,7 @@ "sinon": "^9.0.1", "temp": "^0.9.1", "verdaccio": "6-next", - "yaml": "^1.10.2", - "yargs": "^12.0.5" + "yaml": "^1.10.2" }, "engines": { "node": ">=16.14.0 <17" diff --git a/electron/packager/test/utils.test.js b/electron/packager/test/utils.test.js index e8f7af805..5b6ff045b 100644 --- a/electron/packager/test/utils.test.js +++ b/electron/packager/test/utils.test.js @@ -1,5 +1,5 @@ -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const expect = require('chai').expect; const track = require('temp').track(); const unpack = require('../utils').unpack; diff --git a/electron/packager/utils.js b/electron/packager/utils.js index 9efb418b9..9e4e00ea3 100644 --- a/electron/packager/utils.js +++ b/electron/packager/utils.js @@ -125,20 +125,21 @@ const isElectronPublish = false; // TODO: support auto-updates const isNightly = process.env.IS_NIGHTLY === 'true'; const isRelease = process.env.IS_RELEASE === 'true'; -function git(command) { +/** + * @param {readonly string[]} args + */ +async function git(args) { try { - const gitPath = shell.which('git'); + const git = 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()); + if (!git) { + throw new Error("Could not find 'git' on the $PATH"); } - return stdout.toString().trim(); + const stdout = await exec(git.toString(), args); + return stdout; } catch (e) { throw e; } @@ -168,6 +169,20 @@ function getChannelFile(platform) { ); } +/** + * @param {string} command + * @param {readonly string[]} args + */ +async function exec(command, args) { + const execa = await import('execa'); + const promise = execa.execa(command, args); + if (promise.pipeStdout) { + promise.pipeStdout(process.stdout); + } + const { stdout } = await promise; + return stdout; +} + module.exports = { adjustArchiveStructure, isZip, @@ -177,4 +192,5 @@ module.exports = { isElectronPublish, git, getChannelFile, + exec, }; diff --git a/electron/packager/yarn.lock b/electron/packager/yarn.lock index 88a76837a..701f58573 100644 --- a/electron/packager/yarn.lock +++ b/electron/packager/yarn.lock @@ -136,13 +136,6 @@ 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" @@ -172,13 +165,6 @@ 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" @@ -547,11 +533,6 @@ 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-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" @@ -788,15 +769,6 @@ clipanion@3.1.0: 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" @@ -813,11 +785,6 @@ clone-response@^1.0.2: 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" @@ -908,21 +875,14 @@ cors@2.8.5: 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== +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== 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== + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" dateformat@^3.0.3: version "3.0.3" @@ -1120,18 +1080,20 @@ events@^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" +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" express-rate-limit@5.5.1: version "5.5.1" @@ -1257,7 +1219,7 @@ fastq@^1.6.0, fastq@^1.6.1: dependencies: reusify "^1.0.4" -file-type@*, file-type@^14.1.4: +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== @@ -1335,11 +1297,6 @@ function-bind@^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" @@ -1359,13 +1316,6 @@ get-intrinsic@^1.0.2: 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" @@ -1373,6 +1323,11 @@ get-stream@^5.1.0: dependencies: pump "^3.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== + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1547,6 +1502,11 @@ https-proxy-agent@5.0.1: agent-base "6" debug "4" +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== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1587,11 +1547,6 @@ interpret@^1.0.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" @@ -1631,13 +1586,6 @@ is-extglob@^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" @@ -1667,10 +1615,10 @@ is-regex@^1.0.5: 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-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-symbol@^1.0.2: version "1.0.3" @@ -1774,13 +1722,6 @@ kleur@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" @@ -1895,32 +1836,21 @@ lru-cache@^6.0.0: 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== +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.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" @@ -1961,10 +1891,10 @@ mime@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-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" @@ -2067,11 +1997,6 @@ neo-async@^2.6.0: 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" @@ -2108,17 +2033,12 @@ normalize-url@^6.0.1: 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= +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 "^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= + path-key "^4.0.0" object-assign@^4: version "4.1.1" @@ -2182,35 +2102,18 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: 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== +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: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" + mimic-fn "^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" @@ -2245,10 +2148,15 @@ path-is-absolute@^1.0.0: 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-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-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.6: version "1.0.6" @@ -2454,11 +2362,6 @@ require-from-string@^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" @@ -2558,7 +2461,7 @@ semver@7.3.8, semver@^7.3.7: dependencies: lru-cache "^6.0.0" -semver@^5.5.0, semver@^5.6.0, semver@^5.7.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== @@ -2612,17 +2515,17 @@ setprototypeof@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= +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - shebang-regex "^1.0.0" + shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@^0.8.3: version "0.8.3" @@ -2642,12 +2545,7 @@ side-channel@^1.0.4: 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: +signal-exit@^3.0.2, 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== @@ -2716,16 +2614,7 @@ steno@^0.4.1: 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: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -2758,13 +2647,6 @@ string.prototype.trimright@^2.1.1: 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" @@ -2779,10 +2661,10 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 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-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-json-comments@2.0.1: version "2.0.1" @@ -3017,13 +2899,20 @@ which-module@^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: +which@1.3.1: 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" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + 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" @@ -3036,14 +2925,6 @@ wordwrap@^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" @@ -3058,7 +2939,7 @@ wrappy@1: 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: +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== @@ -3086,14 +2967,6 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2: 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" @@ -3119,24 +2992,6 @@ yargs@13.3.2, yargs@^13.3.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" From 278dd4ba875b686664d05208c28ea5255046b760 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 10 May 2023 14:06:15 +0200 Subject: [PATCH 197/384] fix: show notification if lib/core install failed Closes #621 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../filterable-list-container.tsx | 28 ++++++++++++++---- .../src/common/protocol/installable.ts | 29 ++++++++++++++++++- .../src/node/boards-service-impl.ts | 3 +- .../src/node/library-service-impl.ts | 17 +++++++---- i18n/en.json | 4 +++ 5 files changed, 69 insertions(+), 12 deletions(-) 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 bf7eec3cf..ae90068a7 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 @@ -6,13 +6,20 @@ 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 { 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,24 @@ export class FilterableListContainer< } private async install(item: T, version: Installable.Version): Promise<void> { - 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) { + 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/common/protocol/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index 2b05cf819..a7c70f891 100644 --- a/arduino-ide-extension/src/common/protocol/installable.ts +++ b/arduino-ide-extension/src/common/protocol/installable.ts @@ -1,4 +1,5 @@ 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, @@ -9,6 +10,32 @@ import type { ArduinoComponent } from './arduino-component'; import { ExecuteWithProgress } from './progressible'; import type { ResponseServiceClient } from './response-service'; +export function libraryInstallFailed( + name: string, + version?: string | undefined +): string { + const versionSuffix = version ? `:${version}` : ''; + return nls.localize( + 'arduino/installable/libraryInstallFailed', + "Failed to install library: '{0}{1}'.", + name, + versionSuffix + ); +} + +export function platformInstallFailed( + name: string, + version?: string | undefined +): string { + const versionSuffix = version ? `:${version}` : ''; + return nls.localize( + 'arduino/installable/platformInstallFailed', + "Failed to install platform: '{0}{1}'.", + name, + versionSuffix + ); +} + export interface Installable<T extends ArduinoComponent> { /** * If `options.version` is specified, that will be installed. Otherwise, `item.availableVersions[0]`. @@ -62,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/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index b336d04c4..e04aa909f 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -18,6 +18,7 @@ import { BoardSearch, sortComponents, SortGroup, + platformInstallFailed, } from '../common/protocol'; import { PlatformInstallRequest, @@ -474,7 +475,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`, diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index e31020995..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 @@ -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`, diff --git a/i18n/en.json b/i18n/en.json index d58f478f6..ecd94c757 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -278,6 +278,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", From 117b2a4fc782d002294805af6ce4b3b61e81ae3d Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 9 May 2023 12:06:56 +0200 Subject: [PATCH 198/384] fix: do not enqueue write operations on conflict Closes #2051 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/theia/filesystem/file-resource.ts | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts index c4ef43539..9812aa1da 100644 --- a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts +++ b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts @@ -1,3 +1,4 @@ +import { ResourceSaveOptions } from '@theia/core/lib/common/resource'; import URI from '@theia/core/lib/common/uri'; import { injectable } from '@theia/core/shared/inversify'; import { @@ -7,6 +8,7 @@ import { } from '@theia/filesystem/lib/browser/file-resource'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { + ETAG_DISABLED, FileOperationError, FileOperationResult, } from '@theia/filesystem/lib/common/files'; @@ -51,8 +53,16 @@ class WriteQueuedFileResource extends FileResource { ) { super(uri, fileService, options); const originalDoWrite = this['doWrite']; - this['doWrite'] = (content, options) => - this.writeQueue.add(() => originalDoWrite.bind(this)(content, options)); + this['doWrite'] = (content, options) => { + if (isETagDisabledResourceSaveOptions(options)) { + // When force overriding without auto-save do not enqueue the modification, it's already enqueued and the conflict is just being resolved. + // https://github.com/arduino/arduino-ide/issues/2051 + return originalDoWrite.bind(this)(content, options); + } + return this.writeQueue.add(() => + originalDoWrite.bind(this)(content, options) + ); + }; const originalSaveStream = this['saveStream']; if (originalSaveStream) { this['saveStream'] = (content, options) => @@ -83,3 +93,24 @@ class WriteQueuedFileResource extends FileResource { return super.isInSync(); } } + +// Theia incorrectly sets the disabled ETag on the `stat` instead of the `version` so `FileResourceVersion#is` is unusable. +// https://github.com/eclipse-theia/theia/blob/f9063625b861b8433341fcd1a29a0d0298778f4c/packages/filesystem/src/browser/file-resource.ts#L210 +// https://github.com/eclipse-theia/theia/blob/f9063625b861b8433341fcd1a29a0d0298778f4c/packages/filesystem/src/browser/file-resource.ts#L34 +// https://github.com/eclipse-theia/theia/discussions/12502 +function isETagDisabledResourceSaveOptions( + options?: ResourceSaveOptions +): boolean { + if (typeof options === 'object') { + if ('version' in options && typeof options['version'] === 'object') { + const version = <Record<string, unknown>>options['version']; + if (version && 'stat' in version && typeof version['stat'] === 'object') { + const stat = <Record<string, unknown>>version['stat']; + if (stat) { + return 'etag' in stat && stat['etag'] === ETAG_DISABLED; + } + } + } + } + return false; +} From 31deeebb4970b4de9925161c291084d8d5f8273d Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 11 May 2023 10:38:27 +0200 Subject: [PATCH 199/384] test: use raw `core index-update` for the tests It should make integration tests more resilient on the Windows CI. From now on, tests are not starting a daemon to initialize the `directories.data` folder for the test suites but rely on the raw command. It is required to avoid spawning the discovery processes, which cannot be terminated on Windows while the daemon is up and running. Closes #2059 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../node/core-client-provider.slow-test.ts | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) 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 index e2e7d067d..8ce8670be 100644 --- 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 @@ -1,5 +1,4 @@ import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { waitForEvent } from '@theia/core/lib/common/promise-util'; 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'; @@ -16,6 +15,7 @@ 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 { @@ -177,10 +177,9 @@ describe('core-client-provider', () => { boardsPackages.filter(({ id }) => id === 'teensy:avr').length ).to.be.equal(1); }; - const configDirPath = await prepareTestConfigDir( - { board_manager: { additional_urls: additionalUrls } }, - ({ boardsService }) => assertTeensyAvailable(boardsService) - ); + const configDirPath = await prepareTestConfigDir({ + board_manager: { additional_urls: additionalUrls }, + }); const thirdPartyPackageIndexPath = join( configDirPath, 'data', @@ -273,27 +272,31 @@ async function assertFunctionalCli( * the config folder. */ async function prepareTestConfigDir( - configOverrides: Partial<DefaultCliConfig> = {}, - otherExpect?: (services: Services) => MaybePromise<void> + configOverrides: Partial<DefaultCliConfig> = {} ): Promise<string> { - const toDispose = new DisposableCollection(); const params = { configDirPath: newTempConfigDirPath(), configOverrides }; const container = await createContainer(params); - try { - await start(container, toDispose); - await assertFunctionalCli(container, otherExpect); - const configDirUriProvider = - container.get<ConfigDirUriProvider>(ConfigDirUriProvider); - return FileUri.fsPath(configDirUriProvider.configDirUri()); - } finally { - const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); - // Wait for the daemon stop event. All subprocesses (such as `serial-discovery` and `mdns-discovery`) must terminate. - // Otherwise, `EPERM: operation not permitted, unlink` is thrown on Windows when "corrupting" the `directories.data` folder for the tests. - await Promise.all([ - waitForEvent(daemon.onDaemonStopped, 5_000), - Promise.resolve(toDispose.dispose()), - ]); - } + const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); + const cliPath = await daemon.getExecPath(); + const configDirUriProvider = + container.get<ConfigDirUriProvider>(ConfigDirUriProvider); + const configDirPath = FileUri.fsPath(configDirUriProvider.configDirUri()); + await coreUpdateIndex(cliPath, configDirPath); + return configDirPath; +} + +async function coreUpdateIndex( + cliPath: string, + configDirPath: string +): Promise<void> { + const cliConfigPath = join(configDirPath, 'arduino-cli.yaml'); + await fs.access(cliConfigPath); + const stdout = await spawnCommand( + cliPath, + ['core', 'update-index', '--config-file', cliConfigPath], + (error) => console.error(error) + ); + console.log(stdout); } async function startCli( @@ -312,15 +315,8 @@ async function startCli( throw err; } const container = await createContainer(configDirPath); - await start(container, toDispose); - return container; -} - -async function start( - container: Container, - toDispose: DisposableCollection -): Promise<void> { await startDaemon(container, toDispose); + return container; } async function createContainer( From ee43a12eb7cc03a4604bf11dfd74f1142b0c2312 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 11 May 2023 15:29:06 +0200 Subject: [PATCH 200/384] fix: show no errors if users cancel lib install Throwing and catching a `UserAbortError` is part of the natural flow. Closes #2063 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../widgets/component-list/filterable-list-container.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 ae90068a7..7732568c8 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 @@ -13,7 +13,7 @@ import { } 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 { @@ -148,6 +148,11 @@ export class FilterableListContainer< 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); From e47fb2e65164bdee14e01f709c535375e4f532bb Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 11 May 2023 14:55:46 +0200 Subject: [PATCH 201/384] fix: remove setting unsafe `innerHTML` As it is vulnerable to stored Cross-Site Scripting. Ref: PNX-3669 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/library/library-list-widget.ts | 20 ++++++- .../src/browser/utils/dom.ts | 32 ++++++++++++ .../src/test/browser/dom.test.ts | 52 +++++++++++++++++++ 3 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 arduino-ide-extension/src/test/browser/dom.test.ts diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 25480de95..690799923 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -20,7 +20,7 @@ import { Installable } from '../../common/protocol'; import { ListItemRenderer } from '../widgets/component-list/list-item-renderer'; import { nls } from '@theia/core/lib/common'; import { LibraryFilterRenderer } from '../widgets/component-list/filter-renderer'; -import { findChildTheiaButton } from '../utils/dom'; +import { findChildTheiaButton, splitByBoldTag } from '../utils/dom'; @injectable() export class LibraryListWidget extends ListWidget< @@ -81,7 +81,7 @@ export class LibraryListWidget extends ListWidget< let installDependencies: boolean | undefined = undefined; if (dependencies.length) { const message = document.createElement('div'); - message.innerHTML = + const textContent = dependencies.length === 1 ? nls.localize( 'arduino/library/needsOneDependency', @@ -95,6 +95,22 @@ export class LibraryListWidget extends ListWidget< item.name, version ); + const segments = splitByBoldTag(textContent); + if (!segments) { + message.textContent = textContent; + } else { + segments.map((segment) => { + const span = document.createElement('span'); + if (typeof segment === 'string') { + span.textContent = segment; + } else { + const bold = document.createElement('b'); + bold.textContent = segment.textContent; + span.appendChild(bold); + } + message.appendChild(span); + }); + } const listContainer = document.createElement('div'); listContainer.style.maxHeight = '300px'; listContainer.style.overflowY = 'auto'; diff --git a/arduino-ide-extension/src/browser/utils/dom.ts b/arduino-ide-extension/src/browser/utils/dom.ts index 938b496ab..47cc830e6 100644 --- a/arduino-ide-extension/src/browser/utils/dom.ts +++ b/arduino-ide-extension/src/browser/utils/dom.ts @@ -35,3 +35,35 @@ export function findChildTheiaButton( function isHTMLElement(element: Element): element is HTMLElement { return element instanceof HTMLElement; } + +type Segment = string | { textContent: string; bold: true }; +/** + * Returns with an array of `Segments` by splitting raw HTML text on the `<b></b>` groups. If splitting is not possible, returns `undefined`. + * Example: `one<b>two</b>three<b>four</b>five` will provide an five element length array. Where the 1<sup>st</sup> and 3<sup>rd</sup> elements are objects and the rest are string. + */ +export function splitByBoldTag(text: string): Segment[] | undefined { + const matches = text.matchAll(new RegExp(/<\s*b[^>]*>(.*?)<\s*\/\s*b>/gm)); + if (!matches) { + return undefined; + } + const segments: Segment[] = []; + const textLength = text.length; + let processedLength = 0; + for (const match of matches) { + const { index } = match; + if (typeof index === 'number') { + if (!segments.length && index) { + segments.push(text.substring(0, index)); + } + if (processedLength > 0) { + segments.push(text.substring(processedLength, index)); + } + segments.push({ textContent: match[1], bold: true }); + processedLength = index + match[0].length; + } + } + if (segments.length && textLength > processedLength) { + segments.push(text.substring(processedLength)); + } + return segments.length ? segments : undefined; +} diff --git a/arduino-ide-extension/src/test/browser/dom.test.ts b/arduino-ide-extension/src/test/browser/dom.test.ts new file mode 100644 index 000000000..5106024cc --- /dev/null +++ b/arduino-ide-extension/src/test/browser/dom.test.ts @@ -0,0 +1,52 @@ +import { splitByBoldTag } from '../../browser/utils/dom'; +import { expect } from 'chai'; + +describe('dom', () => { + describe('splitByBoldTag', () => { + it('should split by bold tags', () => { + const actual = splitByBoldTag('one<b>matchOne</b>two'); + const expected = ['one', { textContent: 'matchOne', bold: true }, 'two']; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle starting bold tags', () => { + const actual = splitByBoldTag( + '<b>matchOne</b>one<b>matchTwo</b> two <b>matchThree</b> three' + ); + const expected = [ + { textContent: 'matchOne', bold: true }, + 'one', + { textContent: 'matchTwo', bold: true }, + ' two ', + { textContent: 'matchThree', bold: true }, + ' three', + ]; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle unclosed bold tags', () => { + const actual = splitByBoldTag( + '<b>matchOne</b>one<b>matchTwo</b> two <b>matchThree</b> three <b> ' + ); + const expected = [ + { textContent: 'matchOne', bold: true }, + 'one', + { textContent: 'matchTwo', bold: true }, + ' two ', + { textContent: 'matchThree', bold: true }, + ' three <b> ', + ]; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle no matches', () => { + const actual = splitByBoldTag('<b>alma'); + expect(actual).to.be.undefined; + }); + + it('should handle empty strings', () => { + const actual = splitByBoldTag(''); + expect(actual).to.be.undefined; + }); + }); +}); From 9d2297c68422a341fda50ed101b2e6f03f4b5608 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 11 May 2023 17:31:34 +0200 Subject: [PATCH 202/384] fix: removed unsafe `shell` when executing process Ref: PNX-3671 Co-authored-by: per1234 <accounts@perglass.com> Co-authored-by: Akos Kitta <a.kitta@arduino.cc> Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 5 +- .../src/common/protocol/executable-service.ts | 1 - .../src/node/arduino-daemon-impl.ts | 19 +- .../node/arduino-firmware-uploader-impl.ts | 51 ++--- .../src/node/clang-formatter.ts | 58 ++---- .../src/node/config-service-impl.ts | 13 +- arduino-ide-extension/src/node/exec-util.ts | 58 ++---- .../src/node/executable-service-impl.ts | 26 +-- .../src/test/node/arduino-daemon-impl.test.ts | 12 +- .../src/test/node/clang-formatter.test.ts | 162 +++++++++++++++ .../src/test/node/exec-util.test.ts | 187 +++++++++++++++--- yarn.lock | 16 +- 12 files changed, 388 insertions(+), 220 deletions(-) create mode 100644 arduino-ide-extension/src/test/node/clang-formatter.test.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 2d78a1225..ee4075b66 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -104,17 +104,14 @@ "temp": "^0.9.1", "temp-dir": "^2.0.0", "tree-kill": "^1.2.1", - "util": "^0.12.5", - "which": "^1.3.1" + "util": "^0.12.5" }, "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", "chai": "^4.2.0", - "chai-string": "^1.5.0", "decompress": "^4.2.0", "decompress-tarbz2": "^4.1.1", "decompress-targz": "^4.1.1", 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/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 55d3ec96d..0e48f3c60 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -44,7 +44,6 @@ export class ArduinoDaemonImpl private _running = false; private _port = new Deferred<string>(); - private _execPath: string | undefined; // Backend application lifecycle. @@ -68,7 +67,7 @@ export class ArduinoDaemonImpl async start(): Promise<string> { 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. @@ -132,12 +131,8 @@ export class ArduinoDaemonImpl return this.onDaemonStoppedEmitter.event; } - async getExecPath(): Promise<string> { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('arduino-cli', this.onError.bind(this)); - return this._execPath; + getExecPath(): string { + return getExecPath('arduino-cli'); } protected async getSpawnArgs(): Promise<string[]> { @@ -151,7 +146,7 @@ export class ArduinoDaemonImpl '--port', '0', '--config-file', - `"${cliConfigPath}"`, + cliConfigPath, '-v', ]; if (debug) { @@ -173,10 +168,8 @@ 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); 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..c8c4b3578 100644 --- a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts +++ b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts @@ -1,45 +1,22 @@ +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, } 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 { MonitorManager } from './monitor-manager'; @injectable() export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { - @inject(ExecutableService) - protected executableService: ExecutableService; - - protected _execPath: string | undefined; - @inject(ILogger) @named('fwuploader') - protected readonly logger: ILogger; - + private readonly logger: ILogger; @inject(MonitorManager) - protected readonly monitorManager: MonitorManager; - - protected onError(error: any): void { - this.logger.error(error); - } - - async getExecPath(): Promise<string> { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('arduino-fwuploader'); - return this._execPath; - } - - async runCommand(args: string[]): Promise<any> { - const execPath = await this.getExecPath(); - return await spawnCommand(`"${execPath}"`, args, this.onError.bind(this)); - } + private readonly monitorManager: MonitorManager; - async uploadCertificates(command: string): Promise<any> { + async uploadCertificates(command: string): Promise<string> { return await this.runCommand(['certificates', 'flash', command]); } @@ -70,14 +47,13 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { } async flash(firmware: FirmwareInfo, port: Port): Promise<string> { - let output; const board = { name: firmware.board_name, fqbn: firmware.board_fqbn, }; try { await this.monitorManager.notifyUploadStarted(board.fqbn, port); - output = await this.runCommand([ + const output = await this.runCommand([ 'firmware', 'flash', '--fqbn', @@ -87,11 +63,18 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { '--module', `${firmware.module}@${firmware.firmware_version}`, ]); - } catch (e) { - throw e; + return output; } finally { await this.monitorManager.notifyUploadFinished(board.fqbn, port); - return output; } } + + private onError(error: Error): void { + this.logger.error(error); + } + + private async runCommand(args: string[]): Promise<string> { + const execPath = getExecPath('arduino-fwuploader'); + return await spawnCommand(execPath, args, this.onError.bind(this)); + } } diff --git a/arduino-ide-extension/src/node/clang-formatter.ts b/arduino-ide-extension/src/node/clang-formatter.ts index 06f6c41d9..306ee6a63 100644 --- a/arduino-ide-extension/src/node/clang-formatter.ts +++ b/arduino-ide-extension/src/node/clang-formatter.ts @@ -1,4 +1,3 @@ -import * as os from 'node: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'; @@ -15,7 +14,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 +25,19 @@ export class ClangFormatter implements Formatter { formatterConfigFolderUris: string[]; options?: FormatterOptions; }): Promise<string> { - const [execPath, style] = await Promise.all([ - this.execPath(), - this.style(formatterConfigFolderUris, options), - ]); + const execPath = this.execPath(); + const args = await this.styleArgs(formatterConfigFolderUris, options); const formatted = await spawnCommand( - `"${execPath}"`, - [style], + execPath, + args, console.error, content ); return formatted; } - private _execPath: string | undefined; - private async execPath(): Promise<string> { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('clang-format'); - return this._execPath; + private execPath(): string { + return getExecPath('clang-format'); } /** @@ -60,10 +52,10 @@ export class ClangFormatter implements Formatter { * * See: https://github.com/arduino/arduino-ide/issues/566 */ - private async style( + private async styleArgs( formatterConfigFolderUris: string[], options?: FormatterOptions - ): Promise<string> { + ): Promise<string[]> { const clangFormatPaths = await Promise.all([ ...formatterConfigFolderUris.map((uri) => this.clangConfigPath(uri)), this.clangConfigPath(this.configDirPath()), @@ -72,11 +64,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<string | undefined> { @@ -88,7 +80,7 @@ export class ClangFormatter implements Formatter { } private async configDirPath(): Promise<string> { - const configDirUri = await this.envVariableServer.getConfigDirUri(); + const configDirUri = await this.envVariablesServer.getConfigDirUri(); return FileUri.fsPath(configDirUri); } @@ -100,7 +92,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 +107,7 @@ interface ClangFormatOptions { readonly TabWidth: number; } -const ClangFormatFile = '.clang-format'; +export const clangFormatFilename = '.clang-format'; function toClangOptions( options?: FormatterOptions | undefined @@ -129,24 +121,8 @@ 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({ diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index 78b7d0cd3..cb3559688 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -222,8 +222,8 @@ export class ConfigServiceImpl } private async getFallbackCliConfig(): Promise<DefaultCliConfig> { - 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 +233,8 @@ export class ConfigServiceImpl } private async initCliConfigTo(fsPathToDir: string): Promise<void> { - 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/exec-util.ts b/arduino-ide-extension/src/node/exec-util.ts index 984eff038..f40f6d737 100644 --- a/arduino-ide-extension/src/node/exec-util.ts +++ b/arduino-ide-extension/src/node/exec-util.ts @@ -1,51 +1,17 @@ +import { spawn } from 'node:child_process'; import os from 'node:os'; -import which from 'which'; -import semver from 'semver'; import { join } from 'node:path'; -import { spawn } from 'node:child_process'; -export async function getExecPath( - commandName: string, - onError: (error: Error) => void = (error) => console.log(error), - versionArg?: string | undefined, - inBinDir?: boolean -): Promise<string> { - const execName = `${commandName}${os.platform() === 'win32' ? '.exe' : ''}`; - const relativePath = ['..', '..', 'build']; - if (inBinDir) { - relativePath.push('bin'); - } - const buildCommand = join(__dirname, ...relativePath, execName); - if (!versionArg) { - return buildCommand; - } - const versionRegexp = /\d+\.\d+\.\d+/; - const buildVersion = await spawnCommand( - `"${buildCommand}"`, - [versionArg], - onError - ); - const buildShortVersion = (buildVersion.match(versionRegexp) || [])[0]; - const pathCommand = await new Promise<string | undefined>((resolve) => - which(execName, (error, path) => resolve(error ? undefined : path)) - ); - if (!pathCommand) { - return buildCommand; - } - const pathVersion = await spawnCommand( - `"${pathCommand}"`, - [versionArg], - onError - ); - const pathShortVersion = (pathVersion.match(versionRegexp) || [])[0]; - if ( - pathShortVersion && - buildShortVersion && - semver.gt(pathShortVersion, buildShortVersion) - ) { - return pathCommand; - } - return buildCommand; +export type ArduinoBinaryName = + | 'arduino-cli' + | 'arduino-fwuploader' + | 'arduino-language-server'; +export type ClangBinaryName = 'clangd' | 'clang-format'; +export type BinaryName = ArduinoBinaryName | ClangBinaryName; + +export function getExecPath(binaryName: BinaryName): string { + const filename = `${binaryName}${os.platform() === 'win32' ? '.exe' : ''}`; + return join(__dirname, '..', '..', 'build', filename); } export function spawnCommand( @@ -55,7 +21,7 @@ export function spawnCommand( stdIn?: string ): Promise<string> { return new Promise<string>((resolve, reject) => { - const cp = spawn(command, args, { windowsHide: true, shell: true }); + const cp = spawn(command, args, { windowsHide: true }); const outBuffers: Buffer[] = []; const errBuffers: Buffer[] = []; cp.stdout.on('data', (b: Buffer) => outBuffers.push(b)); diff --git a/arduino-ide-extension/src/node/executable-service-impl.ts b/arduino-ide-extension/src/node/executable-service-impl.ts index f731387d8..a22609e2b 100644 --- a/arduino-ide-extension/src/node/executable-service-impl.ts +++ b/arduino-ide-extension/src/node/executable-service-impl.ts @@ -1,35 +1,19 @@ -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 { getExecPath } from './exec-util'; @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(getExecPath('clangd')).toString(), + cliUri: FileUri.create(getExecPath('arduino-cli')).toString(), + lsUri: FileUri.create(getExecPath('arduino-language-server')).toString(), }; } - - protected onError(error: Error): void { - this.logger.error(error); - } } 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 26f12e3f3..9a5d3f875 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 @@ -43,19 +43,13 @@ class SilentArduinoDaemonImpl extends ArduinoDaemonImpl { } private async initCliConfig(): Promise<string> { - const cliPath = await this.getExecPath(); + const cliPath = this.getExecPath(); const destDir = track.mkdirSync(); - await spawnCommand(`"${cliPath}"`, [ - 'config', - 'init', - '--dest-dir', - destDir, - ]); + await spawnCommand(cliPath, ['config', 'init', '--dest-dir', destDir]); const content = fs.readFileSync(path.join(destDir, CLI_CONFIG), { encoding: 'utf8', }); - const cliConfig = safeLoad(content) as any; - // cliConfig.daemon.port = String(this.port); + const cliConfig = safeLoad(content); const modifiedContent = safeDump(cliConfig); fs.writeFileSync(path.join(destDir, CLI_CONFIG), modifiedContent, { encoding: 'utf8', diff --git a/arduino-ide-extension/src/test/node/clang-formatter.test.ts b/arduino-ide-extension/src/test/node/clang-formatter.test.ts new file mode 100644 index 000000000..b8814a48d --- /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 './test-bindings'; + +const unformattedContent = `void setup ( ) { pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + digitalWrite( LED_BUILTIN , HIGH ); + delay( 1000 ) ; + digitalWrite( LED_BUILTIN , LOW); +delay ( 1000 ) ; + } +`; +const formattedContent = `void setup() { + pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); +} +`; + +type ClangStyleValue = + | string + | number + | boolean + | ClangStyleValue[] + | { [key: string]: ClangStyleValue }; +type ClangConfiguration = Record<string, ClangStyleValue>; + +export interface ClangStyle { + readonly key: string; + readonly value: ClangStyleValue; +} + +const singleClangStyles: ClangStyle[] = [ + { + key: 'SpacesBeforeTrailingComments', + value: 0, + }, + { + key: 'SortIncludes', + value: 'Never', + }, + { + key: 'AlignTrailingComments', + value: true, + }, + { + key: 'IfMacros', + value: ['KJ_IF_MAYBE'], + }, + { + key: 'SpacesInLineCommentPrefix', + value: { + Minimum: 0, + Maximum: -1, + }, + }, +]; + +async function expectNoChanges( + formatter: ClangFormatter, + styleArg: string +): Promise<void> { + const minimalContent = ` +void setup() {} +void loop() {} +`.trim(); + const execPath = formatter['execPath'](); + const actual = await spawnCommand( + execPath, + ['-style', styleArg], + console.error, + minimalContent + ); + expect(actual).to.be.equal(minimalContent); +} + +describe('clang-formatter', () => { + let tracked: typeof temp; + let formatter: ClangFormatter; + let toDispose: DisposableCollection; + + before(async () => { + tracked = temp.track(); + toDispose = new DisposableCollection( + Disposable.create(() => tracked.cleanupSync()) + ); + const container = await createBaseContainer({ + additionalBindings: (bind) => + bind(ClangFormatter).toSelf().inSingletonScope(), + }); + await startDaemon(container, toDispose); + formatter = container.get<ClangFormatter>(ClangFormatter); + }); + + after(() => toDispose.dispose()); + + singleClangStyles + .map((style) => ({ + ...style, + styleArg: JSON.stringify({ [style.key]: style.value }), + })) + .map(({ value, styleArg }) => + it(`should execute the formatter with a single ${ + Array.isArray(value) ? 'array' : typeof value + } type style configuration value: ${styleArg}`, async () => { + await expectNoChanges(formatter, styleArg); + }) + ); + + it('should execute the formatter with a multiple clang formatter styles', async () => { + const styleArg = JSON.stringify( + singleClangStyles.reduce((config, curr) => { + config[curr.key] = curr.value; + return config; + }, {} as ClangConfiguration) + ); + await expectNoChanges(formatter, styleArg); + }); + + it('should format with the default styles', async () => { + const actual = await formatter.format({ + content: unformattedContent, + formatterConfigFolderUris: [], + }); + expect(actual).to.be.equal(formattedContent); + }); + + it('should format with custom formatter configuration file', async () => { + const tempPath = tracked.mkdirSync(); + await fs.writeFile( + path.join(tempPath, clangFormatFilename), + 'SpaceInEmptyParentheses: true', + { + encoding: 'utf8', + } + ); + const actual = await formatter.format({ + content: 'void foo() {}', + formatterConfigFolderUris: [FileUri.create(tempPath).toString()], + }); + expect(actual).to.be.equal('void foo( ) {}'); + }); +}); diff --git a/arduino-ide-extension/src/test/node/exec-util.test.ts b/arduino-ide-extension/src/test/node/exec-util.test.ts index 24d947dbf..d10c56fc3 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,164 @@ -import * as os from 'node: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 { + ArduinoBinaryName, + BinaryName, + ClangBinaryName, + getExecPath, + spawnCommand, +} from '../../node/exec-util'; +import temp from 'temp'; - 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 = getExecPath('arduino-cli'); + 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 name: BinaryName; + 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 binaryNameToVersionMapping: Record<BinaryName, string> = { + 'arduino-cli': 'cli', + 'arduino-language-server': 'languageServer', + 'arduino-fwuploader': 'fwuploader', + clangd: 'clangd', + 'clang-format': 'clangd', + }; + + function readVersionFromPackageJson(name: BinaryName): 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 mappedName = binaryNameToVersionMapping[name]; + expect(mappedName).to.be.not.undefined; + const version = json.arduino[mappedName].version; + expect(version).to.be.not.undefined; + return version; + } + + function createTaskAssert(name: ArduinoBinaryName): 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: ClangBinaryName): 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[] = [ + { + name: 'arduino-cli', + flags: ['version'], + assertOutput: createTaskAssert('arduino-cli'), + }, + { + name: 'arduino-fwuploader', + flags: ['version'], + assertOutput: createTaskAssert('arduino-fwuploader'), + }, + { + name: 'arduino-language-server', + assertOutput: (stderr: string) => { + expect(stderr.includes('Path to ArduinoCLI config file must be set.')) + .to.be.true; + }, + expectNonZeroExit: true, + }, + { + name: 'clangd', + flags: ['--version'], + assertOutput: createClangdAssert('clangd'), + }, + { + name: '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(binaryNameToVersionMapping).length + ); + }); + + suites.map((suite) => + it(`should resolve '${suite.name}'`, async () => { + const execPath = getExecPath(suite.name); + expect(execPath).to.be.not.undefined; + expect(execPath).to.be.not.empty; + expect(fs.accessSync(execPath, fs.constants.X_OK)).to.be.undefined; + if (suite.expectNonZeroExit) { + try { + await spawnCommand(execPath, suite.flags ?? []); + assert.fail('Expected a non-zero exit code'); + } catch (err) { + expect(err).to.be.an.instanceOf(Error); + const stderr = (<Error>err).message; + expect(stderr).to.be.not.undefined; + expect(stderr).to.be.not.empty; + suite.assertOutput(stderr); + } + } else { + const stdout = await spawnCommand(execPath, suite.flags ?? []); + suite.assertOutput(stdout); + } + }) + ); + }); }); diff --git a/yarn.lock b/yarn.lock index 58a12fc91..e5a69a4c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2741,14 +2741,7 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/chai-string@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/chai-string/-/chai-string-1.4.2.tgz#0f116504a666b6c6a3c42becf86634316c9a19ac" - integrity sha512-ld/1hV5qcPRGuwlPdvRfvM3Ka/iofOk2pH4VkasK4b1JJP1LjNmWWn0LsISf6RRzyhVOvs93rb9tM09e+UuF8Q== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.2.7": +"@types/chai@^4.2.7": version "4.3.4" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== @@ -4814,11 +4807,6 @@ caw@^2.0.1: 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.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -15188,7 +15176,7 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@1.3.1, which@^1.2.9, which@^1.3.1: +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== From 0fbd1fbe85fbbd864ad5e6a00850b32cbd2e83e0 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 31 May 2023 13:50:19 +0200 Subject: [PATCH 203/384] chore(cli): Bumped the CLI version to `0.33.0` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 10 +++ .../cc/arduino/cli/commands/v1/board_pb.js | 85 ++++++++++++++++++- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 8 ++ .../cc/arduino/cli/commands/v1/common_pb.js | 62 +++++++++++++- .../arduino/cli/commands/v1/compile_pb.d.ts | 4 + .../cc/arduino/cli/commands/v1/compile_pb.js | 32 ++++++- .../cc/arduino/cli/commands/v1/core_pb.d.ts | 7 ++ .../cc/arduino/cli/commands/v1/core_pb.js | 53 +++++++++++- 9 files changed, 256 insertions(+), 7 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index ee4075b66..bb1963ee6 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -170,7 +170,7 @@ ], "arduino": { "cli": { - "version": "0.32.2" + "version": "0.33.0" }, "fwuploader": { "version": "2.2.2" 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..76e70da5f 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 @@ -18,6 +18,9 @@ export class BoardDetailsRequest extends jspb.Message { getFqbn(): string; setFqbn(value: string): BoardDetailsRequest; + getDoNotExpandBuildProperties(): boolean; + setDoNotExpandBuildProperties(value: boolean): BoardDetailsRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsRequest.AsObject; @@ -33,6 +36,7 @@ export namespace BoardDetailsRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, fqbn: string, + doNotExpandBuildProperties: boolean, } } @@ -93,6 +97,11 @@ export class BoardDetailsResponse extends jspb.Message { setIdentificationPropertiesList(value: Array<BoardIdentificationProperties>): BoardDetailsResponse; addIdentificationProperties(value?: BoardIdentificationProperties, index?: number): BoardIdentificationProperties; + clearBuildPropertiesList(): void; + getBuildPropertiesList(): Array<string>; + setBuildPropertiesList(value: Array<string>): BoardDetailsResponse; + addBuildProperties(value: string, index?: number): string; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; @@ -120,6 +129,7 @@ export namespace BoardDetailsResponse { programmersList: Array<cc_arduino_cli_commands_v1_common_pb.Programmer.AsObject>, debuggingSupported: boolean, identificationPropertiesList: Array<BoardIdentificationProperties.AsObject>, + buildPropertiesList: Array<string>, } } 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 89236154d..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 @@ -498,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) { @@ -544,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; @@ -588,6 +593,13 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.serializeBinaryToWriter = f f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; @@ -646,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<number>} * @const */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15]; +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15,16]; @@ -702,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) { @@ -801,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; @@ -934,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 + ); + } }; @@ -1307,6 +1349,43 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearIdentificat }; +/** + * repeated string build_properties = 16; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getBuildPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 16)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setBuildPropertiesList = function(value) { + return jspb.Message.setField(this, 16, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.addBuildProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 16, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearBuildPropertiesList = function() { + return this.setBuildPropertiesList([]); +}; + + 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..98d9117fe 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 @@ -260,6 +260,12 @@ export class Platform extends jspb.Message { 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,6 +291,8 @@ export namespace Platform { deprecated: boolean, typeList: Array<string>, help?: HelpResources.AsObject, + indexed: boolean, + missingMetadata: boolean, } } 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 dfbc4f507..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 @@ -1637,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) { @@ -1724,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; @@ -1839,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 + ); + } }; @@ -2116,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..a4633d90d 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 @@ -95,6 +95,9 @@ export class CompileRequest extends jspb.Message { getSkipLibrariesDiscovery(): boolean; setSkipLibrariesDiscovery(value: boolean): CompileRequest; + getDoNotExpandBuildProperties(): boolean; + setDoNotExpandBuildProperties(value: boolean): CompileRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -133,6 +136,7 @@ export namespace CompileRequest { signKey: string, encryptKey: string, skipLibrariesDiscovery: boolean, + doNotExpandBuildProperties: boolean, } } 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 64ef4f711..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 @@ -155,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) { @@ -292,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; @@ -488,6 +493,13 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 29, + f + ); + } }; @@ -1022,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..a4d62a8f7 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 @@ -282,6 +282,12 @@ export class PlatformUpgradeResponse extends jspb.Message { 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; static toObject(includeInstance: boolean, msg: PlatformUpgradeResponse): PlatformUpgradeResponse.AsObject; @@ -296,6 +302,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, } } 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 f9c7e24b6..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 @@ -2064,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) { @@ -2111,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; @@ -2156,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 + ); + } }; @@ -2233,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; +}; + + From db0049d6356aa2fbf9e69584a27e758afce39e27 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 6 Jun 2023 13:42:19 +0200 Subject: [PATCH 204/384] fix: omit port from upload request when not set Previously, if the `port` was not set in IDE2, the compile request object has been created with an empty port object (`{}`). From now on, if the port is not specified, IDE2 will create a compile request with the default `null` `port` value. Closes #2089 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/core-service-impl.ts | 24 ++++++----- .../src/test/node/core-service-impl.test.ts | 41 +++++++++++++++++++ 2 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 arduino-ide-extension/src/test/node/core-service-impl.test.ts diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 5ab4506fa..e5e3d05ac 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -411,17 +411,21 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { } } - private createPort(port: Port | undefined): RpcPort { + private createPort(port: Port | undefined): RpcPort | undefined { + if (!port) { + return undefined; + } 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.getPropertiesMap().set(key, value); - } + rpcPort.setAddress(port.address); + rpcPort.setLabel(port.addressLabel); + rpcPort.setProtocol(port.protocol); + rpcPort.setProtocolLabel(port.protocolLabel); + if (port.hardwareId !== undefined) { + rpcPort.setHardwareId(port.hardwareId); + } + if (port.properties) { + for (const [key, value] of Object.entries(port.properties)) { + rpcPort.getPropertiesMap().set(key, value); } } return rpcPort; 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..abba88357 --- /dev/null +++ b/arduino-ide-extension/src/test/node/core-service-impl.test.ts @@ -0,0 +1,41 @@ +import { expect } from 'chai'; +import { Port } 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 actual = new CoreServiceImpl()['createPort'](port); + expect(actual).to.be.not.undefined; + const expected = new Port() + .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((<Port>actual).toObject(false)).to.be.deep.equal( + expected.toObject(false) + ); + }); + }); +}); From 4af488b05e7def531e3e29e2cad323ab8010e782 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 30 May 2023 10:59:23 +0200 Subject: [PATCH 205/384] fix: relaxed `saveAll` if no Internet connection The previous logic has incorrectly bailed the save when there is no Internet connection. The corrected logic disallows saving files if there is no connection between the frontend and the backend. Ref: cff2c956845e04d320231e8a924d1a47ad016af7 Closes #2079 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/theia/core/application-shell.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/arduino-ide-extension/src/browser/theia/core/application-shell.ts b/arduino-ide-extension/src/browser/theia/core/application-shell.ts index 9f0ac6b74..379fb0ff5 100644 --- a/arduino-ide-extension/src/browser/theia/core/application-shell.ts +++ b/arduino-ide-extension/src/browser/theia/core/application-shell.ts @@ -8,13 +8,10 @@ import { TabBar, Widget, } from '@theia/core/lib/browser'; -import { - ConnectionStatus, - ConnectionStatusService, -} from '@theia/core/lib/browser/connection-status-service'; import { nls } from '@theia/core/lib/common/nls'; import { MessageService } from '@theia/core/lib/common/message-service'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { ApplicationConnectionStatusContribution } from './connection-status-service'; import { ToolbarAwareTabBar } from './tab-bars'; @injectable() @@ -22,8 +19,8 @@ export class ApplicationShell extends TheiaApplicationShell { @inject(MessageService) private readonly messageService: MessageService; - @inject(ConnectionStatusService) - private readonly connectionStatusService: ConnectionStatusService; + @inject(ApplicationConnectionStatusContribution) + private readonly connectionStatusService: ApplicationConnectionStatusContribution; override async addWidget( widget: Widget, @@ -64,9 +61,8 @@ export class ApplicationShell extends TheiaApplicationShell { } override async saveAll(options?: SaveOptions): Promise<void> { - if ( - this.connectionStatusService.currentStatus === ConnectionStatus.OFFLINE - ) { + // When there is no connection between the IDE2 frontend and backend. + if (this.connectionStatusService.offlineStatus === 'backend') { this.messageService.error( nls.localize( 'theia/core/couldNotSave', From d1fa6d4f3b81118f31c38f2102044b1b7963078f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 20:01:25 +0000 Subject: [PATCH 206/384] build(deps): Bump svenstaro/upload-release-action from 2.5.0 to 2.6.1 Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.5.0 to 2.6.1. - [Release notes](https://github.com/svenstaro/upload-release-action/releases) - [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenstaro/upload-release-action/compare/2.5.0...2.6.1) --- updated-dependencies: - dependency-name: svenstaro/upload-release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6933c39d..28e07c632 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -236,7 +236,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.6.1 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} From 8f8b46fa6fa051777a83c842964de49bf81f6196 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 30 May 2023 15:03:31 +0200 Subject: [PATCH 207/384] fix: warn user when IDE cannot save the sketch Happens when the IDE2 backend process crashes, and the communication drops between the client and the server. Closes #2081 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/contributions/contribution.ts | 4 +++ .../browser/contributions/save-as-sketch.ts | 5 +++ .../src/browser/contributions/save-sketch.ts | 33 +++++++++++++++---- .../theia/core/connection-status-service.ts | 19 ++++++++--- .../browser/connection-status-service.test.ts | 24 +++++++++++--- 5 files changed, 71 insertions(+), 14 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 085558a05..8de4d8ff4 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -68,6 +68,7 @@ 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, @@ -172,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<Record<string, string>> { const override: Record<string, string> = {}; const sketch = await this.sketchServiceClient.currentSketch(); 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 876f9c872..26dd6158f 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -24,6 +24,7 @@ import { RenameCloudSketch, RenameCloudSketchParams, } from './rename-cloud-sketch'; +import { assertConnectedToBackend } from './save-sketch'; @injectable() export class SaveAsSketch extends CloudSketchContribution { @@ -64,6 +65,10 @@ export class SaveAsSketch extends CloudSketchContribution { markAsRecentlyOpened, }: SaveAsSketch.Options = SaveAsSketch.Options.DEFAULT ): Promise<boolean> { + assertConnectedToBackend({ + connectionStatusService: this.connectionStatusService, + messageService: this.messageService, + }); const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return false; 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<void> { + 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/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index 983850d0c..b38f8d084 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -4,6 +4,7 @@ import { FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, } from '@theia/core/lib/browser/connection-status-service'; import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { WebSocketConnectionProvider } from '@theia/core/lib/browser/index'; import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar'; import { Disposable } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; @@ -16,11 +17,11 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import debounce from 'lodash.debounce'; import { ArduinoDaemon } from '../../../common/protocol'; import { assertUnreachable } from '../../../common/utils'; import { CreateFeatures } from '../../create/create-features'; import { NotificationCenter } from '../../notification-center'; -import debounce from 'lodash.debounce'; @injectable() export class IsOnline implements FrontendApplicationContribution { @@ -113,6 +114,8 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat private readonly daemonPort: DaemonPort; @inject(IsOnline) private readonly isOnline: IsOnline; + @inject(WebSocketConnectionProvider) + private readonly connectionProvider: WebSocketConnectionProvider; @postConstruct() protected override async init(): Promise<void> { @@ -125,6 +128,10 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat } protected override async performPingRequest(): Promise<void> { + if (!this.connectionProvider['socket'].connected) { + this.updateStatus(false); + return; + } try { await this.pingService.ping(); this.updateStatus(this.isOnline.online); @@ -164,6 +171,8 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon private readonly notificationManager: NotificationManager; @inject(CreateFeatures) private readonly createFeatures: CreateFeatures; + @inject(WebSocketConnectionProvider) + private readonly connectionProvider: WebSocketConnectionProvider; private readonly offlineStatusDidChangeEmitter = new Emitter< OfflineConnectionStatus | undefined @@ -190,9 +199,10 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon } protected override handleOffline(): void { - const params = { + const params = <OfflineMessageParams>{ port: this.daemonPort.port, online: this.isOnline.online, + backendConnected: this.connectionProvider['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081 }; this._offlineStatus = offlineConnectionStatusType(params); const { text, tooltip } = offlineMessage(params); @@ -248,6 +258,7 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon interface OfflineMessageParams { readonly port: string | undefined; readonly online: boolean; + readonly backendConnected: boolean; } interface OfflineMessage { readonly text: string; @@ -272,8 +283,8 @@ export function offlineMessage(params: OfflineMessageParams): OfflineMessage { function offlineConnectionStatusType( params: OfflineMessageParams ): OfflineConnectionStatus { - const { port, online } = params; - if (port && online) { + const { port, online, backendConnected } = params; + if (!backendConnected || (port && online)) { return 'backend'; } if (!port) { 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); }); From d79bc0d083c40b3244264696d2d6703756a8bd53 Mon Sep 17 00:00:00 2001 From: Andrew Sepulveda <streak324@gmail.com> Date: Mon, 12 Jun 2023 04:45:58 -0700 Subject: [PATCH 208/384] add linux-arm64 to download-ls (#2078) --- arduino-ide-extension/scripts/download-ls.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arduino-ide-extension/scripts/download-ls.js b/arduino-ide-extension/scripts/download-ls.js index 991dfb07d..dbfe6d4da 100755 --- a/arduino-ide-extension/scripts/download-ls.js +++ b/arduino-ide-extension/scripts/download-ls.js @@ -88,6 +88,12 @@ lsSuffix = 'Linux_64bit.tar.gz'; clangdSuffix = 'Linux_64bit'; break; + case 'linux-arm64': + clangdExecutablePath = path.join(build, 'clangd'); + clangFormatExecutablePath = path.join(build, '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'); From d0bce15f8baaa17b0272a5b8c0ba45e5577ed3a9 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Fri, 30 Jun 2023 10:54:30 +0200 Subject: [PATCH 209/384] Revert "chore(cli): Bumped the CLI version to `0.33.0`" This reverts commit 0fbd1fbe85fbbd864ad5e6a00850b32cbd2e83e0. --- arduino-ide-extension/package.json | 2 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 10 --- .../cc/arduino/cli/commands/v1/board_pb.js | 85 +------------------ .../cc/arduino/cli/commands/v1/common_pb.d.ts | 8 -- .../cc/arduino/cli/commands/v1/common_pb.js | 62 +------------- .../arduino/cli/commands/v1/compile_pb.d.ts | 4 - .../cc/arduino/cli/commands/v1/compile_pb.js | 32 +------ .../cc/arduino/cli/commands/v1/core_pb.d.ts | 7 -- .../cc/arduino/cli/commands/v1/core_pb.js | 53 +----------- 9 files changed, 7 insertions(+), 256 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index bb1963ee6..ee4075b66 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -170,7 +170,7 @@ ], "arduino": { "cli": { - "version": "0.33.0" + "version": "0.32.2" }, "fwuploader": { "version": "2.2.2" 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 76e70da5f..8fed14afe 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 @@ -18,9 +18,6 @@ export class BoardDetailsRequest extends jspb.Message { getFqbn(): string; setFqbn(value: string): BoardDetailsRequest; - getDoNotExpandBuildProperties(): boolean; - setDoNotExpandBuildProperties(value: boolean): BoardDetailsRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsRequest.AsObject; @@ -36,7 +33,6 @@ export namespace BoardDetailsRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, fqbn: string, - doNotExpandBuildProperties: boolean, } } @@ -97,11 +93,6 @@ export class BoardDetailsResponse extends jspb.Message { setIdentificationPropertiesList(value: Array<BoardIdentificationProperties>): BoardDetailsResponse; addIdentificationProperties(value?: BoardIdentificationProperties, index?: number): BoardIdentificationProperties; - clearBuildPropertiesList(): void; - getBuildPropertiesList(): Array<string>; - setBuildPropertiesList(value: Array<string>): BoardDetailsResponse; - addBuildProperties(value: string, index?: number): string; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; @@ -129,7 +120,6 @@ export namespace BoardDetailsResponse { programmersList: Array<cc_arduino_cli_commands_v1_common_pb.Programmer.AsObject>, debuggingSupported: boolean, identificationPropertiesList: Array<BoardIdentificationProperties.AsObject>, - buildPropertiesList: Array<string>, } } 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 da5148eac..89236154d 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 @@ -498,8 +498,7 @@ 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, ""), - doNotExpandBuildProperties: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -545,10 +544,6 @@ 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; @@ -593,13 +588,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.serializeBinaryToWriter = f f ); } - f = message.getDoNotExpandBuildProperties(); - if (f) { - writer.writeBool( - 3, - f - ); - } }; @@ -658,31 +646,13 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.setFqbn = functio }; -/** - * optional bool do_not_expand_build_properties = 3; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.getDoNotExpandBuildProperties = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.prototype.setDoNotExpandBuildProperties = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15,16]; +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15]; @@ -732,8 +702,7 @@ 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), - buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 16)) == null ? undefined : f + proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.toObject, includeInstance) }; if (includeInstance) { @@ -832,10 +801,6 @@ 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; @@ -969,13 +934,6 @@ 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 - ); - } }; @@ -1349,43 +1307,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearIdentificat }; -/** - * repeated string build_properties = 16; - * @return {!Array<string>} - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getBuildPropertiesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 16)); -}; - - -/** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setBuildPropertiesList = function(value) { - return jspb.Message.setField(this, 16, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.addBuildProperties = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 16, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearBuildPropertiesList = function() { - return this.setBuildPropertiesList([]); -}; - - 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 98d9117fe..7d7926f9e 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 @@ -260,12 +260,6 @@ export class Platform extends jspb.Message { 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; @@ -291,8 +285,6 @@ export namespace Platform { deprecated: boolean, typeList: Array<string>, help?: HelpResources.AsObject, - indexed: boolean, - missingMetadata: boolean, } } 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 f0eaaaf44..dfbc4f507 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 @@ -1637,9 +1637,7 @@ 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), - indexed: jspb.Message.getBooleanFieldWithDefault(msg, 13, false), - missingMetadata: jspb.Message.getBooleanFieldWithDefault(msg, 14, false) + help: (f = msg.getHelp()) && proto.cc.arduino.cli.commands.v1.HelpResources.toObject(includeInstance, f) }; if (includeInstance) { @@ -1726,14 +1724,6 @@ 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; @@ -1849,20 +1839,6 @@ 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 - ); - } }; @@ -2140,42 +2116,6 @@ 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 a4633d90d..692e2a3d5 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 @@ -95,9 +95,6 @@ export class CompileRequest extends jspb.Message { getSkipLibrariesDiscovery(): boolean; setSkipLibrariesDiscovery(value: boolean): CompileRequest; - getDoNotExpandBuildProperties(): boolean; - setDoNotExpandBuildProperties(value: boolean): CompileRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -136,7 +133,6 @@ export namespace CompileRequest { signKey: string, encryptKey: string, skipLibrariesDiscovery: boolean, - doNotExpandBuildProperties: boolean, } } 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 7dcaad1ee..64ef4f711 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 @@ -155,8 +155,7 @@ 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), - doNotExpandBuildProperties: jspb.Message.getBooleanFieldWithDefault(msg, 29, false) + skipLibrariesDiscovery: jspb.Message.getBooleanFieldWithDefault(msg, 28, false) }; if (includeInstance) { @@ -293,10 +292,6 @@ 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; @@ -493,13 +488,6 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } - f = message.getDoNotExpandBuildProperties(); - if (f) { - writer.writeBool( - 29, - f - ); - } }; @@ -1034,24 +1022,6 @@ 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 a4d62a8f7..dc8d8b97c 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 @@ -282,12 +282,6 @@ export class PlatformUpgradeResponse extends jspb.Message { 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; static toObject(includeInstance: boolean, msg: PlatformUpgradeResponse): PlatformUpgradeResponse.AsObject; @@ -302,7 +296,6 @@ 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, } } 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 837c234fe..f9c7e24b6 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 @@ -2064,8 +2064,7 @@ 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), - platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) }; if (includeInstance) { @@ -2112,11 +2111,6 @@ 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; @@ -2162,14 +2156,6 @@ 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 - ); - } }; @@ -2247,43 +2233,6 @@ 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; -}; - - From f3b99b08da8428a2fe56fb81e06da71e4084744c Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 30 Jun 2023 14:11:47 +0200 Subject: [PATCH 210/384] chore(cli): Bumped the CLI version to `0.32.3` Ref: arduino/arduino-cli#2234 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index ee4075b66..2c6570570 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -170,7 +170,7 @@ ], "arduino": { "cli": { - "version": "0.32.2" + "version": "0.32.3" }, "fwuploader": { "version": "2.2.2" From 6e18dca644ce35df892a90f52f83322c82337e38 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Fri, 30 Jun 2023 04:05:42 -0700 Subject: [PATCH 211/384] Adjust release procedure and CI system for "trunk-based" development strategy Previously, releases were always made from a point in the revision history of the `main` branch (typically the tip of the branch at the time of the release). Although the simplicity of this approach is nice, it can be limiting in some cases. For this reason, the project is switching to using a "trunk-based" development strategy, as described here: https://trunkbaseddevelopment.com/ This approach allows making releases at any time that consist of the arbitrary subset of revisions suitable for shipping to the users at that time. The commits that should be included in the release are cherry-picked to a release branch and the tag created on that branch. This means that: - PRs can be merged to the `main` branch as soon as they have passed review rather than having to postpone the merge of changes that are not ready to be included in the next release. - Releases don't need to be postponed if the prior revision history on the `main` branch contains changes that are not ready to be included in the release. The documented release procedure must be adjusted to reflect the new development strategy. CI System Adjustments --------------------- The status of the GitHub Actions workflows should be evaluated before making a release. However, this is not so simple as checking the status of the commit at the tip of the release branch. The reason is that, for the sake of efficiency, the workflows are configured to run only when the processes are relevant to the trigger event (e.g., no need to run unit tests for a change to the readme). In the case of the default branch, you can simply set the workflow runs filter to that branch and then check the result of the latest run of each workflow of interest. However, that was not possible to do with the release branch since it might be that the workflow was never run in that branch. The status of the latest run of the workflow in the default branch might not match the status for the release branch if the release branch does not contain the full history. For this reason, it will be helpful to trigger all relevant workflows on the creation of a release branch. This will ensure that each of those workflows will always have at least one run in the release branch. Subsequent commits pushed to the branch can run based on their usual trigger filters and the status of the latest run of each workflow in the branch will provide an accurate indication of the state of that branch. Branches are created for purposes other than releases, most notably feature branches to stage work for a pull request. Due to the comprehensive nature of this project's CI system, it would not be convenient or efficient to fully run all CI workflows on the creation of every feature branch. Unfortunately, GitHub Actions does not support filters on the `create` event of branch creation like it does for the `push` and `pull_request` events. There is support for a `branches` filter of the `push` event, but that filter is an "AND" to the `paths` filter while this application requires an "OR". For this reason, the workflows must be triggered by the creation of any branch. The unwanted job runs are prevented by adding a `run-determination` job with the branch filter handled by Bash commands. The other jobs of the workflow use this `run-determination` job as a dependency, only running when it indicates they should via a job output. Because this minimal `run-determination` job runs very quickly, it is roughly equivalent to the workflow having been skipped entirely for non-release branch creations. --- .github/workflows/build.yml | 30 +++++++++++++ .github/workflows/check-certificates.yml | 46 +++++++++++++++++-- .github/workflows/check-i18n-task.yml | 29 ++++++++++++ docs/internal/release-procedure.md | 56 +++++++++++++++++++----- 4 files changed, 146 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28e07c632..92f96ab4b 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,8 +36,36 @@ 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" + 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 + build: name: build (${{ matrix.config.os }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' strategy: matrix: config: 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 52e9fab59..f072c52a3 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,7 +23,35 @@ 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: 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 `<major>.<minor>.x` (where `<major>.<minor>` is the major and minor version numbers), is created for each minor version series. Release tags (both pre-release and production) are created from these branches. This allows a release to be created from a select subset of the commits in the `main` branch, [cherry-picked](https://git-scm.com/docs/git-cherry-pick) to the release branch. + ## Steps The following are the steps to follow to make a release of Arduino IDE: @@ -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:<br /> + https://github.com/arduino/arduino-ide/actions +1. Type `branch:<release branch>` (where `<release branch>` is the name of the release branch for this release) in the "**Filter workflow runs**" field of the "**Actions**" page. +1. Press the <kbd>**Enter**</kbd> key. +1. Wait for all in progress workflow runs to finish. +1. Click on the first workflow name on the list at the left side of the page. +1. Check the status of the latest run. If it was not successful, investigate the cause and determine if it is of significance to the release. +1. Repeat the above steps for each of the listed workflows. + +#### Beta testing + +The "**Arduino IDE**" workflow run that was triggered by the branch creation will contain artifacts that can be used for beta testing. + +[More information about beta testing](../contributor-guide/beta-testing.md) + +### 6. 🚢 Create the release on GitHub Then, you need to **create and push the new tag** and wait for the release to appear on [the "**Releases**" page](https://github.com/arduino/arduino-ide/releases). ⚠ Doing this will create a new release and users who already have the IDE installed will be notified from the automatic updater that a new version is available. Do not push the tag if you don't want that. -```text -git checkout main -git pull -git tag -a <YOUR_VERSION> -m "<YOUR_VERSION>" -git push origin <YOUR_VERSION> -``` +1. Checkout the release branch in the repository. +1. Run the following commands: + ```text + git pull + git tag -a <YOUR_VERSION> -m "<YOUR_VERSION>" + git push origin <YOUR_VERSION> + ``` Pushing a tag will trigger a **GitHub Actions** workflow on the `main` branch. Check the "**Arduino IDE**" workflow and see that everything goes right. If the workflow succeeds, a new release will be created automatically and you should see it on the ["**Releases**"](https://github.com/arduino/arduino-ide/releases) page. -### 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).<br /> From a5c973561980da357ba7f7ba0fc2f140460e9f82 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 3 Jul 2023 10:29:25 +0200 Subject: [PATCH 212/384] Revert "Revert "chore(cli): Bumped the CLI version to `0.33.0`"" This reverts commit d0bce15f8baaa17b0272a5b8c0ba45e5577ed3a9. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 10 +++ .../cc/arduino/cli/commands/v1/board_pb.js | 85 ++++++++++++++++++- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 8 ++ .../cc/arduino/cli/commands/v1/common_pb.js | 62 +++++++++++++- .../arduino/cli/commands/v1/compile_pb.d.ts | 4 + .../cc/arduino/cli/commands/v1/compile_pb.js | 32 ++++++- .../cc/arduino/cli/commands/v1/core_pb.d.ts | 7 ++ .../cc/arduino/cli/commands/v1/core_pb.js | 53 +++++++++++- 9 files changed, 256 insertions(+), 7 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 2c6570570..bb1963ee6 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -170,7 +170,7 @@ ], "arduino": { "cli": { - "version": "0.32.3" + "version": "0.33.0" }, "fwuploader": { "version": "2.2.2" 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..76e70da5f 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 @@ -18,6 +18,9 @@ export class BoardDetailsRequest extends jspb.Message { getFqbn(): string; setFqbn(value: string): BoardDetailsRequest; + getDoNotExpandBuildProperties(): boolean; + setDoNotExpandBuildProperties(value: boolean): BoardDetailsRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsRequest.AsObject; @@ -33,6 +36,7 @@ export namespace BoardDetailsRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, fqbn: string, + doNotExpandBuildProperties: boolean, } } @@ -93,6 +97,11 @@ export class BoardDetailsResponse extends jspb.Message { setIdentificationPropertiesList(value: Array<BoardIdentificationProperties>): BoardDetailsResponse; addIdentificationProperties(value?: BoardIdentificationProperties, index?: number): BoardIdentificationProperties; + clearBuildPropertiesList(): void; + getBuildPropertiesList(): Array<string>; + setBuildPropertiesList(value: Array<string>): BoardDetailsResponse; + addBuildProperties(value: string, index?: number): string; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; @@ -120,6 +129,7 @@ export namespace BoardDetailsResponse { programmersList: Array<cc_arduino_cli_commands_v1_common_pb.Programmer.AsObject>, debuggingSupported: boolean, identificationPropertiesList: Array<BoardIdentificationProperties.AsObject>, + buildPropertiesList: Array<string>, } } 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 89236154d..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 @@ -498,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) { @@ -544,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; @@ -588,6 +593,13 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.serializeBinaryToWriter = f f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; @@ -646,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<number>} * @const */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15]; +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.repeatedFields_ = [10,11,13,15,16]; @@ -702,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) { @@ -801,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; @@ -934,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 + ); + } }; @@ -1307,6 +1349,43 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearIdentificat }; +/** + * repeated string build_properties = 16; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getBuildPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 16)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setBuildPropertiesList = function(value) { + return jspb.Message.setField(this, 16, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.addBuildProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 16, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearBuildPropertiesList = function() { + return this.setBuildPropertiesList([]); +}; + + 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..98d9117fe 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 @@ -260,6 +260,12 @@ export class Platform extends jspb.Message { 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,6 +291,8 @@ export namespace Platform { deprecated: boolean, typeList: Array<string>, help?: HelpResources.AsObject, + indexed: boolean, + missingMetadata: boolean, } } 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 dfbc4f507..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 @@ -1637,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) { @@ -1724,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; @@ -1839,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 + ); + } }; @@ -2116,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..a4633d90d 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 @@ -95,6 +95,9 @@ export class CompileRequest extends jspb.Message { getSkipLibrariesDiscovery(): boolean; setSkipLibrariesDiscovery(value: boolean): CompileRequest; + getDoNotExpandBuildProperties(): boolean; + setDoNotExpandBuildProperties(value: boolean): CompileRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -133,6 +136,7 @@ export namespace CompileRequest { signKey: string, encryptKey: string, skipLibrariesDiscovery: boolean, + doNotExpandBuildProperties: boolean, } } 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 64ef4f711..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 @@ -155,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) { @@ -292,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; @@ -488,6 +493,13 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 29, + f + ); + } }; @@ -1022,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..a4d62a8f7 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 @@ -282,6 +282,12 @@ export class PlatformUpgradeResponse extends jspb.Message { 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; static toObject(includeInstance: boolean, msg: PlatformUpgradeResponse): PlatformUpgradeResponse.AsObject; @@ -296,6 +302,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, } } 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 f9c7e24b6..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 @@ -2064,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) { @@ -2111,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; @@ -2156,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 + ); + } }; @@ -2233,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; +}; + + From c66b720509e98ec23daabd83fa90876884aeadf1 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 3 Jul 2023 10:32:22 +0200 Subject: [PATCH 213/384] chore(cli): Bumped the CLI version to `0.33.1` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index bb1963ee6..3483e5b31 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -170,7 +170,7 @@ ], "arduino": { "cli": { - "version": "0.33.0" + "version": "0.33.1" }, "fwuploader": { "version": "2.2.2" From 42d017e87696d9bd68ddd44a7ecab2eb8b5ba3ad Mon Sep 17 00:00:00 2001 From: dankeboy36 <dankeboy36@gmail.com> Date: Sat, 13 May 2023 13:50:41 +0200 Subject: [PATCH 214/384] feat: expose Arduino state to VS Code extensions - Update a shared state on fqbn, port, sketch path, and etc. changes. VS Code extensions can access it and listen on changes. - Force VISX activation order: API VSIX starts first. Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- arduino-ide-extension/package.json | 3 +- .../browser/arduino-ide-frontend-module.ts | 2 + .../contributions/update-arduino-state.ts | 179 ++++++++++++++++++ .../browser/theia/plugin-ext/hosted-plugin.ts | 47 ++++- .../common/protocol/arduino-context-mapper.ts | 126 ++++++++++++ .../src/common/protocol/boards-service.ts | 1 + .../src/common/protocol/core-service.ts | 57 +++++- .../src/node/boards-service-impl.ts | 2 + .../src/node/core-service-impl.ts | 100 ++++++++-- .../common/arduino-context-mapper.test.ts | 43 +++++ .../test/node/core-service-impl.slow-test.ts | 5 +- package.json | 1 + yarn.lock | 41 +++- 13 files changed, 569 insertions(+), 38 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/update-arduino-state.ts create mode 100644 arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts create mode 100644 arduino-ide-extension/src/test/common/arduino-context-mapper.test.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3483e5b31..03e60295a 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -104,7 +104,8 @@ "temp": "^0.9.1", "temp-dir": "^2.0.0", "tree-kill": "^1.2.1", - "util": "^0.12.5" + "util": "^0.12.5", + "vscode-arduino-api": "^0.1.2" }, "devDependencies": { "@octokit/rest": "^18.12.0", 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 89d13fd93..122000941 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -354,6 +354,7 @@ import { FileResourceResolver as TheiaFileResourceResolver } from '@theia/filesy 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'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -747,6 +748,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, Account); Contribution.configure(bind, CloudSketchbookContribution); Contribution.configure(bind, CreateCloudCopy); + Contribution.configure(bind, UpdateArduinoState); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window 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..a227a51a0 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -0,0 +1,179 @@ +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, + Port, + isCompileSummary, +} from '../../common/protocol'; +import { + toApiBoardDetails, + toApiCompileSummary, + toApiPort, +} from '../../common/protocol/arduino-context-mapper'; +import type { BoardsConfig } from '../boards/boards-config'; +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<T extends ArduinoState> { + 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.onBoardsConfigChanged((config) => + this.updateBoardsConfig(config) + ), + 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.boardsServiceProvider.reconciled.then(() => { + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); + }); + 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<void> { + 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<void> { + const apiCompileSummary = toApiCompileSummary(compileSummary); + return this.updateState({ + key: 'compileSummary', + value: apiCompileSummary, + }); + } + + private async updateBoardsConfig( + boardsConfig: BoardsConfig.Config + ): Promise<void> { + 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<void> { + await this.updateState({ key: 'fqbn', value: fqbn }); + } + + private async updateBoardDetails(fqbn: string | undefined): Promise<void> { + 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: Port | undefined): Promise<void> { + const apiPort = port && toApiPort(port); + return this.updateState({ key: 'port', value: apiPort }); + } + + private async updateUserDirPath(userDirUri: URI | undefined): Promise<void> { + const userDirPath = userDirUri?.path.fsPath(); + return this.updateState({ + key: 'userDirPath', + value: userDirPath, + }); + } + + private async updateDataDirPath(dataDirUri: URI | undefined): Promise<void> { + const dataDirPath = dataDirUri?.path.fsPath(); + return this.updateState({ + key: 'dataDirPath', + value: dataDirPath, + }); + } + + private async updateState<T extends ArduinoState>( + params: UpdateStateParams<T> + ): Promise<void> { + await this.hostedPluginSupport.didStart; + return this.commandService.executeCommand( + 'arduinoAPI.updateState', + params + ); + } +} diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts index 326e02ee4..8491357a4 100644 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts +++ b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts @@ -1,7 +1,10 @@ -import { Emitter, Event, JsonRpcProxy } from '@theia/core'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; import { injectable, interfaces } from '@theia/core/shared/inversify'; -import { HostedPluginServer } from '@theia/plugin-ext/lib/common/plugin-protocol'; -import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +import { + PluginContributions, + HostedPluginSupport as TheiaHostedPluginSupport, +} from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; @injectable() export class HostedPluginSupport extends TheiaHostedPluginSupport { @@ -10,7 +13,7 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport { override onStart(container: interfaces.Container): void { super.onStart(container); - this.hostedPluginServer.onDidCloseConnection(() => + this['server'].onDidCloseConnection(() => this.onDidCloseConnectionEmitter.fire() ); } @@ -28,8 +31,38 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport { return this.onDidCloseConnectionEmitter.event; } - private get hostedPluginServer(): JsonRpcProxy<HostedPluginServer> { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (this as any).server; + protected override startPlugins( + contributionsByHost: Map<string, PluginContributions[]>, + toDisconnect: DisposableCollection + ): Promise<void> { + reorderPlugins(contributionsByHost); + return super.startPlugins(contributionsByHost, toDisconnect); } } + +/** + * Force the `vscode-arduino-ide` API to activate before any Arduino IDE tool VSIX. + * + * Arduino IDE tool VISXs are not forced to declare the `vscode-arduino-api` as a `extensionDependencies`, + * but the API must activate before any tools. This in place sorting helps to bypass Theia's plugin resolution + * without forcing tools developers to add `vscode-arduino-api` to the `extensionDependencies`. + */ +function reorderPlugins( + contributionsByHost: Map<string, PluginContributions[]> +): void { + for (const [, contributions] of contributionsByHost) { + const apiPluginIndex = contributions.findIndex(isArduinoAPI); + if (apiPluginIndex >= 0) { + const apiPlugin = contributions[apiPluginIndex]; + contributions.splice(apiPluginIndex, 1); + contributions.unshift(apiPlugin); + } + } +} + +function isArduinoAPI(pluginContribution: PluginContributions): boolean { + return ( + pluginContribution.plugin.metadata.model.id === + 'dankeboy36.vscode-arduino-api' + ); +} diff --git a/arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts b/arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts new file mode 100644 index 000000000..ede24fe1c --- /dev/null +++ b/arduino-ide-extension/src/common/protocol/arduino-context-mapper.ts @@ -0,0 +1,126 @@ +import type { + Port as APIPort, + BoardDetails as ApiBoardDetails, + BuildProperties as ApiBuildProperties, + CompileSummary as ApiCompileSummary, + ConfigOption as ApiConfigOption, + ConfigValue as ApiConfigValue, + Tool as ApiTool, +} from 'vscode-arduino-api'; +import type { + BoardDetails, + CompileSummary, + ConfigOption, + ConfigValue, + Port, + Tool, +} from '../protocol'; + +export function toApiCompileSummary( + compileSummary: CompileSummary +): ApiCompileSummary { + const { + buildPath, + buildProperties, + boardPlatform, + buildPlatform, + executableSectionsSize, + usedLibraries, + } = compileSummary; + return { + buildPath, + buildProperties: toApiBuildProperties(buildProperties), + executableSectionsSize: executableSectionsSize, + boardPlatform, + buildPlatform, + usedLibraries, + }; +} + +export function toApiPort(port: Port): APIPort | undefined { + const { + hardwareId = '', + properties = {}, + address, + protocol, + protocolLabel, + addressLabel: label, + } = port; + return { + label, + address, + hardwareId, + properties, + protocol, + protocolLabel, + }; +} + +export function toApiBoardDetails(boardDetails: BoardDetails): ApiBoardDetails { + const { fqbn, programmers, configOptions, requiredTools } = boardDetails; + return { + buildProperties: toApiBuildProperties(boardDetails.buildProperties), + configOptions: configOptions.map(toApiConfigOption), + fqbn, + programmers, + toolsDependencies: requiredTools.map(toApiTool), + }; +} + +function toApiConfigOption(configOption: ConfigOption): ApiConfigOption { + const { label, values, option } = configOption; + return { + optionLabel: label, + option, + values: values.map(toApiConfigValue), + }; +} + +function toApiConfigValue(configValue: ConfigValue): ApiConfigValue { + const { label, selected, value } = configValue; + return { + selected, + value, + valueLabel: label, + }; +} + +function toApiTool(toolDependency: Tool): ApiTool { + const { name, packager, version } = toolDependency; + return { + name, + packager, + version, + }; +} + +const propertySep = '='; + +function parseProperty( + property: string +): [key: string, value: string] | undefined { + const segments = property.split(propertySep); + if (segments.length < 2) { + console.warn(`Could not parse build property: ${property}.`); + return undefined; + } + + const [key, ...rest] = segments; + if (!key) { + console.warn(`Could not determine property key from raw: ${property}.`); + return undefined; + } + const value = rest.join(propertySep); + return [key, value]; +} + +export function toApiBuildProperties(properties: string[]): ApiBuildProperties { + return properties.reduce((acc, curr) => { + const entry = parseProperty(curr); + if (entry) { + const [key, value] = entry; + acc[key] = value; + } + return acc; + }, <Record<string, string>>{}); +} diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index c955b9462..7e2f77555 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -441,6 +441,7 @@ export interface BoardDetails { readonly debuggingSupported: boolean; readonly VID: string; readonly PID: string; + readonly buildProperties: string[]; } export interface Tool { diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 7dfcfb896..2a683370d 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -5,13 +5,11 @@ import type { Range, Position, } from '@theia/core/shared/vscode-languageserver-protocol'; -import type { - BoardUserField, - Port, -} from '../../common/protocol/boards-service'; +import type { BoardUserField, Port, Installable } from '../../common/protocol/'; import type { Programmer } from './boards-service'; import type { Sketch } from './sketches-service'; import { IndexUpdateSummary } from './notification-service'; +import type { CompileSummary as ApiCompileSummary } from 'vscode-arduino-api'; 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,6 +101,53 @@ export namespace CoreError { } } +export interface InstalledPlatformReference { + readonly id: string; + readonly version: Installable.Version; + /** + * Absolute filesystem path. + */ + readonly installDir: string; + readonly packageUrl: string; +} + +export interface ExecutableSectionSize { + readonly name: string; + readonly size: number; + readonly maxSize: number; +} + +export interface CompileSummary { + readonly buildPath: string; + /** + * To be compatible with the `vscode-arduino-tools` API. + * @deprecated Use `buildPath` instead. Use Theia or VS Code URI to convert to an URI string on the client side. + */ + readonly buildOutputUri: string; + readonly usedLibraries: ApiCompileSummary['usedLibraries']; + readonly executableSectionsSize: ExecutableSectionSize[]; + readonly boardPlatform?: InstalledPlatformReference | undefined; + readonly buildPlatform?: InstalledPlatformReference | undefined; + readonly buildProperties: string[]; +} + +export function isCompileSummary(arg: unknown): arg is CompileSummary { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<CompileSummary>arg).buildPath !== undefined && + typeof (<CompileSummary>arg).buildPath === 'string' && + (<CompileSummary>arg).buildOutputUri !== undefined && + typeof (<CompileSummary>arg).buildOutputUri === 'string' && + (<CompileSummary>arg).executableSectionsSize !== undefined && + Array.isArray((<CompileSummary>arg).executableSectionsSize) && + (<CompileSummary>arg).usedLibraries !== undefined && + Array.isArray((<CompileSummary>arg).usedLibraries) && + (<CompileSummary>arg).buildProperties !== undefined && + Array.isArray((<CompileSummary>arg).buildProperties) + ); +} + export const CoreServicePath = '/services/core-service'; export const CoreService = Symbol('CoreService'); export interface CoreService { @@ -132,7 +177,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 ( diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index e04aa909f..a2db13193 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -155,6 +155,7 @@ export class BoardsServiceImpl VID = prop.get('vid') || ''; PID = prop.get('pid') || ''; } + const buildProperties = detailsResp.getBuildPropertiesList(); return { fqbn, @@ -164,6 +165,7 @@ export class BoardsServiceImpl debuggingSupported, VID, PID, + buildProperties }; } diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index e5e3d05ac..253dcd383 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -8,6 +8,8 @@ import { CompilerWarnings, CoreService, CoreError, + CompileSummary, + isCompileSummary, } from '../common/protocol/core-service'; import { CompileRequest, @@ -35,12 +37,15 @@ import { firstToUpperCase, notEmpty } from '../common/utils'; import { ServiceError } from './service-error'; import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible'; import { BoardDiscovery } from './board-discovery'; +import { Mutable } from '@theia/core/lib/common/types'; namespace Uploadable { export type Request = UploadRequest | UploadUsingProgrammerRequest; export type Response = UploadResponse | UploadUsingProgrammerResponse; } +type CompileSummaryFragment = Partial<Mutable<CompileSummary>>; + @injectable() export class CoreServiceImpl extends CoreClientAware implements CoreService { @inject(ResponseService) @@ -58,23 +63,13 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { async compile(options: CoreService.Options.Compile): Promise<void> { const coreClient = await this.coreClient; const { client, instance } = coreClient; - let buildPath: string | undefined = undefined; + const compileSummary = <CompileSummaryFragment>{}; const progressHandler = this.createProgressHandler(options); - const buildPathHandler = (response: CompileResponse) => { - const currentBuildPath = response.getBuildPath(); - if (currentBuildPath) { - buildPath = currentBuildPath; - } else { - if (!!buildPath && currentBuildPath !== buildPath) { - throw new Error( - `The CLI has already provided a build path: <${buildPath}>, and IDE received a new build path value: <${currentBuildPath}>.` - ); - } - } - }; + const compileSummaryHandler = (response: CompileResponse) => + updateCompileSummary(compileSummary, response); const handler = this.createOnDataHandler<CompileResponse>( progressHandler, - buildPathHandler + compileSummaryHandler ); const request = this.compileRequest(options, instance); return new Promise<void>((resolve, reject) => { @@ -111,31 +106,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 ) ); @@ -465,3 +464,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<string, string>), + compatibleWith: object.compatibleWithMap.reduce((acc, [key, value]) => { + acc[key] = value; + return acc; + }, {} as Record<string, boolean>), + } as const; + const mutable = <Partial<Mutable<typeof library>>>library; + delete mutable.architecturesList; + delete mutable.typesList; + delete mutable.examplesList; + delete mutable.providesIncludesList; + delete mutable.propertiesMap; + delete mutable.compatibleWithMap; + return library; + }); + } + const boardPlatform = 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/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/node/core-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts index faac7b6c7..0a0fd253c 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,6 +9,7 @@ import { BoardsService, CoreService, SketchesService, + isCompileSummary, } from '../../common/protocol'; import { createBaseContainer, startDaemon } from './test-bindings'; @@ -31,7 +32,7 @@ describe('core-service-impl', () => { 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>(CoreService); const sketchesService = container.get<SketchesService>(SketchesService); @@ -56,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; diff --git a/package.json b/package.json index 9c9c00f56..6cfd1c915 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "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", diff --git a/yarn.lock b/yarn.lock index e5a69a4c7..74640bac9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3209,6 +3209,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.5.tgz#b1d2f772142a301538fae9bdf9cf15b9f2573a29" integrity sha512-hKB88y3YHL8oPOs/CNlaXtjWn93+Bs48sDQR37ZUqG2tLeCS7EA1cmnkKsuQsub9OKEB/y/Rw9zqJqqNSbqVlQ== +"@types/vscode@^1.78.0": + version "1.78.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.78.0.tgz#b5600abce8855cf21fb32d0857bcd084b1f83069" + integrity sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA== + "@types/which@^1.3.1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" @@ -3991,6 +3996,14 @@ arduino-serial-plotter-webapp@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.2" + resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.2.tgz#145d998231b34b33bf70f7fc6e5be6497191f708" + integrity sha512-8PTBMDS2ofe2LJZZKHw/MgfXgDwpiImXJcBeqeZ6lcTSDqQNMJpEIjcCdPcxbsQbJXRRfZZ4nn6G/gXwEuJPpw== + 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" @@ -10738,6 +10751,13 @@ nested-error-stacks@^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" @@ -12184,7 +12204,7 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protobufjs@^7.0.0: +protobufjs@^7.0.0, protobufjs@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.3.tgz#01af019e40d9c6133c49acbb3ff9e30f4f0f70b2" integrity sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg== @@ -13083,6 +13103,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +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" @@ -14350,6 +14375,11 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== +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.3.1" resolved "https://registry.yarnpkg.com/ts-md5/-/ts-md5-1.3.1.tgz#f5b860c0d5241dd9bb4e909dd73991166403f511" @@ -14947,6 +14977,15 @@ vinyl@^2.2.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +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" From 0bcb182ec0bac3d230588e9509ff9a93550f221a Mon Sep 17 00:00:00 2001 From: dankeboy36 <dankeboy36@gmail.com> Date: Tue, 27 Jun 2023 17:42:49 +0200 Subject: [PATCH 215/384] fix(terminal): widget flickering on resize Ref: eclipse-theia/theia#12587 Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- .../browser/arduino-ide-frontend-module.ts | 5 ++++ .../theia/terminal/terminal-widget-impl.ts | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts 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 122000941..743296fd1 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -355,6 +355,8 @@ 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 { TerminalWidgetImpl } from './theia/terminal/terminal-widget-impl'; +import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -1026,4 +1028,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(TheiaMonacoEditorMenuContribution).toService( MonacoEditorMenuContribution ); + + // Patch terminal issues. + rebind(TerminalWidget).to(TerminalWidgetImpl).inTransientScope(); }); diff --git a/arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts b/arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts new file mode 100644 index 000000000..310a659d1 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts @@ -0,0 +1,23 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { TerminalWidgetImpl as TheiaTerminalWidgetImpl } from '@theia/terminal/lib/browser/terminal-widget-impl'; +import debounce from 'p-debounce'; + +// Patch for https://github.com/eclipse-theia/theia/pull/12587 +@injectable() +export class TerminalWidgetImpl extends TheiaTerminalWidgetImpl { + private readonly debouncedResizeTerminal = debounce( + () => this.doResizeTerminal(), + 50 + ); + + protected override resizeTerminal(): void { + this.debouncedResizeTerminal(); + } + + private doResizeTerminal(): void { + const geo = this.fitAddon.proposeDimensions(); + const cols = geo.cols; + const rows = geo.rows - 1; // subtract one row for margin + this.term.resize(cols, rows); + } +} From 954fee41a0fc860f5124231e37f248f77328b252 Mon Sep 17 00:00:00 2001 From: dankeboy36 <dankeboy36@gmail.com> Date: Tue, 27 Jun 2023 17:43:49 +0200 Subject: [PATCH 216/384] fix(terminal): `split-terminal` visibility Removed the toolbar contribution from the UI. Ref: eclipse-theia/theia#12626/ Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- .../browser/arduino-ide-frontend-module.ts | 4 ++ .../terminal-frontend-contribution.ts | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts 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 743296fd1..ea568d595 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -357,6 +357,8 @@ import { MonacoEditorMenuContribution as TheiaMonacoEditorMenuContribution } fro import { UpdateArduinoState } from './contributions/update-arduino-state'; import { TerminalWidgetImpl } from './theia/terminal/terminal-widget-impl'; import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; +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 @@ -1031,4 +1033,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // Patch terminal issues. rebind(TerminalWidget).to(TerminalWidgetImpl).inTransientScope(); + bind(TerminalFrontendContribution).toSelf().inSingletonScope(); + rebind(TheiaTerminalFrontendContribution).toService(TerminalFrontendContribution); }); diff --git a/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts new file mode 100644 index 000000000..13020175d --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts @@ -0,0 +1,38 @@ +import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; +import { CommandRegistry } from '@theia/core/lib/common/command'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; +import { injectable } from '@theia/core/shared/inversify'; +import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; +import { + TerminalCommands, + TerminalFrontendContribution as TheiaTerminalFrontendContribution, +} from '@theia/terminal/lib/browser/terminal-frontend-contribution'; + +// Patch for https://github.com/eclipse-theia/theia/pull/12626 +@injectable() +export class TerminalFrontendContribution extends TheiaTerminalFrontendContribution { + override registerCommands(commands: CommandRegistry): void { + super.registerCommands(commands); + commands.unregisterCommand(TerminalCommands.SPLIT); + commands.registerCommand(TerminalCommands.SPLIT, { + execute: () => this.splitTerminal(), + isEnabled: (w) => this.withWidget(w, () => true), + isVisible: (w) => this.withWidget(w, () => true), + }); + } + + override registerToolbarItems(toolbar: TabBarToolbarRegistry): void { + super.registerToolbarItems(toolbar); + toolbar.unregisterItem(TerminalCommands.SPLIT.id); + } + + private withWidget<T>( + widget: Widget | undefined, + fn: (widget: TerminalWidget) => T + ): T | false { + if (widget instanceof TerminalWidget) { + return fn(widget); + } + return false; + } +} From 95fdc593edaa05f20b53e39a9f5e51c067f70e53 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 5 Jul 2023 18:08:47 +0200 Subject: [PATCH 217/384] chore(version): updated the version to `2.1.2` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 03e60295a..a928ffe09 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.1.1", + "version": "2.1.2", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index d5875aab7..6721301a3 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.1.1", + "version": "2.1.2", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.37.0", "@theia/terminal": "1.37.0", "@theia/workspace": "1.37.0", - "arduino-ide-extension": "2.1.1" + "arduino-ide-extension": "2.1.2" }, "devDependencies": { "@theia/cli": "1.37.0", diff --git a/package.json b/package.json index 6cfd1c915..2995fd68f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.1.1", + "version": "2.1.2", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 94d2962985d708f008bf0cf30662f3b2a602fb16 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 16 Jun 2023 16:58:57 +0200 Subject: [PATCH 218/384] fix: include all log `args` in the log message - In the bundled application, the customized logger that writes the log files bogusly includes only the first message fragment in the log message. This PR ensures all message fragments are included in the final message before it is printed to the console/terminal and persisted to the rotating log files. - Includes messages with `debug` severity in the log. - Disables the ANSI coloring in the CLI daemon log by adding the `NO_COLOR=true` environment variable to the spawned CLI daemon process. - Trims trailing line ending of the daemon log. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/arduino-daemon-impl.ts | 8 ++++++-- electron/build/patch/backend/main.js | 13 ++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 0e48f3c60..0d0e4e529 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -9,6 +9,7 @@ import { DisposableCollection, } from '@theia/core/lib/common/disposable'; import { Event, Emitter } from '@theia/core/lib/common/event'; +import { deepClone } from '@theia/core/lib/common/objects'; import { environment } from '@theia/application-package/lib/environment'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; @@ -171,7 +172,10 @@ export class ArduinoDaemonImpl const args = await this.getSpawnArgs(); const cliPath = this.getExecPath(); const ready = new Deferred<{ daemon: ChildProcess; port: string }>(); - const options = { shell: true }; + const options = { + shell: true, + 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.) @@ -258,7 +262,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/electron/build/patch/backend/main.js b/electron/build/patch/backend/main.js index cb138d3c4..6f41b4ed3 100644 --- a/electron/build/patch/backend/main.js +++ b/electron/build/patch/backend/main.js @@ -6,6 +6,7 @@ // 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'); +const util = require('util'); if (os.platform() === 'linux' && !process.env['XDG_CONFIG_HOME']) { const { join } = require('path'); const home = process.env['HOME']; @@ -18,12 +19,14 @@ setup({ appName: 'Arduino IDE', maxSize: 10 * 1024 * 1024 }); -for (const name of ['log', 'trace', 'info', 'warn', 'error']) { +for (const name of ['log', 'trace', 'debug', 'info', 'warn', 'error']) { const original = console[name]; - console[name] = (data => { - original(data); - log(data); - }).bind(console); + console[name] = function () { + const messages = Object.values(arguments); + const message = util.format(...messages) + original(message) + log(message); + } } const { BackendApplicationConfigProvider } = require('@theia/core/lib/node/backend-application-config-provider'); From f6a43254f5c416a2e4fa888875358336b42dd4d5 Mon Sep 17 00:00:00 2001 From: dankeboy36 <dankeboy36@gmail.com> Date: Sat, 17 Jun 2023 13:03:59 +0200 Subject: [PATCH 219/384] feat: can dock the monitor widget to the `"right"` Added a new preference (`arduino.monitor.dockPanel`) to specify the location of the application shell where the _Serial Monitor_ widget resides. The possible values are `"bottom"` and `"right"`. The default\ value is the `"bottom"`. The dock panel is per application and not per workspace or window. However, advanced users can create the `./.vscode/settings.json` and configure per sketch preference. Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- .../src/browser/arduino-preferences.ts | 479 ++++++++++-------- .../monitor/monitor-view-contribution.tsx | 60 ++- .../browser/serial/monitor/monitor-widget.tsx | 7 +- .../src/browser/style/monitor.css | 2 +- arduino-ide-extension/src/common/nls.ts | 5 + i18n/en.json | 3 + 6 files changed, 316 insertions(+), 240 deletions(-) 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<T extends object> = { + [p in keyof T]: PreferenceSchemaProperty; +}; +type ArduinoPreferenceSchemaProperties = + StrictPreferenceSchemaProperties<ArduinoConfiguration> & { '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/serial/monitor/monitor-view-contribution.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx index 925d221ec..970cf4c54 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx @@ -1,6 +1,10 @@ import * as React from '@theia/core/shared/react'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { AbstractViewContribution, codicon } from '@theia/core/lib/browser'; +import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; +import { + AbstractViewContribution, + ApplicationShell, + codicon +} from '@theia/core/lib/browser'; import { MonitorWidget } from './monitor-widget'; import { MenuModelRegistry, Command, CommandRegistry } from '@theia/core'; import { @@ -13,6 +17,12 @@ import { nls } from '@theia/core/lib/common'; import { Event } from '@theia/core/lib/common/event'; import { MonitorModel } from '../../monitor-model'; import { MonitorManagerProxyClient } from '../../../common/protocol'; +import { + ArduinoPreferences, + defaultMonitorWidgetDockPanel, + isMonitorWidgetDockPanel +} from '../../arduino-preferences'; +import { serialMonitorWidgetLabel } from '../../../common/nls'; export namespace SerialMonitor { export namespace Commands { @@ -50,31 +60,59 @@ export class MonitorViewContribution static readonly TOGGLE_SERIAL_MONITOR_TOOLBAR = MonitorWidget.ID + ':toggle-toolbar'; static readonly RESET_SERIAL_MONITOR = MonitorWidget.ID + ':reset'; + + @inject(MonitorModel) + private readonly model: MonitorModel; + @inject(MonitorManagerProxyClient) + private readonly monitorManagerProxy: MonitorManagerProxyClient; + @inject(ArduinoPreferences) + private readonly arduinoPreferences: ArduinoPreferences; - constructor( - @inject(MonitorModel) - protected readonly model: MonitorModel, + private _panel: ApplicationShell.Area; - @inject(MonitorManagerProxyClient) - protected readonly monitorManagerProxy: MonitorManagerProxyClient - ) { + constructor() { super({ widgetId: MonitorWidget.ID, - widgetName: MonitorWidget.LABEL, + widgetName: serialMonitorWidgetLabel, defaultWidgetOptions: { - area: 'bottom', + area: defaultMonitorWidgetDockPanel, }, toggleCommandId: MonitorViewContribution.TOGGLE_SERIAL_MONITOR, toggleKeybinding: 'CtrlCmd+Shift+M', }); + this._panel = defaultMonitorWidgetDockPanel; + } + + @postConstruct() + protected init(): void { + this._panel = this.arduinoPreferences['arduino.monitor.dockPanel'] ?? defaultMonitorWidgetDockPanel; this.monitorManagerProxy.onMonitorShouldReset(() => this.reset()); + this.arduinoPreferences.onPreferenceChanged((event) => { + if (event.preferenceName === 'arduino.monitor.dockPanel' && isMonitorWidgetDockPanel(event.newValue) && event.newValue !== this._panel) { + this._panel = event.newValue; + const widget = this.tryGetWidget(); + // reopen at the new position if opened + if (widget) { + widget.close(); + this.openView({ activate: true, reveal: true }); + } + } + }) + } + + override get defaultViewOptions(): ApplicationShell.WidgetOptions { + const viewOptions = super.defaultViewOptions; + return { + ...viewOptions, + area: this._panel + }; } override registerMenus(menus: MenuModelRegistry): void { if (this.toggleCommand) { menus.registerMenuAction(ArduinoMenus.TOOLS__MAIN_GROUP, { commandId: this.toggleCommand.id, - label: MonitorWidget.LABEL, + label: serialMonitorWidgetLabel, order: '5', }); } diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index 0e790706b..7f2e6d02c 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -27,13 +27,10 @@ import { } from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { serialMonitorWidgetLabel } from '../../../common/nls'; @injectable() export class MonitorWidget extends ReactWidget { - static readonly LABEL = nls.localize( - 'arduino/common/serialMonitor', - 'Serial Monitor' - ); static readonly ID = 'serial-monitor'; protected settings: MonitorSettings = {}; @@ -65,7 +62,7 @@ export class MonitorWidget extends ReactWidget { constructor() { super(); this.id = MonitorWidget.ID; - this.title.label = MonitorWidget.LABEL; + this.title.label = serialMonitorWidgetLabel; this.title.iconClass = 'monitor-tab-icon'; this.title.closable = true; this.scrollOptions = undefined; diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index 6787ea4cb..dfbed12aa 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -20,7 +20,7 @@ .serial-monitor .head { display: flex; - padding: 0px 5px 5px 0px; + padding: 0px 5px 5px 5px; height: 27px; background-color: var(--theia-activityBar-background); } diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index a2e58b86a..29ab5604f 100644 --- a/arduino-ide-extension/src/common/nls.ts +++ b/arduino-ide-extension/src/common/nls.ts @@ -19,3 +19,8 @@ export const InstallManually = nls.localize( 'arduino/common/installManually', 'Install Manually' ); + +export const serialMonitorWidgetLabel = nls.localize( + 'arduino/common/serialMonitor', + 'Serial Monitor' +); diff --git a/i18n/en.json b/i18n/en.json index ecd94c757..9a5b38eda 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -381,6 +381,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", From e17472ef07ed4761ce251de00bf7210f47673345 Mon Sep 17 00:00:00 2001 From: coby2023t <123261899+coby2023t@users.noreply.github.com> Date: Wed, 26 Jul 2023 14:52:04 +0800 Subject: [PATCH 220/384] =?UTF-8?q?Add=20=E4=B8=AD=E6=96=87(=E7=B9=81?= =?UTF-8?q?=E9=AB=94)=20("Chinese=20(Traditional)")=20localization=20(#215?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will add a "中文(繁體)" option to the "Language" menu in the Arduino IDE preferences, which will cause the strings in the IDE UI to be localized for "Chinese (Traditional)". In addition to the translations for the strings that originate from the Eclipse Theia IDE framework provided by the "Chinese (Traditional) Language Pack for Visual Studio Code" language pack, this will also utilize the translations of the Arduino IDE-specific strings contributed by the community. --- .../src/node/i18n/arduino-localization-contribution.ts | 1 + package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) 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 33aeeb05d..c0165e97d 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -31,6 +31,7 @@ export class ArduinoLocalizationContribution ['tr'], ['uk', 'uk_UA'], ['zh-cn', 'zh'], + ['zh-tw', 'zh-Hant'], ]; async registerLocalizations(registry: LocalizationRegistry): Promise<void> { diff --git a/package.json b/package.json index 2995fd68f..464be7783 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.70.0/file/MS-CEINTL.vscode-language-pack-ru-1.70.0.vsix", "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.70.0/file/MS-CEINTL.vscode-language-pack-tr-1.70.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.70.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.70.0.vsix" + "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.70.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.70.0.vsix", + "vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.70.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.70.0.vsix" } } From 144df893d0dafec64a26565cf912a98f32572da9 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 25 Jul 2023 21:39:21 -0700 Subject: [PATCH 221/384] Clean localization data files before pulling from Transifex The localization of the UI strings specific to the Arduino IDE application is done via the Transifex localization platform. A scheduled workflow pulls the data from Transifex weekly and submits a pull request for the updates. Previously, the script used to pull the data did not clean the data files before pulling. This meant that a vestigial file would accumulate in the repository whenever a language was removed from the Transifex project. The accumulation is avoided by deleting the data files for the locales managed on Transifex (all locales other than the source English locale) before downloading the data from Transifex. --- scripts/i18n/transifex-pull.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/i18n/transifex-pull.js b/scripts/i18n/transifex-pull.js index e620e88da..b92a67cf1 100644 --- a/scripts/i18n/transifex-pull.js +++ b/scripts/i18n/transifex-pull.js @@ -1,6 +1,8 @@ // @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'); @@ -106,6 +108,15 @@ const getTranslationDownloadStatus = async (language, downloadRequestId) => { const languages = await getLanguages(organization, project); shell.echo('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) { downloadIds.push({ From 9a6a457bc44fb16f646b9e61a9e8b336b3666412 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:12:05 +0200 Subject: [PATCH 222/384] chore(deps): Updated to Theia `1.39.0` (#2144) - update Theia to `1.39.0`, - remove the application packager and fix the security vulnerabilities, - bundle the backed application with `webpack`, and - enhance the developer docs. Co-authored-by: Akos Kitta <a.kitta@arduino.cc> Co-authored-by: per1234 <accounts@perglass.com> Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .eslintrc.js | 4 +- .github/workflows/build.yml | 16 +- .github/workflows/check-i18n-task.yml | 3 +- .github/workflows/i18n-nightly-push.yml | 3 +- .github/workflows/i18n-weekly-pull.yml | 3 +- .github/workflows/themes-weekly-pull.yml | 3 +- .gitignore | 13 +- .vscode/launch.json | 58 +- .vscode/tasks.json | 12 +- arduino-ide-extension/package.json | 75 +- arduino-ide-extension/scripts/download-cli.js | 12 +- .../scripts/download-examples.js | 18 +- .../scripts/download-fwuploader.js | 12 +- arduino-ide-extension/scripts/download-ls.js | 57 +- arduino-ide-extension/scripts/downloader.js | 3 +- .../scripts/generate-protocol.js | 12 +- arduino-ide-extension/scripts/utils.js | 12 +- .../src/browser/app-service.ts | 5 +- .../browser/arduino-frontend-contribution.tsx | 4 +- .../browser/arduino-ide-frontend-module.ts | 9 +- .../boards/boards-config-dialog-widget.tsx | 2 +- .../src/browser/boards/boards-config.tsx | 2 +- .../browser/boards/boards-toolbar-item.tsx | 2 +- .../src/browser/components/ProgressBar.tsx | 2 +- .../src/browser/contributions/about.ts | 15 +- .../certificate-add-new.tsx | 2 +- .../certificate-uploader/certificate-list.tsx | 2 +- .../certificate-uploader-component.tsx | 2 +- .../certificate-uploader-dialog.tsx | 2 +- .../select-board-components.tsx | 2 +- .../dialogs/cloud-share-sketch-dialog.tsx | 2 +- .../firmware-uploader-component.tsx | 2 +- .../firmware-uploader-dialog.tsx | 2 +- .../ide-updater/ide-updater-component.tsx | 3 +- .../ide-updater/ide-updater-dialog.tsx | 2 +- .../dialogs/settings/settings-component.tsx | 2 +- .../dialogs/settings/settings-dialog.tsx | 2 +- .../dialogs/settings/settings-step-input.tsx | 2 +- .../src/browser/dialogs/settings/settings.ts | 2 +- .../user-fields/user-fields-component.tsx | 2 +- .../user-fields/user-fields-dialog.tsx | 2 +- .../monitor/monitor-view-contribution.tsx | 28 +- .../browser/serial/monitor/monitor-widget.tsx | 2 +- .../monitor/serial-monitor-send-input.tsx | 2 +- .../monitor/serial-monitor-send-output.tsx | 2 +- .../src/browser/theia/core/about-dialog.ts | 2 +- .../theia/core/connection-status-service.ts | 2 +- .../theia/core/sidebar-bottom-menu-widget.tsx | 2 +- .../debug/debug-configuration-manager.ts | 11 +- .../src/browser/theia/dialogs/dialogs.tsx | 2 +- .../notification-center-component.tsx | 2 +- .../theia/messages/notification-component.tsx | 2 +- .../notification-toasts-component.tsx | 2 +- .../theia/messages/notifications-renderer.tsx | 2 +- .../preferences/preference-tree-generator.ts | 2 +- .../terminal-frontend-contribution.ts | 26 +- .../theia/terminal/terminal-widget-impl.ts | 23 - .../theia/workspace/workspace-input-dialog.ts | 5 + .../src/browser/toolbar/arduino-toolbar.tsx | 2 +- .../src/browser/widgets/arduino-select.tsx | 2 +- .../cloud-sketchbook-composite-widget.tsx | 2 +- .../cloud-sketchbook-tree-widget.tsx | 2 +- .../widgets/cloud-sketchbook/cloud-status.tsx | 2 +- .../component-list/component-list-item.tsx | 2 +- .../widgets/component-list/component-list.tsx | 2 +- .../component-list/filter-renderer.tsx | 2 +- .../filterable-list-container.tsx | 2 +- .../component-list/list-item-renderer.tsx | 2 +- .../widgets/component-list/list-widget.tsx | 2 +- .../widgets/component-list/search-bar.tsx | 2 +- .../browser/widgets/sketchbook/create-new.tsx | 2 +- .../sketchbook-composite-widget.tsx | 2 +- .../sketchbook/sketchbook-tree-widget.tsx | 14 +- .../src/common/protocol/config-service.ts | 1 - .../electron-browser/electron-app-service.ts | 6 +- .../src/electron-browser/preload.ts | 4 +- .../src/electron-common/electron-arduino.ts | 15 +- .../src/electron-main/electron-arduino.ts | 7 +- .../theia/electron-main-application.ts | 97 +- .../src/node/arduino-daemon-impl.ts | 4 +- .../node/arduino-firmware-uploader-impl.ts | 10 +- .../src/node/arduino-ide-backend-module.ts | 2 +- .../src/node/auth/authentication-server.ts | 4 +- .../src/node/auth/keychain.ts | 8 +- .../src/node/clang-formatter.ts | 11 +- .../src/node/config-service-impl.ts | 6 +- .../src/node/examples-service-impl.ts | 5 +- arduino-ide-extension/src/node/exec-util.ts | 14 - .../src/node/executable-service-impl.ts | 12 +- .../i18n/arduino-localization-contribution.ts | 72 +- .../src/node/is-temp-sketch.ts | 2 +- .../monitor-settings-provider-impl.ts | 26 +- .../plotter/plotter-backend-contribution.ts | 14 +- arduino-ide-extension/src/node/resources.ts | 32 + .../{nsfw-watcher => }/nsfw-bindings.ts | 4 +- .../theia/filesystem/nsfw-watcher/index.ts | 2 +- .../web-socket/web-socket-provider-impl.ts | 2 +- .../node/web-socket/web-socket-provider.ts | 4 +- .../src/test/node/arduino-daemon-impl.test.ts | 6 +- .../src/test/node/exec-util.test.ts | 59 +- .../test/node/sketches-service-impl.test.ts | 8 +- docs/development.md | 183 +- electron-app/arduino-ide-backend-main.js | 42 + electron-app/arduino-ide-electron-main.js | 25 + electron-app/package.json | 192 +- .../resources/entitlements.mac.plist | 0 .../build => electron-app}/resources/eula.txt | 0 .../resources/icon.icns | Bin .../build => electron-app}/resources/icon.ico | Bin .../resources/icons/512x512.png | Bin .../resources/installerSidebar.bmp | Bin .../scripts/archive.js | 113 +- .../scripts/notarize.js | 34 +- electron-app/scripts/package.js | 166 + electron-app/scripts/post-package.js | 186 + electron-app/scripts/utils.js | 8 + .../test/archive.test.js | 91 +- .../test/test-resources}/not-a-zip.dmg | Bin .../test-resources}/zip with whitespace.zip | Bin .../test-resources}/zip-with-base-folder.zip | Bin .../test/test-resources}/zip-with-symlink.zip | Bin .../test-resources}/zip-without-symlink.zip | Bin electron-app/webpack.base.js | 138 + electron-app/webpack.config.js | 51 +- electron-app/webpack.dev.js | 22 + electron/.gitignore | 15 - electron/README.md | 15 - electron/build/patch/backend/main.js | 46 - .../scripts/arduino-ide-electron-main.js | 15 - electron/build/template-package.json | 143 - electron/packager/config.js | 155 - electron/packager/extensions.json | 3 - electron/packager/index.js | 565 -- electron/packager/npm-registry/config.yml | 19 - electron/packager/package.json | 41 - electron/packager/yarn.lock | 3006 -------- lerna.json | 1 - package.json | 41 +- scripts/i18n/transifex-pull.js | 34 +- scripts/i18n/transifex-push.js | 25 +- scripts/i18n/transifex.js | 25 +- scripts/package.sh | 12 + yarn.lock | 6762 ++++++++--------- 143 files changed, 5038 insertions(+), 8122 deletions(-) delete mode 100644 arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts create mode 100644 arduino-ide-extension/src/node/resources.ts rename arduino-ide-extension/src/node/theia/filesystem/{nsfw-watcher => }/nsfw-bindings.ts (94%) create mode 100644 electron-app/arduino-ide-backend-main.js create mode 100644 electron-app/arduino-ide-electron-main.js rename {electron/build => electron-app}/resources/entitlements.mac.plist (100%) rename {electron/build => electron-app}/resources/eula.txt (100%) rename {electron/build => electron-app}/resources/icon.icns (100%) rename {electron/build => electron-app}/resources/icon.ico (100%) rename {electron/build => electron-app}/resources/icons/512x512.png (100%) rename {electron/build => electron-app}/resources/installerSidebar.bmp (100%) rename electron/packager/utils.js => electron-app/scripts/archive.js (52%) rename {electron/build => electron-app}/scripts/notarize.js (55%) create mode 100644 electron-app/scripts/package.js create mode 100644 electron-app/scripts/post-package.js create mode 100644 electron-app/scripts/utils.js rename electron/packager/test/utils.test.js => electron-app/test/archive.test.js (63%) rename {electron/packager/test/resources => electron-app/test/test-resources}/not-a-zip.dmg (100%) rename {electron/packager/test/resources => electron-app/test/test-resources}/zip with whitespace.zip (100%) rename {electron/packager/test/resources => electron-app/test/test-resources}/zip-with-base-folder.zip (100%) rename {electron/packager/test/resources => electron-app/test/test-resources}/zip-with-symlink.zip (100%) rename {electron/packager/test/resources => electron-app/test/test-resources}/zip-without-symlink.zip (100%) create mode 100644 electron-app/webpack.base.js create mode 100644 electron-app/webpack.dev.js delete mode 100644 electron/.gitignore delete mode 100644 electron/README.md delete mode 100644 electron/build/patch/backend/main.js delete mode 100644 electron/build/scripts/arduino-ide-electron-main.js delete mode 100644 electron/build/template-package.json delete mode 100644 electron/packager/config.js delete mode 100644 electron/packager/extensions.json delete mode 100644 electron/packager/index.js delete mode 100644 electron/packager/npm-registry/config.yml delete mode 100644 electron/packager/package.json delete mode 100644 electron/packager/yarn.lock create mode 100755 scripts/package.sh diff --git a/.eslintrc.js b/.eslintrc.js index 812c8a718..ba733c944 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,7 +15,9 @@ 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 92f96ab4b..00b49cf53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -92,6 +92,7 @@ jobs: with: node-version: '16.14' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Python 3.x uses: actions/setup-python@v4 @@ -135,15 +136,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 diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index f072c52a3..2aa398b93 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -63,6 +63,7 @@ jobs: with: node-version: '16.14' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go uses: actions/setup-go@v4 @@ -76,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 09a82f082..3b9b5b2ba 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -21,6 +21,7 @@ jobs: with: 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 5812c91f5..49f8edc51 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -21,6 +21,7 @@ jobs: with: 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 d70eb4a3f..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/ -electron/build/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..3c54efee9 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", @@ -95,7 +95,8 @@ "**/${fileBasenameNoExtension}.js" ], "env": { - "TS_NODE_PROJECT": "${workspaceRoot}/tsconfig.json" + "TS_NODE_PROJECT": "${workspaceFolder}/tsconfig.json", + "IDE2_TEST": "true" }, "sourceMaps": true, "smartStep": true, @@ -108,19 +109,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 a928ffe09..05c44e0c3 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -4,63 +4,60 @@ "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": "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.8.14", - "@theia/application-package": "1.37.0", - "@theia/core": "1.37.0", - "@theia/debug": "1.37.0", - "@theia/editor": "1.37.0", - "@theia/electron": "1.37.0", - "@theia/filesystem": "1.37.0", - "@theia/keymaps": "1.37.0", - "@theia/markers": "1.37.0", - "@theia/messages": "1.37.0", - "@theia/monaco": "1.37.0", + "@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.37.0", - "@theia/outline-view": "1.37.0", - "@theia/output": "1.37.0", - "@theia/plugin-ext": "1.37.0", - "@theia/preferences": "1.37.0", - "@theia/scm": "1.37.0", - "@theia/search-in-workspace": "1.37.0", - "@theia/terminal": "1.37.0", - "@theia/typehierarchy": "1.37.0", - "@theia/workspace": "1.37.0", + "@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/jsdom": "^21.1.1", - "@types/keytar": "^4.4.0", "@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", @@ -70,6 +67,7 @@ "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", "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", @@ -87,6 +85,7 @@ "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", @@ -112,18 +111,20 @@ "@types/chai": "^4.2.7", "@types/mocha": "^5.2.7", "@types/react-window": "^1.8.5", + "@xhmikosr/downloader": "^13.0.1", "chai": "^4.2.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" @@ -170,17 +171,17 @@ } ], "arduino": { - "cli": { + "arduino-cli": { "version": "0.33.1" }, - "fwuploader": { + "arduino-fwuploader": { "version": "2.2.2" }, + "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 3b00d1bfe..d34732408 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -5,12 +5,27 @@ const version = '1.10.0'; (async () => { const os = require('node:os'); - const { promises: fs } = require('node:fs'); + 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); @@ -28,7 +43,6 @@ const version = '1.10.0'; 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 ed4866acb..6cc13338f 100755 --- a/arduino-ide-extension/scripts/download-fwuploader.js +++ b/arduino-ide-extension/scripts/download-fwuploader.js @@ -18,7 +18,7 @@ return undefined; } - const { fwuploader } = arduino; + const fwuploader = arduino['arduino-fwuploader']; if (!fwuploader) { return undefined; } @@ -35,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 = (() => { diff --git a/arduino-ide-extension/scripts/download-ls.js b/arduino-ide-extension/scripts/download-ls.js index dbfe6d4da..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,41 +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(build, 'clangd'); - clangFormatExecutablePath = path.join(build, 'clang-format'); + 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; @@ -116,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 4b1970880..f0737a2ec 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -31,7 +31,7 @@ return defaultVersion; } - const { cli } = arduino; + const cli = arduino['arduino-cli']; if (!cli) { return defaultVersion; } @@ -65,9 +65,15 @@ shell.echo(`<<< Repository cloned.`); const { platform } = process; - const build = path.join(__dirname, '..', 'build'); + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); const cli = path.join( - build, + resourcesFolder, `arduino-cli${platform === 'win32' ? '.exe' : ''}` ); const versionJson = exec(cli, ['version', '--format', 'json'], shell).trim(); diff --git a/arduino-ide-extension/scripts/utils.js b/arduino-ide-extension/scripts/utils.js index 4b18c74f3..eeeee37eb 100644 --- a/arduino-ide-extension/scripts/utils.js +++ b/arduino-ide-extension/scripts/utils.js @@ -90,9 +90,15 @@ 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); } diff --git a/arduino-ide-extension/src/browser/app-service.ts b/arduino-ide-extension/src/browser/app-service.ts index 20557f412..4598b9fd5 100644 --- a/arduino-ide-extension/src/browser/app-service.ts +++ b/arduino-ide-extension/src/browser/app-service.ts @@ -1,11 +1,14 @@ 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; - version(): Promise<string>; + info(): Promise<AppInfo>; registerStartupTasksHandler( handler: (tasks: StartupTasks) => void ): Disposable; diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 5113b1a14..9ca0a9c61 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -30,7 +30,7 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import * as React from '@theia/core/shared/react'; +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'; @@ -69,7 +69,7 @@ export class ArduinoFrontendContribution private readonly appStateService: FrontendApplicationStateService; @postConstruct() - protected async init(): Promise<void> { + protected init(): void { if (!window.navigator.onLine) { // tslint:disable-next-line:max-line-length this.messageService.warn( 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 ea568d595..e29e98ca3 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -355,10 +355,8 @@ 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 { TerminalWidgetImpl } from './theia/terminal/terminal-widget-impl'; -import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; import { TerminalFrontendContribution } from './theia/terminal/terminal-frontend-contribution'; -import { TerminalFrontendContribution as TheiaTerminalFrontendContribution } from '@theia/terminal/lib/browser/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 @@ -1032,7 +1030,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); // Patch terminal issues. - rebind(TerminalWidget).to(TerminalWidgetImpl).inTransientScope(); bind(TerminalFrontendContribution).toSelf().inSingletonScope(); - rebind(TheiaTerminalFrontendContribution).toService(TerminalFrontendContribution); + rebind(TheiaTerminalFrontendContribution).toService( + TerminalFrontendContribution + ); }); 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 index 7ad65697a..ec39e6b30 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import 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'; diff --git a/arduino-ide-extension/src/browser/boards/boards-config.tsx b/arduino-ide-extension/src/browser/boards/boards-config.tsx index 8781981e6..af62368fe 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import 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'; 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..25d66e361 100644 --- a/arduino-ide-extension/src/browser/boards/boards-toolbar-item.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-toolbar-item.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import * as ReactDOM from '@theia/core/shared/react-dom'; import { CommandRegistry } from '@theia/core/lib/common/command'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; 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 03eae0cbf..201d13b41 100644 --- a/arduino-ide-extension/src/browser/contributions/about.ts +++ b/arduino-ide-extension/src/browser/contributions/about.ts @@ -4,7 +4,6 @@ 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 { ConfigService } from '../../common/protocol'; import { AppService } from '../app-service'; import { ArduinoMenus } from '../menu/arduino-menus'; import { @@ -18,8 +17,6 @@ import { export class About extends Contribution { @inject(ClipboardService) private readonly clipboardService: ClipboardService; - @inject(ConfigService) - private readonly configService: ConfigService; @inject(AppService) private readonly appService: AppService; @@ -42,11 +39,9 @@ export class About extends Contribution { } private async showAbout(): Promise<void> { - const [appVersion, cliVersion] = await Promise.all([ - this.appService.version(), - this.configService.getVersion(), - ]); - const buildDate = this.buildDate; + const appInfo = await this.appService.info(); + const { appVersion, cliVersion, buildDate } = appInfo; + const detail = (showAll: boolean) => nls.localize( 'arduino/about/detail', @@ -84,10 +79,6 @@ export class About extends Contribution { return FrontendApplicationConfigProvider.get().applicationName; } - private get buildDate(): string | undefined { - return FrontendApplicationConfigProvider.get().buildDate; - } - private ago(isoTime: string): string { const now = moment(Date.now()); const other = moment(isoTime); 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..b426b82e3 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,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import Tippy from '@tippyjs/react'; import { AvailableBoard } from '../../boards/boards-service-provider'; import { CertificateListComponent } from './certificate-list'; 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..5dde52d91 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,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable, 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..ca4cd91be 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,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'; import { AvailableBoard } from '../../boards/boards-service-provider'; import { ArduinoSelect } from '../../widgets/arduino-select'; diff --git a/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx index 215478614..133cf249a 100644 --- a/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/cloud-share-sketch-dialog.tsx @@ -6,7 +6,7 @@ import { nls } from '@theia/core/lib/common/nls'; import { MaybePromise } from '@theia/core/lib/common/types'; import { Message } from '@theia/core/shared/@phosphor/messaging'; import { Widget } from '@theia/core/shared/@phosphor/widgets'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { CreateApi } from '../create/create-api'; import { AbstractDialog } from '../theia/dialogs/dialogs'; diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx index a8db65627..f7d5f4478 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.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'; import { Port } from '../../../common/protocol'; import { ArduinoFirmwareUploader, diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx index 20d97d4b2..c9e23b937 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable, diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx index bbe358b77..091e0a06a 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-component.tsx @@ -1,5 +1,5 @@ import { nls } from '@theia/core/lib/common/nls'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; // @ts-expect-error see https://github.com/microsoft/TypeScript/issues/49721#issuecomment-1319854183 import type { Options } from 'react-markdown'; import { ProgressInfo, UpdateInfo } from '../../../common/protocol/ide-updater'; @@ -111,7 +111,6 @@ export const IDEUpdaterComponent = ({ > <ReactMarkdown components={{ - // @ts-expect-error see imports. There is no ESM type-only import in CommonJS modules. a: ({ href, children, ...props }) => ( <a onClick={() => href && openExternal(href)} {...props}> {children} diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index e8d5f6371..0c6abbfaa 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable, diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 644484f01..347c712bf 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; import { Disable } from 'react-disable'; diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 0c9e51e43..1872e5d9a 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { injectable, inject, diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx index 1470ec192..8f9d2df94 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import classnames from 'classnames'; interface SettingsStepInputProps { diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index c120d6a9a..f6f2b88fb 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -117,7 +117,7 @@ export class SettingsService { protected _settings: Settings; @postConstruct() - protected async init(): Promise<void> { + protected init(): void { this.appStateService.reachedState('ready').then(async () => { const settings = await this.loadSettings(); this._settings = deepClone(settings); diff --git a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx index f9d75e3e3..8751881fc 100644 --- a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-component.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { BoardUserField } from '../../../common/protocol'; import { nls } from '@theia/core/lib/common'; diff --git a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx index 88109cf71..d6a3e9130 100644 --- a/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/user-fields/user-fields-dialog.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable } from '@theia/core/shared/inversify'; import { DialogProps } from '@theia/core/lib/browser/dialogs'; import { Message } from '@theia/core/shared/@phosphor/messaging'; diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx index 970cf4c54..98bf53625 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx @@ -1,9 +1,13 @@ -import * as React from '@theia/core/shared/react'; -import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import { + injectable, + inject, + postConstruct, +} from '@theia/core/shared/inversify'; import { AbstractViewContribution, ApplicationShell, - codicon + codicon, } from '@theia/core/lib/browser'; import { MonitorWidget } from './monitor-widget'; import { MenuModelRegistry, Command, CommandRegistry } from '@theia/core'; @@ -20,7 +24,7 @@ import { MonitorManagerProxyClient } from '../../../common/protocol'; import { ArduinoPreferences, defaultMonitorWidgetDockPanel, - isMonitorWidgetDockPanel + isMonitorWidgetDockPanel, } from '../../arduino-preferences'; import { serialMonitorWidgetLabel } from '../../../common/nls'; @@ -60,7 +64,7 @@ export class MonitorViewContribution static readonly TOGGLE_SERIAL_MONITOR_TOOLBAR = MonitorWidget.ID + ':toggle-toolbar'; static readonly RESET_SERIAL_MONITOR = MonitorWidget.ID + ':reset'; - + @inject(MonitorModel) private readonly model: MonitorModel; @inject(MonitorManagerProxyClient) @@ -85,10 +89,16 @@ export class MonitorViewContribution @postConstruct() protected init(): void { - this._panel = this.arduinoPreferences['arduino.monitor.dockPanel'] ?? defaultMonitorWidgetDockPanel; + this._panel = + this.arduinoPreferences['arduino.monitor.dockPanel'] ?? + defaultMonitorWidgetDockPanel; this.monitorManagerProxy.onMonitorShouldReset(() => this.reset()); this.arduinoPreferences.onPreferenceChanged((event) => { - if (event.preferenceName === 'arduino.monitor.dockPanel' && isMonitorWidgetDockPanel(event.newValue) && event.newValue !== this._panel) { + if ( + event.preferenceName === 'arduino.monitor.dockPanel' && + isMonitorWidgetDockPanel(event.newValue) && + event.newValue !== this._panel + ) { this._panel = event.newValue; const widget = this.tryGetWidget(); // reopen at the new position if opened @@ -97,14 +107,14 @@ export class MonitorViewContribution this.openView({ activate: true, reveal: true }); } } - }) + }); } override get defaultViewOptions(): ApplicationShell.WidgetOptions { const viewOptions = super.defaultViewOptions; return { ...viewOptions, - area: this._panel + area: this._panel, }; } diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index 7f2e6d02c..7b390772f 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { injectable, inject, diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx index 21e54e2fd..086626c24 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-input.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { Key, KeyCode } from '@theia/core/lib/browser/keys'; import { Board } from '../../../common/protocol/boards-service'; import { DisposableCollection, nls } from '@theia/core/lib/common'; diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx index 70a275b5c..ec2327ad5 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { Event } from '@theia/core/lib/common/event'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { areEqual, FixedSizeList as List } from 'react-window'; diff --git a/arduino-ide-extension/src/browser/theia/core/about-dialog.ts b/arduino-ide-extension/src/browser/theia/core/about-dialog.ts index d2b1ad0a9..4e22b59fd 100644 --- a/arduino-ide-extension/src/browser/theia/core/about-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/core/about-dialog.ts @@ -1,7 +1,7 @@ import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog'; export class AboutDialog extends TheiaAboutDialog { - protected override async init(): Promise<void> { + protected override init(): void { // NOOP // IDE2 has a custom about dialog, so it does not make sense to collect Theia extensions at startup time. } diff --git a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index b38f8d084..413e50645 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -118,7 +118,7 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat private readonly connectionProvider: WebSocketConnectionProvider; @postConstruct() - protected override async init(): Promise<void> { + protected override init(): void { this.schedulePing(); const refresh = debounce(() => { this.updateStatus(Boolean(this.daemonPort.port) && this.isOnline.online); diff --git a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx index 0c7104c85..042e9a01f 100644 --- a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx +++ b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx @@ -7,7 +7,7 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { accountMenu } from '../../contributions/account'; import { CreateFeatures } from '../../create/create-features'; import { ApplicationConnectionStatusContribution } from './connection-status-service'; diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts index c763c3e9e..f877e0e12 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts @@ -1,9 +1,5 @@ import debounce from 'p-debounce'; -import { - inject, - injectable, - postConstruct, -} from '@theia/core/shared/inversify'; +import { inject, injectable } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { Event, Emitter } from '@theia/core/lib/common/event'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @@ -42,9 +38,7 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { return this.onTempContentDidChangeEmitter.event; } - @postConstruct() - protected override async init(): Promise<void> { - super.init(); + protected override async doInit(): Promise<void> { this.appStateService.reachedState('ready').then(async () => { const tempContent = await this.getTempLaunchJsonContent(); if (!tempContent) { @@ -78,6 +72,7 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { }); this.updateModels(); }); + return super.doInit(); } protected override updateModels = debounce(async () => { diff --git a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx index 57eef5639..cc1ab7dd2 100644 --- a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx +++ b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx @@ -9,7 +9,7 @@ import { DisposableCollection, } from '@theia/core/lib/common/disposable'; import { inject, injectable } from '@theia/core/shared/inversify'; -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { createRoot } from '@theia/core/shared/react-dom/client'; @injectable() diff --git a/arduino-ide-extension/src/browser/theia/messages/notification-center-component.tsx b/arduino-ide-extension/src/browser/theia/messages/notification-center-component.tsx index b4b83bc77..6dfe42b1e 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notification-center-component.tsx +++ b/arduino-ide-extension/src/browser/theia/messages/notification-center-component.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { NotificationComponent } from './notification-component'; import { NotificationCenterComponent as TheiaNotificationCenterComponent } from '@theia/messages/lib/browser/notification-center-component'; import { nls } from '@theia/core/lib/common'; diff --git a/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx b/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx index 58b60a13b..2f1203b97 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx +++ b/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { NotificationComponent as TheiaNotificationComponent } from '@theia/messages/lib/browser/notification-component'; import { nls } from '@theia/core/lib/common'; import { codicon } from '@theia/core/lib/browser'; diff --git a/arduino-ide-extension/src/browser/theia/messages/notification-toasts-component.tsx b/arduino-ide-extension/src/browser/theia/messages/notification-toasts-component.tsx index 393dd9b5a..b9f295313 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notification-toasts-component.tsx +++ b/arduino-ide-extension/src/browser/theia/messages/notification-toasts-component.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { NotificationComponent } from './notification-component'; import { NotificationToastsComponent as TheiaNotificationToastsComponent } from '@theia/messages/lib/browser/notification-toasts-component'; diff --git a/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx b/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx index 89ef20724..ce01c48b6 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx +++ b/arduino-ide-extension/src/browser/theia/messages/notifications-renderer.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable, diff --git a/arduino-ide-extension/src/browser/theia/preferences/preference-tree-generator.ts b/arduino-ide-extension/src/browser/theia/preferences/preference-tree-generator.ts index 6ff7df05b..2cf5b07d6 100644 --- a/arduino-ide-extension/src/browser/theia/preferences/preference-tree-generator.ts +++ b/arduino-ide-extension/src/browser/theia/preferences/preference-tree-generator.ts @@ -14,7 +14,7 @@ export class PreferenceTreeGenerator extends TheiaPreferenceTreeGenerator { @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; - protected override async init(): Promise<void> { + protected override init(): void { this.appStateService.onStateChanged((state) => { this.state = state; // manually trigger a model (and UI) refresh if it was requested during the startup phase. diff --git a/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts index 13020175d..bea94ac6c 100644 --- a/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/terminal/terminal-frontend-contribution.ts @@ -1,38 +1,16 @@ import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; -import { CommandRegistry } from '@theia/core/lib/common/command'; -import { Widget } from '@theia/core/shared/@phosphor/widgets'; import { injectable } from '@theia/core/shared/inversify'; -import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; import { TerminalCommands, TerminalFrontendContribution as TheiaTerminalFrontendContribution, } from '@theia/terminal/lib/browser/terminal-frontend-contribution'; -// Patch for https://github.com/eclipse-theia/theia/pull/12626 @injectable() export class TerminalFrontendContribution extends TheiaTerminalFrontendContribution { - override registerCommands(commands: CommandRegistry): void { - super.registerCommands(commands); - commands.unregisterCommand(TerminalCommands.SPLIT); - commands.registerCommand(TerminalCommands.SPLIT, { - execute: () => this.splitTerminal(), - isEnabled: (w) => this.withWidget(w, () => true), - isVisible: (w) => this.withWidget(w, () => true), - }); - } - override registerToolbarItems(toolbar: TabBarToolbarRegistry): void { super.registerToolbarItems(toolbar); + // removes the `split-terminal` command from the tabbar toolbar + // https://github.com/dankeboy36/esp-exception-decoder/pull/1#pullrequestreview-1500146673 toolbar.unregisterItem(TerminalCommands.SPLIT.id); } - - private withWidget<T>( - widget: Widget | undefined, - fn: (widget: TerminalWidget) => T - ): T | false { - if (widget instanceof TerminalWidget) { - return fn(widget); - } - return false; - } } diff --git a/arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts b/arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts deleted file mode 100644 index 310a659d1..000000000 --- a/arduino-ide-extension/src/browser/theia/terminal/terminal-widget-impl.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { TerminalWidgetImpl as TheiaTerminalWidgetImpl } from '@theia/terminal/lib/browser/terminal-widget-impl'; -import debounce from 'p-debounce'; - -// Patch for https://github.com/eclipse-theia/theia/pull/12587 -@injectable() -export class TerminalWidgetImpl extends TheiaTerminalWidgetImpl { - private readonly debouncedResizeTerminal = debounce( - () => this.doResizeTerminal(), - 50 - ); - - protected override resizeTerminal(): void { - this.debouncedResizeTerminal(); - } - - private doResizeTerminal(): void { - const geo = this.fitAddon.proposeDimensions(); - const cols = geo.cols; - const rows = geo.rows - 1; // subtract one row for margin - this.term.resize(cols, rows); - } -} diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts index 8a8e82eec..9f48fbb52 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts @@ -28,6 +28,11 @@ export class WorkspaceInputDialog extends TheiaWorkspaceInputDialog { protected override readonly labelProvider: LabelProvider ) { super(props, labelProvider); + if (this.contentNode.contains(this.errorMessageNode)) { + // Reverts https://github.com/eclipse-theia/theia/pull/12585/files#diff-068570364d86f936ca72dfc52f8bfa93f14f6d971e2e6fa19216f33cb322244bR533-R534 + this.contentNode.removeChild(this.errorMessageNode); + this.controlPanel.prepend(this.errorMessageNode); + } this.node.classList.add('workspace-input-dialog'); this.appendCloseButton(Dialog.CANCEL); } diff --git a/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx b/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx index c1a656206..4f1878f09 100644 --- a/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx +++ b/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { TabBarToolbar, TabBarToolbarRegistry, diff --git a/arduino-ide-extension/src/browser/widgets/arduino-select.tsx b/arduino-ide-extension/src/browser/widgets/arduino-select.tsx index 31950ff8e..d5d291b4f 100644 --- a/arduino-ide-extension/src/browser/widgets/arduino-select.tsx +++ b/arduino-ide-extension/src/browser/widgets/arduino-select.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import type { Props, StylesConfig, ThemeConfig } from 'react-select'; import Select from 'react-select'; diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx index 0d4b5eb82..e6bc28ba7 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-composite-widget.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import type { Root } from '@theia/core/shared/react-dom/client'; import { inject, diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx index 375e874df..ad16ca24b 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-tree-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-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 } from '@theia/core/shared/inversify'; import { TreeModel } from '@theia/core/lib/browser/tree/tree-model'; import { CloudSketchbookTreeModel } from './cloud-sketchbook-tree-model'; 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 7732568c8..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,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +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'; 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<SearchBar.Props> { constructor(props: Readonly<SearchBar.Props>) { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx 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<CreateNew.Props> { 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<void> { + protected override init(): void { super.init(); // cache the current open sketch uri - const currentSketch = await this.sketchServiceClient.currentSketch(); - this.currentSketchUri = - (CurrentSketch.isValid(currentSketch) && currentSketch.uri) || ''; + this.sketchServiceClient + .currentSketch() + .then( + (currentSketch) => + (this.currentSketchUri = + (CurrentSketch.isValid(currentSketch) && currentSketch.uri) || '') + ); } protected override createNodeClassNames( 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<Readonly<string>>; getConfiguration(): Promise<ConfigState>; setConfiguration(config: Config): Promise<void>; } diff --git a/arduino-ide-extension/src/electron-browser/electron-app-service.ts b/arduino-ide-extension/src/electron-browser/electron-app-service.ts index 968247566..a564646ca 100644 --- a/arduino-ide-extension/src/electron-browser/electron-app-service.ts +++ b/arduino-ide-extension/src/electron-browser/electron-app-service.ts @@ -1,6 +1,6 @@ import type { Disposable } from '@theia/core/lib/common/disposable'; import { injectable } from '@theia/core/shared/inversify'; -import type { AppService } from '../browser/app-service'; +import type { AppInfo, AppService } from '../browser/app-service'; import type { Sketch } from '../common/protocol/sketches-service'; import type { StartupTasks } from '../electron-common/startup-task'; @@ -10,8 +10,8 @@ export class ElectronAppService implements AppService { window.electronArduino.quitApp(); } - version(): Promise<string> { - return window.electronArduino.appVersion(); + info(): Promise<AppInfo> { + return window.electronArduino.appInfo(); } registerStartupTasksHandler( diff --git a/arduino-ide-extension/src/electron-browser/preload.ts b/arduino-ide-extension/src/electron-browser/preload.ts index feb24ba97..b70529423 100644 --- a/arduino-ide-extension/src/electron-browser/preload.ts +++ b/arduino-ide-extension/src/electron-browser/preload.ts @@ -10,7 +10,7 @@ import { import { v4 } from 'uuid'; import type { Sketch } from '../common/protocol/sketches-service'; import { - CHANNEL_APP_VERSION, + CHANNEL_APP_INFO, CHANNEL_IS_FIRST_WINDOW, CHANNEL_MAIN_MENU_ITEM_DID_CLICK, CHANNEL_OPEN_PATH, @@ -76,7 +76,7 @@ const api: ElectronArduino = { ipcRenderer.invoke(CHANNEL_SHOW_OPEN_DIALOG, options), showSaveDialog: (options: SaveDialogOptions) => ipcRenderer.invoke(CHANNEL_SHOW_SAVE_DIALOG, options), - appVersion: () => ipcRenderer.invoke(CHANNEL_APP_VERSION), + appInfo: () => ipcRenderer.invoke(CHANNEL_APP_INFO), quitApp: () => ipcRenderer.send(CHANNEL_QUIT_APP), isFirstWindow: () => ipcRenderer.invoke(CHANNEL_IS_FIRST_WINDOW), requestReload: (options: StartupTasks) => diff --git a/arduino-ide-extension/src/electron-common/electron-arduino.ts b/arduino-ide-extension/src/electron-common/electron-arduino.ts index 2d5174981..54f76d3c1 100644 --- a/arduino-ide-extension/src/electron-common/electron-arduino.ts +++ b/arduino-ide-extension/src/electron-common/electron-arduino.ts @@ -11,6 +11,17 @@ 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'; @@ -50,7 +61,7 @@ export interface ElectronArduino { showMessageBox(options: MessageBoxOptions): Promise<MessageBoxReturnValue>; showOpenDialog(options: OpenDialogOptions): Promise<OpenDialogReturnValue>; showSaveDialog(options: SaveDialogOptions): Promise<SaveDialogReturnValue>; - appVersion(): Promise<string>; + appInfo(): Promise<AppInfo>; quitApp(): void; isFirstWindow(): Promise<boolean>; requestReload(tasks: StartupTasks): void; @@ -77,7 +88,7 @@ declare global { 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_VERSION = 'Arduino:AppVersion'; +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'; diff --git a/arduino-ide-extension/src/electron-main/electron-arduino.ts b/arduino-ide-extension/src/electron-main/electron-arduino.ts index 263ad87c0..2697bf0c1 100644 --- a/arduino-ide-extension/src/electron-main/electron-arduino.ts +++ b/arduino-ide-extension/src/electron-main/electron-arduino.ts @@ -18,7 +18,8 @@ import { createDisposableListener } from '@theia/core/lib/electron-main/event-ut import { injectable } from '@theia/core/shared/inversify'; import { WebContents } from '@theia/electron/shared/electron'; import { - CHANNEL_APP_VERSION, + AppInfo, + CHANNEL_APP_INFO, CHANNEL_IS_FIRST_WINDOW, CHANNEL_MAIN_MENU_ITEM_DID_CLICK, CHANNEL_OPEN_PATH, @@ -85,8 +86,8 @@ export class ElectronArduino implements ElectronMainApplicationContribution { return result; } ); - ipcMain.handle(CHANNEL_APP_VERSION, async () => { - return app.appVersion; + ipcMain.handle(CHANNEL_APP_INFO, async (): Promise<AppInfo> => { + return app.appInfo; }); ipcMain.on(CHANNEL_QUIT_APP, () => app.requestStop()); ipcMain.handle(CHANNEL_IS_FIRST_WINDOW, async (event) => { 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 6f9a393d7..76ee458be 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 @@ -10,7 +10,7 @@ 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 { MaybePromise } from '@theia/core/lib/common/types'; +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 { @@ -31,6 +31,8 @@ import { } 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, @@ -72,6 +74,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 +118,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(); @@ -615,8 +623,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { return this._firstWindowId; } - get appVersion(): string { - return app.getVersion(); + get appInfo(): AppInfo { + return this._appInfo; } private async delete(sketch: Sketch): Promise<void> { @@ -681,3 +689,84 @@ 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<FrontendApplicationConfig> { + 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<string, string> = + packageJson?.theia?.frontend?.config; + for (const property of appInfoPropertyLiterals) { + const value = packageJsonConfig[property]; + if (value && !config[property]) { + if (!config[property]) { + console.debug( + `Setting 'theia.frontend.config.${property}' application configuration value to: ${JSON.stringify( + value + )} (type of ${typeof value})` + ); + } else { + console.warn( + `Overriding 'theia.frontend.config.${property}' application configuration value with: ${JSON.stringify( + value + )} (type of ${typeof value}). Original value: ${JSON.stringify( + config[property] + )}` + ); + } + config[property] = value; + } + } + console.debug( + `Frontend application configuration after modifications: ${JSON.stringify( + config + )}` + ); + return config; + } + } catch (err) { + console.error( + `Could not read the frontend application configuration from the 'package.json' file. Falling back to (the Theia CLI) generated default config: ${JSON.stringify( + config + )}`, + err + ); + } + return config; +} + +/** + * Mutates the `toUpdate` argument and returns with it. + */ +function updateAppInfo( + toUpdate: Mutable<AppInfo>, + updateWith: Record<string, unknown> +): AppInfo { + appInfoPropertyLiterals.forEach((property) => { + const newValue = updateWith[property]; + if (typeof newValue === 'string') { + toUpdate[property] = newValue; + } + }); + return toUpdate; +} diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 0d0e4e529..d2fe7d81b 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -15,9 +15,9 @@ 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 @@ -133,7 +133,7 @@ export class ArduinoDaemonImpl } getExecPath(): string { - return getExecPath('arduino-cli'); + return arduinoCliPath; } protected async getSpawnArgs(): Promise<string[]> { 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 c8c4b3578..f7f22d1d2 100644 --- a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts +++ b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts @@ -5,8 +5,9 @@ import { ArduinoFirmwareUploader, FirmwareInfo, } from '../common/protocol/arduino-firmware-uploader'; -import { getExecPath, spawnCommand } from './exec-util'; +import { spawnCommand } from './exec-util'; import { MonitorManager } from './monitor-manager'; +import { arduinoFirmwareUploaderPath } from './resources'; @injectable() export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { @@ -74,7 +75,10 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { } private async runCommand(args: string[]): Promise<string> { - const execPath = getExecPath('arduino-fwuploader'); - return await spawnCommand(execPath, args, this.onError.bind(this)); + 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 d40a462e2..02d534044 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -111,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'; diff --git a/arduino-ide-extension/src/node/auth/authentication-server.ts b/arduino-ide-extension/src/node/auth/authentication-server.ts index 89d647a05..5d593166d 100644 --- a/arduino-ide-extension/src/node/auth/authentication-server.ts +++ b/arduino-ide-extension/src/node/auth/authentication-server.ts @@ -1,5 +1,5 @@ -import * as http from 'node:http'; -import * as url from 'node:url'; +import http from 'node:http'; +import url from 'node:url'; import { body } from './body'; import { authServerPort } from '../../common/protocol/authentication-service'; 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/clang-formatter.ts b/arduino-ide-extension/src/node/clang-formatter.ts index 306ee6a63..d29778b45 100644 --- a/arduino-ide-extension/src/node/clang-formatter.ts +++ b/arduino-ide-extension/src/node/clang-formatter.ts @@ -6,7 +6,9 @@ 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 { @@ -37,7 +39,7 @@ export class ClangFormatter implements Formatter { } private execPath(): string { - return getExecPath('clang-format'); + return clangFormatPath; } /** @@ -129,10 +131,9 @@ function styleJson({ TabWidth, UseTab, }: ClangFormatOptions): Record<string, unknown> { - // Source: https://github.com/arduino/tooling-project-assets/tree/main/other/clang-format-configuration - const defaultConfig = require('../../src/node/default-formatter-config.json'); return { - ...defaultConfig, + // Source: https://github.com/arduino/tooling-project-assets/tree/main/other/clang-format-configuration + ...defaultClangFormat, TabWidth, UseTab, }; diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index cb3559688..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 'node:fs'; import { dirname } from 'node:path'; -import * as yaml from 'js-yaml'; +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<string> { - return require('../../package.json').arduino?.cli?.version || ''; - } - private async initConfig(): Promise<void> { this.logger.info('>>> Initializing CLI configuration...'); try { diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index eca7a35fc..1199f729e 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -4,7 +4,7 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { join } from 'node:path'; -import * as fs from 'node:fs'; +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 f40f6d737..b93b48eb3 100644 --- a/arduino-ide-extension/src/node/exec-util.ts +++ b/arduino-ide-extension/src/node/exec-util.ts @@ -1,18 +1,4 @@ import { spawn } from 'node:child_process'; -import os from 'node:os'; -import { join } from 'node:path'; - -export type ArduinoBinaryName = - | 'arduino-cli' - | 'arduino-fwuploader' - | 'arduino-language-server'; -export type ClangBinaryName = 'clangd' | 'clang-format'; -export type BinaryName = ArduinoBinaryName | ClangBinaryName; - -export function getExecPath(binaryName: BinaryName): string { - const filename = `${binaryName}${os.platform() === 'win32' ? '.exe' : ''}`; - return join(__dirname, '..', '..', 'build', filename); -} export function spawnCommand( command: string, diff --git a/arduino-ide-extension/src/node/executable-service-impl.ts b/arduino-ide-extension/src/node/executable-service-impl.ts index a22609e2b..9501079d1 100644 --- a/arduino-ide-extension/src/node/executable-service-impl.ts +++ b/arduino-ide-extension/src/node/executable-service-impl.ts @@ -1,7 +1,11 @@ import { FileUri } from '@theia/core/lib/node/file-uri'; import { injectable } from '@theia/core/shared/inversify'; import { ExecutableService } from '../common/protocol/executable-service'; -import { getExecPath } from './exec-util'; +import { + arduinoCliPath, + arduinoLanguageServerPath, + clangdPath, +} from './resources'; @injectable() export class ExecutableServiceImpl implements ExecutableService { @@ -11,9 +15,9 @@ export class ExecutableServiceImpl implements ExecutableService { lsUri: string; }> { return { - clangdUri: FileUri.create(getExecPath('clangd')).toString(), - cliUri: FileUri.create(getExecPath('arduino-cli')).toString(), - lsUri: FileUri.create(getExecPath('arduino-language-server')).toString(), + clangdUri: FileUri.create(clangdPath).toString(), + cliUri: FileUri.create(arduinoCliPath).toString(), + lsUri: FileUri.create(arduinoLanguageServerPath).toString(), }; } } 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 c0165e97d..66868d80b 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -3,46 +3,56 @@ import { LocalizationRegistry, } from '@theia/core/lib/node/i18n/localization-contribution'; import { injectable } from '@theia/core/shared/inversify'; -import { join } from 'node: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 uk_UAJson from '../resources/i18n/uk_UA.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'], - ['zh-tw', 'zh-Hant'], - ]; + private readonly locales: Readonly<Record<string, unknown>> = { + bg: bgJson, + cs: csJson, + de: deJson, + es: esJson, + fr: frJson, + hu: huJson, + // id: Does not have Transifex translations, but has a VS Code language pack available on Open VSX. + it: itJson, + ja: jaJson, + ko: koJson, + nl: nlJson, + pl: plJson, + 'pt-br': ptJson, + ru: [ruJson], + tr: [trJson], + uk: uk_UAJson, + 'zh-cn': zhJson, + 'zh-tw': zh_HantJson, + }; async registerLocalizations(registry: LocalizationRegistry): Promise<void> { - 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 4401a4432..dc65a2faf 100644 --- a/arduino-ide-extension/src/node/is-temp-sketch.ts +++ b/arduino-ide-extension/src/node/is-temp-sketch.ts @@ -1,4 +1,4 @@ -import * as fs from 'node:fs'; +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'; 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 68eab4a5c..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,4 +1,4 @@ -import * as fs from 'node:fs'; +import fs from 'node:fs'; import { join } from 'node:path'; import { injectable, @@ -38,19 +38,21 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { private pluggableMonitorSettingsPath: string; @postConstruct() - protected async init(): Promise<void> { - // get the monitor settings file path - const configDirUri = await this.envVariablesServer.getConfigDirUri(); - this.pluggableMonitorSettingsPath = join( - FileUri.fsPath(configDirUri), - MONITOR_SETTINGS_FILE - ); + protected init(): void { + (async () => { + // get the monitor settings file path + const configDirUri = await this.envVariablesServer.getConfigDirUri(); + this.pluggableMonitorSettingsPath = join( + FileUri.fsPath(configDirUri), + MONITOR_SETTINGS_FILE + ); - // read existing settings - await this.readSettingsFromFS(); + // read existing settings + await this.readSettingsFromFS(); - // init is done, resolve the deferred and unblock any call that was waiting for it - this.ready.resolve(); + // init is done, resolve the deferred and unblock any call that was waiting for it + this.ready.resolve(); + })(); } async getSettings( 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 aa97a8603..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 'node: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/theia/filesystem/nsfw-watcher/nsfw-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts similarity index 94% 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 e64b95e97..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 @@ -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>( NsfwFileSystemWatcherServiceProcessOptions ).toConstantValue({ - entryPoint: join(__dirname, 'index.js'), + entryPoint: join(__dirname, 'nsfw-watcher'), }); rebind<FileSystemWatcherService>(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/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<string>; onClientsNumberChanged: Event<number>; 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 9a5d3f875..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,6 +1,6 @@ -import * as fs from 'node:fs'; -import * as path from 'node: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 'node:child_process'; import { safeLoad, safeDump } from 'js-yaml'; 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 d10c56fc3..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,14 +1,15 @@ import { assert, expect } from 'chai'; import fs from 'node:fs'; import path from 'node:path'; -import { - ArduinoBinaryName, - BinaryName, - ClangBinaryName, - getExecPath, - spawnCommand, -} from '../../node/exec-util'; +import { spawnCommand } from '../../node/exec-util'; import temp from 'temp'; +import { + arduinoCliPath, + arduinoFirmwareUploaderPath, + arduinoLanguageServerPath, + clangdPath, + clangFormatPath, +} from '../../node/resources'; describe('exec-utils', () => { describe('spawnCommand', () => { @@ -26,7 +27,7 @@ describe('exec-utils', () => { 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 = getExecPath('arduino-cli'); + const cliPath = arduinoCliPath; const filename = path.basename(cliPath); const tempPath = tracked.mkdirSync(); const tempPathWitSpaces = path.join(tempPath, segment); @@ -44,7 +45,7 @@ describe('exec-utils', () => { type AssertOutput = (stdout: string) => void; interface GetExecPathTestSuite { - readonly name: BinaryName; + readonly binaryName: string; readonly flags?: string[]; readonly assertOutput: AssertOutput; /** @@ -54,29 +55,29 @@ describe('exec-utils', () => { readonly expectNonZeroExit?: boolean; } - const binaryNameToVersionMapping: Record<BinaryName, string> = { - 'arduino-cli': 'cli', - 'arduino-language-server': 'languageServer', - 'arduino-fwuploader': 'fwuploader', - clangd: 'clangd', - 'clang-format': 'clangd', + const binaryNameToPathMapping: Record<string, string> = { + 'arduino-cli': arduinoCliPath, + 'arduino-language-server': arduinoLanguageServerPath, + 'arduino-fwuploader': arduinoFirmwareUploaderPath, + clangd: clangdPath, + 'clang-format': clangFormatPath, }; - function readVersionFromPackageJson(name: BinaryName): string { + 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 mappedName = binaryNameToVersionMapping[name]; - expect(mappedName).to.be.not.undefined; - const version = json.arduino[mappedName].version; + const version = + json.arduino[binaryName === 'clang-format' ? 'clangd' : binaryName] + .version; expect(version).to.be.not.undefined; return version; } - function createTaskAssert(name: ArduinoBinaryName): AssertOutput { + function createTaskAssert(name: string): AssertOutput { const version = readVersionFromPackageJson(name); if (typeof version === 'string') { return (stdout: string) => { @@ -91,7 +92,7 @@ describe('exec-utils', () => { }; } - function createClangdAssert(name: ClangBinaryName): AssertOutput { + function createClangdAssert(name: string): AssertOutput { const version = readVersionFromPackageJson(name); return (stdout: string) => { expect(stdout.includes(name)).to.be.true; @@ -101,17 +102,17 @@ describe('exec-utils', () => { const suites: GetExecPathTestSuite[] = [ { - name: 'arduino-cli', + binaryName: 'arduino-cli', flags: ['version'], assertOutput: createTaskAssert('arduino-cli'), }, { - name: 'arduino-fwuploader', + binaryName: 'arduino-fwuploader', flags: ['version'], assertOutput: createTaskAssert('arduino-fwuploader'), }, { - name: 'arduino-language-server', + binaryName: 'arduino-language-server', assertOutput: (stderr: string) => { expect(stderr.includes('Path to ArduinoCLI config file must be set.')) .to.be.true; @@ -119,12 +120,12 @@ describe('exec-utils', () => { expectNonZeroExit: true, }, { - name: 'clangd', + binaryName: 'clangd', flags: ['--version'], assertOutput: createClangdAssert('clangd'), }, { - name: 'clang-format', + binaryName: 'clang-format', flags: ['--version'], assertOutput: createClangdAssert('clang-format'), }, @@ -133,13 +134,13 @@ describe('exec-utils', () => { // 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(binaryNameToVersionMapping).length + Object.keys(binaryNameToPathMapping).length ); }); suites.map((suite) => - it(`should resolve '${suite.name}'`, async () => { - const execPath = getExecPath(suite.name); + 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; 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 83ca39fbd..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,7 +1,7 @@ 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 * as assert from 'node:assert'; +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'; @@ -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<SketchRef>) => { - 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/docs/development.md b/docs/development.md index fe593c10e..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<sup>[[2]]</sup>. + +- providing access to the filesystem, +- communicating with the [Arduino CLI](https://github.com/arduino/arduino-cli) via gRPC, +- running your terminal, +- exposing additional RESTful APIs, +- performing the Git commands in the local repositories, +- hosting and running any VS Code extensions, or +- executing VS Code tasks<sup>[[2]]</sup>. The _Electron main_ process spawns the _backend_ process. There is always exactly one _backend_ process. However, due to performance considerations, the _backend_ spawns several sub-processes for the filesystem watching, Git repository discovery, etc. The communication between the _backend_ process and its sub-processes is established via IPC. Besides spawning sub-processes, the _backend_ will start an HTTP server on a random available port, and serves the web application as static content. When the sub-processes are up and running, and the HTTP server is also listening, the _backend_ process sends the HTTP server port to the _Electron main_ process via IPC. The _Electron main_ process will load the _backend_'s endpoint in the `BrowserWindow`. @@ -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 --- @@ -57,59 +65,140 @@ Please refer to the [Theia IDE prerequisites](https://github.com/eclipse-theia/t 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 + + - <kbd>Ctrl/⌘</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> to open the _Command Palette_. + - Type `Tasks: Run Task` and press <kbd>Enter</kbd>. + - Type `Rebuild App` and press <kbd>Enter</kbd>. + - Wait for the "Rebuild App" task to finish, as indicated by a "✔ Rebuild Complete" message in the Terminal. + +6. Start the TypeScript compiler + `webpack` in watch mode + + - <kbd>Ctrl/⌘</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>. + - Type `Tasks: Run Task` and press <kbd>Enter</kbd>. + - Type `Watch All` and press <kbd>Enter</kbd>. + - Select how you want to scan the task output. You can press <kbd>Enter</kbd> or <kbd>Esc</kbd>. [Click](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher) here to learn more. -2. Rebuild the dependencies - ```sh - yarn rebuild:browser - ``` +7. Start the application in debug mode + - Open the _Run and Debug_ view with <kbd>Ctrl/⌘</kbd>+<kbd>Shift</kbd>+<kbd>D</kbd>, + - Select `App` from the dropdown, + - Start debugging with <kbd>F5</kbd>. -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 <kbd>F5</kbd>. + +### CI + +This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide/actions). + +- _Snapshot_ builds run when changes are pushed to the `main` branch, or when a PR is created against the `main` branch. For the sake of the review and verification process, the build artifacts for each operating system can be downloaded from the GitHub Actions page. +- _Nightly_ builds run every day at 03:00 GMT from the `main` branch. +- _Release_ builds run when a new tag is pushed to the remote. The tag must follow the [semver](https://semver.org/). For instance, `1.2.3` is a correct tag, but `v2.3.4` won't work. Steps to trigger a new release build: + - Create a local tag: + ```sh + git tag -a 1.2.3 -m "Creating a new tag for the `1.2.3` release." + ``` + - Push it to the remote: + ```sh + git push origin 1.2.3 + ``` + ## FAQ -* *Can I manually change the version of the [`arduino-cli`](https://github.com/arduino/arduino-cli/) used by the IDE?* +- _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/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 6721301a3..3803fecbb 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -3,32 +3,57 @@ "name": "electron-app", "version": "2.1.2", "license": "AGPL-3.0-or-later", - "main": "src-gen/frontend/electron-main.js", + "main": "./src-gen/backend/electron-main.js", "dependencies": { - "@theia/core": "1.37.0", - "@theia/debug": "1.37.0", - "@theia/editor": "1.37.0", - "@theia/electron": "1.37.0", - "@theia/filesystem": "1.37.0", - "@theia/keymaps": "1.37.0", - "@theia/messages": "1.37.0", - "@theia/monaco": "1.37.0", - "@theia/navigator": "1.37.0", - "@theia/plugin-ext": "1.37.0", - "@theia/plugin-ext-vscode": "1.37.0", - "@theia/preferences": "1.37.0", - "@theia/terminal": "1.37.0", - "@theia/workspace": "1.37.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.1.2" }, "devDependencies": { - "@theia/cli": "1.37.0", - "electron": "^23.2.4" + "@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", @@ -62,7 +87,8 @@ }, "backend": { "config": { - "configDirName": ".arduinoIDE" + "configDirName": ".arduinoIDE", + "singleInstance": true } }, "generator": { @@ -70,5 +96,131 @@ "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", + "!**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 52% rename from electron/packager/utils.js rename to electron-app/scripts/archive.js index 9e4e00ea3..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,84 +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'; - -/** - * @param {readonly string[]} args - */ -async function git(args) { - try { - const git = shell.which('git'); - const error = shell.error(); - if (error) { - throw new Error(error); - } - if (!git) { - throw new Error("Could not find 'git' on the $PATH"); - } - const stdout = await exec(git.toString(), args); - return stdout; - } 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] - ); -} - -/** - * @param {string} command - * @param {readonly string[]} args - */ -async function exec(command, args) { - const execa = await import('execa'); - const promise = execa.execa(command, args); - if (promise.pipeStdout) { - promise.pipeStdout(process.stdout); - } - const { stdout } = await promise; - return stdout; -} - -module.exports = { - adjustArchiveStructure, - isZip, - unpack, - isNightly, - isRelease, - isElectronPublish, - git, - getChannelFile, - exec, -}; +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<string>} + */ +async function getVersion() { + /** @type {string} */ + let version = require('../package.json').version; + if (!semver.valid(version)) { + throw new Error( + `Could not read version from root package.json. Version was: '${version}'.` + ); + } + if (!isRelease) { + if (isNightly) { + version = `${version}-nightly-${await timestamp()}`; + } else { + version = `${version}-snapshot-${await currentCommitish()}`; + } + if (!semver.valid(version)) { + throw new Error(`Invalid patched version: '${version}'.`); + } + } + return version; +} + +/** + * @param {string} version + * @returns {Promise<string>} + */ +async function getArtifactName(version) { + const { platform, arch } = process; + version = isNightly ? `nightly-${await timestamp()}` : version; + const name = 'arduino-ide'; + switch (platform) { + case 'win32': { + if (arch === 'x64') { + return `${name}_${version}_Windows_64bit.\$\{ext}`; + } + throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); + } + case 'darwin': { + if (arch === 'arm64') { + return `${name}_${version}_macOS_arm64.\$\{ext}`; + } + return `${name}_${version}_macOS_64bit.\$\{ext}`; + } + case 'linux': { + switch (arch) { + case 'arm': { + return `${name}_${version}_Linux_armv7.\$\{ext}`; + } + case 'arm64': { + return `${name}_${version}_Linux_arm64.\$\{ext}`; + } + case 'x64': { + return `${name}_${version}_Linux_64bit.\$\{ext}`; + } + default: { + throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); + } + } + } + default: + throw new Error(`Unsupported platform, arch: ${platform}, ${arch}`); + } +} + +function getChannel() { + if (isRelease) { + return 'stable'; + } + if (isNightly) { + return 'nightly'; + } + return ''; +} + +async function timestamp() { + const { default: dateFormat } = await import('dateformat'); + return dateFormat(new Date(), 'yyyymmdd'); +} + +async function currentCommitish() { + return exec('git', ['rev-parse', '--short', 'HEAD']); +} + +/** + * @param {string} command + * @param {readonly string[]} args + * @param {import('execa').Options<string> | undefined} [options] + * @returns {Promise<string>} + */ +async function exec(command, args, options) { + const execa = await import('execa'); + const promise = execa.execa(command, args, options); + const { stdout } = await promise; + return stdout; +} + +run(); diff --git a/electron-app/scripts/post-package.js b/electron-app/scripts/post-package.js new file mode 100644 index 000000000..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 63% rename from electron/packager/test/utils.test.js rename to electron-app/test/archive.test.js index 5b6ff045b..4af3e21f3 100644 --- a/electron/packager/test/utils.test.js +++ b/electron-app/test/archive.test.js @@ -1,30 +1,38 @@ +// @ts-check +'use strict'; + const fs = require('node:fs'); const path = require('node:path'); -const expect = require('chai').expect; -const track = require('temp').track(); -const unpack = require('../utils').unpack; -const testMe = require('../utils'); -const sinon = require('sinon'); +const { expect } = require('chai'); +const temp = require('temp'); +const { unpack, adjustArchiveStructure } = require('../scripts/archive'); -describe('utils', () => { +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 index 4ff6cca03..0db6b8024 100644 --- a/electron-app/webpack.config.js +++ b/electron-app/webpack.config.js @@ -1,8 +1,14 @@ +const path = require('node:path'); const webpack = require('webpack'); -const configs = require('./gen-webpack.config.js'); +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 = configs[0]; +const mainWindowConfig = frontend[0]; mainWindowConfig.resolve.extensions.push('.ts'); mainWindowConfig.resolve.fallback['util'] = require.resolve('util/'); mainWindowConfig.plugins?.push( @@ -13,5 +19,44 @@ mainWindowConfig.plugins?.push( process: 'process/browser', }) ); +const preloadConfig = frontend[2]; -module.exports = configs; +// 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 6f41b4ed3..000000000 --- a/electron/build/patch/backend/main.js +++ /dev/null @@ -1,46 +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'); -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 () { - const messages = Object.values(arguments); - const message = util.format(...messages) - original(message) - log(message); - } -} - -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 901ffcbfe..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.37.0", - "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.14.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 ed8a57833..000000000 --- a/electron/packager/config.js +++ /dev/null @@ -1,155 +0,0 @@ -//@ts-check - -const fs = require('node:fs'); -const path = require('node:path'); -const semver = require('semver'); -const merge = require('deepmerge'); -const dateFormat = require('dateformat'); -const { isNightly, isRelease, git } = require('./utils'); - -async function artifactName() { - const { platform, arch } = process; - const id = await (() => { - 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}.`); - } -} - -async function getVersion() { - const repositoryRootPath = await 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-${await 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'); -} - -async function currentCommitish() { - return git(['rev-parse', '--short', 'HEAD']); -} - -// function currentBranch() { -// return git('rev-parse --abbrev-ref HEAD'); -// } - -async 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 = await 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: await 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 c8fae293e..000000000 --- a/electron/packager/index.js +++ /dev/null @@ -1,565 +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('node:fs'); - const join = require('node: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 = await 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']; - await Promise.all( - foldersToSyncFromDev.map((filename) => - exec('git', [ - '-C', - join(repoRoot, 'electron', 'build', filename), - 'clean', - '-ffxdq', - ]) - ) - ); - - //----------------------------------------------------+ - // Copy the Theia preload, etc. from `./electron-app` | - //----------------------------------------------------+ - const filesToSyncFromDev = ['webpack.config.js']; - for (const filename of [...foldersToSyncFromDev, ...filesToSyncFromDev]) { - 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) { - await exec( - 'yarn', - ['--network-timeout', '1000000', '--cwd', join(repoRoot, extension)], - `Building and testing ${extension}` - ); - await 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; - await 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. | - //-------------------------------------------------------------------------------------------+ - await exec( - 'yarn', - [ - '--network-timeout', - '1000000', - '--cwd', - join(repoRoot, 'electron', 'build'), - '--registry', - 'http://localhost:4873', - ], - 'Installing dependencies' - ); - await exec( - 'yarn', - ['--cwd', join(repoRoot, 'electron', 'build'), 'build'], - `Building the ${productName} application` - ); - await 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. | - //-----------------------------------+ - await 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. | - //--------+ - /** - * @param {string} command - * @param {readonly string[]} args - */ - async function exec(command, args, toEcho = '') { - if (toEcho) { - echo(`⏱️ >>> ${toEcho}...`); - } - const stdout = await utils.exec(command, args); - if (toEcho) { - echo(`👌 <<< ${toEcho}.`); - } - return stdout.trim(); - } - - 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('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, - }); - }); - } - - /** - * @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<import('node:child_process').ChildProcess>} - */ - function startNpmRegistry(configPath) { - return new Promise((resolve, reject) => { - const fork = require('node: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 e0e315eaa..000000000 --- a/electron/packager/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "private": true, - "name": "packager", - "version": "1.0.0", - "description": "Packager for the Arduino IDE electron application", - "main": "index.js", - "scripts": { - "prepare": "yarn test", - "package": "node index.js", - "test": "mocha \"./test/**/*.test.js\"" - }, - "keywords": [], - "author": "Arduino SA", - "license": "AGPL-3.0-or-later", - "dependencies": { - "7zip-min": "^1.1.1", - "chai": "^4.2.0", - "dateformat": "^3.0.3", - "deepmerge": "2.01", - "execa": "^7.1.1", - "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" - }, - "engines": { - "node": ">=16.14.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 701f58573..000000000 --- a/electron/packager/yarn.lock +++ /dev/null @@ -1,3006 +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/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" "*" - -"@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@^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@^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" - -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@^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== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -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@^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" - -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@^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@^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@^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.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== - -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" - -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== - -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== - -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@^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@^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-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== - -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" - -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== - -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== - -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.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@^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== - -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== - -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@^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" - -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" - -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" - -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-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@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-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.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@^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.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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -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.2, 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== - -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.2 || 2": - 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@^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-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-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: - 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" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - 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@^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@^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-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" - -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/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 464be7783..3d07690f0 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,10 @@ "node": ">=16.14.0 <17" }, "devDependencies": { - "@theia/cli": "1.37.0", - "@types/sinon": "^2.3.5", + "@theia/cli": "1.39.0", "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", - "cross-env": "^7.0.2", + "@xhmikosr/downloader": "^13.0.1", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", @@ -23,8 +22,9 @@ "eslint-plugin-unused-imports": "^2.0.0", "husky": "^6.0.0", "ignore-styles": "^5.0.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", @@ -35,15 +35,16 @@ "xhr2": "^0.2.1" }, "scripts": { - "prepare": "lerna run prepare && yarn download:plugins", + "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", @@ -66,31 +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-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.70.0/file/MS-CEINTL.vscode-language-pack-cs-1.70.0.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.70.0/file/MS-CEINTL.vscode-language-pack-de-1.70.0.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.70.0/file/MS-CEINTL.vscode-language-pack-es-1.70.0.vsix", - "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.70.0/file/MS-CEINTL.vscode-language-pack-fr-1.70.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.70.0/file/MS-CEINTL.vscode-language-pack-it-1.70.0.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.70.0/file/MS-CEINTL.vscode-language-pack-ja-1.70.0.vsix", - "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.70.0/file/MS-CEINTL.vscode-language-pack-ko-1.70.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.70.0/file/MS-CEINTL.vscode-language-pack-pl-1.70.0.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.70.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.70.0.vsix", - "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.70.0/file/MS-CEINTL.vscode-language-pack-ru-1.70.0.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.70.0/file/MS-CEINTL.vscode-language-pack-tr-1.70.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.70.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.70.0.vsix", - "vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.70.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.70.0.vsix" - } + ] } diff --git a/scripts/i18n/transifex-pull.js b/scripts/i18n/transifex-pull.js index b92a67cf1..31c61d66b 100644 --- a/scripts/i18n/transifex-pull.js +++ b/scripts/i18n/transifex-pull.js @@ -4,9 +4,7 @@ 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( @@ -14,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 = []; @@ -46,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()); @@ -62,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) { @@ -101,12 +100,12 @@ 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); @@ -141,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, { @@ -152,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 74640bac9..64517dd61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,23 @@ # yarn lockfile v1 +"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: + "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== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -10,405 +27,274 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@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.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" - integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== +"@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.21.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" - integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + 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.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.4" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.4" - "@babel/types" "^7.21.4" + "@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.2" - semver "^6.3.0" + semver "^6.3.1" -"@babel/generator@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" - integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== +"@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.21.4" + "@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== +"@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.18.6" + "@babel/types" "^7.22.5" -"@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== +"@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/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" - integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== +"@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.21.4" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" + "@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.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz#40411a8ab134258ad2cf3a3d987ec6aa0723cee5" - integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" + 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.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@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.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@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.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-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== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@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== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@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.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.9": - 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-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-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@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/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@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/types" "^7.20.2" + "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@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.20.0" + "@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-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-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@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== +"@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/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.20.7", "@babel/parser@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" - integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@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.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@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/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-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== +"@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.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@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.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@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-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.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-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.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@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.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@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.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@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.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@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.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.19.0" + "@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" @@ -521,301 +421,434 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@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.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@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-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@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.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.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@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.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@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.20.2" + "@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.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@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.20.2" + "@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.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@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.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@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.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@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-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@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-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-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@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-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^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-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-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-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-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-replace-supers" "^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-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@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.20.2" + "@babel/helper-module-transforms" "^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-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-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.22.5" + +"@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.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@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.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.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@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.20.2" + "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.1" -"@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-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.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.10.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.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.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@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.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@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.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@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.9" + "@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.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.4.tgz#a952482e634a8dd8271a3fe5459a16eb10739c58" - integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== - dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@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.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@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.20.0" + "@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" @@ -825,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.20.7" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.20.7" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@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.21.0" - "@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.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.20.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@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.10" - "@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.21.4" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.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" @@ -882,46 +932,54 @@ 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.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + 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.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" - integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.4" - "@babel/types" "^7.21.4" +"@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.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== +"@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-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@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" @@ -942,93 +1000,106 @@ optionalDependencies: global-agent "^3.0.0" -"@emotion/babel-plugin@^11.10.6": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" - integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== +"@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.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/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.7" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" - integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== +"@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.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + 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.6" - "@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== +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" 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/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== -"@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/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== -"@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/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== -"@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/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== -"@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== +"@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" @@ -1038,18 +1109,18 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.0.tgz#f6f729b02feee2c749f57e334b7a1b5f40a81724" - integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@eslint/eslintrc@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02" - integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== +"@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: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.1" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1057,51 +1128,46 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.39.0": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" - integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== +"@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== -"@floating-ui/core@^1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0" - integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== +"@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.2.6" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.6.tgz#bcf0c7bada97c20d9d1255b889f35bac838c63fe" - integrity sha512-02vxFDuvuVPs22iJICacezYJyf7zwwOCWkPNkWNBr1U0Qt1cKFYzWvxts0AmqcOQGwt/3KJWcWIgtbUU38keyw== + version "1.4.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.5.tgz#336dfb9870c98b471ff5802002982e489b8bd1c5" + integrity sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw== dependencies: - "@floating-ui/core" "^1.2.6" - -"@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== + "@floating-ui/core" "^1.3.1" "@grpc/grpc-js@^1.8.14": - version "1.8.14" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.14.tgz#4fe0f9917d6f094cf59245763c275442b182e9ad" - integrity sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A== + version "1.8.18" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.18.tgz#fdbf2728064fd3db7e72e970372db28bd0f6fafb" + integrity sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ== dependencies: "@grpc/proto-loader" "^0.7.0" "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.7.0": - version "0.7.6" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.6.tgz#b71fdf92b184af184b668c4e9395a5ddc23d61de" - integrity sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw== + 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: "@types/long" "^4.0.1" lodash.camelcase "^4.3.0" long "^4.0.0" - protobufjs "^7.0.0" - yargs "^16.2.0" + protobufjs "^7.2.4" + yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@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: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1122,17 +1188,24 @@ 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== +"@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: + 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" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@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: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" @@ -1153,10 +1226,10 @@ 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.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== +"@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: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" @@ -1184,101 +1257,40 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@lerna/child-process@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.6.1.tgz#e31bc411ad6d474cf7b676904da6f77f58fd64eb" - integrity sha512-yUCDCcRNNbI9UUsUB6FYEmDHpo5Tn/f0q5D7vhDP4i6Or8kBj82y7+e31hwfLvK2ykOYlDVs2MxAluH/+QUBOQ== +"@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: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-6.6.1.tgz#fc20f09e10b612d424a576775ad6eefe6aa96517" - integrity sha512-GDmHFhQ0mr0RcXWXrsLyfMV6ch/dZV/Ped1e6sFVQhsLL9P+FFXX1ZWxa/dQQ90VWF2qWcmK0+S/L3kUz2xvTA== +"@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" "6.6.1" - dedent "^0.7.0" - fs-extra "^9.1.0" - init-package-json "^3.0.2" + "@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" - pacote "^13.6.1" - pify "^5.0.0" + pacote "^15.2.0" + 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" + validate-npm-package-name "5.0.0" yargs-parser "20.2.4" -"@lerna/legacy-package-management@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@lerna/legacy-package-management/-/legacy-package-management-6.6.1.tgz#1f44af40098b9396a4f698514ff2b87016b1ee3d" - integrity sha512-0EYxSFr34VgeudA5rvjGJSY7s4seITMVB7AJ9LRFv9QDUk6jpvapV13ZAaKnhDTxX5vNCfnJuWHXXWq0KyPF/Q== +"@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: - "@npmcli/arborist" "6.2.3" - "@npmcli/run-script" "4.1.7" - "@nrwl/devkit" ">=15.5.2 < 16" - "@octokit/rest" "19.0.3" - byte-size "7.0.0" - chalk "4.1.0" - clone-deep "4.0.1" - cmd-shim "5.0.0" - columnify "1.6.0" - config-chain "1.1.12" - conventional-changelog-core "4.2.4" - conventional-recommended-bump "6.1.0" - cosmiconfig "7.0.0" - dedent "0.7.0" - dot-prop "6.0.1" - execa "5.0.0" - file-url "3.0.0" - find-up "5.0.0" - fs-extra "9.1.0" - 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.10" - has-unicode "2.0.1" - inquirer "8.2.4" - is-ci "2.0.0" - is-stream "2.0.0" - libnpmpublish "6.0.4" - load-json-file "6.2.0" - 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.3" - npmlog "6.0.2" - p-map "4.0.0" - p-map-series "2.1.0" - p-queue "6.6.2" - p-waterfall "2.1.1" - pacote "13.6.2" - pify "5.0.0" - pretty-format "29.4.3" - read-cmd-shim "3.0.0" - read-package-json "5.0.1" - resolve-from "5.0.0" - 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" - tempy "1.0.0" - upath "2.0.1" - uuid "8.3.2" - write-file-atomic "4.0.1" - write-pkg "4.0.0" - yargs "16.2.0" + cross-spawn "^7.0.1" "@malept/cross-spawn-promise@^2.0.0": version "2.0.0" @@ -1287,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.10" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" - integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + 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" @@ -1332,6 +1354,11 @@ 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== +"@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" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1353,53 +1380,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@6.2.3": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.2.3.tgz#31f8aed2588341864d3811151d929c01308f8e71" - integrity sha512-lpGOC2ilSJXcc2zfW9QtukcCTcMbl3fVI0z4wvFB2AFIl0C+Q6Wv7ccrpdrQa8rvJ1ZVuc6qkX7HVTyKlzGqKA== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/fs" "^3.1.0" - "@npmcli/installed-package-contents" "^2.0.0" - "@npmcli/map-workspaces" "^3.0.2" - "@npmcli/metavuln-calculator" "^5.0.0" - "@npmcli/name-from-folder" "^2.0.0" - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^3.0.0" - "@npmcli/query" "^3.0.0" - "@npmcli/run-script" "^6.0.0" - bin-links "^4.0.1" - cacache "^17.0.4" - common-ancestor-path "^1.0.1" - hosted-git-info "^6.1.1" - json-parse-even-better-errors "^3.0.0" - json-stringify-nice "^1.1.4" - minimatch "^6.1.6" - nopt "^7.0.0" - npm-install-checks "^6.0.0" - npm-package-arg "^10.1.0" - npm-pick-manifest "^8.0.1" - npm-registry-fetch "^14.0.3" - npmlog "^7.0.1" - pacote "^15.0.8" - parse-conflict-json "^3.0.0" - proc-log "^3.0.0" - promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.1" - read-package-json-fast "^3.0.2" - semver "^7.3.7" - ssri "^10.0.1" - treeverse "^3.0.0" - walk-up-path "^1.0.0" - -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== - dependencies: - "@gar/promisify" "^1.1.3" - semver "^7.3.5" - "@npmcli/fs@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" @@ -1407,25 +1387,10 @@ dependencies: 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== - dependencies: - "@npmcli/promise-spawn" "^3.0.0" - lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" - promise-inflight "^1.0.1" - promise-retry "^2.0.1" - semver "^7.3.5" - which "^2.0.2" - "@npmcli/git@^4.0.0": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" - integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== + 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" "^6.0.0" lru-cache "^7.4.4" @@ -1436,15 +1401,7 @@ semver "^7.3.5" which "^3.0.0" -"@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/installed-package-contents@^2.0.0", "@npmcli/installed-package-contents@^2.0.1": +"@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== @@ -1452,63 +1409,11 @@ npm-bundled "^3.0.0" npm-normalize-package-bin "^3.0.0" -"@npmcli/map-workspaces@^3.0.2": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.3.tgz#476944b63cd1f65bf83c6fdc7f4ca7be56906b1f" - integrity sha512-HlCvFuTzw4UNoKyZdqiNrln+qMF71QJkxy2dsusV8QQdoa89e2TF4dATCzBxbl4zzRzdDoWWyP5ADVrNAH9cRQ== - dependencies: - "@npmcli/name-from-folder" "^2.0.0" - glob "^9.3.1" - minimatch "^7.4.2" - read-package-json-fast "^3.0.0" - -"@npmcli/metavuln-calculator@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" - integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== - dependencies: - cacache "^17.0.0" - json-parse-even-better-errors "^3.0.0" - pacote "^15.0.0" - semver "^7.3.5" - -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@npmcli/name-from-folder@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" - integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== - -"@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@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-3.0.0.tgz#c9219a197e1be8dbf43c4ef8767a72277c0533b6" - integrity sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg== - dependencies: - json-parse-even-better-errors "^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== - dependencies: - infer-owner "^1.0.4" - "@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" @@ -1516,39 +1421,10 @@ dependencies: which "^3.0.0" -"@npmcli/query@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.0.tgz#51a0dfb85811e04f244171f164b6bc83b36113a7" - integrity sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA== - dependencies: - postcss-selector-parser "^6.0.10" - -"@npmcli/run-script@4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" - integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== - 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" - -"@npmcli/run-script@^4.1.0": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" - integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== - 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" - -"@npmcli/run-script@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.0.tgz#f89e322c729e26ae29db6cc8cc76559074aac208" - integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== +"@npmcli/run-script@6.0.2", "@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== dependencies: "@npmcli/node-gyp" "^3.0.0" "@npmcli/promise-spawn" "^6.0.0" @@ -1556,75 +1432,81 @@ read-package-json-fast "^3.0.0" which "^3.0.0" -"@nrwl/cli@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.9.2.tgz#82537d3d85410b0143d37a3b4fade09675356084" - integrity sha512-QoCmyrcGakHAYTJaNBbOerRQAmqJHMYGCdqtQidV+aP9p1Dy33XxDELfhd+IYmGqngutXuEWChNpWNhPloLnoA== +"@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: + "@nx/devkit" "16.5.2" + +"@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.9.2" + nx "16.5.2" -"@nrwl/devkit@>=15.5.2 < 16": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.9.2.tgz#482b89f1bf88d3600b11f8b7e3e4452c5766eca4" - integrity sha512-2DvTstVZb91m+d4wqUJMBHQ3elxyabdmFE6/3aXmtOGeDxTyXyDzf/1O6JvBBiL8K6XC3ZYchjtxUHgxl/NJ5A== +"@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: + "@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/nx-darwin-arm64@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.2.tgz#612d8d714ec876cafd6f1483bf5565704d1b75be" - integrity sha512-Yv+OVsQt3C/hmWOC+YhJZQlsyph5w1BHfbp4jyCvV1ZXBbb8NdvwxgDHPWXxKPTc1EXuB7aEX3qzxM3/OWEUJg== - -"@nrwl/nx-darwin-x64@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.2.tgz#3f77bd90dbabf4782d81f773cfb2739a443e595f" - integrity sha512-qHfdluHlPzV0UHOwj1ZJ+qNEhzfLGiBuy1cOth4BSzDlvMnkuqBWoprfaXoztzYcus2NSILY1/7b3Jw4DAWmMw== - -"@nrwl/nx-linux-arm-gnueabihf@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.9.2.tgz#3374a5a1692b222ce18f2213a47b4d68fb509e70" - integrity sha512-0GzwbablosnYnnJDCJvAeZv8LlelSrNwUnGhe43saeoZdAew35Ay1E34zBrg/GCGTASuz+knEEYFM+gDD9Mc6A== - -"@nrwl/nx-linux-arm64-gnu@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.9.2.tgz#e3ec95c6ee3285c77422886cf4cbec1f04804460" - integrity sha512-3mFIY7iUTPG45hSIRaM2DmraCy8W6hNoArAGRrTgYw40BIJHtLrW+Rt7DLyvVXaYCvrKugWOKtxC+jG7kpIZVA== - -"@nrwl/nx-linux-arm64-musl@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.9.2.tgz#72ce601d256083ded7380c598f1b3eb4dc2a3472" - integrity sha512-FNBnXEtockwxZa4I3NqggrJp0YIbNokJvt/clrICP+ijOacdUDkv8mJedavobkFsRsNq9gzCbRbUScKymrOLrg== - -"@nrwl/nx-linux-x64-gnu@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.9.2.tgz#2da6bb50cd80d699310e91c7331baa6cfc8ce197" - integrity sha512-gHWsP5lbe4FNQCa1Q/VLxIuik+BqAOcSzyPjdUa4gCDcbxPa8xiE57PgXB5E1XUzOWNnDTlXa/Ll07/TIuKuog== - -"@nrwl/nx-linux-x64-musl@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.9.2.tgz#39b3bda5868a53b722f1d42700dce71c5ff3f6b9" - integrity sha512-EaFUukCbmoHsYECX2AS4pxXH933yesBFVvBgD38DkoFDxDoJMVt6JqYwm+d5R7S4R2P9U3l++aurljQTRq567Q== - -"@nrwl/nx-win32-arm64-msvc@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.9.2.tgz#bc350be5cb7d0bfa6c2c5ced40c5af163a457a2c" - integrity sha512-PGAe7QMr51ivx1X3avvs8daNlvv1wGo3OFrobjlu5rSyjC1Y3qHwT9+wdlwzNZ93FIqWOq09s+rE5gfZRfpdAg== - -"@nrwl/nx-win32-x64-msvc@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.9.2.tgz#3e46c3f7af196bdbf0deb336ec4f9448c54e4a9f" - integrity sha512-Q8onNzhuAZ0l9DNkm8D4Z1AEIzJr8JiT4L2fVBLYrV/R75C2HS3q7lzvfo6oqMY6mXge1cFPcrTtg3YXBQaSWA== - -"@nrwl/tao@15.9.2": - version "15.9.2" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.9.2.tgz#e970efa8b3fb828007b02286e9e505247032b5b3" - integrity sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA== - dependencies: - nx "15.9.2" +"@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" @@ -1634,11 +1516,9 @@ "@octokit/types" "^6.0.3" "@octokit/auth-token@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c" - integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA== - dependencies: - "@octokit/types" "^9.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" @@ -1653,10 +1533,10 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/core@^4.0.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" - integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== +"@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" @@ -1676,9 +1556,9 @@ universal-user-agent "^6.0.0" "@octokit/endpoint@^7.0.0": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1" - integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== dependencies: "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" @@ -1694,9 +1574,9 @@ universal-user-agent "^6.0.0" "@octokit/graphql@^5.0.0": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2" - integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== dependencies: "@octokit/request" "^6.0.0" "@octokit/types" "^9.0.0" @@ -1707,15 +1587,10 @@ 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@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-17.0.0.tgz#7356d287f48b20e9a1f497ef8dfaabdff9cf8622" - integrity sha512-V8BVJGN0ZmMlURF55VFHFd/L92XQQ43KvFjNmY1IYbCN3V/h/uUFV6iQi19WEHM395Nn+1qhUbViCAD/1czzog== +"@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": version "6.0.1" @@ -1729,12 +1604,13 @@ dependencies: "@octokit/types" "^6.40.0" -"@octokit/plugin-paginate-rest@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" - integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== +"@octokit/plugin-paginate-rest@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== dependencies: - "@octokit/types" "^6.41.0" + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" @@ -1749,13 +1625,12 @@ "@octokit/types" "^6.39.0" deprecation "^2.3.1" -"@octokit/plugin-rest-endpoint-methods@^6.0.0": - version "6.8.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz#97391fda88949eb15f68dc291957ccbe1d3e8ad1" - integrity sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg== +"@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.1.1" - 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" @@ -1788,9 +1663,9 @@ universal-user-agent "^6.0.0" "@octokit/request@^6.0.0": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4" - integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA== + 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" @@ -1799,15 +1674,15 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" - integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== +"@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.0.0" - "@octokit/plugin-paginate-rest" "^3.0.0" + "@octokit/core" "^4.2.1" + "@octokit/plugin-paginate-rest" "^6.1.2" "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.0.0" + "@octokit/plugin-rest-endpoint-methods" "^7.1.2" "@octokit/rest@^18.12.0": version "18.12.0" @@ -1819,26 +1694,31 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0", "@octokit/types@^6.41.0": +"@octokit/tsconfig@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== + +"@octokit/types@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": version "6.41.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== dependencies: "@octokit/openapi-types" "^12.11.0" -"@octokit/types@^8.1.1": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.2.1.tgz#a6de091ae68b5541f8d4fcf9a12e32836d4648aa" - integrity sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw== - dependencies: - "@octokit/openapi-types" "^14.0.0" - -"@octokit/types@^9.0.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.1.1.tgz#8a71f05c4e72fe51aac2c66ed71999abdd7e2777" - integrity sha512-hFheiHJEZzE5qn/u4R2IeMLXqUzXgd1vSokHS5x4oq+klHhXNFLL69kanAtrlTqj3K9Dps9XhOqOtDhDmPdlxQ== +"@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" "^17.0.0" + "@octokit/openapi-types" "^18.0.0" "@parcel/watcher@2.0.4": version "2.0.4" @@ -1947,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.7" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" - integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== + 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" @@ -2024,10 +1909,18 @@ resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@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" @@ -2041,20 +1934,15 @@ dependencies: execa "^2.0.1" -"@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== - "@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.3.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.3.0.tgz#0ec9264cf54a527671d990eb874e030b55b70dcc" - integrity sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw== + 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" @@ -2080,17 +1968,18 @@ dependencies: defer-to-connect "^2.0.1" -"@theia/application-manager@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.37.0.tgz#10341b4e153a678b42381c510d57247397455b2b" - integrity sha512-ZSczn9K7TzkEUrog4D1pXdAK/MQHXfEHOOpDpu4N0yYD0vraj08ZjbLHx5uLTRM8fk+HHZQsN7gYHOko970SYg== +"@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.37.0" - "@theia/ffmpeg" "1.37.0" + "@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" @@ -2104,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" @@ -2118,12 +2008,12 @@ worker-loader "^3.0.8" yargs "^15.3.1" -"@theia/application-package@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.37.0.tgz#51797e73334e9a69e127586d99f8c3cc11a38fac" - integrity sha512-SgQM4ZNlNEDUtLjxfIkVaLN/yLOnZ/QQprJJSUEp7KKyEHeiJEnAICxrwdIEP9Wp4WsqXG23R0UwIkSUV/pNug== +"@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.37.0" + "@theia/request" "1.39.0" "@types/fs-extra" "^4.0.2" "@types/semver" "^5.4.0" "@types/write-json-file" "^2.2.1" @@ -2135,38 +2025,38 @@ semver "^5.4.1" write-json-file "^2.2.0" -"@theia/bulk-edit@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.37.0.tgz#e8f58f945fab8688b3d11572b2c1b7b68639b526" - integrity sha512-xq3eS4oYJnKQI0EkfBhbfNAoZnj6aVLOoA0N2VLRIut6zbdsuHJXC4MmeXJNgaRcYKj7XJAKn+BuAEOVH/A+dw== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/monaco" "1.37.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/workspace" "1.37.0" + "@theia/workspace" "1.39.0" -"@theia/callhierarchy@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.37.0.tgz#27fa1af388d75d3870dd83ea0abce5704ca259d5" - integrity sha512-q7E0A03rgzR1BfjgeLybvtGEDSPrp9NMrvu85bNEW9b8ajqUhnBYwlHyX6BLTUtfyrC+zXFE3INFYoHXzeP5xg== +"@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.37.0" - "@theia/editor" "1.37.0" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" ts-md5 "^1.2.2" -"@theia/cli@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.37.0.tgz#0c0aa06ec0cefd238b5a4cc9cba55266952e45fe" - integrity sha512-cs++uYk8Kv82OPizM4yiGeCMe03aB7XC3vtnFo85ukn7Hwk/9hx+rEOTjNCZobZkv8sUbbVIXI3F7U28knS4+w== - dependencies: - "@theia/application-manager" "1.37.0" - "@theia/application-package" "1.37.0" - "@theia/ffmpeg" "1.37.0" - "@theia/localization-manager" "1.37.0" - "@theia/ovsx-client" "1.37.0" - "@theia/request" "1.37.0" +"@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" "^10.0.0" "@types/node-fetch" "^2.5.7" @@ -2184,20 +2074,20 @@ temp "^0.9.1" yargs "^15.3.1" -"@theia/console@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.37.0.tgz#87144273a6550aef1a755cae19786feb352a0a91" - integrity sha512-82yuBXjTilsk3NPGJ2+mdRt7dHM7ylKUaQ6uEaz5AK5/Oix9wCIGFIe20bOidn1ArP1ECaje+C3TqJH3CzG1zw== +"@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.37.0" - "@theia/monaco" "1.37.0" + "@theia/core" "1.39.0" + "@theia/monaco" "1.39.0" "@theia/monaco-editor-core" "1.72.3" anser "^2.0.1" -"@theia/core@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.37.0.tgz#0cba3cdbcb64ed9b7833ba48cdfbae255175717e" - integrity sha512-Smrlhkq8Zw0i0w++pnmEqUB1yH3XUU6MKQ9l/vtl1vzKljcaB+/EmTOz6lfouj1SLoEU/tH0rwsC2GXGA4iMxQ== +"@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" @@ -2210,8 +2100,8 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" - "@theia/application-package" "1.37.0" - "@theia/request" "1.37.0" + "@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" @@ -2228,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" @@ -2242,7 +2133,7 @@ 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" @@ -2267,81 +2158,81 @@ ws "^7.1.2" yargs "^15.3.1" -"@theia/debug@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.37.0.tgz#87e45c73cc271a01a4ad8d0e536157f1209f5237" - integrity sha512-UU+A5TFMfAp/z5/NqO+y0+voJ0KgVOfoaOKPXJpg6hoZGU1CEKFbAuIGYjIwdKg1umca2lB2NpJNNl+/wT38kg== - dependencies: - "@theia/console" "1.37.0" - "@theia/core" "1.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/markers" "1.37.0" - "@theia/monaco" "1.37.0" +"@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.37.0" - "@theia/process" "1.37.0" - "@theia/task" "1.37.0" - "@theia/terminal" "1.37.0" - "@theia/variable-resolver" "1.37.0" - "@theia/workspace" "1.37.0" + "@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" p-debounce "^2.1.0" -"@theia/editor-preview@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.37.0.tgz#ef62129b1a276de57384461597ed8ef3134d5202" - integrity sha512-jQHDvJuZoknnd/Jo2YCVAQmP9GQT58H77DY0ofegsdLx4tKqFOWF7g5EyrPOHa34AgLrP5noeCJrbHGEni/r0Q== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/navigator" "1.37.0" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/navigator" "1.39.0" -"@theia/editor@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.37.0.tgz#abf82a36becb883fb65accc040832c733552c033" - integrity sha512-ZfCg71kXhBgqoRsjInLTM8rYPD8JHi18V4JjJ9EWiBvogjphkZdVc6U1lpS0FjFl9G+QkAArvCBOuwYbrVogrw== +"@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.37.0" - "@theia/variable-resolver" "1.37.0" + "@theia/core" "1.39.0" + "@theia/variable-resolver" "1.39.0" -"@theia/electron@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.37.0.tgz#a44608fad9a7ad62a0dd6cd657d62db6ad3015e6" - integrity sha512-d3aQ0E8g0FmVpT99fgrzRFpN9bl5LoIzEzwTTTFUOsDIN/TwGJ+AFmi1UpGn6nBMaszz1JClcrguuYvdJf3Djg== +"@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-store "^8.0.0" fix-path "^3.0.0" native-keymap "^2.2.1" -"@theia/ffmpeg@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.37.0.tgz#43100eae45f0b931f21c52e7cdb975c09fe2bf65" - integrity sha512-tW0eLSTQGYjMQrhjHjE8zip2yXD5M49Xh8b+ng+HQu327RrOsF+9E0pu9RDad8A48pub8PAGQkpieqQtOBlfjA== +"@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.37.0.tgz#6bc87ea5303dc847311f6648998b705752b09bd4" - integrity sha512-xS3iVEIgSDuRbKmn3BDLlP8fzY9kbH3VO0jninDoUm7+G6V6N0HOvamdV9g/YnXLnpwTvkyTpZ/+hfpalDI7Iw== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/process" "1.37.0" - "@theia/workspace" "1.37.0" + "@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.37.0.tgz#9dca3804a05aaafb697ea048c3d54bdabebf2c95" - integrity sha512-RI7T6hzYxLA7q3QYOdjg8NPOj9RJrBCEQ7W2+njYKLoQejXRYP2pe4lqzERT2IZC23ZA79OrXLp166YMXO/rHA== +"@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.37.0" + "@theia/core" "1.39.0" "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" "@types/rimraf" "^2.0.2" @@ -2358,22 +2249,22 @@ uuid "^8.0.0" vscode-languageserver-textdocument "^1.0.1" -"@theia/keymaps@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.37.0.tgz#ead53cd813de6a9525fc5a276f5bbb5f5aa65c9b" - integrity sha512-YtpL5aiTk/GsiHohcEabc3UYRplnvWxLIL53PnR901FcPop83z9QL+jiLrjgmlTFpz3/RaLlWY93n1ha/mw+CQ== +"@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.37.0" - "@theia/monaco" "1.37.0" + "@theia/core" "1.39.0" + "@theia/monaco" "1.39.0" "@theia/monaco-editor-core" "1.72.3" - "@theia/preferences" "1.37.0" - "@theia/userstorage" "1.37.0" + "@theia/preferences" "1.39.0" + "@theia/userstorage" "1.39.0" jsonc-parser "^2.2.0" -"@theia/localization-manager@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.37.0.tgz#74d17c3e8c1afd8c90bb88c2ecfeb32366ac590a" - integrity sha512-4wj78eh625YkRwJ/bxxEjC/pL6eT6BQIm1rHDUyac+IXdt/kWAy+cdVYXrLzI3xlxxFpcPtLG6O0tguopJvGMg== +"@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" @@ -2384,21 +2275,21 @@ glob "^7.2.0" typescript "~4.5.5" -"@theia/markers@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.37.0.tgz#ea6b36bf5a8e6a45165d31e699413595529fd8a7" - integrity sha512-TCzGzuYBctnxVs/dQUAU3Dce9LY/2KlVJ17ZSrCcatOjqMcuoz62hI29XpWmpyfoXZeovUPelt9Jtl3sgUR07w== +"@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.37.0" - "@theia/filesystem" "1.37.0" - "@theia/workspace" "1.37.0" + "@theia/core" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/workspace" "1.39.0" -"@theia/messages@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.37.0.tgz#ab51545943bd9aa9dc8f435a1c792b06968444a4" - integrity sha512-4wKPlAR9VoRqPDZ5xYysTNvMmzjabst1cd8yp1tm9DREs/0coVWsWYUdP0s0TZBE570OC0MIGQGew5VGB8p9kQ== +"@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.37.0" + "@theia/core" "1.39.0" react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" @@ -2407,112 +2298,121 @@ resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.72.3.tgz#911d674c6e0c490442a355cfaa52beec919a025e" integrity sha512-2FK5m0G5oxiqCv0ZrjucMx5fVgQ9Jqv0CgxGvSzDc4wRrauBdeBoX90J99BEIOJ8Jp3W0++GoRBdh0yQNIGL2g== -"@theia/monaco@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.37.0.tgz#8bd861c3b85f9627f4e4c50d59b1231362d96298" - integrity sha512-zRNivHfpCCRS8+B67IjtPaQPwvFZRAXyZaDyVHrTbjA30UmpRC7yVCoPrfswHrGJoswLFcwoM+VP1ZijhmmnIw== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/markers" "1.37.0" + "@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.37.0" + "@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.3" -"@theia/navigator@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.37.0.tgz#05b804479419a43042678023fa5a966be2126637" - integrity sha512-scMZfj5YBz6iSfc/3qQDRcPwXeMZEF3egMR7dDkWBn6t5PSG9XWj+wdwUKaUNLOswb22j+RVPMrWGJcruTSr/g== +"@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.37.0" - "@theia/filesystem" "1.37.0" - "@theia/workspace" "1.37.0" + 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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.37.0.tgz#11ed2ba98f6f21557384df1b57fb825079b5b278" - integrity sha512-FYO5cm7tmkBQ1k1EBtEvqOnbD0Up6wkvbaj5voSznmsK1gKEMvomJlH6VF28mJLQY64mTKODt6ODsQ9ssGtD1A== +"@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.37.0" + "@theia/core" "1.39.0" -"@theia/output@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.37.0.tgz#ca35c23674e3a410e63c531d2f55936ffb34129d" - integrity sha512-AYrHy0n5xDPalom6Iy9ifNGZUfa39Pl6ZV54+6dVNAmWAex0x4/gf3bnbxuTj+KGxbVr8FLcjqtiNCggnqgwTA== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/monaco" "1.37.0" + "@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.37.0.tgz#6c76afaea6d7d7db72c45c08444a99d5eb03f8b0" - integrity sha512-qU2Qc1v4uSQh70K77zv05OXRRKVXqD0AnAlZrQPk7oA+DK686NYbCjOAuiCxjoNRab3A4bU54Urh5mG5+x1hwA== +"@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.37.0" + "@theia/request" "1.39.0" semver "^5.4.1" -"@theia/plugin-ext-vscode@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.37.0.tgz#0a32f962d38f129bd4148c551576255f43bbfc2d" - integrity sha512-dTv9DdiobqtZ8qgXDy6QwsNwbqfCFFcx3QlBYeSWQmArruJTebOqPKGyTDRQVLNA6fzKRy+dk9pr7Izp09A0Lg== +"@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.37.0" - "@theia/core" "1.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/monaco" "1.37.0" + "@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.37.0" - "@theia/plugin" "1.37.0" - "@theia/plugin-ext" "1.37.0" - "@theia/terminal" "1.37.0" - "@theia/typehierarchy" "1.37.0" - "@theia/userstorage" "1.37.0" - "@theia/workspace" "1.37.0" + "@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" -"@theia/plugin-ext@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.37.0.tgz#09904a72c69381378e384fad96b7eb5723f95424" - integrity sha512-myodGqnb9AyNm8Nove7lrG0pfIrYZXoXKjTp9wPN+srUKMSvj+I9G7Y0NYfdsrMQC/t28zvjBjNaFR//6LiAsw== - dependencies: - "@theia/bulk-edit" "1.37.0" - "@theia/callhierarchy" "1.37.0" - "@theia/console" "1.37.0" - "@theia/core" "1.37.0" - "@theia/debug" "1.37.0" - "@theia/editor" "1.37.0" - "@theia/editor-preview" "1.37.0" - "@theia/file-search" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/markers" "1.37.0" - "@theia/messages" "1.37.0" - "@theia/monaco" "1.37.0" +"@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.37.0" - "@theia/output" "1.37.0" - "@theia/plugin" "1.37.0" - "@theia/preferences" "1.37.0" - "@theia/scm" "1.37.0" - "@theia/search-in-workspace" "1.37.0" - "@theia/task" "1.37.0" - "@theia/terminal" "1.37.0" - "@theia/timeline" "1.37.0" - "@theia/typehierarchy" "1.37.0" - "@theia/variable-resolver" "1.37.0" - "@theia/workspace" "1.37.0" + "@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" @@ -2525,152 +2425,151 @@ semver "^5.4.1" uuid "^8.0.0" vhost "^3.0.2" - vscode-proxy-agent "^0.12.0" vscode-textmate "^7.0.3" -"@theia/plugin@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.37.0.tgz#e63763b87d1dc161936e388d2880b2347f5d5d26" - integrity sha512-WfAGRtsPSvGEEtWL+sMGoL4nCKNT41ARJWKCWafGKreYVBnE9amc+VpIor9metCBqDKPHYGpCh35mYH27c94UA== +"@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.37.0.tgz#66e676b24791d293745381e2b31e7cfbabaf568a" - integrity sha512-AWx4gaIwbnhLkSL/Hd2K+FS5T1Ed1SqsdIn3xFV/f7MYiMwla05f2d8eetWXWeQP1ly6jKavP9dTe4qidDNfLw== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/monaco" "1.37.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/userstorage" "1.37.0" - "@theia/workspace" "1.37.0" + "@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.37.0.tgz#ea847e52f10e16bd466003054c81cdac9af60fe8" - integrity sha512-5qPOw0bE+9wB4FvHh/KG9eHKrqsdXrliTR5uJgmG2G01L5vpHl+77ouB1QfHJySLohs/ojX1Q6YHaspTgfjuqA== +"@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.37.0" + "@theia/core" "1.39.0" node-pty "0.11.0-beta17" string-argv "^0.1.1" -"@theia/request@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.37.0.tgz#1925ab93f771a807ca9cee1ae68747afb0ba866d" - integrity sha512-US3wrXDOs4XNxFkWeW5Sz7dTQpDS+IMQu3i2RfFAknZOgadOJvSuQkIuKtt1tqvaP/Z1nOzQ+1Enmlr5hWWUIg== +"@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.37.0.tgz#fd125ccabccd09e479838bbd8162dfcab51a1e80" - integrity sha512-mbsN2qW2tJq8XozE8O5xJp5gN0yux2jAgQxkmEUOJQ9GFXQNZ+jMUHutNpe1zPd8VFaMn5wyK1lXOLIICHD2xQ== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" + "@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.37.0.tgz#31c4ae18d261d98a659020588a0afeb52b0414f3" - integrity sha512-omBC+Q1/gLxVWGSb6aaJLZBqnpd7r8p8KwCFkiVVnH/i1Cb1uZT0nOczNCJf9hMsdu3NBNuaASD1RhGd3wmzOQ== - dependencies: - "@theia/core" "1.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/navigator" "1.37.0" - "@theia/process" "1.37.0" - "@theia/workspace" "1.37.0" +"@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 "^5.1.0" -"@theia/task@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.37.0.tgz#f662bbee9d324859b3851e3c1158b8ed0fbb3a07" - integrity sha512-bWnFYMB3bhmePoK5+EtAvedxMf9z3OHmvluaaDubPzwh446SzndyVDvGMuKyVuLBI/wUORNWupz23sF7K81RVg== +"@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.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/markers" "1.37.0" - "@theia/monaco" "1.37.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/process" "1.37.0" - "@theia/terminal" "1.37.0" - "@theia/userstorage" "1.37.0" - "@theia/variable-resolver" "1.37.0" - "@theia/workspace" "1.37.0" + "@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.37.0.tgz#af5e2d521d9fecaf09b5b270a8c6ddec72f9a39e" - integrity sha512-/QvvrNTO6qdZ+2Ho2oYGtdVzLzbIPMXeAIhNV/3tts1aT5xy0pohapMUKtj7feB1E8jfa6AsP7GI36iq/NqRAA== - dependencies: - "@theia/core" "1.37.0" - "@theia/editor" "1.37.0" - "@theia/filesystem" "1.37.0" - "@theia/process" "1.37.0" - "@theia/variable-resolver" "1.37.0" - "@theia/workspace" "1.37.0" +"@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.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.37.0.tgz#5216056b14c340a6594eb41f7e4329034e244dbf" - integrity sha512-OWpDla/bw9CdA5qFD+nSNASDjbCjhyDkuTFvEZn1wD/uJcDaxz8suiaMMa9RXq5F0+B/cRiHv9cmQzj/65UGjQ== +"@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.37.0" - "@theia/navigator" "1.37.0" + "@theia/core" "1.39.0" + "@theia/navigator" "1.39.0" -"@theia/typehierarchy@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.37.0.tgz#fd760d22135f8ef01d6b8a6ac7fb860b17cd60b8" - integrity sha512-nztCqJJLMPbSXrSGnIOq4rqJ0CHbbWO/uHJEC8/0On4eAu0dmz2RzPqGya6EndYTIM01OUY8zG4jbTCYkhQTzA== +"@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.37.0" - "@theia/editor" "1.37.0" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" "@types/uuid" "^7.0.3" uuid "^8.0.0" -"@theia/userstorage@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.37.0.tgz#8139a4715abbafa1f64bd12b7fcb390c2754fa16" - integrity sha512-qiMK9sFJhW7+oI7A8Sg0lQJ4eGzlNcJEBScCNIpvxbKfPA691WGIMAMd+4ZfP4V3ERH+1yo4dxjxFIpjlWvfJA== +"@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.37.0" - "@theia/filesystem" "1.37.0" + "@theia/core" "1.39.0" + "@theia/filesystem" "1.39.0" -"@theia/variable-resolver@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.37.0.tgz#6ca22f220b045864ce455f3e8765e8484276dc7e" - integrity sha512-ETgzcYylf7XqqZJos0VUl8ZloZERfZ5Ue7lktYkc/gJ6GWo5bPNUm9gTkYySXJ/FBOj97idhQWcERYSoEHYDFg== +"@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.37.0" + "@theia/core" "1.39.0" -"@theia/workspace@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.37.0.tgz#06de774fb4ec8085bfe70d62d1d3ff0e015e2a4f" - integrity sha512-NJqmre9kIowY3gb5y6c2beSwigLBbrwinbfrNwAUHJ5+6BCRfnA+3OmnCu0Wt0q1zYC3gSAd5cNCm1jq4Xh9YQ== +"@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.37.0" - "@theia/filesystem" "1.37.0" - "@theia/variable-resolver" "1.37.0" + "@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" @@ -2681,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" @@ -2696,18 +2600,18 @@ 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.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.3.tgz#e6cb8a86834da7459a7c836cd892dee56b4bab44" - integrity sha512-mkFEqqRisi13DmR5pX4x+Zk97EiU8djTtpNW1GeuX410y/raAsq/T3ZCjwoRIZ8/cIBfW0olK/sywlAiWevDVw== +"@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 "^7.4.6" + minimatch "^9.0.0" "@types/auth0-js@^9.14.0": - version "9.14.7" - resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.14.7.tgz#ffa07e66ba37b1e07c5299e877658c0c841c071e" - integrity sha512-Lfoj9XItsnjI/1lxHs4r5wlQjkD4XLy81tAVt6B3j3N9mJL4o4ZQu1SbNcq7aImdhkzss53vxubwBJ3rp3AjUQ== + 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.3" @@ -2742,9 +2646,9 @@ "@types/responselike" "^1.0.0" "@types/chai@^4.2.7": - version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== + 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" @@ -2775,20 +2679,13 @@ 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" @@ -2810,9 +2707,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" - integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + 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" "*" @@ -2828,13 +2725,14 @@ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + 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.17" @@ -2853,6 +2751,13 @@ dependencies: "@types/node" "*" +"@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" @@ -2861,7 +2766,7 @@ "@types/minimatch" "^5.1.2" "@types/node" "*" -"@types/glob@^7.2.0": +"@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== @@ -2875,17 +2780,22 @@ 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@^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" @@ -2901,16 +2811,9 @@ parse5 "^7.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/keytar@^4.4.0": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@types/keytar/-/keytar-4.4.2.tgz#49ef917d6cbb4f19241c0ab50cd35097b5729b32" - integrity sha512-xtQcDj9ruGnMwvSu1E2BH4SFa5Dv2PvSPd0CKEBLN5hEj/v5YpXJY+B6hAfuKIbvEomD7vJTc/P1s1xPNh2kRw== - dependencies: - keytar "*" + 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@^3.1.4": version "3.1.4" @@ -2946,9 +2849,9 @@ "@types/lodash" "*" "@types/lodash@*": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== + 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" @@ -2964,11 +2867,11 @@ "@types/mdurl" "*" "@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + 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@*": version "1.0.2" @@ -2980,6 +2883,11 @@ 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" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + "@types/mime@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" @@ -3023,22 +2931,22 @@ "@types/express" "*" "@types/node-fetch@^2.5.7": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.3.tgz#175d977f5e24d93ad0f57602693c435c57ad7e80" - integrity sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w== + 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.15.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== "@types/node@^16.11.26": - version "16.18.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.24.tgz#f21925dd56cd3467b4e1e0c5071d0f2af5e9a316" - integrity sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw== + 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" @@ -3055,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" @@ -3076,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" "*" @@ -3090,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" "*" @@ -3104,9 +3020,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.0.15": - version "18.0.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.37.tgz#7a784e2a8b8f83abb04dc6b9ed9c9b4c0aee9be7" - integrity sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw== + 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" "*" @@ -3150,23 +3066,27 @@ integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== "@types/semver@^7.3.12", "@types/semver@^7.3.6", "@types/semver@^7.3.8": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@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/serve-static@*": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + 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/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/tar-fs@^1.16.1": version "1.16.3" resolved "https://registry.yarnpkg.com/@types/tar-fs/-/tar-fs-1.16.3.tgz#425b2b817c405d13d051f36ec6ec6ebd25e31069" @@ -3199,25 +3119,25 @@ 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/vscode@^1.78.0": - version "1.78.0" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.78.0.tgz#b5600abce8855cf21fb32d0857bcd084b1f83069" - integrity sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA== +"@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/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/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" @@ -3244,6 +3164,13 @@ dependencies: "@types/yargs-parser" "*" +"@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: + "@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" @@ -3252,87 +3179,87 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz#c0e10eeb936debe5d1c3433cf36206a95befefd0" - integrity sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw== + 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.59.0" - "@typescript-eslint/type-utils" "5.59.0" - "@typescript-eslint/utils" "5.59.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" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.0.tgz#0ad7cd019346cc5d150363f64869eca10ca9977c" - integrity sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.59.0" - "@typescript-eslint/types" "5.59.0" - "@typescript-eslint/typescript-estree" "5.59.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/scope-manager@5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz#86501d7a17885710b6716a23be2e93fc54a4fe8c" - integrity sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.0" - "@typescript-eslint/visitor-keys" "5.59.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz#8e8d1420fc2265989fa3a0d897bde37f3851e8c9" - integrity sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.59.0" - "@typescript-eslint/utils" "5.59.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@5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.0.tgz#3fcdac7dbf923ec5251545acdd9f1d42d7c4fe32" - integrity sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA== +"@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.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz#8869156ee1dcfc5a95be3ed0e2809969ea28e965" - integrity sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg== +"@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.59.0" - "@typescript-eslint/visitor-keys" "5.59.0" + "@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/utils@5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.0.tgz#063d066b3bc4850c18872649ed0da9ee72d833d5" - integrity sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA== +"@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: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.0" - "@typescript-eslint/types" "5.59.0" - "@typescript-eslint/typescript-estree" "5.59.0" + "@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@5.59.0": - version "5.59.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz#a59913f2bf0baeb61b5cfcb6135d3926c3854365" - integrity sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA== +"@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" "5.59.0" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" "@virtuoso.dev/react-urx@^0.2.12": @@ -3348,142 +3275,163 @@ integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw== "@vscode/codicons@*": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.32.tgz#9e27de90d509c69762b073719ba3bf46c3cd2530" - integrity sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg== + 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.59.0" - resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.59.0.tgz#f173ff725f60e4ff1002f089105634900c88bd77" - integrity sha512-Ks8NiZrCvybf9ebGLP8OUZQbEMIJYC8X0Ds54Q/szpT/SYEDjTksPvZlcWGTo7B9t5abjvbd0jkNH3blYaSuVw== + 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.15.2" - resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.2.tgz#85b55181353d6d204210e64e03853c5e2ee6edd9" - integrity sha512-8zmyoxV6F+CY1Rinaq7LO/bGShaX2+B333X+Nqo984nC6jg2OvfZtQHzU+PKNQte2fjhm9h2ZlZTufnJxHaX9w== + 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.5", "@webassemblyjs/ast@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" - integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== +"@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.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" - integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== +"@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" - integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== +"@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" - integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== +"@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" - integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== +"@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.5" - "@webassemblyjs/helper-api-error" "1.11.5" + "@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" - integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== +"@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" - integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== +"@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.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" + "@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" - integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== +"@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" - integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== +"@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.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" - integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== +"@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.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" - integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/helper-wasm-section" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-opt" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - "@webassemblyjs/wast-printer" "1.11.5" - -"@webassemblyjs/wasm-gen@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" - integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - -"@webassemblyjs/wasm-opt@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" - integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - -"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" - integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - -"@webassemblyjs/wast-printer@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" - integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== - dependencies: - "@webassemblyjs/ast" "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": @@ -3503,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" @@ -3518,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.42" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.42.tgz#3814e90a81bb1f9c06cc83c6a009139c55efe94d" - integrity sha512-eW9Mbegmb5bJjwawJM9ghjUjUqciNMhC6L7XrQPF/clXS5bbP66MstsgCT5hy9VlfUh/CfBT+0Wucf531dMjHA== +"@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" @@ -3533,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== @@ -3551,18 +3578,6 @@ abbrev@1, abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3579,10 +3594,10 @@ acorn-globals@^7.0.0: 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.2: version "5.3.2" @@ -3594,10 +3609,10 @@ acorn-walk@^8.0.2: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.1.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +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" @@ -3643,7 +3658,7 @@ 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== @@ -3655,7 +3670,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, 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== @@ -3902,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" @@ -3935,6 +3955,11 @@ ansi-styles@^5.0.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" @@ -3969,6 +3994,43 @@ anymatch@~3.1.1, 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" @@ -3979,27 +4041,20 @@ 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.2" - resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.2.tgz#145d998231b34b33bf70f7fc6e5be6497191f708" - integrity sha512-8PTBMDS2ofe2LJZZKHw/MgfXgDwpiImXJcBeqeZ6lcTSDqQNMJpEIjcCdPcxbsQbJXRRfZZ4nn6G/gXwEuJPpw== + 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" @@ -4020,14 +4075,6 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -are-we-there-yet@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz#3ff397dc14f08b52dd8b2a64d3cee154ab8760d2" - integrity sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw== - dependencies: - delegates "^1.0.0" - readable-stream "^4.1.0" - are-we-there-yet@~1.1.2: version "1.1.7" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" @@ -4086,7 +4133,7 @@ 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, array-includes@^3.1.6: +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== @@ -4128,6 +4175,16 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +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.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + 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" @@ -4160,6 +4217,18 @@ array.prototype.tosorted@^1.1.1: 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" @@ -4180,6 +4249,23 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +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: + 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: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -4205,6 +4291,11 @@ 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-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" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.3.2.tgz#1485eda5bda1b0ec7c8df1ac2e815757ad1831df" @@ -4212,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" @@ -4238,9 +4336,9 @@ atomically@^1.7.0: integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== auth0-js@^9.14.0: - version "9.20.2" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.20.2.tgz#c76f4bfda771105dcb735d8222588b08c0f25b70" - integrity sha512-a6tFTYYK2+DQA3+A/mTKAWt/XOaMeiGWu644SnyAL5P84K79G53QOwtn/ok3DbM9MRfRp+2jYE6U4czTLJnj/g== + 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" @@ -4284,14 +4382,19 @@ axios@^0.21.1: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.3.6" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.6.tgz#1ace9a9fb994314b5f6327960918406fa92c6646" - integrity sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg== + 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.3.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" @@ -4311,29 +4414,29 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +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.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - 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.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +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.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +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.3" + "@babel/helper-define-polyfill-provider" "^0.4.1" bail@^2.0.0: version "2.0.2" @@ -4392,16 +4495,6 @@ 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@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" - integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== - dependencies: - cmd-shim "^6.0.0" - npm-normalize-package-bin "^3.0.0" - read-cmd-shim "^4.0.0" - write-file-atomic "^5.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" @@ -4439,6 +4532,18 @@ 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" @@ -4528,15 +4633,15 @@ browser-stdout@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.21.3, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +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.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + 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" @@ -4561,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" @@ -4576,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== @@ -4605,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" @@ -4624,10 +4765,10 @@ busboy@^1.0.0: dependencies: streamsearch "^1.1.0" -byte-size@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" - integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== +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" @@ -4639,45 +4780,20 @@ 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.1.0: - 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@^17.0.0, cacache@^17.0.4: - version "17.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.5.tgz#6dbec26c11f1f6a2b558bc11ed3316577c339ebc" - integrity sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA== +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" "^3.1.0" fs-minipass "^3.0.0" - glob "^9.3.1" + glob "^10.2.2" lru-cache "^7.7.1" - minipass "^4.0.0" + minipass "^5.0.0" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" p-map "^4.0.0" - promise-inflight "^1.0.1" ssri "^10.0.0" tar "^6.1.11" unique-filename "^3.0.0" @@ -4708,9 +4824,9 @@ cacheable-lookup@^7.0.0: integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== cacheable-request@^10.2.8: - version "10.2.9" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.9.tgz#6375833d2b99921d8870df9fdc26cb703c56f356" - integrity sha512-CaAMr53AS1Tb9evO1BIWFnZjSr8A4pbXofpsNVWPMDZZj3ZQKHwsQG9BrTqQ4x5ZYJXz1T2b8LLtTZODxSpzbg== + 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" @@ -4720,23 +4836,10 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -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@^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" @@ -4791,10 +4894,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001449: - version "1.0.30001481" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz#f58a717afe92f9e69d0e35ff64df596bfad93912" - integrity sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ== +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" @@ -4810,16 +4913,6 @@ 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@^4.2.0: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -4906,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" @@ -4951,18 +5049,28 @@ 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.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.6.tgz#a082151834083ed002624f12fa35e748817b2ee5" - integrity sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw== +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== +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" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -5003,9 +5111,9 @@ cli-spinners@2.6.1: integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.5.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.8.0.tgz#e97a3e2bd00e6d85aa0c13d7f9e3ce236f7787fc" - integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + 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" @@ -5079,13 +5187,6 @@ clone-deep@4.0.1, 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" @@ -5122,14 +5223,7 @@ 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.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== @@ -5186,6 +5280,11 @@ colorette@^2.0.16: 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: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" @@ -5206,11 +5305,28 @@ comma-separated-tokens@^2.0.0: 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" @@ -5221,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" @@ -5239,6 +5350,11 @@ 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" @@ -5305,22 +5421,6 @@ conf@^10.2.0: pkg-up "^3.1.0" semver "^7.3.5" -config-chain@1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - 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" @@ -5335,7 +5435,7 @@ 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== @@ -5347,87 +5447,78 @@ content-type@~1.0.4, content-type@~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.12" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" - integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== +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.9.0" @@ -5479,12 +5570,17 @@ copy-webpack-plugin@^8.1.1: schema-utils "^3.0.0" serialize-javascript "^5.0.1" -core-js-compat@^3.25.1: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" - integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== +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.5" + browserslist "^4.21.9" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== core-util-is@~1.0.0: version "1.0.3" @@ -5499,17 +5595,6 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - cosmiconfig@8.1.3: version "8.1.3" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" @@ -5531,6 +5616,16 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +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: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cp-file@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-10.0.0.tgz#bbae9ecb9f505951b862880d2901e1f56de7a4dc" @@ -5541,9 +5636,9 @@ cp-file@^10.0.0: p-event "^5.0.1" cpy@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-10.0.0.tgz#372dfc731f8f1d72ab06888093084e3c558aec20" - integrity sha512-6aFIEPIDnUE98L4FNBEkfOL5A1XfMt+37fzYsdQ4KugSrVU6gWa1IgBbtc/Di3ohTzGw10LqCcCamw8bL8Erqw== + version "10.1.0" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-10.1.0.tgz#85517387036b9be480f6424e54089261fc6f4bab" + integrity sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ== dependencies: arrify "^3.0.0" cp-file "^10.0.0" @@ -5554,6 +5649,13 @@ cpy@^10.0.0: 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" resolved "https://registry.yarnpkg.com/create-frame/-/create-frame-1.0.0.tgz#8b95f2691e3249b6080443e33d0bad9f8f6975aa" @@ -5564,20 +5666,27 @@ 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: +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-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: + node-fetch "^2.6.12" + cross-spawn@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -5611,20 +5720,15 @@ crypto-js@^4.1.1: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - css-loader@^6.2.0: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + 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.19" + 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" @@ -5673,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" @@ -5685,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.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== @@ -5699,7 +5808,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, 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== @@ -5755,13 +5864,6 @@ decode-uri-component@^0.2.0, decode-uri-component@^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@^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" - decompress-response@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" @@ -5846,12 +5948,12 @@ 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: +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== @@ -5915,20 +6017,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5992,6 +6080,11 @@ dezalgo@^1.0.4: 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" @@ -6007,6 +6100,16 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +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" @@ -6021,6 +6124,34 @@ 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.6.0" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" @@ -6065,9 +6196,9 @@ domexception@^4.0.0: webidl-conversions "^7.0.0" dompurify@^2.2.9: - version "2.4.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87" - integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== + 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" @@ -6077,13 +6208,6 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@6.0.1, dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -6091,30 +6215,29 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + 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== @@ -6131,16 +6254,16 @@ 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== +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" @@ -6153,6 +6276,57 @@ ejs@^3.1.7: 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" @@ -6181,10 +6355,10 @@ electron-store@^8.0.0: conf "^10.2.0" type-fest "^2.17.0" -electron-to-chromium@^1.4.284: - version "1.4.368" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.368.tgz#75901f97d3e23da2e66feb1e61fbb8e70ac96430" - integrity sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw== +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" @@ -6201,9 +6375,9 @@ electron-updater@^4.6.5: semver "^7.3.5" electron@^23.2.4: - version "23.3.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-23.3.0.tgz#3e83e75d8bebe00764611c1d0c1bfa90cc197c7c" - integrity sha512-DVAtptpOSxM7ycgriphSxzlkb3R92d28sFKG1hMtmPkAwHl/e87reaHXhGwyj8Xu4GY69e6yUoAJqma20w0Vgw== + 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" "^2.0.0" "@types/node" "^16.11.26" @@ -6219,6 +6393,11 @@ 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" @@ -6243,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.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.4.0.tgz#88cd3082609ca86d7d3c12f0e746d12db4f47c91" - integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== +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" + engine.io-parser "~5.1.0" ws "~8.11.0" xmlhttprequest-ssl "~2.0.0" -engine.io-parser@~5.0.3: - version "5.0.6" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" - integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== +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.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.1.tgz#8056b4526a88e779f9c280d820422d4e3eeaaae5" - integrity sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw== +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" @@ -6272,13 +6451,13 @@ engine.io@~6.4.1: cookie "~0.4.1" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.0.3" + engine.io-parser "~5.1.0" ws "~8.11.0" -enhanced-resolve@^5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" - integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== +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" @@ -6310,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" @@ -6340,17 +6524,18 @@ error-symbol@^0.1.0: integrity sha512-VyjaKxUmeDX/m2lxm/aknsJ1GWDWUO2Ze2Ad8S1Pb9dykAm9TjSKp5CjrNyltYqZ5W/PO6TInAmO2/BfwMyT1g== es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + 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.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -6370,14 +6555,18 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + 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.9" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -6385,9 +6574,9 @@ es-array-method-boxes-properly@^1.0.0: integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + 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" @@ -6444,20 +6633,19 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@5.0.0: +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.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + 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 "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -6520,28 +6708,28 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: estraverse "^4.1.1" eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + 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: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" - integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== +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.39.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" - integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== + 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.0.2" - "@eslint/js" "8.39.0" - "@humanwhocodes/config-array" "^0.11.8" + "@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" @@ -6551,8 +6739,8 @@ eslint@^8.39.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.0" - espree "^9.5.1" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -6560,32 +6748,29 @@ eslint@^8.39.0: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.1: - version "9.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4" - integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== +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 "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -6644,17 +6829,12 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0, events@^3.3.0: +events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -6715,6 +6895,21 @@ execa@^2.0.1: 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" @@ -6730,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" @@ -6748,6 +6958,11 @@ 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.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -6854,6 +7069,11 @@ extract-zip@2.0.1, extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + "falsey@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/falsey/-/falsey-0.3.2.tgz#b21c90c5c34660fc192bf909575db95b6880d597" @@ -6867,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" @@ -6882,10 +7107,10 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.11, fast-glob@^3.2.5, 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== +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" @@ -6898,7 +7123,7 @@ 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== @@ -6959,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" @@ -6979,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-url@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/file-url/-/file-url-3.0.0.tgz#247a586a746ce9f7a8ed05560290968afc262a77" - integrity sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA== - -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== @@ -7003,17 +7222,13 @@ filelist@^1.0.1: filename-reserved-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity 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" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== + +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" @@ -7024,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" @@ -7164,6 +7388,14 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +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: + 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" @@ -7195,9 +7427,9 @@ formdata-polyfill@^4.0.10: fetch-blob "^3.1.2" formidable@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.1.tgz#81269cbea1a613240049f5f61a9d97731517414f" - integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ== + 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" @@ -7221,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" @@ -7244,17 +7468,7 @@ fs-exists-sync@^0.1.0: resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== -fs-extra@9.1.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^10.0.0: +fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -7263,7 +7477,7 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.1.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== @@ -7290,7 +7504,17 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^2.0.0, fs-minipass@^2.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== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.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== @@ -7298,11 +7522,11 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: minipass "^3.0.0" fs-minipass@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.1.tgz#853809af15b6d03e27638d1ab6432e6b378b085d" - integrity sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw== + 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 "^4.0.0" + minipass "^5.0.0" fs.realpath@^1.0.0: version "1.0.0" @@ -7383,20 +7607,6 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" -gauge@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.0.tgz#e270ca9d97dae84abf64e5277ef1ebddc7dd1e2f" - integrity sha512-0s5T5eciEG7Q3ugkxAkFtaDhrrhXsCRivA5y8C9WMHWuI8UlMOJg7+Iwf7Mccii+Dfs3H5jHepU0joPVyQU0Lw== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -7431,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.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== +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: @@ -7453,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== @@ -7468,18 +7679,6 @@ get-port@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" @@ -7525,16 +7724,14 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -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" @@ -7544,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" @@ -7634,6 +7831,17 @@ glob@7.2.0: 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" @@ -7657,7 +7865,7 @@ glob@^8.0.1, glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" -glob@^9.2.0, glob@^9.3.0, glob@^9.3.1: +glob@^9.2.0: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -7698,7 +7906,7 @@ globalthis@^1.0.1, globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@11.1.0, globby@^11.0.1, globby@^11.0.3, globby@^11.1.0: +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== @@ -7711,13 +7919,13 @@ globby@11.1.0, globby@^11.0.1, globby@^11.0.3, globby@^11.1.0: slash "^3.0.0" globby@^13.1.4: - version "13.1.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + 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.2.11" - ignore "^5.2.0" + fast-glob "^3.3.0" + ignore "^5.2.4" merge2 "^1.4.1" slash "^4.0.0" @@ -7767,10 +7975,10 @@ got@^11.7.0, got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -got@^12.0.0, got@^12.1.0: - version "12.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.6.0.tgz#8d382ee5de4432c086e83c133efdd474484f6ac7" - integrity sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ== +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" @@ -7784,43 +7992,20 @@ got@^12.0.0, got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.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" - -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -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.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +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== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +"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" @@ -7957,23 +8142,11 @@ has-proto@^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-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - has-symbols@^1.0.0, has-symbols@^1.0.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" @@ -8107,21 +8280,14 @@ 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== - dependencies: - lru-cache "^7.5.1" - -hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: +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== @@ -8143,12 +8309,7 @@ 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, http-cache-semantics@^4.1.1: +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== @@ -8211,11 +8372,21 @@ https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: 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" @@ -8228,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" @@ -8287,18 +8466,18 @@ ignore-walk@^5.0.1: minimatch "^5.0.1" ignore-walk@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.2.tgz#c48f48397cf8ef6174fcc28aa5f8c1de6203d389" - integrity sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg== + 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 "^7.4.2" + 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@^5.0.4, ignore@^5.2.0: +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== @@ -8308,7 +8487,7 @@ image-size@~0.5.0: 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== @@ -8316,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== @@ -8339,11 +8518,6 @@ indent-string@^5.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -8362,50 +8536,29 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i 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, 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" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - inquirer@^8.2.4: version "8.2.5" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" @@ -8427,6 +8580,13 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" +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: + 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" @@ -8446,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" @@ -8552,7 +8704,14 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^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@2.0.0: +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" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== @@ -8560,9 +8719,9 @@ is-ci@2.0.0: ci-info "^2.0.0" 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.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== + 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" @@ -8738,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" @@ -8760,11 +8914,6 @@ is-online@^10.0.0: p-timeout "^5.1.0" public-ip "^5.0.0" -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - 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" @@ -8820,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" @@ -8861,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" @@ -8932,6 +9081,18 @@ isarray@^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" @@ -8954,23 +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== -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" @@ -8986,11 +9163,6 @@ js-cookie@^2.2.0: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -9030,9 +9202,9 @@ jschardet@^2.1.1: integrity sha512-6I6xT7XN/7sBB7q8ObzKbmv5vN+blzLcboDE1BNEsEfmRXJValMxO6OIRT69ylPBRemS3rw6US+CMCar0OBc9g== jsdom@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.1.tgz#ab796361e3f6c01bcfaeda1fea3c06197ac9d8ae" - integrity sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w== + 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" @@ -9047,7 +9219,7 @@ jsdom@^21.1.1: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.1" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" + nwsapi "^2.2.4" parse5 "^7.1.2" rrweb-cssom "^0.6.0" saxes "^6.0.0" @@ -9071,11 +9243,6 @@ 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: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -9116,11 +9283,6 @@ json-stable-stringify-without-jsonify@^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: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -9170,33 +9332,25 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + 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.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" 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.5.0" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" - integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== - 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@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" - integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== - just-performance@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/just-performance/-/just-performance-4.3.0.tgz#cc2bc8c9227f09e97b6b1df4cd0de2df7ae16db1" @@ -9207,14 +9361,6 @@ jwt-decode@^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" @@ -9223,17 +9369,10 @@ 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@^4.0.0, keyv@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== dependencies: json-buffer "3.0.1" @@ -9273,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== @@ -9285,84 +9424,83 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -lerna@^6.1.0: - version "6.6.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.6.1.tgz#4897171aed64e244a2d0f9000eef5c5b228f9332" - integrity sha512-WJtrvmbmR+6hMB9b5pvsxJzew0lRL6hARgW/My9BM4vYaxwPIA2I0riv3qQu5Zd7lYse7FEqJkTnl9Kn1bXhLA== - dependencies: - "@lerna/child-process" "6.6.1" - "@lerna/create" "6.6.1" - "@lerna/legacy-package-management" "6.6.1" - "@npmcli/arborist" "6.2.3" - "@npmcli/run-script" "4.1.7" - "@nrwl/devkit" ">=15.5.2 < 16" +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.3" - byte-size "7.0.0" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" chalk "4.1.0" clone-deep "4.0.1" - cmd-shim "5.0.0" + cmd-shim "6.0.1" columnify "1.6.0" - config-chain "1.1.12" - conventional-changelog-angular "5.0.12" - conventional-changelog-core "4.2.4" - conventional-recommended-bump "6.1.0" - cosmiconfig "7.0.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" - dot-prop "6.0.1" - envinfo "^7.7.4" + envinfo "7.8.1" execa "5.0.0" - fs-extra "9.1.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.10" + graceful-fs "4.2.11" has-unicode "2.0.1" - import-local "^3.0.2" - init-package-json "3.0.2" + import-local "3.1.0" + ini "^1.3.8" + init-package-json "5.0.0" inquirer "^8.2.4" - is-ci "2.0.0" + is-ci "3.0.1" is-stream "2.0.0" - js-yaml "^4.1.0" - libnpmaccess "6.0.3" - libnpmpublish "6.0.4" + 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.3" + npm-registry-fetch "^14.0.5" npmlog "^6.0.2" - nx ">=15.5.2 < 16" + 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 "13.6.2" + pacote "^15.2.0" pify "5.0.0" - read-cmd-shim "3.0.0" - read-package-json "5.0.1" + 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" + ssri "^9.0.1" strong-log-transformer "2.1.0" tar "6.1.11" temp-dir "1.0.0" - typescript "^3 || ^4" - upath "^2.0.1" - uuid "8.3.2" + typescript ">=3 < 6" + upath "2.0.1" + uuid "^9.0.0" validate-npm-package-license "3.0.4" - validate-npm-package-name "4.0.0" - write-file-atomic "4.0.1" + 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" @@ -9391,34 +9529,27 @@ 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.3" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded" - integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg== +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: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" -libnpmpublish@6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.4.tgz#adb41ec6b0c307d6f603746a4d929dcefb8f1a0b" - integrity sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg== +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: - normalize-package-data "^4.0.0" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" + 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" - ssri "^9.0.0" + sigstore "^1.4.0" + ssri "^10.0.1" limiter@^2.1.0: version "2.1.0" @@ -9451,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" @@ -9476,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== @@ -9643,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.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== @@ -9713,16 +9865,6 @@ 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: - 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" @@ -9760,10 +9902,10 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -lru-cache@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.0.tgz#19efafa9d08d1c08eb8efd78876075f0b8b1b07b" - integrity sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ== +"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" @@ -9786,7 +9928,7 @@ make-dir@3.1.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-dir@^1.0.0, make-dir@^1.2.0: +make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== @@ -9801,32 +9943,17 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-fetch-happen@^10.0.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-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@^11.0.0, make-fetch-happen@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz#f26b05e89317e960b75fd5e080e40d40f8d7b2a5" - integrity sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA== +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 "^17.0.0" @@ -9835,7 +9962,7 @@ make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1: https-proxy-agent "^5.0.0" is-lambda "^1.0.1" lru-cache "^7.7.1" - minipass "^4.0.0" + minipass "^5.0.0" minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" @@ -9906,9 +10033,9 @@ mdast-util-definitions@^5.0.0: unist-util-visit "^4.0.0" mdast-util-from-markdown@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" - integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== + 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" @@ -9973,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== @@ -9995,6 +10122,13 @@ 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" @@ -10011,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" @@ -10033,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" @@ -10052,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" @@ -10081,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" @@ -10130,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, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== + 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" @@ -10173,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.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== + 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" @@ -10224,7 +10357,7 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.4, micromatch@^4.0.5: +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== @@ -10249,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.6.0, mime@^2.4.4: +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== @@ -10264,6 +10397,11 @@ 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-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" @@ -10290,9 +10428,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.6.1: - version "2.7.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== + 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" @@ -10336,20 +10474,6 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimatch@^6.1.6: - version "6.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" - integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^7.4.2, minimatch@^7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" - integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== - 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" @@ -10357,6 +10481,13 @@ minimatch@^8.0.2: 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" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -10378,23 +10509,12 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== - dependencies: - minipass "^3.1.6" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - minipass-fetch@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.2.tgz#2f7275ae13f2fb0f2a469cee4f78250c25c80ab3" - integrity sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA== + 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 "^4.0.0" + minipass "^5.0.0" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -10429,14 +10549,14 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: +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, minipass@^4.2.4: +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== @@ -10446,6 +10566,11 @@ minipass@^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" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -10472,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" @@ -10562,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== @@ -10613,7 +10729,7 @@ 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@^3.0.1: +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== @@ -10628,11 +10744,11 @@ msgpackr-extract@^3.0.1: "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2" msgpackr@^1.6.1: - version "1.8.5" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.8.5.tgz#8cadfb935357680648f33699d0e833c9179dbfeb" - integrity sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg== + version "1.9.5" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.9.5.tgz#ac548c5f4546db895e84e46d39d813be961dc527" + integrity sha512-/IJ3cFSN6Ci3eG2wLhbFEL6GT63yEaoN/R5My2QkV6zro+OJaVRLPlwvxY7EtHYSmDlQpk8stvOQTL2qJFkDRg== optionalDependencies: - msgpackr-extract "^3.0.1" + msgpackr-extract "^3.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -10658,11 +10774,16 @@ 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.17.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" @@ -10771,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.40.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.40.0.tgz#51d8ed44534f70ff1357dfbc3a89717b1ceac1b4" - integrity sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA== +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" @@ -10785,16 +10906,16 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" +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" @@ -10827,10 +10948,10 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== +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" @@ -10854,14 +10975,15 @@ node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-gyp@^9.0.0, node-gyp@^9.3.0: - version "9.3.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" - integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== + 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" + make-fetch-happen "^11.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -10869,6 +10991,22 @@ node-gyp@^9.0.0, node-gyp@^9.3.0: tar "^6.1.2" which "^2.0.2" +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: + 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" resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta17.tgz#7df6a60dced6bf7a3a282b65cf51980c68954af6" @@ -10876,10 +11014,10 @@ node-pty@0.11.0-beta17: dependencies: nan "^2.14.0" -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +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" @@ -10900,13 +11038,6 @@ nopt@^6.0.0: dependencies: abbrev "^1.0.0" -nopt@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.1.0.tgz#91f6a3366182176e72ecab93a09c19b63b485f28" - integrity sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q== - dependencies: - abbrev "^2.0.0" - normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -10917,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== @@ -10927,16 +11058,6 @@ 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== - dependencies: - hosted-git-info "^5.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - 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" @@ -10952,15 +11073,6 @@ 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@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" @@ -10971,20 +11083,13 @@ normalize-url@^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.1, npm-bundled@^1.1.2: +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-bundled@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" @@ -10992,21 +11097,6 @@ npm-bundled@^3.0.0: dependencies: npm-normalize-package-bin "^3.0.0" -npm-conf@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== - dependencies: - config-chain "^1.1.11" - pify "^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== - dependencies: - semver "^7.1.1" - 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" @@ -11019,15 +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.0" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz#6097436adb4ef09e2628b59a7882576fe53ce485" - integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== + 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" @@ -11048,16 +11133,6 @@ npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: semver "^7.3.5" validate-npm-package-name "^5.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== - dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" - semver "^7.3.5" - validate-npm-package-name "^4.0.0" - npm-packlist@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" @@ -11068,16 +11143,6 @@ npm-packlist@5.1.1: npm-bundled "^1.1.2" npm-normalize-package-bin "^1.0.1" -npm-packlist@^5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.3.tgz#69d253e6fd664b9058b85005905012e00e69274b" - integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== - dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^2.0.0" - npm-normalize-package-bin "^2.0.0" - npm-packlist@^7.0.0: version "7.0.4" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" @@ -11085,17 +11150,7 @@ npm-packlist@^7.0.0: dependencies: ignore-walk "^6.0.0" -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== - dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^2.0.0" - npm-package-arg "^9.0.0" - semver "^7.3.5" - -npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: +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== @@ -11105,39 +11160,13 @@ npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: npm-package-arg "^10.0.0" semver "^7.3.5" -npm-registry-fetch@14.0.3: - version "14.0.3" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz#8545e321c2b36d2c6fe6e009e77e9f0e527f547b" - integrity sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA== - dependencies: - make-fetch-happen "^11.0.0" - minipass "^4.0.0" - minipass-fetch "^3.0.0" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^10.0.0" - proc-log "^3.0.0" - -npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: - 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== - dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" - -npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: - version "14.0.4" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.4.tgz#43dfa55ce7c0d0c545d625c7a916bab5b95f7038" - integrity sha512-pMS2DRkwg+M44ct65zrN/Cr9IHK1+n6weuefAo6Er4lc+/8YBCU0Czq04H3ZiSigluh7pb2rMM5JpgcytctB+Q== +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 "^11.0.0" - minipass "^4.0.0" + minipass "^5.0.0" minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" @@ -11158,22 +11187,19 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" -npm-run-path@^4.0.1: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@6.0.2, npmlog@^6.0.0, npmlog@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== +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: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" + path-key "^4.0.0" npmlog@^4.0.1: version "4.1.2" @@ -11195,14 +11221,14 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" -npmlog@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" - integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== +npmlog@^6.0.0, npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== dependencies: - are-we-there-yet "^4.0.0" + are-we-there-yet "^3.0.0" console-control-strings "^1.1.0" - gauge "^5.0.0" + gauge "^4.0.3" set-blocking "^2.0.0" nsfw@^2.2.4: @@ -11217,21 +11243,20 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nwsapi@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" - integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== +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.9.2, "nx@>=15.5.2 < 16": - version "15.9.2" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.9.2.tgz#d7ace1e5ae64a47f1b553dc5da08dbdd858bde96" - integrity sha512-wtcs+wsuplSckvgk+bV+/XuGlo+sVWzSG0RpgWBjQYeqA3QsVFEAPVY66Z5cSoukDbTV77ddcAjEw+Rz8oOR1A== +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.9.2" - "@nrwl/tao" "15.9.2" + "@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" @@ -11252,7 +11277,7 @@ nx@15.9.2, "nx@>=15.5.2 < 16": 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" @@ -11263,15 +11288,16 @@ nx@15.9.2, "nx@>=15.5.2 < 16": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nrwl/nx-darwin-arm64" "15.9.2" - "@nrwl/nx-darwin-x64" "15.9.2" - "@nrwl/nx-linux-arm-gnueabihf" "15.9.2" - "@nrwl/nx-linux-arm64-gnu" "15.9.2" - "@nrwl/nx-linux-arm64-musl" "15.9.2" - "@nrwl/nx-linux-x64-gnu" "15.9.2" - "@nrwl/nx-linux-x64-musl" "15.9.2" - "@nrwl/nx-win32-arm64-msvc" "15.9.2" - "@nrwl/nx-win32-x64-msvc" "15.9.2" + "@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" @@ -11314,7 +11340,7 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.3, object.assign@^4.1.4: +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== @@ -11398,6 +11424,13 @@ 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.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -11407,29 +11440,17 @@ open@^8.0.6, open@^8.4.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" @@ -11473,11 +11494,6 @@ p-any@^4.0.0: p-cancelable "^3.0.0" p-some "^6.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@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -11498,13 +11514,6 @@ 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@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" @@ -11529,11 +11538,6 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -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-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" @@ -11643,13 +11647,6 @@ p-some@^6.0.0: aggregate-error "^4.0.0" p-cancelable "^3.0.0" -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -11679,37 +11676,10 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" -pacote@13.6.2, 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" - 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" - tar "^6.1.11" - -pacote@^15.0.0, pacote@^15.0.8: - version "15.1.2" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.2.tgz#78b4c1403231fab368c752943f1969c6d8f026bb" - integrity sha512-EAGJrMiIjBTBB6tWGrx9hFJTOo14B3HSAoa/W9SawFEBhUqjxN7qqaFlGVF9jfY/mIri8Mb2xafmkRgWxYXxIQ== +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" @@ -11717,7 +11687,7 @@ pacote@^15.0.0, pacote@^15.0.8: "@npmcli/run-script" "^6.0.0" cacache "^17.0.0" fs-minipass "^3.0.0" - minipass "^4.0.0" + minipass "^5.0.0" npm-package-arg "^10.0.0" npm-packlist "^7.0.0" npm-pick-manifest "^8.0.0" @@ -11745,15 +11715,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-conflict-json@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" - integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== - dependencies: - json-parse-even-better-errors "^3.0.0" - just-diff "^6.0.0" - 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" @@ -11849,6 +11810,11 @@ 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" @@ -11866,13 +11832,13 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" -path-scurry@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" - integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== +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.0.0" - minipass "^5.0.0" + 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" @@ -11903,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" @@ -11976,6 +11947,15 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +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" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -11986,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" @@ -12009,10 +11989,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + 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" @@ -12022,10 +12002,10 @@ 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.19: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== +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.6" picocolors "^1.0.0" @@ -12071,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" @@ -12112,16 +12064,16 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.3.1: - version "2.8.7" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" - integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + 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.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" - integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== +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.4.3" + "@jest/schemas" "^29.6.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -12130,11 +12082,6 @@ private@~0.1.5: 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" @@ -12155,16 +12102,6 @@ progress@2.0.3, progress@^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.2" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" - integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -12178,12 +12115,12 @@ 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.8.1: version "15.8.1" @@ -12199,15 +12136,10 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== -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== - -protobufjs@^7.0.0, protobufjs@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.3.tgz#01af019e40d9c6133c49acbb3ff9e30f4f0f70b2" - integrity sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg== +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" @@ -12305,13 +12237,13 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -puppeteer-core@19.10.1, puppeteer-core@^19.7.2: - version "19.10.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.10.1.tgz#b16263e201612e9145d063092e6cdf994584ad7c" - integrity sha512-vD4ojslBtnIWd56IQIEADIcAWrNel/Qt7YGlAxcSNB0b33U3tYe0A+0FLmPNgSa7UTlCOCCVEmzXi5QlDtLGjQ== +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.6" + chromium-bidi "0.4.7" cross-fetch "3.1.5" debug "4.3.4" devtools-protocol "0.0.1107588" @@ -12333,21 +12265,16 @@ puppeteer-to-istanbul@^1.4.0: yargs "^15.3.1" puppeteer@^19.7.2: - version "19.10.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.10.1.tgz#1d2bf9e1f1440dbe55dbeb6743191657a6b9878b" - integrity sha512-HqpY8sWqz28JfyZE8cGG9kBPgASD7iRHn/ryWLvVLXE10poR5AyU/mMsLmL175qoYl/chwMTN2pxKSz7HobaCg== + version "19.11.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.11.1.tgz#bb75d518e87b0b4f6ef9bad1ea7e9d1cdcd18a5d" + integrity sha512-39olGaX2djYUdhaQQHDZ0T0GwEp+5f9UB9HmEP0qHfdQHIq0xGQZuAZ5TLnJIc/88SrPLpEflPC+xUqOTv3c5g== dependencies: "@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.10.1" - -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== + puppeteer-core "19.11.1" qs@6.11.0: version "6.11.0" @@ -12357,21 +12284,12 @@ qs@6.11.0: side-channel "^1.0.4" qs@^6.10.1, qs@^6.10.3, qs@^6.11.0, qs@^6.9.4: - version "6.11.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" -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== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - query-string@^7.0.1: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -12392,6 +12310,11 @@ queue-microtask@^1.2.2: 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" @@ -12477,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" @@ -12492,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" @@ -12506,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.7.2" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.2.tgz#ccd40071b9429277983bf15526e7a5773a060e09" - integrity sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA== + 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" @@ -12569,25 +12492,23 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" -read-cmd-shim@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" - integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog== - -read-cmd-shim@^4.0.0: +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.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-fast@^3.0.0, read-package-json-fast@^3.0.2: +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== @@ -12595,32 +12516,12 @@ read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" -read-package-json@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" - integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== - dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^1.0.1" - -read-package-json@^5.0.0: - 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== - 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" - -read-package-json@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.1.tgz#566cb06bc05dbddefba4607e9096d5a9efbcd836" - integrity sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA== +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 "^9.3.0" + glob "^10.2.2" json-parse-even-better-errors "^3.0.0" normalize-package-data "^5.0.0" npm-normalize-package-bin "^3.0.0" @@ -12661,23 +12562,14 @@ 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@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.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== +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: +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== @@ -12690,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" -readable-stream@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.3.0.tgz#0914d0c72db03b316c9733bb3461d64a3cc50cba" - integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ== +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +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: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" + readable-stream "^3.6.0" readdirp@~3.2.0: version "3.2.0" @@ -12783,7 +12681,7 @@ 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.3: +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== @@ -12819,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" @@ -12942,13 +12840,6 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -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" @@ -13054,9 +12945,9 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.5.1, rxjs@^7.5.5: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + 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" @@ -13113,6 +13004,13 @@ safe-stable-stringify@^2.4.3: 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" @@ -13141,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.1, schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== +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.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" - integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== + 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.9.0" ajv-formats "^2.1.1" 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== @@ -13178,36 +13076,34 @@ 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.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +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.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== +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.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" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -13376,14 +13272,19 @@ signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, s resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sigstore@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.3.2.tgz#2f70ec3e1192911484d9d148ecd9c98345cd172d" - integrity sha512-0KT1DjpVB11FK15ep7BIsZQV6j1jBm4SnXIInbBCRvql6II39IKONOMO+j036sGsArU/+2xqa1NDJwJkic0neA== +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" - tuf-js "^1.1.3" simple-concat@^1.0.0: version "1.0.1" @@ -13399,14 +13300,12 @@ 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" @@ -13441,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== @@ -13492,34 +13391,35 @@ socket.io-adapter@~2.5.2: ws "~8.11.0" socket.io-client@^4.5.3: - version "4.6.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.6.1.tgz#80d97d5eb0feca448a0fb6d69a7b222d3d547eab" - integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== + 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.4.0" - socket.io-parser "~4.2.1" + engine.io-client "~6.5.1" + socket.io-parser "~4.2.4" -socket.io-parser@~4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" - integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== +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.6.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.6.1.tgz#62ec117e5fce0692fa50498da9347cfb52c3bc70" - integrity sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA== + 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.4.1" + engine.io "~6.5.0" socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.1" + socket.io-parser "~4.2.4" socks-proxy-agent@^5.0.0: version "5.0.1" @@ -13664,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== @@ -13678,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== @@ -13695,19 +13595,24 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@9.0.1, ssri@^9.0.0: +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: + 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" -ssri@^10.0.0, ssri@^10.0.1: - version "10.0.3" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.3.tgz#7f83da39058ca1d599d174e9eee4237659710bf4" - integrity sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg== - dependencies: - minipass "^4.0.0" +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== static-extend@^0.1.1: version "0.1.2" @@ -13734,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" @@ -13767,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" @@ -13784,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" @@ -13802,6 +13710,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +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" @@ -13857,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== @@ -13866,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" @@ -13887,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" @@ -13911,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" @@ -13921,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" @@ -13933,18 +13870,23 @@ 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.1, 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" @@ -13959,17 +13901,25 @@ strong-log-transformer@2.1.0, 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.2" - resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.7.2.tgz#bb4e70b2c2020dfa3ea81f22adda252aaf31e0a4" - integrity sha512-Nd/qrPj1ikYX+sL/8PofMgfaJLRvGgT96Ty3dJLGNqtZmecVr3Xs+OZivMQEYmSCTiap/UyeV5SqwmAgn3/KKA== + 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" @@ -13982,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" @@ -14110,6 +14060,15 @@ tar-stream@^2.1.4, tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" +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: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + tar@6.1.11: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -14123,13 +14082,13 @@ tar@6.1.11: yallist "^4.0.0" tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + 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" @@ -14144,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" @@ -14152,35 +14119,24 @@ temp@^0.9.1: mkdirp "^0.5.1" rimraf "~2.6.2" -tempy@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.0.tgz#4f192b3ee3328a2684d0e3fc5c491425395aab65" - integrity sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w== - dependencies: - del "^6.0.0" - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - terser-webpack-plugin@^5.3.7: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + 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.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.5" + terser "^5.16.8" -terser@^5.16.5: - version "5.17.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" - integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== +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" @@ -14202,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" @@ -14219,11 +14168,6 @@ 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.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" @@ -14236,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" @@ -14243,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== @@ -14302,10 +14253,18 @@ toidentifier@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@^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: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + tough-cookie@^4.0.0, tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + 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" @@ -14348,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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" - integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== - trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -14370,11 +14324,25 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" +trim-repeated@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-2.0.0.tgz#5d60556d6d40d9461b7c7e06c3ac20b6b1d50090" + integrity sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg== + dependencies: + escape-string-regexp "^5.0.0" + trough@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== +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" @@ -14400,9 +14368,9 @@ tslib@^1.10.0, tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + 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" @@ -14411,13 +14379,14 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tuf-js@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.4.tgz#e85a936b16859c7fae23e5f040bc0f7b559b3192" - integrity sha512-Lw2JRM3HTYhEtQJM2Th3aNCPbnXirtWMl065BawwmM2pX6XStH/ZO9e8T2hh0zk/HUa+1i6j+Lv6eDitKTau6A== +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.3" - make-fetch-happen "^11.0.1" + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" tunnel-agent@^0.6.0: version "0.6.0" @@ -14433,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" @@ -14450,11 +14412,6 @@ type-fest@^0.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -14498,6 +14455,36 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +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" @@ -14519,7 +14506,12 @@ typeof-article@^0.1.1: dependencies: kind-of "^3.1.0" -"typescript@^3 || ^4", typescript@^4.9.3: +"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== @@ -14558,7 +14550,7 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unbzip2-stream@1.4.3, 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== @@ -14617,13 +14609,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -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-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -14631,13 +14616,6 @@ unique-filename@^3.0.0: dependencies: unique-slug "^4.0.0" -unique-slug@^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== - dependencies: - imurmurhash "^0.1.4" - unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -14645,13 +14623,6 @@ unique-slug@^4.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - unist-util-generated@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" @@ -14729,9 +14700,9 @@ unset-value@^1.0.0: isobject "^3.0.0" unzipper@^0.10.11: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + 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" @@ -14759,12 +14730,12 @@ unzipper@^0.9.11: readable-stream "~2.3.6" setimmediate "~1.0.4" -upath@2.0.1, 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.10: +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== @@ -14803,13 +14774,6 @@ 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== - dependencies: - prepend-http "^2.0.0" - url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -14818,11 +14782,6 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== - use-isomorphic-layout-effect@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" @@ -14840,6 +14799,11 @@ 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" @@ -14861,11 +14825,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -14876,6 +14835,11 @@ uuid@^7.0.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== +uuid@^8.0.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" @@ -14916,10 +14880,10 @@ validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validat spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@4.0.0, 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== +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" @@ -14930,18 +14894,20 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -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" - 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.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.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" @@ -15014,20 +14980,6 @@ vscode-oniguruma@1.6.1: resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== -vscode-proxy-agent@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.12.0.tgz#0775f464b9519b0c903da4dcf50851e1453f4e48" - integrity sha512-jS7950hE9Kq6T18vYewVl0N9acEBD3d+scbPew2Nti7d61THBrhVF9FQjc8TLfrUZ//UzzOFO8why+F0kHDdNw== - 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.0" - vscode-textmate@^7.0.3: version "7.0.4" resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.4.tgz#a30df59ce573e998e4e2ffbca5ab82d57bc3126f" @@ -15038,13 +14990,6 @@ vscode-uri@^2.1.1: 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-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -15052,11 +14997,6 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.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== - warning-symbol@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/warning-symbol/-/warning-symbol-0.1.0.tgz#bb31dd11b7a0f9d67ab2ed95f457b65825bbad21" @@ -15112,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" @@ -15125,9 +15065,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.76.0: - version "5.80.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.80.0.tgz#3e660b4ab572be38c5e954bdaae7e2bf76010fdc" - integrity sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA== + 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" "^1.0.0" @@ -15135,10 +15075,10 @@ webpack@^5.76.0: "@webassemblyjs/wasm-edit" "^1.11.5" "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" + enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -15148,7 +15088,7 @@ webpack@^5.76.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" @@ -15194,19 +15134,19 @@ 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-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +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" @@ -15230,9 +15170,9 @@ which@^2.0.1, which@^2.0.2: isexe "^2.0.0" which@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-3.0.0.tgz#a9efd016db59728758a390d23f1687b6e8f59f8e" - integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== + 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" @@ -15251,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" @@ -15283,6 +15218,15 @@ workerpool@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" @@ -15309,27 +15253,27 @@ 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@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== +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 "^3.0.7" + signal-exit "^4.0.1" write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: version "2.4.3" @@ -15340,14 +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@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz#54303f117e109bf3d540261125c8ea5a7320fab0" - integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== - 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" @@ -15421,6 +15357,11 @@ xml-name-validator@^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" @@ -15481,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== @@ -15572,7 +15513,7 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@17.7.1, yargs@^17.0.1, yargs@^17.6.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== @@ -15620,6 +15561,19 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +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" + 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" + yauzl@^2.10.0, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From 69ae38effaf950ae6fba83617b08b1cc0bc0a40d Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:42:50 +0200 Subject: [PATCH 223/384] feat: simplify board and port handling (#2165) Use Arduino CLI revision `38479dc` Closes #43 Closes #82 Closes #1319 Closes #1366 Closes #2143 Closes #2158 Ref: https://github.com/arduino/arduino-cli/commit/38479dc706f27b2640cabad0bf39cd24e4f049c7 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .vscode/launch.json | 7 + arduino-ide-extension/package.json | 12 +- arduino-ide-extension/scripts/utils.js | 2 + .../browser/arduino-ide-frontend-module.ts | 18 +- .../browser/boards/boards-auto-installer.ts | 412 +++--- .../boards/boards-config-component.tsx | 328 +++++ .../boards/boards-config-dialog-widget.tsx | 71 - .../browser/boards/boards-config-dialog.ts | 142 -- .../browser/boards/boards-config-dialog.tsx | 202 +++ .../src/browser/boards/boards-config.tsx | 432 ------ .../src/browser/boards/boards-data-store.ts | 108 +- .../browser/boards/boards-service-provider.ts | 1203 +++++++---------- .../browser/boards/boards-toolbar-item.tsx | 282 ++-- .../browser/contributions/board-selection.ts | 318 +++-- .../boards-data-menu-updater.ts | 83 +- .../src/browser/contributions/debug.ts | 12 +- .../src/browser/contributions/examples.ts | 20 +- .../browser/contributions/include-library.ts | 6 +- .../src/browser/contributions/ino-language.ts | 21 +- .../contributions/open-boards-config.ts | 17 +- .../browser/contributions/selected-board.ts | 42 +- .../contributions/update-arduino-state.ts | 29 +- .../browser/contributions/upload-sketch.ts | 52 +- .../src/browser/contributions/user-fields.ts | 7 +- .../certificate-uploader-component.tsx | 72 +- .../certificate-uploader-dialog.tsx | 69 +- .../select-board-components.tsx | 84 +- .../firmware-uploader-component.tsx | 73 +- .../firmware-uploader-dialog.tsx | 34 +- .../monitor-manager-proxy-client-impl.ts | 98 +- .../src/browser/notification-center.ts | 18 +- .../browser/serial/monitor/monitor-widget.tsx | 1 - .../src/browser/storage-wrapper.ts | 37 - .../browser/style/boards-config-dialog.css | 47 +- .../src/browser/theia/dialogs/dialogs.tsx | 54 +- arduino-ide-extension/src/common/nls.ts | 1 + .../src/common/protocol/board-list.ts | 694 ++++++++++ .../src/common/protocol/boards-service.ts | 666 +++++---- .../src/common/protocol/core-service.ts | 27 +- .../src/common/protocol/monitor-service.ts | 35 +- .../common/protocol/notification-service.ts | 8 +- arduino-ide-extension/src/common/types.ts | 4 + .../theia/electron-main-application.ts | 7 + .../node/arduino-firmware-uploader-impl.ts | 2 +- .../src/node/board-discovery.ts | 209 ++- .../src/node/boards-service-impl.ts | 130 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 71 - .../cli/commands/v1/commands_grpc_pb.d.ts | 20 +- .../cli/commands/v1/commands_grpc_pb.js | 36 + .../arduino/cli/commands/v1/commands_pb.d.ts | 121 +- .../cc/arduino/cli/commands/v1/commands_pb.js | 651 +++++++-- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 50 +- .../arduino/cli/commands/v1/compile_pb.d.ts | 37 - .../cc/arduino/cli/commands/v1/core_pb.d.ts | 32 - .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 105 +- .../cc/arduino/cli/commands/v1/lib_pb.js | 32 +- .../arduino/cli/commands/v1/monitor_pb.d.ts | 21 - .../cc/arduino/cli/commands/v1/port_pb.d.ts | 6 - .../cc/arduino/cli/commands/v1/upload_pb.d.ts | 88 +- .../cc/arduino/cli/commands/v1/upload_pb.js | 304 ++++- .../arduino/cli/debug/v1/debug_grpc_pb.d.ts | 3 +- .../cc/arduino/cli/debug/v1/debug_pb.d.ts | 20 - .../cli/settings/v1/settings_grpc_pb.d.ts | 20 +- .../cli/settings/v1/settings_grpc_pb.js | 34 + .../arduino/cli/settings/v1/settings_pb.d.ts | 45 +- .../cc/arduino/cli/settings/v1/settings_pb.js | 275 ++++ .../cli-protocol/google/rpc/status_pb.d.ts | 3 - .../src/node/core-service-impl.ts | 126 +- .../src/node/monitor-manager.ts | 59 +- .../src/node/notification-service-server.ts | 6 +- .../src/node/sketches-service-impl.ts | 6 +- .../browser/board-service-provider.test.ts | 426 ++++++ .../browser/boards-auto-installer.test.ts | 247 ---- .../src/test/browser/browser-test-bindings.ts | 8 + .../src/test/browser/fixtures/boards.ts | 50 +- .../src/test/common/board-list.test.ts | 594 ++++++++ .../src/test/common/boards-service.test.ts | 236 ++-- .../src/test/common/common-test-bindings.ts | 97 ++ .../src/test/common/fixtures.ts | 176 +++ .../node/boards-service-impl.slow-test.ts | 2 +- .../src/test/node/clang-formatter.test.ts | 2 +- .../node/core-client-provider.slow-test.ts | 60 +- .../test/node/core-service-impl.slow-test.ts | 2 +- .../src/test/node/core-service-impl.test.ts | 22 +- .../node/library-service-impl.slow-test.ts | 2 +- ...test-bindings.ts => node-test-bindings.ts} | 109 +- .../node/sketches-service-impl.slow-test.ts | 2 +- i18n/en.json | 13 +- 88 files changed, 6494 insertions(+), 3921 deletions(-) create mode 100644 arduino-ide-extension/src/browser/boards/boards-config-component.tsx delete mode 100644 arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx delete mode 100644 arduino-ide-extension/src/browser/boards/boards-config-dialog.ts create mode 100644 arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx delete mode 100644 arduino-ide-extension/src/browser/boards/boards-config.tsx rename arduino-ide-extension/src/browser/{boards => contributions}/boards-data-menu-updater.ts (73%) delete mode 100644 arduino-ide-extension/src/browser/storage-wrapper.ts create mode 100644 arduino-ide-extension/src/common/protocol/board-list.ts create mode 100644 arduino-ide-extension/src/test/browser/board-service-provider.test.ts delete mode 100644 arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts create mode 100644 arduino-ide-extension/src/test/browser/browser-test-bindings.ts create mode 100644 arduino-ide-extension/src/test/common/board-list.test.ts create mode 100644 arduino-ide-extension/src/test/common/common-test-bindings.ts create mode 100644 arduino-ide-extension/src/test/common/fixtures.ts rename arduino-ide-extension/src/test/node/{test-bindings.ts => node-test-bindings.ts} (78%) diff --git a/.vscode/launch.json b/.vscode/launch.json index 3c54efee9..11c115550 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -94,6 +94,13 @@ "--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": "${workspaceFolder}/tsconfig.json", "IDE2_TEST": "true" diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 05c44e0c3..2dde27623 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -123,14 +123,14 @@ "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": [ @@ -172,10 +172,14 @@ ], "arduino": { "arduino-cli": { - "version": "0.33.1" + "version": { + "owner": "arduino", + "repo": "arduino-cli", + "commitish": "38479dc" + } }, "arduino-fwuploader": { - "version": "2.2.2" + "version": "2.3.0" }, "arduino-language-server": { "version": "0.7.4" diff --git a/arduino-ide-extension/scripts/utils.js b/arduino-ide-extension/scripts/utils.js index eeeee37eb..b932b444c 100644 --- a/arduino-ide-extension/scripts/utils.js +++ b/arduino-ide-extension/scripts/utils.js @@ -113,6 +113,8 @@ function buildFromGit(command, version, destinationPath, taskName) { shell.echo(`<<< Checked out ${commitish}.`); } + exec('git', ['-C', tempRepoPath, 'rev-parse', '--short', 'HEAD'], shell); + shell.echo(`>>> Building the ${taskName}...`); exec(command, ['build'], shell, { cwd: tempRepoPath, encoding: 'utf8' }); shell.echo(`<<< Done ${taskName} build.`); 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 e29e98ca3..0300429c9 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -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'; @@ -445,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 @@ -478,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( @@ -751,6 +749,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { 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 @@ -879,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(); 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<BoardsPackage | undefined> { + 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<PlatformIdentifier | undefined> { + 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<void> { + 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<EditBoardsConfigActionParams['query']> + >; + readonly onAppStateDidChange: Event<FrontendApplicationState>; + readonly onBoardSelected: (board: BoardIdentifier) => void; + readonly onPortSelected: (port: PortIdentifier) => void; + readonly searchBoards: (query?: { + query?: string; + }) => Promise<BoardWithPackage[]>; + readonly ports: ( + predicate?: (port: DetectedPort) => boolean + ) => readonly DetectedPort[]; + } + + export interface State { + searchResults: Array<BoardWithPackage>; + showAllPorts: boolean; + query: string; + } +} + +export abstract class Item<T> 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 ( + <div + onClick={this.onClick} + className={classNames.join(' ')} + title={`${label}${!details ? '' : details}`} + > + <div className="label">{label}</div> + {!details ? '' : <div className="details">{details}</div>} + {!selected ? ( + '' + ) : ( + <div className="selected-icon"> + <i className="fa fa-check" /> + </div> + )} + </div> + ); + } + + 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<HTMLInputElement> | 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<Array<BoardWithPackage>> => { + 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 ( + <div className="container"> + <div className="content"> + <div className="title">{title}</div> + {contentRenderer()} + <div className="footer">{footerRenderer ? footerRenderer() : ''}</div> + </div> + </div> + ); + } + + 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<string, Board.Detailed>(); + 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) => ( + <Item<BoardWithPackage> + key={toKey(board)} + item={board} + label={board.name} + details={board.details} + selected={board.selected} + onClick={this.selectBoard} + missing={board.missing} + /> + )); + + return ( + <React.Fragment> + <div className="search"> + <input + type="search" + value={query} + className="theia-input" + placeholder={nls.localize( + 'arduino/board/searchBoard', + 'Search board' + )} + onChange={this.updateBoards} + ref={this.focusNodeSet} + /> + <i className="fa fa-search"></i> + </div> + {boardsList.length > 0 ? ( + <div className="boards list">{boardsList}</div> + ) : ( + <div className="no-result"> + {nls.localize( + 'arduino/board/noBoardsFound', + 'No boards found for "{0}"', + query + )} + </div> + )} + </React.Fragment> + ); + } + + 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 ? ( + <div className="no-result"> + {nls.localize('arduino/board/noPortsDiscovered', 'No ports discovered')} + </div> + ) : ( + <div className="ports list"> + {detectedPorts.map((detectedPort, index) => ( + <Item<Port> + key={`${Port.keyOf(detectedPort.port)}`} + item={detectedPort.port} + label={Port.toString(detectedPort.port)} + selected={index === matchingIndex} + onClick={this.selectPort} + /> + ))} + </div> + ); + } + + private renderPortsFooter(): React.ReactNode { + return ( + <div className="noselect"> + <label + title={nls.localize( + 'arduino/board/showAllAvailablePorts', + 'Shows all available ports when enabled' + )} + > + <input + type="checkbox" + defaultChecked={this.state.showAllPorts} + onChange={this.toggleFilterPorts} + /> + <span> + {nls.localize('arduino/board/showAllPorts', 'Show all ports')} + </span> + </label> + </div> + ); + } +} 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 ec39e6b30..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog-widget.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import 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<string>(); - protected readonly onBoardConfigChangedEmitter = - new Emitter<BoardsConfig.Config>(); - 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 ( - <div className="selectBoardContainer"> - <BoardsConfig - boardsServiceProvider={this.boardsServiceClient} - notificationCenter={this.notificationCenter} - onConfigChange={this.fireConfigChanged} - onFocusNodeSet={this.setFocusNode} - onFilteredTextDidChangeEvent={this.onFilterTextDidChangeEmitter.event} - onAppStateDidChange={this.notificationCenter.onAppStateDidChange} - /> - </div> - ); - } - - 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<BoardsConfig.Config> { - @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<BoardsConfig.Config | undefined> { - 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<BoardsConfig, 'selectedBoard'> & { + selectedBoard: BoardsConfig['selectedBoard'] | BoardWithPackage; +}; + +@injectable() +export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> { + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(NotificationCenter) + private readonly notificationCenter: NotificationCenter; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; + + private readonly onFilterTextDidChangeEmitter: Emitter< + Defined<EditBoardsConfigActionParams['query']> + >; + 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<BoardWithPackage[]> => { + 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<BoardsConfig | undefined> { + 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 ( + <> + <div className="head"> + <div className="text"> + <div> + {nls.localize( + 'arduino/board/configDialog1', + 'Select both a Board and a Port if you want to upload a sketch.' + )} + </div> + <div> + {nls.localize( + 'arduino/board/configDialog2', + 'If you only select a Board you will be able to compile, but not to upload your sketch.' + )} + </div> + </div> + </div> + <div id="select-board-dialog" className="p-Widget ps"> + <div className="selectBoardContainer"> + <BoardsConfigComponent + boardsConfig={this._boardsConfig} + searchSet={this._searchSet} + onBoardSelected={this.onBoardSelected} + onPortSelected={this.onPortSelected} + notificationCenter={this.notificationCenter} + onFocusNodeSet={this.setFocusNode} + onFilteredTextDidChangeEvent={ + this.onFilterTextDidChangeEmitter.event + } + appState={this.appStateService.state} + onAppStateDidChange={this.notificationCenter.onAppStateDidChange} + searchBoards={this.searchBoards} + ports={this.ports} + /> + </div> + </div> + </> + ); + } + + 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 af62368fe..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ /dev/null @@ -1,432 +0,0 @@ -import 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<string>; - readonly onAppStateDidChange: Event<FrontendApplicationState>; - } - - export interface State extends Config { - searchResults: Array<BoardWithPackage>; - knownPorts: Port[]; - showAllPorts: boolean; - query: string; - } -} - -export abstract class Item<T> 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 ( - <div - onClick={this.onClick} - className={classNames.join(' ')} - title={`${label}${!details ? '' : details}`} - > - <div className="label">{label}</div> - {!details ? '' : <div className="details">{details}</div>} - {!selected ? ( - '' - ) : ( - <div className="selected-icon"> - <i className="fa fa-check" /> - </div> - )} - </div> - ); - } - - 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<HTMLInputElement> | 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<Array<BoardWithPackage>> => { - return this.props.boardsServiceProvider.searchBoards(options); - }; - - protected get availablePorts(): MaybePromise<Port[]> { - return this.props.boardsServiceProvider.availableBoards - .map(({ port }) => port) - .filter(notEmpty); - } - - protected get availableBoards(): AvailableBoard[] { - return this.props.boardsServiceProvider.availableBoards; - } - - protected queryPorts = async ( - availablePorts: MaybePromise<Port[]> = 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 ( - <div className="container"> - <div className="content"> - <div className="title">{title}</div> - {contentRenderer()} - <div className="footer">{footerRenderer ? footerRenderer() : ''}</div> - </div> - </div> - ); - } - - 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<string, Board.Detailed>(); - 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) => ( - <Item<BoardWithPackage> - key={toKey(board)} - item={board} - label={board.name} - details={board.details} - selected={board.selected} - onClick={this.selectBoard} - missing={board.missing} - /> - )); - - return ( - <React.Fragment> - <div className="search"> - <input - type="search" - value={query} - className="theia-input" - placeholder={nls.localize( - 'arduino/board/searchBoard', - 'Search board' - )} - onChange={this.updateBoards} - ref={this.focusNodeSet} - /> - <i className="fa fa-search"></i> - </div> - {boardsList.length > 0 ? ( - <div className="boards list">{boardsList}</div> - ) : ( - <div className="no-result"> - {nls.localize( - 'arduino/board/noBoardsFound', - 'No boards found for "{0}"', - query - )} - </div> - )} - </React.Fragment> - ); - } - - 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 ? ( - <div className="no-result"> - {nls.localize('arduino/board/noPortsDiscovered', 'No ports discovered')} - </div> - ) : ( - <div className="ports list"> - {ports.map((port) => ( - <Item<Port> - key={`${Port.keyOf(port)}`} - item={port} - label={Port.toString(port)} - selected={Port.sameAs(this.state.selectedPort, port)} - onClick={this.selectPort} - /> - ))} - </div> - ); - } - - protected renderPortsFooter(): React.ReactNode { - return ( - <div className="noselect"> - <label - title={nls.localize( - 'arduino/board/showAllAvailablePorts', - 'Shows all available ports when enabled' - )} - > - <input - type="checkbox" - defaultChecked={this.state.showAllPorts} - onChange={this.toggleFilterPorts} - /> - <span> - {nls.localize('arduino/board/showAllPorts', 'Show all ports')} - </span> - </label> - </div> - ); - } -} - -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<string[]>(); + private readonly onChangedEmitter = new Emitter<string[]>(); + 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<ConfigOption[]>(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<string[]> { @@ -65,7 +66,7 @@ export class BoardsDataStore implements FrontendApplicationContribution { } async appendConfigToFqbn( - fqbn: string | undefined, + fqbn: string | undefined ): Promise<string | undefined> { if (!fqbn) { return undefined; @@ -100,12 +101,13 @@ export class BoardsDataStore implements FrontendApplicationContribution { return data; } - async selectProgrammer( - { - fqbn, - selectedProgrammer, - }: { fqbn: string; selectedProgrammer: Programmer }, - ): Promise<boolean> { + async selectProgrammer({ + fqbn, + selectedProgrammer, + }: { + fqbn: string; + selectedProgrammer: Programmer; + }): Promise<boolean> { 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<boolean> { + async selectConfigOption({ + fqbn, + option, + selectedValue, + }: { + fqbn: string; + option: string; + selectedValue: string; + }): Promise<boolean> { 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<Defined<BoardsConfig>> & + 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<BoardsConfig.Config>(); - protected readonly onAvailableBoardsChangedEmitter = new Emitter< - AvailableBoard[] - >(); - protected readonly onAvailablePortsChangedEmitter = new Emitter<{ - newState: Port[]; - oldState: Port[]; - }>(); - private readonly inheritedConfig = new Deferred<BoardsConfig.Config>(); + private _boardsConfig = emptyBoardsConfig(); + private _detectedPorts: DetectedPorts = {}; + private _boardList = this.createBoardListUI(createBoardList({})); + private _boardListHistory: Mutable<BoardListHistory> = {}; + private _ready = new Deferred<void>(); - /** - * 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<BoardsConfig.Config> - | 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<BoardsConfigChangeEvent>(); + readonly onBoardsConfigDidChange = this.boardsConfigDidChangeEmitter.event; + private readonly boardListDidChangeEmitter = new Emitter<BoardListUI>(); /** - * 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<void>(); + 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<void> { - 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<void> { + 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<PortToSelect, undefined> { + 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<void> { + 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<BoardsConfig.Config> { - 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<void> { + 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<void> { - 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<void>((_, reject) => - setTimeout( - () => reject(new Error(`Timeout after ${timeout} ms.`)), - timeout - ) - ) - : new Promise<void>(() => { - /* never */ - }); - const waitUntilTask = new Promise<void>((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<void> { - 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<Board | undefined> { - const key = this.getLastSelectedBoardOnPortKey(port); - return this.getData<Board>(key); - } - - protected async saveState(): Promise<void> { - // 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<void> { 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<BoardsConfig> & { boardListHistory: BoardListHistory | undefined } + > { + const [maybeSelectedBoard, maybeSelectedPort, maybeBoardHistory] = + await Promise.all([ + this.getData<string>(selectedBoardStorageKey), + this.getData<string>(selectedPortStorageKey), + this.getData<string>(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<void> { - const storedLatestValidBoardsConfig = await this.getData< - RecursiveRequired<BoardsConfig.Config> - >('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<undefined>((resolve) => - setTimeout(() => resolve(undefined), 2_000) - ), - ]); - } - if (storedLatestBoardsConfig) { - this.latestBoardsConfig = storedLatestBoardsConfig; - this.boardsConfig = this.latestBoardsConfig; + private tryParse<T>( + 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<T>(key: string, value: T): Promise<void> { - return this.commandService.executeCommand( - StorageWrapper.Commands.SET_DATA.id, - key, - value - ); + return this.storageService.setData(key, value); } private getData<T>(key: string): Promise<T | undefined> { - return this.commandService.executeCommand<T>( - 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 25d66e361..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 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<AvailableBoard & { onClick: () => void; port: Port }>; + readonly boardList: BoardListUI; readonly openBoardsConfig: () => void; + readonly hide: () => void; } } -export class BoardsDropDown extends React.Component<BoardsDropDown.Props> { - protected dropdownElement: HTMLElement; +export class BoardListDropDown extends React.Component<BoardsDropDown.Props> { + private dropdownElement: HTMLElement; private listRef: React.RefObject<HTMLDivElement>; 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<BoardsDropDown.Props> { } 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<BoardsDropDown.Props> { tabIndex={0} > <div className="arduino-boards-dropdown-list--items-container"> - {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, + }) + )} </div> <div key={footerLabel} @@ -95,31 +101,43 @@ export class BoardsDropDown extends React.Component<BoardsDropDown.Props> { ); } - 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 ( <div - key={`board-item--${boardLabel}-${port.address}`} + key={`board-item--${Port.keyOf(port)}`} className={classNames('arduino-boards-dropdown-item', { 'arduino-boards-dropdown-item--selected': selected, })} - onClick={onClick} + onClick={() => this.onDefaultAction(item)} onKeyUp={onKeyUp} tabIndex={0} > @@ -127,21 +145,81 @@ export class BoardsDropDown extends React.Component<BoardsDropDown.Props> { className={classNames( 'arduino-boards-dropdown-item--protocol', 'fa', - protocolIcon + iconNameFromProtocol(portProtocol) )} /> - <div - className="arduino-boards-dropdown-item--label" - title={`${boardLabel}\n${port.address}`} - > - <div className="arduino-boards-dropdown-item--board-label noWrapInfo noselect"> - {boardLabel} + <div className="arduino-boards-dropdown-item--label" title={tooltip}> + <div className="arduino-boards-dropdown-item--board-header"> + <div className="arduino-boards-dropdown-item--board-label noWrapInfo noselect"> + {boardLabel} + </div> </div> <div className="arduino-boards-dropdown-item--port-label noWrapInfo noselect"> - {port.addressLabel} + {portLabel} </div> </div> - {selected ? <div className="fa fa-check" /> : ''} + {this.renderActions(item)} + </div> + ); + } + + 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<HTMLElement, MouseEvent>, + callback: () => void + ) => { + event.preventDefault(); + event.stopPropagation(); + hide(); + callback(); + }; + return ( + <div className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR}> + {edit && ( + <div + className={`${TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM} enabled`} + > + { + <div + id="edit" + className={codicon('pencil', true)} + title={nls.localize( + 'arduino/board/editBoardsConfig', + 'Edit Board and Port...' + )} + onClick={(event) => + handleOnClick(event, () => boardList.edit(edit.params)) + } + /> + } + </div> + )} + {revert && ( + <div + className={`${TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM} enabled`} + > + { + <div + id="revert" + className={codicon('discard', true)} + title={nls.localize( + 'arduino/board/revertBoardsConfig', + "Use '{0}' discovered on '{1}'", + boardIdentifierLabel(revert.params.selectedBoard), + item.labels.portLabel + )} + onClick={(event) => + handleOnClick(event, () => boardList.select(revert.params)) + } + /> + } + </div> + )} </div> ); } @@ -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<HTMLElement>): void => { + private readonly show = (event: React.MouseEvent<HTMLElement>): 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 ( <React.Fragment> <div className="arduino-boards-toolbar-item-container" - title={selectedPortLabel} + title={tooltip} onClick={this.show} > {protocolIcon && <div className={protocolIconClassNames} />} @@ -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} </div> <div className="fa fa-caret-down caret" /> </div> - <BoardsDropDown + <BoardListDropDown coords={coords} - items={availableBoards - .filter(AvailableBoard.hasPort) - .map((board) => ({ - ...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} - ></BoardsDropDown> + boardList={boardList} + openBoardsConfig={() => boardList.edit({ query: '' })} + hide={this.hide} + /> </React.Fragment> ); } - - protected openDialog = async ( - previousBoardConfig?: BoardsConfig.Config - ): Promise<void> => { - const selectedBoardConfig = - await this.props.commands.executeCommand<BoardsConfig.Config>( - 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/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 3e7558c83..ddeda87bc 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -1,57 +1,58 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -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<InstalledBoardWithPackage[]> | 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); @@ -76,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<void> { this.updateMenus(); } - protected async updateMenus(): Promise<void> { - 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<void> { + 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(); @@ -112,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( @@ -132,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( @@ -171,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<string, BoardWithPackage[]>; + // 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<string, BoardsPerVendor>(); + 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<BoardList['ports']>, + protocolOrder: number ) => { - const portIDs = Object.keys(ports); - if (!portIDs.length) { + if (!ports.length) { return; } @@ -258,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, @@ -314,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 73% 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 f323621d3..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 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; - - @inject(FrontendApplicationStateService) - private readonly appStateService: FrontendApplicationStateService; + private readonly boardsServiceProvider: BoardsServiceProvider; - protected readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); - protected readonly toDisposeOnBoardChange = new DisposableCollection(); + private readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); + private readonly toDisposeOnBoardChange = new DisposableCollection(); - async onStart(): Promise<void> { - 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<void> { 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/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<void> { if (!board) { diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index 16fc6a380..3796b7535 100644 --- a/arduino-ide-extension/src/browser/contributions/examples.ts +++ b/arduino-ide-extension/src/browser/contributions/examples.ts @@ -28,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'; @@ -108,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; @@ -117,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. }) ); @@ -134,7 +138,7 @@ export abstract class Examples extends SketchContribution { } protected abstract update(options?: { - board?: Board | undefined; + board?: BoardIdentifier | undefined; forceRefresh?: boolean; }): void; @@ -225,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 { @@ -306,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<void> { 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 cb6479f18..5d77e9ec3 100644 --- a/arduino-ide-extension/src/browser/contributions/include-library.ts +++ b/arduino-ide-extension/src/browser/contributions/include-library.ts @@ -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 2577d5a73..096c27ed8 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -7,12 +7,13 @@ 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'; @@ -48,7 +49,7 @@ export class InoLanguage extends SketchContribution { override onReady(): void { const start = ( - { selectedBoard }: BoardsConfig.Config, + selectedBoard: BoardIdentifier | undefined, forceStart = false ) => { if (selectedBoard) { @@ -59,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) @@ -101,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 { 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/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/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts index a227a51a0..35b4c2ab7 100644 --- a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -6,15 +6,16 @@ import type { ArduinoState } from 'vscode-arduino-api'; import { BoardsService, CompileSummary, - Port, isCompileSummary, + BoardsConfig, + PortIdentifier, + resolveDetectedPort, } from '../../common/protocol'; import { toApiBoardDetails, toApiCompileSummary, toApiPort, } from '../../common/protocol/arduino-context-mapper'; -import type { BoardsConfig } from '../boards/boards-config'; import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { CurrentSketch } from '../sketches-service-client-impl'; @@ -44,8 +45,8 @@ export class UpdateArduinoState extends SketchContribution { override onStart(): void { this.toDispose.pushAll([ - this.boardsServiceProvider.onBoardsConfigChanged((config) => - this.updateBoardsConfig(config) + this.boardsServiceProvider.onBoardsConfigDidChange(() => + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig) ), this.sketchServiceClient.onCurrentSketchDidChange((sketch) => this.updateSketchPath(sketch) @@ -75,9 +76,7 @@ export class UpdateArduinoState extends SketchContribution { } override onReady(): void { - this.boardsServiceProvider.reconciled.then(() => { - this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); - }); + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); // TODO: verify! this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch()); this.updateUserDirPath(this.configService.tryGetSketchDirUri()); this.updateDataDirPath(this.configService.tryGetDataDirUri()); @@ -106,9 +105,7 @@ export class UpdateArduinoState extends SketchContribution { }); } - private async updateBoardsConfig( - boardsConfig: BoardsConfig.Config - ): Promise<void> { + private async updateBoardsConfig(boardsConfig: BoardsConfig): Promise<void> { const fqbn = boardsConfig.selectedBoard?.fqbn; const port = boardsConfig.selectedPort; await this.updateFqbn(fqbn); @@ -146,8 +143,11 @@ export class UpdateArduinoState extends SketchContribution { }); } - private async updatePort(port: Port | undefined): Promise<void> { - const apiPort = port && toApiPort(port); + private async updatePort(port: PortIdentifier | undefined): Promise<void> { + const resolvedPort = + port && + resolveDetectedPort(port, this.boardsServiceProvider.detectedPorts); + const apiPort = resolvedPort && toApiPort(resolvedPort); return this.updateState({ key: 'port', value: apiPort }); } @@ -171,9 +171,6 @@ export class UpdateArduinoState extends SketchContribution { params: UpdateStateParams<T> ): Promise<void> { await this.hostedPluginSupport.didStart; - return this.commandService.executeCommand( - 'arduinoAPI.updateState', - params - ); + return this.commandService.executeCommand('arduinoAPI.updateState', params); } } 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<void>(); 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/dialogs/certificate-uploader/certificate-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx index b426b82e3..21f8f2406 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,30 @@ +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 { + BoardList, + isInferredBoardListItem, +} 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 +43,17 @@ export const CertificateUploaderComponent = ({ const [selectedCerts, setSelectedCerts] = React.useState<string[]>([]); - const [selectedBoard, setSelectedBoard] = - React.useState<AvailableBoard | null>(null); + const [selectedItem, setSelectedItem] = + React.useState<BoardOptionValue | null>(null); const installCertificates = async () => { - if (!selectedBoard || !selectedBoard.fqbn || !selectedBoard.port) { + if (!selectedItem) { + return; + } + const board = isInferredBoardListItem(selectedItem) + ? selectedItem.inferredBoard + : selectedItem.board; + if (!board.fqbn) { return; } @@ -45,8 +61,8 @@ export const CertificateUploaderComponent = ({ try { await uploadCertificates( - selectedBoard.fqbn, - selectedBoard.port.address, + board.fqbn, + selectedItem.port.address, selectedCerts ); setInstallFeedback('ok'); @@ -55,17 +71,29 @@ 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 = isInferredBoardListItem(item) + ? item.inferredBoard + : item.board; + const selectedBoard = isInferredBoardListItem(selectedItem) + ? selectedItem.inferredBoard + : selectedItem?.board; + const port = item.port; + 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 +153,10 @@ export const CertificateUploaderComponent = ({ <div className="dialogRow"> <div className="fl1"> <SelectBoardComponent - availableBoards={availableBoards} + boardList={boardList} updatableFqbns={updatableFqbns} - onBoardSelect={onBoardSelect} - selectedBoard={selectedBoard} + onItemSelect={onItemSelect} + selectedItem={selectedItem} busy={installFeedback === 'installing'} /> </div> @@ -167,7 +195,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')} </button> 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 5dde52d91..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 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 ( <CertificateUploaderComponent - availableBoards={this.availableBoards} + boardList={this.boardList} certificates={this.certificates} updatableFqbns={this.updatableFqbns} addCertificate={this.addCertificate.bind(this)} @@ -143,7 +132,7 @@ export class UploadCertificateDialogProps extends DialogProps {} @injectable() export class UploadCertificateDialog extends AbstractDialog<void> { @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 ca4cd91be..49aa5617d 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,38 @@ import { nls } from '@theia/core/lib/common'; import React from '@theia/core/shared/react'; -import { AvailableBoard } from '../../boards/boards-service-provider'; +import { + BoardList, + BoardListItemWithBoard, + InferredBoardListItem, + isInferredBoardListItem, +} from '../../../common/protocol/board-list'; import { ArduinoSelect } from '../../widgets/arduino-select'; -type BoardOption = { value: string; label: string }; +export type BoardOptionValue = BoardListItemWithBoard | InferredBoardListItem; +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<BoardOption[]>([]); - 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 +45,33 @@ export const SelectBoardComponent = ({ 'arduino/certificate/selectBoard', 'Select a board...' ); + const updatableBoards = boardList.boards.filter((item) => { + const fqbn = ( + isInferredBoardListItem(item) ? item.inferredBoard : 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; } + const board = isInferredBoardListItem(item) + ? item.inferredBoard + : item.board; return { label: nls.localize( 'arduino/certificate/boardAtPort', '{0} at {1}', board.name, - board.port?.address ?? '' + 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 +79,32 @@ 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 ( <ArduinoSelect id="board-select" menuPosition="fixed" isDisabled={selectOptions.length === 0 || busy} - placeholder={selectBoardPlaceholder} + placeholder={selectItemPlaceholder} options={selectOptions} value={ - (selectedBoard && { - value: selectedBoard.fqbn, + (selectedItem && { + value: selectedItem, label: nls.localize( 'arduino/certificate/boardAtPort', '{0} at {1}', - selectedBoard.name, - selectedBoard.port?.address ?? '' + (isInferredBoardListItem(selectedItem) + ? selectedItem.inferredBoard + : selectedItem.board + ).name, + selectedItem.port.address ?? '' ), }) || null diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx index f7d5f4478..774645ae4 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx @@ -1,24 +1,32 @@ import { nls } from '@theia/core/lib/common'; import React from '@theia/core/shared/react'; -import { Port } from '../../../common/protocol'; +import { + boardIdentifierEquals, + Port, + portIdentifierEquals, +} from '../../../common/protocol'; import { ArduinoFirmwareUploader, FirmwareInfo, } from '../../../common/protocol/arduino-firmware-uploader'; -import { AvailableBoard } from '../../boards/boards-service-provider'; +import { + BoardList, + BoardListItemWithBoard, + isInferredBoardListItem, +} from '../../../common/protocol/board-list'; import { ArduinoSelect } from '../../widgets/arduino-select'; import { SelectBoardComponent } from '../certificate-uploader/select-board-components'; type FirmwareOption = { value: string; label: string }; export const FirmwareUploaderComponent = ({ - availableBoards, + boardList, firmwareUploader, updatableFqbns, flashFirmware, isOpen, }: { - availableBoards: AvailableBoard[]; + boardList: BoardList; firmwareUploader: ArduinoFirmwareUploader; updatableFqbns: string[]; flashFirmware: (firmware: FirmwareInfo, port: Port) => Promise<any>; @@ -31,8 +39,8 @@ export const FirmwareUploaderComponent = ({ 'ok' | 'fail' | 'installing' | null >(null); - const [selectedBoard, setSelectedBoard] = - React.useState<AvailableBoard | null>(null); + const [selectedItem, setSelectedItem] = + React.useState<BoardListItemWithBoard | null>(null); const [availableFirmwares, setAvailableFirmwares] = React.useState< FirmwareInfo[] @@ -50,13 +58,16 @@ export const FirmwareUploaderComponent = ({ const fetchFirmwares = React.useCallback(async () => { setInstallFeedback(null); setFirmwaresFetching(true); - if (!selectedBoard) { + if (!selectedItem) { return; } // fetch the firmwares for the selected board + const board = isInferredBoardListItem(selectedItem) + ? selectedItem.inferredBoard + : selectedItem.board; const firmwaresForFqbn = await firmwareUploader.availableFirmwares( - selectedBoard.fqbn || '' + board.fqbn || '' ); setAvailableFirmwares(firmwaresForFqbn); @@ -69,7 +80,7 @@ export const FirmwareUploaderComponent = ({ if (firmwaresForFqbn.length > 0) setSelectedFirmware(firmwaresOpts[0]); setFirmwaresFetching(false); - }, [firmwareUploader, selectedBoard]); + }, [firmwareUploader, selectedItem]); const installFirmware = React.useCallback(async () => { setInstallFeedback('installing'); @@ -81,27 +92,39 @@ export const FirmwareUploaderComponent = ({ try { const installStatus = !!firmwareToFlash && - !!selectedBoard?.port && - (await flashFirmware(firmwareToFlash, selectedBoard?.port)); + !!selectedItem?.board && + (await flashFirmware(firmwareToFlash, selectedItem?.port)); setInstallFeedback((installStatus && 'ok') || 'fail'); } catch { setInstallFeedback('fail'); } - }, [firmwareUploader, selectedBoard, selectedFirmware, availableFirmwares]); + }, [selectedItem, selectedFirmware, availableFirmwares, flashFirmware]); - const onBoardSelect = React.useCallback( - (board: AvailableBoard) => { - const newFqbn = (board && board.fqbn) || null; - const prevFqbn = (selectedBoard && selectedBoard.fqbn) || null; - - if (newFqbn !== prevFqbn) { + const onItemSelect = React.useCallback( + (item: BoardListItemWithBoard | null) => { + if (!item) { + return; + } + const board = isInferredBoardListItem(item) + ? item.inferredBoard + : item.board; + const selectedBoard = isInferredBoardListItem(selectedItem) + ? selectedItem.inferredBoard + : selectedItem?.board; + const port = item.port; + const selectedPort = selectedItem?.port; + + if ( + !boardIdentifierEquals(board, selectedBoard) || + !portIdentifierEquals(port, selectedPort) + ) { setInstallFeedback(null); setAvailableFirmwares([]); - setSelectedBoard(board); + setSelectedItem(item); } }, - [selectedBoard] + [selectedItem] ); return ( @@ -115,10 +138,10 @@ export const FirmwareUploaderComponent = ({ <div className="dialogRow"> <div className="fl1"> <SelectBoardComponent - availableBoards={availableBoards} + boardList={boardList} updatableFqbns={updatableFqbns} - onBoardSelect={onBoardSelect} - selectedBoard={selectedBoard} + onItemSelect={onItemSelect} + selectedItem={selectedItem} busy={installFeedback === 'installing'} /> </div> @@ -126,7 +149,7 @@ export const FirmwareUploaderComponent = ({ type="button" className="theia-button secondary" disabled={ - selectedBoard === null || + selectedItem === null || firmwaresFetching || installFeedback === 'installing' } @@ -150,7 +173,7 @@ export const FirmwareUploaderComponent = ({ id="firmware-select" menuPosition="fixed" isDisabled={ - !selectedBoard || + !selectedItem || firmwaresFetching || installFeedback === 'installing' } diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx index c9e23b937..44745d5f2 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx @@ -1,24 +1,21 @@ -import 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 type { Message } from '@theia/core/shared/@phosphor/messaging'; import { inject, injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { DialogProps } from '@theia/core/lib/browser/dialogs'; -import { ReactDialog } from '../../theia/dialogs/dialogs'; -import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { - AvailableBoard, - BoardsServiceProvider, -} from '../../boards/boards-service-provider'; +import React from '@theia/core/shared/react'; import { ArduinoFirmwareUploader, FirmwareInfo, } from '../../../common/protocol/arduino-firmware-uploader'; -import { FirmwareUploaderComponent } from './firmware-uploader-component'; +import type { Port } from '../../../common/protocol/boards-service'; +import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { UploadFirmware } from '../../contributions/upload-firmware'; -import { Port } from '../../../common/protocol'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { ReactDialog } from '../../theia/dialogs/dialogs'; +import { FirmwareUploaderComponent } from './firmware-uploader-component'; @injectable() export class UploadFirmwareDialogProps extends DialogProps {} @@ -26,14 +23,13 @@ export class UploadFirmwareDialogProps extends DialogProps {} @injectable() export class UploadFirmwareDialog extends ReactDialog<void> { @inject(BoardsServiceProvider) - private readonly boardsServiceClient: BoardsServiceProvider; + private readonly boardsServiceProvider: BoardsServiceProvider; @inject(ArduinoFirmwareUploader) private readonly arduinoFirmwareUploader: ArduinoFirmwareUploader; @inject(FrontendApplicationStateService) - private readonly appStatusService: FrontendApplicationStateService; + private readonly appStateService: FrontendApplicationStateService; private updatableFqbns: string[] = []; - private availableBoards: AvailableBoard[] = []; private isOpen = new Object(); private busy = false; @@ -49,16 +45,12 @@ export class UploadFirmwareDialog extends ReactDialog<void> { @postConstruct() protected init(): void { - this.appStatusService.reachedState('ready').then(async () => { + this.appStateService.reachedState('ready').then(async () => { const fqbns = await this.arduinoFirmwareUploader.updatableBoards(); this.updatableFqbns = fqbns; this.update(); }); - - this.boardsServiceClient.onAvailableBoardsChanged((availableBoards) => { - this.availableBoards = availableBoards; - this.update(); - }); + this.boardsServiceProvider.onBoardListDidChange(() => this.update()); } get value(): void { @@ -70,7 +62,7 @@ export class UploadFirmwareDialog extends ReactDialog<void> { <div> <form> <FirmwareUploaderComponent - availableBoards={this.availableBoards} + boardList={this.boardsServiceProvider.boardList} firmwareUploader={this.arduinoFirmwareUploader} flashFirmware={this.flashFirmware.bind(this)} updatableFqbns={this.updatableFqbns} diff --git a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts index 04793674c..c6f7faeb1 100644 --- a/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts +++ b/arduino-ide-extension/src/browser/monitor-manager-proxy-client-impl.ts @@ -1,15 +1,18 @@ -import { - ApplicationError, - Disposable, - Emitter, - MessageService, - nls, -} from '@theia/core'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { Emitter } from '@theia/core/lib/common/event'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { inject, injectable } from '@theia/core/shared/inversify'; import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; -import { MessageType } from '@theia/core/lib/common/message-service-protocol'; -import { Board, Port } from '../common/protocol'; +import { BoardIdentifier, PortIdentifier } from '../common/protocol'; +import { + BoardListItem, + boardListItemEquals, + getInferredBoardOrBoard, +} from '../common/protocol/board-list'; import { Monitor, MonitorManagerProxyClient, @@ -17,7 +20,6 @@ import { MonitorSettings, PluggableMonitorSettings, } from '../common/protocol/monitor-service'; -import { BoardsConfig } from './boards/boards-config'; import { BoardsServiceProvider } from './boards/boards-service-provider'; @injectable() @@ -55,8 +57,8 @@ export class MonitorManagerProxyClientImpl // frontend and backend. private webSocket?: WebSocket; private wsPort?: number; - private lastConnectedBoard: BoardsConfig.Config; - private onBoardsConfigChanged: Disposable | undefined; + private lastConnectedBoard: BoardListItem | undefined; + private onBoardListDidChange: Disposable | undefined; getWebSocketPort(): number | undefined { return this.wsPort; @@ -110,8 +112,8 @@ export class MonitorManagerProxyClientImpl if (!this.webSocket) { return; } - this.onBoardsConfigChanged?.dispose(); - this.onBoardsConfigChanged = undefined; + this.onBoardListDidChange?.dispose(); + this.onBoardListDidChange = undefined; try { this.webSocket.close(); this.webSocket = undefined; @@ -134,51 +136,52 @@ export class MonitorManagerProxyClientImpl } async startMonitor(settings?: PluggableMonitorSettings): Promise<void> { - await this.boardsServiceProvider.reconciled; - this.lastConnectedBoard = { - selectedBoard: this.boardsServiceProvider.boardsConfig.selectedBoard, - selectedPort: this.boardsServiceProvider.boardsConfig.selectedPort, - }; - - if (!this.onBoardsConfigChanged) { - this.onBoardsConfigChanged = - this.boardsServiceProvider.onBoardsConfigChanged( - async ({ selectedBoard, selectedPort }) => { - if ( - typeof selectedBoard === 'undefined' || - typeof selectedPort === 'undefined' - ) + const { boardList } = this.boardsServiceProvider; + this.lastConnectedBoard = boardList.items[boardList.selectedIndex]; + if (!this.onBoardListDidChange) { + this.onBoardListDidChange = + this.boardsServiceProvider.onBoardListDidChange( + async (newBoardList) => { + const currentConnectedBoard = + newBoardList.items[newBoardList.selectedIndex]; + if (!currentConnectedBoard) { return; + } - // a board is plugged and it's different from the old connected board if ( - selectedBoard?.fqbn !== - this.lastConnectedBoard?.selectedBoard?.fqbn || - Port.keyOf(selectedPort) !== - (this.lastConnectedBoard.selectedPort - ? Port.keyOf(this.lastConnectedBoard.selectedPort) - : undefined) + !this.lastConnectedBoard || + boardListItemEquals( + currentConnectedBoard, + this.lastConnectedBoard + ) ) { - this.lastConnectedBoard = { - selectedBoard: selectedBoard, - selectedPort: selectedPort, - }; - this.onMonitorShouldResetEmitter.fire(); - } else { // a board is plugged and it's the same as prev, rerun "this.startMonitor" to // recreate the listener callback this.startMonitor(); + } else { + // a board is plugged and it's different from the old connected board + this.lastConnectedBoard = currentConnectedBoard; + this.onMonitorShouldResetEmitter.fire(); } } ); } - const { selectedBoard, selectedPort } = - this.boardsServiceProvider.boardsConfig; - if (!selectedBoard || !selectedBoard.fqbn || !selectedPort) return; + if (!this.lastConnectedBoard) { + return; + } + + const board = getInferredBoardOrBoard(this.lastConnectedBoard); + if (!board) { + return; + } try { this.clearVisibleNotification(); - await this.server().startMonitor(selectedBoard, selectedPort, settings); + await this.server().startMonitor( + board, + this.lastConnectedBoard.port, + settings + ); } catch (err) { const message = ApplicationError.is(err) ? err.message : String(err); this.previousNotificationId = this.notificationId(message); @@ -186,7 +189,10 @@ export class MonitorManagerProxyClientImpl } } - getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings> { + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise<MonitorSettings> { return this.server().getCurrentSettings(board, port); } diff --git a/arduino-ide-extension/src/browser/notification-center.ts b/arduino-ide-extension/src/browser/notification-center.ts index 96c938d25..e7d5c6676 100644 --- a/arduino-ide-extension/src/browser/notification-center.ts +++ b/arduino-ide-extension/src/browser/notification-center.ts @@ -14,13 +14,13 @@ import { NotificationServiceClient, NotificationServiceServer, } from '../common/protocol/notification-service'; -import { - AttachedBoardsChangeEvent, +import type { BoardsPackage, LibraryPackage, ConfigState, Sketch, ProgressMessage, + DetectedPorts, } from '../common/protocol'; import { FrontendApplicationStateService, @@ -61,8 +61,9 @@ export class NotificationCenter private readonly libraryDidUninstallEmitter = new Emitter<{ item: LibraryPackage; }>(); - private readonly attachedBoardsDidChangeEmitter = - new Emitter<AttachedBoardsChangeEvent>(); + private readonly detectedPortsDidChangeEmitter = new Emitter<{ + detectedPorts: DetectedPorts; + }>(); private readonly recentSketchesChangedEmitter = new Emitter<{ sketches: Sketch[]; }>(); @@ -82,7 +83,7 @@ export class NotificationCenter this.platformDidUninstallEmitter, this.libraryDidInstallEmitter, this.libraryDidUninstallEmitter, - this.attachedBoardsDidChangeEmitter + this.detectedPortsDidChangeEmitter ); readonly onDidReinitialize = this.didReinitializeEmitter.event; @@ -97,8 +98,7 @@ export class NotificationCenter readonly onPlatformDidUninstall = this.platformDidUninstallEmitter.event; readonly onLibraryDidInstall = this.libraryDidInstallEmitter.event; readonly onLibraryDidUninstall = this.libraryDidUninstallEmitter.event; - readonly onAttachedBoardsDidChange = - this.attachedBoardsDidChangeEmitter.event; + readonly onDetectedPortsDidChange = this.detectedPortsDidChangeEmitter.event; readonly onRecentSketchesDidChange = this.recentSketchesChangedEmitter.event; readonly onAppStateDidChange = this.onAppStateDidChangeEmitter.event; @@ -166,8 +166,8 @@ export class NotificationCenter this.libraryDidUninstallEmitter.fire(event); } - notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void { - this.attachedBoardsDidChangeEmitter.fire(event); + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void { + this.detectedPortsDidChangeEmitter.fire(event); } notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void { diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index 7b390772f..f5c394603 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -173,7 +173,6 @@ export class MonitorWidget extends ReactWidget { private async startMonitor(): Promise<void> { await this.appStateService.reachedState('ready'); - await this.boardsServiceProvider.reconciled; await this.syncSettings(); await this.monitorManagerProxy.startMonitor(); } diff --git a/arduino-ide-extension/src/browser/storage-wrapper.ts b/arduino-ide-extension/src/browser/storage-wrapper.ts deleted file mode 100644 index c1ffeb502..000000000 --- a/arduino-ide-extension/src/browser/storage-wrapper.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import { StorageService } from '@theia/core/lib/browser/storage-service'; -import { - Command, - CommandContribution, - CommandRegistry, -} from '@theia/core/lib/common/command'; - -/** - * This is a workaround to break cycles in the dependency injection. Provides commands for `setData` and `getData`. - */ -@injectable() -export class StorageWrapper implements CommandContribution { - @inject(StorageService) - protected storageService: StorageService; - - registerCommands(commands: CommandRegistry): void { - commands.registerCommand(StorageWrapper.Commands.GET_DATA, { - execute: (key: string, defaultValue?: any) => - this.storageService.getData(key, defaultValue), - }); - commands.registerCommand(StorageWrapper.Commands.SET_DATA, { - execute: (key: string, value: any) => - this.storageService.setData(key, value), - }); - } -} -export namespace StorageWrapper { - export namespace Commands { - export const SET_DATA: Command = { - id: 'arduino-store-wrapper-set', - }; - export const GET_DATA: Command = { - id: 'arduino-store-wrapper-get', - }; - } -} diff --git a/arduino-ide-extension/src/browser/style/boards-config-dialog.css b/arduino-ide-extension/src/browser/style/boards-config-dialog.css index 90938ca70..ad18afc7f 100644 --- a/arduino-ide-extension/src/browser/style/boards-config-dialog.css +++ b/arduino-ide-extension/src/browser/style/boards-config-dialog.css @@ -172,20 +172,19 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { width: 210px; } -.arduino-boards-toolbar-item--protocol, +.arduino-boards-toolbar-item--protocol, .arduino-boards-dropdown-item--protocol { align-items: center; display: flex; font-size: 16px; } -.arduino-boards-toolbar-item--protocol , +.arduino-boards-toolbar-item--protocol, .arduino-boards-dropdown-item--protocol { color: var(--theia-arduino-toolbar-dropdown-label); } -.arduino-boards-toolbar-item-container - .arduino-boards-toolbar-item { +.arduino-boards-toolbar-item-container .arduino-boards-toolbar-item { display: flex; align-items: baseline; width: 100%; @@ -196,7 +195,10 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { } .arduino-boards-toolbar-item--label-connected { + font-family: 'Open Sans Bold'; + font-style: normal; font-weight: 700; + font-size: 14px; } .arduino-boards-toolbar-item-container .caret { @@ -208,6 +210,10 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { margin: -1px; z-index: 1; border: 1px solid var(--theia-arduino-toolbar-dropdown-border); + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + font-size: 12px; } .arduino-boards-dropdown-list:focus { @@ -230,20 +236,47 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { cursor: default; display: flex; font-size: var(--theia-ui-font-size1); - gap: 10px; justify-content: space-between; padding: 10px; } +.arduino-boards-dropdown-item--board-header { + display: flex; + align-items: center; +} + .arduino-boards-dropdown-item--label { overflow: hidden; flex: 1; } +/* Redefine default codicon size https://github.com/microsoft/vscode/commit/38cd0a377b7abef34fb07fe770fc633e68819ba6 */ +.arduino-boards-dropdown-item .codicon[class*='codicon-'] { + font-size: 14px; +} + +.arduino-boards-dropdown-item .p-TabBar-toolbar { + padding: 0px; + margin: 0px; + flex-direction: column; +} + +.arduino-boards-dropdown-item .p-TabBar-toolbar .item { + margin: 0px; +} + +.arduino-boards-dropdown-item .p-TabBar-toolbar .item .action-label { + padding: 0px; +} + .arduino-boards-dropdown-item--board-label { font-size: 14px; } +.arduino-boards-dropdown-item .arduino-boards-dropdown-item--protocol { + margin-right: 10px; +} + .arduino-boards-dropdown-item--port-label { font-size: 12px; } @@ -267,10 +300,6 @@ div#select-board-dialog .selectBoardContainer .list .item.selected i { color: var(--theia-arduino-toolbar-dropdown-iconSelected); } -.arduino-boards-dropdown-item .fa-check { - align-self: center; -} - .arduino-board-dropdown-footer { color: var(--theia-secondaryButton-foreground); border-top: 1px solid var(--theia-dropdown-border); diff --git a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx index cc1ab7dd2..c354bfd77 100644 --- a/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx +++ b/arduino-ide-extension/src/browser/theia/dialogs/dialogs.tsx @@ -3,14 +3,9 @@ import { DialogProps, } from '@theia/core/lib/browser/dialogs'; import { ReactDialog as TheiaReactDialog } from '@theia/core/lib/browser/dialogs/react-dialog'; -import { codiconArray, Message } from '@theia/core/lib/browser/widgets/widget'; -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; +import { codiconArray } from '@theia/core/lib/browser/widgets/widget'; +import type { Message } from '@theia/core/shared/@phosphor/messaging'; import { inject, injectable } from '@theia/core/shared/inversify'; -import React from '@theia/core/shared/react'; -import { createRoot } from '@theia/core/shared/react-dom/client'; @injectable() export abstract class AbstractDialog<T> extends TheiaAbstractDialog<T> { @@ -18,7 +13,6 @@ export abstract class AbstractDialog<T> extends TheiaAbstractDialog<T> { @inject(DialogProps) protected override readonly props: DialogProps ) { super(props); - this.closeCrossNode.classList.remove(...codiconArray('close')); this.closeCrossNode.classList.add('fa', 'fa-close'); } @@ -26,38 +20,26 @@ export abstract class AbstractDialog<T> extends TheiaAbstractDialog<T> { @injectable() export abstract class ReactDialog<T> extends TheiaReactDialog<T> { - protected override onUpdateRequest(msg: Message): void { - // This is tricky to bypass the default Theia code. - // Otherwise, there is a warning when opening the dialog for the second time. - // You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it. - const disposables = new DisposableCollection(); - if (!this.isMounted) { - // toggle the `isMounted` logic for the time being of the super call so that the `createRoot` does not run - this.isMounted = true; - disposables.push(Disposable.create(() => (this.isMounted = false))); - } + private _isOnCloseRequestInProgress = false; - // Always unset the `contentNodeRoot` so there is no double update when calling super. - const restoreContentNodeRoot = this.contentNodeRoot; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (this.contentNodeRoot as any) = undefined; - disposables.push( - Disposable.create(() => (this.contentNodeRoot = restoreContentNodeRoot)) - ); + override dispose(): void { + // There is a bug in Theia, and the React component's `componentWillUnmount` will not be called, as the Theia widget is already disposed when closing and reopening a dialog. + // Widget lifecycle issue in Theia: https://github.com/eclipse-theia/theia/issues/12093 + // Bogus react widget lifecycle management PR: https://github.com/eclipse-theia/theia/pull/11687 + // Do not call super. Do not let the Phosphor widget to be disposed on dialog close. + if (this._isOnCloseRequestInProgress) { + // Do not let the widget dispose on close. + return; + } + super.dispose(); + } + protected override onCloseRequest(message: Message): void { + this._isOnCloseRequestInProgress = true; try { - super.onUpdateRequest(msg); + super.onCloseRequest(message); } finally { - disposables.dispose(); - } - - // Use the patched rendering. - if (!this.isMounted) { - this.contentNodeRoot = createRoot(this.contentNode); - // Resetting the prop is missing from the Theia code. - // https://github.com/eclipse-theia/theia/blob/v1.31.1/packages/core/src/browser/dialogs/react-dialog.tsx#L41-L47 - this.isMounted = true; + this._isOnCloseRequestInProgress = false; } - this.contentNodeRoot?.render(<>{this.render()}</>); } } diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index 29ab5604f..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'); 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..ee2c0448f --- /dev/null +++ b/arduino-ide-extension/src/common/protocol/board-list.ts @@ -0,0 +1,694 @@ +import type { Mutable } from '@theia/core/lib/common/types'; +import { Unknown } from '../nls'; +import type { Defined } from '../types'; +import { naturalCompare } from '../utils'; +import { + BoardIdentifier, + boardIdentifierComparator, + boardIdentifierEquals, + BoardsConfig, + DetectedPort, + DetectedPorts, + emptyBoardsConfig, + findMatchingPortIndex, + isBoardIdentifier, + isDefinedBoardsConfig, + Port, + PortIdentifier, + portIdentifierEquals, + portProtocolComparator, + selectBoard, + unconfirmedBoard, + notConnected, + boardIdentifierLabel, +} from './boards-service'; + +/** + * Representation of a detected port with an optional board. + */ +export interface BoardListItem { + readonly port: Port; + readonly board?: BoardIdentifier; +} + +/** + * Representation of a detected port with multiple discovered boards on the same port. For example Arduino Nano ESP32 from `esp32:esp32:nano_nora` and `arduino:esp32:nano_nora`. + * If multiple boards are detected, but the board names are the same, the `board` will be the `first` element of the `boards` array. + * If multiple boards are detected, but the board names are not identical, the `board` will be missing. + */ +export interface MultiBoardsBoardListItem extends BoardListItem { + readonly boards: readonly BoardIdentifier[]; +} + +function findUniqueBoardName( + item: MultiBoardsBoardListItem +): string | undefined { + const distinctNames = new Set(item.boards.map(({ name }) => name)); + if (distinctNames.size === 1) { + const name = Array.from(distinctNames.keys()).shift(); + if (name) { + return name; + } + } + return undefined; +} + +export function isMultiBoardsBoardListItem( + arg: unknown +): arg is MultiBoardsBoardListItem { + return ( + isBoardListItem(arg) && + (<MultiBoardsBoardListItem>arg).boards !== undefined && + Array.isArray((<MultiBoardsBoardListItem>arg).boards) && + Boolean((<MultiBoardsBoardListItem>arg).boards.length) && + (<MultiBoardsBoardListItem>arg).boards.every(isBoardIdentifier) + ); +} + +/** + * Base inferred board list item type. + * The the type of the inferred board can be: + * - manually specified board for a detected port where no boards were discovered, + * - the board has been overridden for detected port discovered board pair. + */ +export type InferredBoardListItem = + | ManuallySelectedBoardListItem + | BoardOverriddenBoardListItem; + +/** + * No boards have been discovered for a detected port, it has been manually selected by the user. + */ +export interface ManuallySelectedBoardListItem extends BoardListItem { + readonly inferredBoard: BoardIdentifier; + readonly type: 'manually-selected'; +} + +/** + * One or more boards have been discovered for a detected port, but the board has been overridden by a manual action. + */ +export interface BoardOverriddenBoardListItem extends BoardListItem { + readonly inferredBoard: BoardIdentifier; + readonly board: BoardIdentifier; + readonly type: 'board-overridden'; +} + +export function isBoardListItem(arg: unknown): arg is BoardListItem { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<BoardListItem>arg).port !== undefined && + Port.is((<BoardListItem>arg).port) && + ((<BoardListItem>arg).board === undefined || + ((<BoardListItem>arg).board !== undefined && + isBoardIdentifier((<BoardListItem>arg).board))) + ); +} + +export function boardListItemEquals( + left: BoardListItem, + right: BoardListItem +): boolean { + if (portIdentifierEquals(left.port, right.port)) { + const leftBoard = getBoardOrInferredBoard(left); + const rightBoard = getBoardOrInferredBoard(right); + if (boardIdentifierEquals(leftBoard, rightBoard)) { + const leftInferredBoard = getInferredBoardOrBoard(left); + const rightInferredBoard = getInferredBoardOrBoard(right); + return boardIdentifierEquals(leftInferredBoard, rightInferredBoard); + } + } + return false; +} + +export interface BoardListItemWithBoard extends BoardListItem { + readonly board: BoardIdentifier; +} + +function getBoardOrInferredBoard( + item: BoardListItem +): BoardIdentifier | undefined { + let board: BoardIdentifier | undefined = undefined; + board = item.board; + if (!board && isInferredBoardListItem(item)) { + board = item.inferredBoard; + } + return board; +} + +export function getInferredBoardOrBoard( + item: BoardListItem +): BoardIdentifier | undefined { + if (isInferredBoardListItem(item)) { + return item.inferredBoard; + } + return item.board; +} + +export function isInferredBoardListItem( + arg: unknown +): arg is InferredBoardListItem { + return ( + isBoardListItem(arg) && + (<InferredBoardListItem>arg).type !== undefined && + isInferenceType((<InferredBoardListItem>arg).type) && + (<InferredBoardListItem>arg).inferredBoard !== undefined && + isBoardIdentifier((<InferredBoardListItem>arg).inferredBoard) + ); +} + +/** + * Stores historical info about boards manually specified for detected boards. The key are generated with `Port#keyOf`. + */ +export type BoardListHistory = Readonly<Record<string, BoardIdentifier>>; + +export function isBoardListHistory(arg: unknown): arg is BoardListHistory { + return ( + Boolean(arg) && + typeof arg === 'object' && + Object.entries(<object>arg).every(([, value]) => isBoardIdentifier(value)) + ); +} + +const inferenceTypeLiterals = [ + /** + * The user has manually selected the board (FQBN) for the detected port of a 3rd party board (no matching boards were detected by the CLI for the port) + */ + 'manually-selected', + /** + * The user has manually edited the detected FQBN of a recognized board from a detected port (there are matching boards for a detected port, but the user decided to use another FQBN) + */ + 'board-overridden', +] as const; +type InferenceType = (typeof inferenceTypeLiterals)[number]; +function isInferenceType(arg: unknown): arg is InferenceType { + return ( + typeof arg === 'string' && + inferenceTypeLiterals.includes(<InferenceType>arg) + ); +} + +/** + * Compare precedence: + * 1. `BoardListItem#port#protocol`: `'serial'`, `'network'`, then natural compare of the `protocol` string. + * 1. `BoardListItem`s with a `board` comes before items without a `board`. + * 1. `BoardListItem#board`: + * 1. Items with `'arduino'` vendor ID in the `fqbn` come before other vendors. + * 1. Natural compare of the `name`. + * 1. If the `BoardListItem`s do not have a `board` property: + * 1. Ambiguous boards come before no boards. + * 1. `BoardListItem#port#address` natural compare is the fallback. + */ +function boardListItemComparator( + left: BoardListItem, + right: BoardListItem +): number { + // sort by port protocol + let result = portProtocolComparator(left.port, right.port); + if (result) { + return result; + } + + // compare by board + result = boardIdentifierComparator( + getBoardOrInferredBoard(left), + getBoardOrInferredBoard(right) + ); + if (result) { + return result; + } + + // detected ports with multiple discovered boards come before any other unknown items + if (isMultiBoardsBoardListItem(left) && !isMultiBoardsBoardListItem(right)) { + return -1; + } + if (!isMultiBoardsBoardListItem(left) && !isMultiBoardsBoardListItem(right)) { + return 1; + } + // ambiguous boards with a unique board name comes first than other ambiguous ones + if (isMultiBoardsBoardListItem(left) && isMultiBoardsBoardListItem(right)) { + const leftUniqueName = findUniqueBoardName(left); + const rightUniqueName = findUniqueBoardName(right); + if (leftUniqueName && !rightUniqueName) { + return -1; + } + if (!leftUniqueName && rightUniqueName) { + return 1; + } + if (leftUniqueName && rightUniqueName) { + return naturalCompare(leftUniqueName, rightUniqueName); + } + } + + // fallback compare based on the address + return naturalCompare(left.port.address, right.port.address); +} + +/** + * What is shown in the UI for the entire board list. + */ +export interface BoardListLabels { + readonly boardLabel: string; + readonly portProtocol: string | undefined; + readonly tooltip: string; + /** + * The client's board+port selection matches with one of the board list items. + */ + readonly selected: boolean; +} + +function createBoardListLabels( + boardsConfig: BoardsConfig, + allPorts: readonly DetectedPort[], + selectedItem: BoardListItem | undefined +): BoardListLabels { + const { selectedBoard, selectedPort } = boardsConfig; + const boardLabel = selectedBoard?.name || selectBoard; + let tooltip = ''; + if (!selectedBoard && !selectedPort) { + tooltip = selectBoard; + } else { + if (selectedBoard) { + tooltip += boardIdentifierLabel(selectedBoard); + } + if (selectedPort) { + if (tooltip) { + tooltip += '\n'; + } + tooltip += selectedPort.address; + const index = findMatchingPortIndex(selectedPort, allPorts); + if (index < 0) { + tooltip += ` ${notConnected}`; + } + } + } + return { + boardLabel, + portProtocol: selectedBoard ? selectedPort?.protocol : undefined, + tooltip, + selected: Boolean(selectedItem), + }; +} + +/** + * What is show in the UI for a particular board with all its refinements, fallbacks, and tooltips. + */ +export interface BoardListItemLabels { + readonly boardLabel: string; + readonly boardLabelWithFqbn: string; + readonly portLabel: string; + readonly portProtocol: string; + readonly tooltip: string; +} + +export interface BoardListItemUI extends BoardListItem { + readonly labels: BoardListItemLabels; + readonly defaultAction: BoardListItemAction; + readonly otherActions: Readonly<{ + edit?: EditBoardsConfigAction; + revert?: SelectBoardsConfigAction; + }>; +} + +function createBoardListItemLabels(item: BoardListItem): BoardListItemLabels { + const { port } = item; + const portLabel = port.address; + const portProtocol = port.protocol; + let board = item.board; // use default board label if any + if (isInferredBoardListItem(item)) { + board = item.inferredBoard; // inferred board overrides any discovered boards + } + // if the board is still missing, maybe it's ambiguous + if (!board && isMultiBoardsBoardListItem(item)) { + const name = + // get a unique board name + findUniqueBoardName(item) ?? + // or fall back to something else than unknown board + unconfirmedBoard; + board = { name, fqbn: undefined }; + } + const boardLabel = board?.name ?? Unknown; + let boardLabelWithFqbn = boardLabel; + if (board?.fqbn) { + boardLabelWithFqbn += ` (${board.fqbn})`; + } + return { + boardLabel, + boardLabelWithFqbn, + portLabel, + portProtocol, + tooltip: `${boardLabelWithFqbn}\n${portLabel}`, + }; +} + +/** + * A list of boards discovered by the Arduino CLI. With the `board list --watch` gRPC equivalent command, + * the CLI provides a `1..*` mapping between a port and the matching boards list. This type inverts the mapping + * and makes a `1..1` association between a board identifier and the port it belongs to. + */ +export interface BoardList { + readonly labels: BoardListLabels; + /** + * All detected ports with zero to many boards and optional inferred information based on historical selection/usage. + */ + readonly items: readonly BoardListItemUI[]; + /** + * A snapshot of the board and port configuration this board list has been initialized with. + */ + readonly boardsConfig: Readonly<BoardsConfig>; + + /** + * Index of the board+port item that is currently "selected". A board list item is selected, if matches the board+port combination of `boardsConfig`. + */ + readonly selectedIndex: number; + + /** + * Contains all boards recognized from the detected port, and an optional unrecognized one that is derived from the detected port and the `initParam#selectedBoard`. + */ + readonly boards: readonly (BoardListItemWithBoard | InferredBoardListItem)[]; + + /** + * If `predicate` is not defined, no ports are filtered. + */ + ports( + predicate?: (detectedPort: DetectedPort) => boolean + ): readonly DetectedPort[] & Readonly<{ matchingIndex: number }>; + + /** + * Sugar for `#ports` with additional grouping based on the port `protocol`. + */ + portsGroupedByProtocol(): Readonly< + Record<'serial' | 'network' | string, ReturnType<BoardList['ports']>> + >; + + /** + * For dumping the current state of board list for debugging purposes. + */ + toString(): string; +} + +export type SelectBoardsConfigActionParams = Readonly<Defined<BoardsConfig>>; +export interface SelectBoardsConfigAction { + readonly type: 'select-boards-config'; + readonly params: SelectBoardsConfigActionParams; +} +export interface EditBoardsConfigActionParams { + readonly portToSelect?: PortIdentifier; + readonly boardToSelect?: BoardIdentifier; + readonly query?: string; + readonly searchSet?: readonly BoardIdentifier[]; +} +export interface EditBoardsConfigAction { + readonly type: 'edit-boards-config'; + readonly params: EditBoardsConfigActionParams; +} +export type BoardListItemAction = + | SelectBoardsConfigAction + | EditBoardsConfigAction; + +export function createBoardList( + detectedPorts: DetectedPorts, + boardsConfig: Readonly<BoardsConfig> = emptyBoardsConfig(), + boardListHistory: BoardListHistory = {} +): BoardList { + const items: BoardListItemUI[] = []; + for (const detectedPort of Object.values(detectedPorts)) { + const item = createBoardListItemUI(detectedPort, boardListHistory); + items.push(item); + } + items.sort(boardListItemComparator); + const selectedIndex = findSelectedIndex(boardsConfig, items); + const boards = collectBoards(items); + const allPorts = collectPorts(items, detectedPorts); + const labels = createBoardListLabels( + boardsConfig, + allPorts, + items[selectedIndex] + ); + return { + labels, + items, + boardsConfig, + boards, + selectedIndex, + ports(predicate?: (detectedPort: DetectedPort) => boolean) { + return filterPorts(allPorts, boardsConfig.selectedPort, predicate); + }, + portsGroupedByProtocol() { + const _allPorts = filterPorts(allPorts, boardsConfig.selectedPort); + return portsGroupedByProtocol(_allPorts); + }, + toString() { + return JSON.stringify( + { + labels, + detectedPorts, + boardsConfig, + items, + selectedIndex, + boardListHistory, + }, + null, + 2 + ); + }, + }; +} + +function portsGroupedByProtocol( + allPorts: ReturnType<BoardList['ports']> +): ReturnType<BoardList['portsGroupedByProtocol']> { + const result: Record<string, DetectedPort[] & { matchingIndex: number }> = {}; + for (const detectedPort of allPorts) { + const protocol = detectedPort.port.protocol; + if (!result[protocol]) { + result[protocol] = Object.assign([], { + matchingIndex: -1, + }); + } + const portsOnProtocol = result[protocol]; + portsOnProtocol.push(detectedPort); + } + const matchItem = allPorts[allPorts.matchingIndex]; + // the cached match index is per all ports. Here, IDE2 needs to adjust the match index per grouped protocol + if (matchItem) { + const matchProtocol = matchItem.port.protocol; + const matchPorts = result[matchProtocol]; + matchPorts.matchingIndex = matchPorts.indexOf(matchItem); + } + return result; +} + +function filterPorts( + allPorts: readonly DetectedPort[], + selectedPort: PortIdentifier | undefined, + predicate: (detectedPort: DetectedPort) => boolean = () => true +): ReturnType<BoardList['ports']> { + const ports = allPorts.filter(predicate); + const matchingIndex = findMatchingPortIndex(selectedPort, ports); + return Object.assign(ports, { matchingIndex }); +} + +function collectPorts( + items: readonly BoardListItem[], + detectedPorts: DetectedPorts +): DetectedPort[] { + const allPorts: DetectedPort[] = []; + // to keep the order or the detected ports + const visitedPortKeys = new Set<string>(); + for (let i = 0; i < items.length; i++) { + const { port } = items[i]; + const portKey = Port.keyOf(port); + if (!visitedPortKeys.has(portKey)) { + visitedPortKeys.add(portKey); + const detectedPort = detectedPorts[portKey]; + if (detectedPort) { + allPorts.push(detectedPort); + } + } + } + return allPorts; +} + +function collectBoards( + items: readonly BoardListItem[] +): readonly (BoardListItemWithBoard | InferredBoardListItem)[] { + const boards: (BoardListItemWithBoard | InferredBoardListItem)[] = []; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (isInferredBoardListItem(item)) { + boards.push(item); + } else if (item.board?.fqbn) { + boards.push(<Required<BoardListItem>>item); + } + } + return boards; +} + +function findSelectedIndex( + boardsConfig: BoardsConfig, + items: readonly BoardListItem[] +): number { + if (!isDefinedBoardsConfig(boardsConfig)) { + return -1; + } + const length = items.length; + const { selectedPort, selectedBoard } = boardsConfig; + const portKey = Port.keyOf(selectedPort); + // find the exact match of the board and port combination + for (let index = 0; index < length; index++) { + const item = items[index]; + const { board, port } = item; + if (!board) { + continue; + } + if ( + Port.keyOf(port) === portKey && + boardIdentifierEquals(board, selectedBoard) + ) { + return index; + } + } + // find match from inferred board + for (let index = 0; index < length; index++) { + const item = items[index]; + if (!isInferredBoardListItem(item)) { + continue; + } + const { inferredBoard, port } = item; + if ( + Port.keyOf(port) === portKey && + boardIdentifierEquals(inferredBoard, boardsConfig.selectedBoard) + ) { + return index; + } + } + return -1; +} + +function createBoardListItemUI( + detectedPort: DetectedPort, + boardListHistory: BoardListHistory +): BoardListItemUI { + const item = createBoardListItem(detectedPort, boardListHistory); + const labels = createBoardListItemLabels(item); + const defaultAction = createDefaultAction(item); + const otherActions = createOtherActions(item); + return Object.assign(item, { labels, defaultAction, otherActions }); +} + +function createBoardListItem( + detectedPort: DetectedPort, + boardListHistory: BoardListHistory +): BoardListItem { + const { port, boards } = detectedPort; + // boards with arduino vendor should come first + boards?.sort(boardIdentifierComparator); + const portKey = Port.keyOf(port); + const inferredBoard = boardListHistory[portKey]; + if (!boards?.length) { + let unknownItem: BoardListItem | InferredBoardListItem = { port }; + // Infer unrecognized boards from the history + if (inferredBoard) { + unknownItem = { + ...unknownItem, + inferredBoard, + type: 'manually-selected', + }; + } + return unknownItem; + } else if (boards.length === 1) { + const board = boards[0]; + let detectedItem: BoardListItemWithBoard | InferredBoardListItem = { + port, + board, + }; + if ( + inferredBoard && + // ignore the inferred item if it's the same as the discovered board + !boardIdentifierEquals(board, inferredBoard) + ) { + detectedItem = { + ...detectedItem, + inferredBoard, + type: 'board-overridden', + }; + } + return detectedItem; + } else { + let ambiguousItem: MultiBoardsBoardListItem | InferredBoardListItem = { + port, + boards, + }; + if (inferredBoard) { + ambiguousItem = { + ...ambiguousItem, + inferredBoard, + type: 'manually-selected', + }; + } + return ambiguousItem; + } +} + +function createDefaultAction(item: BoardListItem): BoardListItemAction { + if (isInferredBoardListItem(item)) { + return createSelectAction({ + selectedBoard: item.inferredBoard, + selectedPort: item.port, + }); + } + if (item.board) { + return createSelectAction({ + selectedBoard: item.board, + selectedPort: item.port, + }); + } + return createEditAction(item); +} + +function createOtherActions( + item: BoardListItem +): BoardListItemUI['otherActions'] { + if (isInferredBoardListItem(item)) { + const edit = createEditAction(item); + if (item.type === 'board-overridden') { + const revert = createSelectAction({ + selectedBoard: item.board, + selectedPort: item.port, + }); + return { edit, revert }; + } + return { edit }; + } + return {}; +} + +function createSelectAction( + params: SelectBoardsConfigActionParams +): SelectBoardsConfigAction { + return { + type: 'select-boards-config', + params, + }; +} + +function createEditAction(item: BoardListItem): EditBoardsConfigAction { + const params: Mutable<EditBoardsConfigActionParams> = { + portToSelect: item.port, + }; + if (isMultiBoardsBoardListItem(item)) { + const uniqueBoardName = findUniqueBoardName(item); + params.query = uniqueBoardName ?? ''; + params.searchSet = item.boards; + } else if (isInferredBoardListItem(item)) { + params.query = item.inferredBoard.name; + } else if (item.board) { + params.query = item.board.name; + } else { + params.query = ''; + } + return { + type: 'edit-boards-config', + params, + }; +} diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index 7e2f77555..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<string, [Port, Array<Board>]>; -export namespace AvailablePorts { - export function groupByProtocol( - availablePorts: AvailablePorts - ): Map<string, AvailablePorts> { - const grouped = new Map<string, AvailablePorts>(); - for (const portID of Object.keys(availablePorts)) { - const [port, boards] = availablePorts[portID]; - let ports = grouped.get(port.protocol); - if (!ports) { - ports = {} as AvailablePorts; - } - ports[portID] = [port, boards]; - grouped.set(port.protocol, ports); - } - return grouped; - } - export function split( - state: AvailablePorts - ): Readonly<{ boards: Board[]; ports: Port[] }> { - const availablePorts: Port[] = []; - const attachedBoards: Board[] = []; - for (const key of Object.keys(state)) { - const [port, boards] = state[key]; - availablePorts.push(port); - attachedBoards.push(...boards); - } - return { - boards: attachedBoards, - ports: availablePorts, - }; - } -} +import 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<Board, 'name' | 'fqbn'>[]; } -export namespace AttachedBoardsChangeEvent { - export function isEmpty(event: AttachedBoardsChangeEvent): boolean { - const { detached, attached } = diff(event); - return ( - !!detached.boards.length && - !!detached.ports.length && - !!attached.boards.length && - !!attached.ports.length - ); - } - export function toString(event: AttachedBoardsChangeEvent): string { - const rows: string[] = []; - if (!isEmpty(event)) { - const { attached, detached } = diff(event); - const visitedAttachedPorts: Port[] = []; - const visitedDetachedPorts: Port[] = []; - for (const board of attached.boards) { - const port = board.port ? ` on ${Port.toString(board.port)}` : ''; - rows.push(` - Attached board: ${Board.toString(board)}${port}`); - if (board.port) { - visitedAttachedPorts.push(board.port); - } - } - for (const board of detached.boards) { - const port = board.port ? ` from ${Port.toString(board.port)}` : ''; - rows.push(` - Detached board: ${Board.toString(board)}${port}`); - if (board.port) { - visitedDetachedPorts.push(board.port); - } - } - for (const port of attached.ports) { - if (!visitedAttachedPorts.find((p) => Port.sameAs(port, p))) { - rows.push(` - New port is available on ${Port.toString(port)}`); - } - } - for (const port of detached.ports) { - if (!visitedDetachedPorts.find((p) => Port.sameAs(port, p))) { - rows.push(` - Port is no longer available on ${Port.toString(port)}`); - } - } - } - return rows.length ? rows.join('\n') : 'No changes.'; +export function findMatchingPortIndex( + toFind: PortIdentifier | undefined, + ports: readonly DetectedPort[] | readonly Port[] +): number { + if (!toFind) { + return -1; } + const toFindPortKey = Port.keyOf(toFind); + return ports.findIndex((port) => Port.keyOf(port) === toFindPortKey); +} - export function diff(event: AttachedBoardsChangeEvent): Readonly<{ - attached: { - boards: Board[]; - ports: Port[]; - }; - detached: { - boards: Board[]; - ports: Port[]; - }; - }> { - // In `lefts` AND not in `rights`. - const diff = <T>( - lefts: T[], - rights: T[], - sameAs: (left: T, right: T) => boolean - ) => { - return lefts.filter( - (left) => rights.findIndex((right) => sameAs(left, right)) === -1 - ); - }; - const { boards: newBoards } = event.newState; - const { boards: oldBoards } = event.oldState; - const { ports: newPorts } = event.newState; - const { ports: oldPorts } = event.oldState; - const boardSameAs = (left: Board, right: Board) => - Board.sameAs(left, right); - const portSameAs = (left: Port, right: Port) => Port.sameAs(left, right); - return { - detached: { - boards: diff(oldBoards, newBoards, boardSameAs), - ports: diff(oldPorts, newPorts, portSameAs), - }, - attached: { - boards: diff(newBoards, oldBoards, boardSameAs), - ports: diff(newPorts, oldPorts, portSameAs), - }, - }; +/** + * The closest representation what the Arduino CLI detects with the `board list --watch` gRPC equivalent. + * The keys are unique identifiers generated from the port object (via `Port#keyOf`). + * The values are the detected ports with all their optional `properties` and matching board list. + */ +export type DetectedPorts = Readonly<Record<string, DetectedPort>>; + +export function resolveDetectedPort( + port: PortIdentifier, + detectedPorts: DetectedPorts +): Port | undefined { + const portKey = Port.keyOf(port); + const detectedPort = detectedPorts[portKey]; + if (detectedPort) { + return detectedPort.port; } + return undefined; } export const BoardsServicePath = '/services/boards-service'; @@ -152,14 +65,17 @@ export interface BoardsService */ skipPostInstall?: boolean; }): Promise<void>; - getState(): Promise<AvailablePorts>; + getDetectedPorts(): Promise<DetectedPorts>; getBoardDetails(options: { fqbn: string }): Promise<BoardDetails | undefined>; - getBoardPackage(options: { id: string }): Promise<BoardsPackage | undefined>; + getBoardPackage(options: { + id: string /* TODO: change to PlatformIdentifier type? */; + }): Promise<BoardsPackage | undefined>; getContainerBoardPackage(options: { fqbn: string; }): Promise<BoardsPackage | undefined>; searchBoards({ query }: { query?: string }): Promise<BoardWithPackage[]>; getInstalledBoards(): Promise<BoardWithPackage[]>; + getInstalledPlatforms(): Promise<BoardsPackage[]>; 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<Board> - ): (port: Port) => boolean { - return (port: Port) => { - if (port.protocol === 'serial' || port.protocol === 'network') { - // Allow all `serial` and `network` boards. - // IDE2 must support better label for unrecognized `network` boards: https://github.com/arduino/arduino-ide/issues/1331 - return true; - } - // All other ports with different protocol are - // only shown if there is a recognized board - // connected - for (const board of boardsHaystack) { - if (board.port?.address === port.address) { - return true; - } - } - 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) && + (<BoardWithPackage>arg).packageName !== undefined && + typeof (<BoardWithPackage>arg).packageName === 'string' && + isPlatformIdentifier((<BoardWithPackage>arg).packageId) && + (<BoardWithPackage>arg).manuallyInstalled !== undefined && + typeof (<BoardWithPackage>arg).manuallyInstalled === 'boolean' + ); } } @@ -456,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. @@ -555,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; } @@ -594,7 +465,7 @@ export namespace Board { } export function toString( - board: Board, + board: BoardIdentifier, options: { useFqbn: boolean } = { useFqbn: true } ): string { const fqbn = @@ -607,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<BoardWithPackage> ): Array<Detailed> { + let foundSelected = false; // Board names are not unique. We show the corresponding core name as a detail. // https://github.com/arduino/arduino-cli/pull/294#issuecomment-513764948 const distinctBoardNames = new Map<string, number>(); @@ -622,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, @@ -644,7 +537,7 @@ export namespace Board { (distinctBoardNames.get(board.name) || 0) > 1 ? ` - ${board.packageName}` : undefined, - selected: selected(board), + selected: isSelected(board), missing: !installed(board), })); } @@ -674,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' && + (<PlatformIdentifier>arg).vendorId !== undefined && + typeof (<PlatformIdentifier>arg).vendorId === 'string' && + (<PlatformIdentifier>arg).arch !== undefined && + typeof (<PlatformIdentifier>arg).arch === 'string' + ); +} + +export function serializePlatformIdentifier({ + vendorId, + arch, +}: PlatformIdentifier): string { + return `${vendorId}:${arch}`; +} + +export function platformIdentifierEquals( + left: PlatformIdentifier, + right: PlatformIdentifier +) { + return left.vendorId === right.vendorId && left.arch === right.arch; +} + +/** + * Bare minimum information to identify port. + */ +export type PortIdentifier = Readonly<Pick<Port, 'protocol' | 'address'>>; + +export function portIdentifierEquals( + left: PortIdentifier | undefined, + right: PortIdentifier | undefined +): boolean { + if (!left) { + return !right; + } + if (!right) { + return !left; + } + return left.protocol === right.protocol && left.address === right.address; } +export function isPortIdentifier(arg: unknown): arg is PortIdentifier { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<PortIdentifier>arg).protocol !== undefined && + typeof (<PortIdentifier>arg).protocol === 'string' && + (<PortIdentifier>arg).address !== undefined && + typeof (<PortIdentifier>arg).address === 'string' + ); +} + +// the smaller the number, the higher the priority +const portProtocolPriorities: Record<string, number> = { + serial: 0, + network: 1, +} as const; + +/** + * See `boardListItemComparator`. + */ +export function portProtocolComparator( + left: PortIdentifier, + right: PortIdentifier +): number { + const leftPriority = + portProtocolPriorities[left.protocol] ?? Number.MAX_SAFE_INTEGER; + const rightPriority = + portProtocolPriorities[right.protocol] ?? Number.MAX_SAFE_INTEGER; + return leftPriority - rightPriority; +} + +/** + * Lightweight information to identify a board.\ + * \ + * Note: the `name` property of the board identifier must never participate in the board's identification. + * Hence, it should only be used as the final fallback for the UI when the board's platform is not installed and only the board's name is available. + */ +export interface BoardIdentifier { + /** + * The name of the board. It's only purpose is to provide a fallback for the UI. Preferably do not use this property for any sophisticated logic. When + */ + readonly name: string; + /** + * The FQBN might contain boards config options if selected from the discovered ports (see [arduino/arduino-ide#1588](https://github.com/arduino/arduino-ide/issues/1588)). + */ + // TODO: decide whether to persist the boards config if any + readonly fqbn: string | undefined; +} + +export function isBoardIdentifier(arg: unknown): arg is BoardIdentifier { + return ( + Boolean(arg) && + typeof arg === 'object' && + (<BoardIdentifier>arg).name !== undefined && + typeof (<BoardIdentifier>arg).name === 'string' && + ((<BoardIdentifier>arg).fqbn === undefined || + ((<BoardIdentifier>arg).fqbn !== undefined && + typeof (<BoardIdentifier>arg).fqbn === 'string')) + ); +} + +/** + * @param options if `looseFqbn` is `true`, FQBN config options are ignored. Hence, `{ name: 'x', fqbn: 'a:b:c:o1=v1 }` equals `{ name: 'y', fqbn: 'a:b:c' }`. It's `true` by default. + */ +export function boardIdentifierEquals( + left: BoardIdentifier | undefined, + right: BoardIdentifier | undefined, + options: { looseFqbn: boolean } = { looseFqbn: true } +): boolean { + if (!left) { + return !right; + } + if (!right) { + return !left; + } + if ((left.fqbn && !right.fqbn) || (!left.fqbn && right.fqbn)) { + // This can be very tricky when comparing boards + // the CLI's board search returns with falsy FQBN when the platform is not installed + // the CLI's board list returns with the full FQBN (for detected boards) even if the platform is not installed + // when there are multiple boards with the same name (Arduino Nano RP2040) from different platforms (Mbed Nano OS vs. the deprecated global Mbed OS) + // maybe add some 3rd party platform overhead (https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json) + // and it will get very tricky when comparing a board which has a FQBN and which does not. + return false; // TODO: This a strict now. Maybe compare name in the future. + } + if (left.fqbn && right.fqbn) { + const leftFqbn = 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<BoardsConfig> { + if (!boardsConfig) { + return false; + } + return ( + boardsConfig.selectedBoard !== undefined && + boardsConfig.selectedPort !== undefined + ); +} + +export interface BoardIdentifierChangeEvent { + readonly previousSelectedBoard: BoardIdentifier | undefined; + readonly selectedBoard: BoardIdentifier | undefined; +} + +export function isBoardIdentifierChangeEvent( + event: BoardsConfigChangeEvent +): event is BoardIdentifierChangeEvent { + return 'previousSelectedBoard' in event && 'selectedBoard' in event; +} + +export interface PortIdentifierChangeEvent { + readonly previousSelectedPort: PortIdentifier | undefined; + readonly selectedPort: PortIdentifier | undefined; +} + +export function isPortIdentifierChangeEvent( + event: BoardsConfigChangeEvent +): event is PortIdentifierChangeEvent { + return 'previousSelectedPort' in event && 'selectedPort' in event; +} + +export type BoardsConfigChangeEvent = + | BoardIdentifierChangeEvent + | PortIdentifierChangeEvent + | (BoardIdentifierChangeEvent & PortIdentifierChangeEvent); + export interface BoardInfo { /** * Board name. Could be `'Unknown board`'. @@ -714,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<AvailablePorts> + boardListProvider: MaybePromise<BoardList> ): Promise<BoardInfo | string> { - 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/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 2a683370d..9104df01e 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -1,15 +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, Installable } from '../../common/protocol/'; -import type { Programmer } from './boards-service'; -import type { Sketch } from './sketches-service'; -import { IndexUpdateSummary } from './notification-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'; export const CompilerWarningLiterals = [ 'None', @@ -148,11 +148,22 @@ export function isCompileSummary(arg: unknown): arg is CompileSummary { ); } +export interface UploadResponse { + readonly portAfterUpload: PortIdentifier; +} +export function isUploadResponse(arg: unknown): arg is UploadResponse { + return ( + Boolean(arg) && + typeof arg === 'object' && + isPortIdentifier((<UploadResponse>arg).portAfterUpload) + ); +} + export const CoreServicePath = '/services/core-service'; export const CoreService = Symbol('CoreService'); export interface CoreService { compile(options: CoreService.Options.Compile): Promise<void>; - upload(options: CoreService.Options.Upload): Promise<void>; + upload(options: CoreService.Options.Upload): Promise<UploadResponse>; burnBootloader(options: CoreService.Options.Bootloader): Promise<void>; /** * Refreshes the underling core gRPC client for the Arduino CLI. @@ -198,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/monitor-service.ts b/arduino-ide-extension/src/common/protocol/monitor-service.ts index 5eb793f5b..92fb7e4a6 100644 --- a/arduino-ide-extension/src/common/protocol/monitor-service.ts +++ b/arduino-ide-extension/src/common/protocol/monitor-service.ts @@ -1,5 +1,8 @@ -import { ApplicationError, Event, JsonRpcServer, nls } from '@theia/core'; -import { Board, Port } from './boards-service'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import type { Event } from '@theia/core/lib/common/event'; +import type { JsonRpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; +import { nls } from '@theia/core/lib/common/nls'; +import type { BoardIdentifier, PortIdentifier } from './boards-service'; export type PluggableMonitorSettings = Record<string, PluggableMonitorSetting>; export interface MonitorSettings { @@ -15,17 +18,20 @@ export const MonitorManagerProxy = Symbol('MonitorManagerProxy'); export interface MonitorManagerProxy extends JsonRpcServer<MonitorManagerProxyClient> { startMonitor( - board: Board, - port: Port, + board: BoardIdentifier, + port: PortIdentifier, settings?: PluggableMonitorSettings ): Promise<void>; changeMonitorSettings( - board: Board, - port: Port, + board: BoardIdentifier, + port: PortIdentifier, settings: MonitorSettings ): Promise<void>; - stopMonitor(board: Board, port: Port): Promise<void>; - getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings>; + stopMonitor(board: BoardIdentifier, port: PortIdentifier): Promise<void>; + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise<MonitorSettings>; } export const MonitorManagerProxyClient = Symbol('MonitorManagerProxyClient'); @@ -38,7 +44,10 @@ export interface MonitorManagerProxyClient { getWebSocketPort(): number | undefined; isWSConnected(): Promise<boolean>; startMonitor(settings?: PluggableMonitorSettings): Promise<void>; - getCurrentSettings(board: Board, port: Port): Promise<MonitorSettings>; + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise<MonitorSettings>; send(message: string): void; changeSettings(settings: MonitorSettings): void; } @@ -95,7 +104,7 @@ export const MissingConfigurationError = declareMonitorError( ); export function createConnectionFailedError( - port: Port, + port: PortIdentifier, details?: string ): ApplicationError<number, PortDescriptor> { const { protocol, address } = port; @@ -120,7 +129,7 @@ export function createConnectionFailedError( return ConnectionFailedError(message, { protocol, address }); } export function createNotConnectedError( - port: Port + port: PortIdentifier ): ApplicationError<number, PortDescriptor> { const { protocol, address } = port; return NotConnectedError( @@ -134,7 +143,7 @@ export function createNotConnectedError( ); } export function createAlreadyConnectedError( - port: Port + port: PortIdentifier ): ApplicationError<number, PortDescriptor> { const { protocol, address } = port; return AlreadyConnectedError( @@ -148,7 +157,7 @@ export function createAlreadyConnectedError( ); } export function createMissingConfigurationError( - port: Port + port: PortIdentifier ): ApplicationError<number, PortDescriptor> { 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/types.ts b/arduino-ide-extension/src/common/types.ts index 421a27534..c73987650 100644 --- a/arduino-ide-extension/src/common/types.ts +++ b/arduino-ide-extension/src/common/types.ts @@ -1,3 +1,7 @@ export type RecursiveRequired<T> = { [P in keyof T]-?: RecursiveRequired<T[P]>; }; + +export type Defined<T> = { + [P in keyof T]: NonNullable<T[P]>; +}; diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index 76ee458be..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 @@ -13,6 +13,7 @@ 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, @@ -702,6 +703,12 @@ class InterruptWorkspaceRestoreError extends Error { async function updateFrontendApplicationConfigFromPackageJson( config: FrontendApplicationConfig ): Promise<FrontendApplicationConfig> { + 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. 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 f7f22d1d2..d1c1d0cb5 100644 --- a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts +++ b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts @@ -66,7 +66,7 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { ]); return output; } finally { - await this.monitorManager.notifyUploadFinished(board.fqbn, port); + await this.monitorManager.notifyUploadFinished(board.fqbn, port, port); // here the before and after ports are assumed to be always the same } } 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<void>(); // when the watcher is canceled by the IDE2 private readonly toDisposeOnStopWatch = new DisposableCollection(); - private uploadInProgress = false; - - /** - * Keys are the `address` of the ports. - * - * The `protocol` is ignored because the board detach event does not carry the protocol information, - * just the address. - * ```json - * { - * "type": "remove", - * "address": "/dev/cu.usbmodem14101" - * } - * ``` - */ - private _availablePorts: AvailablePorts = {}; - get availablePorts(): AvailablePorts { - return this._availablePorts; + private _detectedPorts: DetectedPorts = {}; + get detectedPorts(): DetectedPorts { + return this._detectedPorts; } onStart(): void { @@ -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<string, unknown> | undefined = undefined; - if (arg instanceof BoardListWatchRequest) { - object = BoardListWatchRequest.toObject(false, arg); - } else if (arg instanceof BoardListWatchResponse) { - object = BoardListWatchResponse.toObject(false, arg); - } else { - throw new Error(`Unhandled object type: ${arg}`); - } - return JSON.stringify(object); - } - async start(): Promise<void> { this.logger.info('start'); if (this.stopping) { @@ -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> + ): 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 a2db13193..80f1446e0 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -12,13 +12,15 @@ import { Programmer, ResponseService, NotificationServiceServer, - AvailablePorts, + DetectedPorts, BoardWithPackage, BoardUserField, BoardSearch, sortComponents, SortGroup, platformInstallFailed, + createPlatformIdentifier, + platformIdentifierEquals, } from '../common/protocol'; import { PlatformInstallRequest, @@ -65,8 +67,8 @@ export class BoardsServiceImpl @inject(BoardDiscovery) protected readonly boardDiscovery: BoardDiscovery; - async getState(): Promise<AvailablePorts> { - return this.boardDiscovery.availablePorts; + async getDetectedPorts(): Promise<DetectedPorts> { + return this.boardDiscovery.detectedPorts; } async getBoardDetails(options: { @@ -165,7 +167,7 @@ export class BoardsServiceImpl debuggingSupported, VID, PID, - buildProperties + buildProperties, }; } @@ -212,6 +214,28 @@ export class BoardsServiceImpl return this.handleListBoards(client.boardListAll.bind(client), req); } + async getInstalledPlatforms(): Promise<BoardsPackage[]> { + const { instance, client } = await this.coreClient; + return new Promise<BoardsPackage[]>((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, @@ -232,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(), }); @@ -316,38 +368,6 @@ export class BoardsServiceImpl } ); const packages = new Map<string, BoardsPackage>(); - const toPackage = (platform: Platform) => { - let installedVersion: string | undefined; - const matchingPlatform = installedPlatforms.find( - (ip) => ip.getId() === platform.getId() - ); - if (!!matchingPlatform) { - installedVersion = matchingPlatform.getInstalled(); - } - return { - id: platform.getId(), - name: platform.getName(), - author: platform.getMaintainer(), - availableVersions: [platform.getLatest()], - description: platform - .getBoardsList() - .map((b) => b.getName()) - .join(', '), - installable: true, - types: platform.getTypeList(), - deprecated: platform.getDeprecated(), - summary: nls.localize( - 'arduino/component/boardsIncluded', - 'Boards included in this package:' - ), - installedVersion, - boards: platform - .getBoardsList() - .map((b) => <Board>{ name: b.getName(), fqbn: b.getFqbn() }), - moreInfoLink: platform.getWebsite(), - }; - }; - // We must group the cores by ID, and sort platforms by, first the installed version, then version alphabetical order. // Otherwise we lose the FQBN information. const groupedById: Map<string, Platform[]> = new Map(); @@ -400,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)); } } } @@ -572,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) => <Board>{ name: b.getName(), fqbn: b.getFqbn() }), + moreInfoLink: platform.getWebsite(), + }; +} 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 76e70da5f..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,14 +14,11 @@ 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; static toObject(includeInstance: boolean, msg: BoardDetailsRequest): BoardDetailsRequest.AsObject; @@ -43,66 +40,51 @@ export namespace BoardDetailsRequest { export class BoardDetailsResponse extends jspb.Message { getFqbn(): string; setFqbn(value: string): BoardDetailsResponse; - getName(): string; setName(value: string): BoardDetailsResponse; - getVersion(): string; setVersion(value: string): BoardDetailsResponse; - getPropertiesId(): string; setPropertiesId(value: string): BoardDetailsResponse; - getAlias(): string; setAlias(value: string): BoardDetailsResponse; - getOfficial(): boolean; setOfficial(value: boolean): BoardDetailsResponse; - getPinout(): string; setPinout(value: string): BoardDetailsResponse; - hasPackage(): boolean; clearPackage(): void; getPackage(): Package | undefined; setPackage(value?: Package): BoardDetailsResponse; - hasPlatform(): boolean; clearPlatform(): void; getPlatform(): BoardPlatform | undefined; setPlatform(value?: BoardPlatform): BoardDetailsResponse; - clearToolsDependenciesList(): void; getToolsDependenciesList(): Array<ToolsDependencies>; setToolsDependenciesList(value: Array<ToolsDependencies>): BoardDetailsResponse; addToolsDependencies(value?: ToolsDependencies, index?: number): ToolsDependencies; - clearConfigOptionsList(): void; getConfigOptionsList(): Array<ConfigOption>; setConfigOptionsList(value: Array<ConfigOption>): BoardDetailsResponse; addConfigOptions(value?: ConfigOption, index?: number): ConfigOption; - clearProgrammersList(): void; getProgrammersList(): Array<cc_arduino_cli_commands_v1_common_pb.Programmer>; setProgrammersList(value: Array<cc_arduino_cli_commands_v1_common_pb.Programmer>): BoardDetailsResponse; addProgrammers(value?: cc_arduino_cli_commands_v1_common_pb.Programmer, index?: number): cc_arduino_cli_commands_v1_common_pb.Programmer; - getDebuggingSupported(): boolean; setDebuggingSupported(value: boolean): BoardDetailsResponse; - clearIdentificationPropertiesList(): void; getIdentificationPropertiesList(): Array<BoardIdentificationProperties>; setIdentificationPropertiesList(value: Array<BoardIdentificationProperties>): BoardDetailsResponse; addIdentificationProperties(value?: BoardIdentificationProperties, index?: number): BoardIdentificationProperties; - clearBuildPropertiesList(): void; getBuildPropertiesList(): Array<string>; setBuildPropertiesList(value: Array<string>): BoardDetailsResponse; addBuildProperties(value: string, index?: number): string; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardDetailsResponse): BoardDetailsResponse.AsObject; @@ -138,7 +120,6 @@ export class BoardIdentificationProperties extends jspb.Message { getPropertiesMap(): jspb.Map<string, string>; clearPropertiesMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardIdentificationProperties.AsObject; static toObject(includeInstance: boolean, msg: BoardIdentificationProperties): BoardIdentificationProperties.AsObject; @@ -159,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; @@ -204,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; @@ -224,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; @@ -269,19 +236,15 @@ export namespace BoardPlatform { export class ToolsDependencies extends jspb.Message { getPackager(): string; setPackager(value: string): ToolsDependencies; - getName(): string; setName(value: string): ToolsDependencies; - getVersion(): string; setVersion(value: string): ToolsDependencies; - clearSystemsList(): void; getSystemsList(): Array<Systems>; setSystemsList(value: Array<Systems>): ToolsDependencies; addSystems(value?: Systems, index?: number): Systems; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ToolsDependencies.AsObject; static toObject(includeInstance: boolean, msg: ToolsDependencies): ToolsDependencies.AsObject; @@ -304,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; @@ -341,16 +299,13 @@ export namespace Systems { export class ConfigOption extends jspb.Message { getOption(): string; setOption(value: string): ConfigOption; - getOptionLabel(): string; setOptionLabel(value: string): ConfigOption; - clearValuesList(): void; getValuesList(): Array<ConfigValue>; setValuesList(value: Array<ConfigValue>): ConfigOption; addValues(value?: ConfigValue, index?: number): ConfigValue; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ConfigOption.AsObject; static toObject(includeInstance: boolean, msg: ConfigOption): ConfigOption.AsObject; @@ -372,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; @@ -404,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; @@ -436,7 +385,6 @@ export class BoardListResponse extends jspb.Message { setPortsList(value: Array<DetectedPort>): BoardListResponse; addPorts(value?: DetectedPort, index?: number): DetectedPort; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardListResponse): BoardListResponse.AsObject; @@ -459,13 +407,11 @@ export class DetectedPort extends jspb.Message { setMatchingBoardsList(value: Array<BoardListItem>): DetectedPort; addMatchingBoards(value?: BoardListItem, index?: number): BoardListItem; - hasPort(): boolean; clearPort(): void; getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): DetectedPort; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DetectedPort.AsObject; static toObject(includeInstance: boolean, msg: DetectedPort): DetectedPort.AsObject; @@ -489,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<string>; setSearchArgsList(value: Array<string>): BoardListAllRequest; addSearchArgs(value: string, index?: number): string; - getIncludeHiddenBoards(): boolean; setIncludeHiddenBoards(value: boolean): BoardListAllRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListAllRequest.AsObject; static toObject(includeInstance: boolean, msg: BoardListAllRequest): BoardListAllRequest.AsObject; @@ -523,7 +466,6 @@ export class BoardListAllResponse extends jspb.Message { setBoardsList(value: Array<BoardListItem>): BoardListAllResponse; addBoards(value?: BoardListItem, index?: number): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListAllResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardListAllResponse): BoardListAllResponse.AsObject; @@ -546,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; @@ -572,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; @@ -603,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; @@ -642,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; @@ -674,7 +604,6 @@ export class BoardSearchResponse extends jspb.Message { setBoardsList(value: Array<BoardListItem>): BoardSearchResponse; addBoards(value?: BoardListItem, index?: number): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardSearchResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardSearchResponse): BoardSearchResponse.AsObject; 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<grpc.Untyped newSketch: IArduinoCoreServiceService_INewSketch; loadSketch: IArduinoCoreServiceService_ILoadSketch; archiveSketch: IArduinoCoreServiceService_IArchiveSketch; + setSketchDefaults: IArduinoCoreServiceService_ISetSketchDefaults; boardDetails: IArduinoCoreServiceService_IBoardDetails; boardList: IArduinoCoreServiceService_IBoardList; boardListAll: IArduinoCoreServiceService_IBoardListAll; @@ -138,6 +138,15 @@ interface IArduinoCoreServiceService_IArchiveSketch extends grpc.MethodDefinitio responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse>; } +interface IArduinoCoreServiceService_ISetSketchDefaults extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SetSketchDefaults"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse>; +} interface IArduinoCoreServiceService_IBoardDetails extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardDetails"; requestStream: false; @@ -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<cc_arduino_cli_commands_v1_commands_pb.CreateRequest, cc_arduino_cli_commands_v1_commands_pb.CreateResponse>; init: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_commands_pb.InitRequest, cc_arduino_cli_commands_v1_commands_pb.InitResponse>; destroy: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.DestroyRequest, cc_arduino_cli_commands_v1_commands_pb.DestroyResponse>; @@ -412,6 +421,7 @@ export interface IArduinoCoreServiceServer { newSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.NewSketchRequest, cc_arduino_cli_commands_v1_commands_pb.NewSketchResponse>; loadSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.LoadSketchRequest, cc_arduino_cli_commands_v1_commands_pb.LoadSketchResponse>; archiveSketch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest, cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse>; + setSketchDefaults: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse>; boardDetails: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse>; boardList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListRequest, cc_arduino_cli_commands_v1_board_pb.BoardListResponse>; boardListAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest, cc_arduino_cli_commands_v1_board_pb.BoardListAllResponse>; @@ -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<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; + setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; @@ -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<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchResponse) => void): grpc.ClientUnaryCall; + public setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + public setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; + public setSketchDefaults(request: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse) => void): grpc.ClientUnaryCall; public boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; public boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; public boardDetails(request: cc_arduino_cli_commands_v1_board_pb.BoardDetailsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; 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<string>; setOtherSketchFilesList(value: Array<string>): LoadSketchResponse; addOtherSketchFiles(value: string, index?: number): string; - clearAdditionalFilesList(): void; getAdditionalFilesList(): Array<string>; setAdditionalFilesList(value: Array<string>): LoadSketchResponse; addAdditionalFiles(value: string, index?: number): string; - clearRootFolderFilesList(): void; getRootFolderFilesList(): Array<string>; setRootFolderFilesList(value: Array<string>): LoadSketchResponse; addRootFolderFiles(value: string, index?: number): string; - + 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<string>, additionalFilesList: Array<string>, rootFolderFilesList: Array<string>, + 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<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SetSketchDefaultsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SetSketchDefaultsRequest; + static deserializeBinaryFromReader(message: SetSketchDefaultsRequest, reader: jspb.BinaryReader): SetSketchDefaultsRequest; +} + +export namespace SetSketchDefaultsRequest { + export type AsObject = { + sketchPath: string, + defaultFqbn: string, + defaultPortAddress: string, + defaultPortProtocol: string, + } +} + +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<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SetSketchDefaultsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SetSketchDefaultsResponse; + static deserializeBinaryFromReader(message: SetSketchDefaultsResponse, reader: jspb.BinaryReader): SetSketchDefaultsResponse; +} + +export namespace SetSketchDefaultsResponse { + export type AsObject = { + defaultFqbn: string, + defaultPortAddress: string, + defaultPortProtocol: string, + } +} + 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 ead2d3881..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 @@ -53,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); @@ -479,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'; +} @@ -2733,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) @@ -2773,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); @@ -2819,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( @@ -2851,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} @@ -3104,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, "") }; @@ -3142,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); @@ -3180,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( @@ -3198,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} @@ -3296,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) { @@ -3353,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; @@ -3417,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 + ); + } }; @@ -3567,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); +}; + + @@ -3888,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_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.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_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.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} */ @@ -3895,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 98d9117fe..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,54 +198,40 @@ 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<Board>; setBoardsList(value: Array<Board>): Platform; addBoards(value?: Board, index?: number): Board; - getManuallyInstalled(): boolean; setManuallyInstalled(value: boolean): Platform; - getDeprecated(): boolean; setDeprecated(value: boolean): Platform; - clearTypeList(): void; getTypeList(): Array<string>; setTypeList(value: Array<string>): 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; static toObject(includeInstance: boolean, msg: Platform): Platform.AsObject; @@ -299,17 +264,13 @@ export namespace Platform { 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; @@ -332,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; @@ -357,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; @@ -383,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/compile_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts index a4633d90d..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,90 +15,65 @@ export class CompileRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): CompileRequest; - getFqbn(): string; setFqbn(value: string): CompileRequest; - getSketchPath(): string; setSketchPath(value: string): CompileRequest; - getShowProperties(): boolean; setShowProperties(value: boolean): CompileRequest; - getPreprocess(): boolean; setPreprocess(value: boolean): CompileRequest; - getBuildCachePath(): string; setBuildCachePath(value: string): CompileRequest; - getBuildPath(): string; setBuildPath(value: string): CompileRequest; - clearBuildPropertiesList(): void; getBuildPropertiesList(): Array<string>; setBuildPropertiesList(value: Array<string>): CompileRequest; addBuildProperties(value: string, index?: number): string; - getWarnings(): string; setWarnings(value: string): CompileRequest; - getVerbose(): boolean; setVerbose(value: boolean): CompileRequest; - getQuiet(): boolean; setQuiet(value: boolean): CompileRequest; - getJobs(): number; setJobs(value: number): CompileRequest; - clearLibrariesList(): void; getLibrariesList(): Array<string>; setLibrariesList(value: Array<string>): CompileRequest; addLibraries(value: string, index?: number): string; - getOptimizeForDebug(): boolean; setOptimizeForDebug(value: boolean): CompileRequest; - getExportDir(): string; setExportDir(value: string): CompileRequest; - getClean(): boolean; setClean(value: boolean): CompileRequest; - getCreateCompilationDatabaseOnly(): boolean; setCreateCompilationDatabaseOnly(value: boolean): CompileRequest; - getSourceOverrideMap(): jspb.Map<string, string>; clearSourceOverrideMap(): void; - hasExportBinaries(): boolean; clearExportBinaries(): void; getExportBinaries(): google_protobuf_wrappers_pb.BoolValue | undefined; setExportBinaries(value?: google_protobuf_wrappers_pb.BoolValue): CompileRequest; - clearLibraryList(): void; getLibraryList(): Array<string>; setLibraryList(value: Array<string>): CompileRequest; addLibrary(value: string, index?: number): string; - getKeysKeychain(): string; setKeysKeychain(value: string): CompileRequest; - getSignKey(): string; setSignKey(value: string): CompileRequest; - getEncryptKey(): string; setEncryptKey(value: string): CompileRequest; - getSkipLibrariesDiscovery(): boolean; setSkipLibrariesDiscovery(value: boolean): CompileRequest; - getDoNotExpandBuildProperties(): boolean; setDoNotExpandBuildProperties(value: boolean): CompileRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; static toObject(includeInstance: boolean, msg: CompileRequest): CompileRequest.AsObject; @@ -145,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<cc_arduino_cli_commands_v1_lib_pb.Library>; setUsedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.Library>): 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<ExecutableSectionSize>; setExecutableSectionsSizeList(value: Array<ExecutableSectionSize>): 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<string>; setBuildPropertiesList(value: Array<string>): CompileResponse; addBuildProperties(value: string, index?: number): string; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileResponse.AsObject; static toObject(includeInstance: boolean, msg: CompileResponse): CompileResponse.AsObject; @@ -215,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/core_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts index a4d62a8f7..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,19 +254,16 @@ 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; static toObject(includeInstance: boolean, msg: PlatformUpgradeResponse): PlatformUpgradeResponse.AsObject; @@ -312,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; @@ -344,7 +317,6 @@ export class PlatformSearchResponse extends jspb.Message { setSearchOutputList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): PlatformSearchResponse; addSearchOutput(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformSearchResponse): PlatformSearchResponse.AsObject; @@ -367,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; @@ -399,7 +368,6 @@ export class PlatformListResponse extends jspb.Message { setInstalledPlatformsList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): PlatformListResponse; addInstalledPlatforms(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformListResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformListResponse): PlatformListResponse.AsObject; 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<LibraryDependencyStatus>): LibraryResolveDependenciesResponse; addDependencies(value?: LibraryDependencyStatus, index?: number): LibraryDependencyStatus; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryResolveDependenciesResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryResolveDependenciesResponse): LibraryResolveDependenciesResponse.AsObject; @@ -370,14 +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<SearchedLibrary>; setLibrariesList(value: Array<SearchedLibrary>): LibrarySearchResponse; addLibraries(value?: SearchedLibrary, index?: number): SearchedLibrary; - getStatus(): LibrarySearchStatus; setStatus(value: LibrarySearchStatus): LibrarySearchResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibrarySearchResponse.AsObject; static toObject(includeInstance: boolean, msg: LibrarySearchResponse): LibrarySearchResponse.AsObject; @@ -459,22 +426,18 @@ export class SearchedLibrary extends jspb.Message { getName(): string; setName(value: string): SearchedLibrary; - getReleasesMap(): jspb.Map<string, LibraryRelease>; clearReleasesMap(): void; - hasLatest(): boolean; clearLatest(): void; getLatest(): LibraryRelease | undefined; setLatest(value?: LibraryRelease): SearchedLibrary; - clearAvailableVersionsList(): void; getAvailableVersionsList(): Array<string>; setAvailableVersionsList(value: Array<string>): SearchedLibrary; addAvailableVersions(value: string, index?: number): string; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SearchedLibrary.AsObject; 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<string>; setArchitecturesList(value: Array<string>): LibraryRelease; addArchitectures(value: string, index?: number): string; - clearTypesList(): void; getTypesList(): Array<string>; setTypesList(value: Array<string>): LibraryRelease; addTypes(value: string, index?: number): string; - hasResources(): boolean; clearResources(): void; getResources(): DownloadResource | undefined; setResources(value?: DownloadResource): LibraryRelease; - getLicense(): string; setLicense(value: string): LibraryRelease; - clearProvidesIncludesList(): void; getProvidesIncludesList(): Array<string>; setProvidesIncludesList(value: Array<string>): LibraryRelease; addProvidesIncludes(value: string, index?: number): string; - clearDependenciesList(): void; getDependenciesList(): Array<LibraryDependency>; setDependenciesList(value: Array<LibraryDependency>): LibraryRelease; addDependencies(value?: LibraryDependency, index?: number): LibraryDependency; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryRelease.AsObject; static toObject(includeInstance: boolean, msg: LibraryRelease): LibraryRelease.AsObject; @@ -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<InstalledLibrary>): 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<string>; setArchitecturesList(value: Array<string>): Library; addArchitectures(value: string, index?: number): string; - clearTypesList(): void; getTypesList(): Array<string>; setTypesList(value: Array<string>): Library; addTypes(value: string, index?: number): string; - getInstallDir(): string; setInstallDir(value: string): Library; - getSourceDir(): string; setSourceDir(value: string): Library; - getUtilityDir(): string; setUtilityDir(value: string): Library; - getContainerPlatform(): string; setContainerPlatform(value: string): Library; - getDotALinkage(): boolean; setDotALinkage(value: boolean): Library; - getPrecompiled(): boolean; setPrecompiled(value: boolean): Library; - getLdFlags(): string; setLdFlags(value: string): Library; - getIsLegacy(): boolean; setIsLegacy(value: boolean): Library; - getVersion(): string; setVersion(value: string): Library; - getLicense(): string; setLicense(value: string): Library; - getPropertiesMap(): jspb.Map<string, string>; clearPropertiesMap(): void; - getLocation(): LibraryLocation; setLocation(value: LibraryLocation): Library; - getLayout(): LibraryLayout; setLayout(value: LibraryLayout): Library; - clearExamplesList(): void; getExamplesList(): Array<string>; setExamplesList(value: Array<string>): Library; addExamples(value: string, index?: number): string; - clearProvidesIncludesList(): void; getProvidesIncludesList(): Array<string>; setProvidesIncludesList(value: Array<string>): Library; addProvidesIncludes(value: string, index?: number): string; - getCompatibleWithMap(): jspb.Map<string, boolean>; clearCompatibleWithMap(): void; - getInDevelopment(): boolean; setInDevelopment(value: boolean): Library; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Library.AsObject; 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 fa7cc1365..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 @@ -3209,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) { @@ -3259,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; @@ -3310,6 +3315,13 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.serializeBinaryToWriter = f ); } + f = message.getSearchArgs(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } }; @@ -3386,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<MonitorPortSetting>): 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<MonitorPortSetting>; setAppliedSettingsList(value: Array<MonitorPortSetting>): 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<MonitorPortSettingDescriptor>): EnumerateMonitorPortSettingsResponse; addSettings(value?: MonitorPortSettingDescriptor, index?: number): MonitorPortSettingDescriptor; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): EnumerateMonitorPortSettingsResponse.AsObject; static toObject(includeInstance: boolean, msg: EnumerateMonitorPortSettingsResponse): EnumerateMonitorPortSettingsResponse.AsObject; @@ -199,22 +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<string>; setEnumValuesList(value: Array<string>): MonitorPortSettingDescriptor; addEnumValues(value: string, index?: number): string; - getValue(): string; setValue(value: string): MonitorPortSettingDescriptor; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorPortSettingDescriptor.AsObject; static toObject(includeInstance: boolean, msg: MonitorPortSettingDescriptor): MonitorPortSettingDescriptor.AsObject; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/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<string, string>; 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/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<string, string>; 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<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: UploadResult, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): UploadResult; + static deserializeBinaryFromReader(message: UploadResult, reader: jspb.BinaryReader): UploadResult; +} + +export namespace UploadResult { + export type AsObject = { + updatedUploadPort?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, } } @@ -129,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<string, string>; 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<string, string>; 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<cc_arduino_cli_commands_v1_common_pb.Programmer>): ListProgrammersAvailableForUploadResponse; addProgrammers(value?: cc_arduino_cli_commands_v1_common_pb.Programmer, index?: number): cc_arduino_cli_commands_v1_common_pb.Programmer; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ListProgrammersAvailableForUploadResponse.AsObject; static toObject(includeInstance: boolean, msg: ListProgrammersAvailableForUploadResponse): ListProgrammersAvailableForUploadResponse.AsObject; @@ -364,14 +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<UserField>): SupportedUserFieldsResponse; addUserFields(value?: UserField, index?: number): UserField; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SupportedUserFieldsResponse.AsObject; static toObject(includeInstance: boolean, msg: SupportedUserFieldsResponse): SupportedUserFieldsResponse.AsObject; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js index c38618ad6..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 @@ -34,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); @@ -69,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) { @@ -79,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 @@ -765,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<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UploadResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UploadResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -797,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) { @@ -842,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; @@ -871,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 + ); + } }; @@ -926,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; }; @@ -968,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_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UploadResult.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.UploadResult} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.UploadResult.toObject = function(includeInstance, msg) { + var f, obj = { + updatedUploadPort: (f = msg.getUpdatedUploadPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.UploadResult; + return proto.cc.arduino.cli.commands.v1.UploadResult.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.UploadResult} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setUpdatedUploadPort(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.UploadResult.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.UploadResult} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.UploadResult.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUpdatedUploadPort(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Port updated_upload_port = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.getUpdatedUploadPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.setUpdatedUploadPort = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadResult} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.clearUpdatedUploadPort = function() { + return this.setUpdatedUploadPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadResult.prototype.hasUpdatedUploadPort = function() { + return jspb.Message.getField(this, 1) != null; }; 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<cc_ export const DebugServiceService: IDebugServiceService; -export interface IDebugServiceServer { +export interface IDebugServiceServer extends grpc.UntypedServiceImplementation { debug: grpc.handleBidiStreamingCall<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; } 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<string, string>; clearToolchainConfigurationMap(): void; - getServerConfigurationMap(): jspb.Map<string, string>; clearServerConfigurationMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GetDebugConfigResponse.AsObject; static toObject(includeInstance: boolean, msg: GetDebugConfigResponse): GetDebugConfigResponse.AsObject; 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<grpc.UntypedServiceImplementation> { @@ -14,6 +13,7 @@ interface ISettingsServiceService extends grpc.ServiceDefinition<grpc.UntypedSer getValue: ISettingsServiceService_IGetValue; setValue: ISettingsServiceService_ISetValue; write: ISettingsServiceService_IWrite; + delete: ISettingsServiceService_IDelete; } interface ISettingsServiceService_IGetAll extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, cc_arduino_cli_settings_v1_settings_pb.GetAllResponse> { @@ -61,15 +61,25 @@ interface ISettingsServiceService_IWrite extends grpc.MethodDefinition<cc_arduin responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; } +interface ISettingsServiceService_IDelete extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, cc_arduino_cli_settings_v1_settings_pb.DeleteResponse> { + path: "/cc.arduino.cli.settings.v1.SettingsService/Delete"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.DeleteResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.DeleteResponse>; +} export const SettingsServiceService: ISettingsServiceService; -export interface ISettingsServiceServer { +export interface ISettingsServiceServer extends grpc.UntypedServiceImplementation { getAll: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; merge: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.MergeRequest, cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; getValue: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; setValue: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; write: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.WriteRequest, cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; + delete: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, cc_arduino_cli_settings_v1_settings_pb.DeleteResponse>; } 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<grpc.CallOptions>, 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<grpc.CallOptions>, 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<grpc.CallOptions>, 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<grpc.CallOptions>, 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<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + 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<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + 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 585bd6473..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 @@ -21,6 +21,8 @@ var global = (function() { 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); @@ -241,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'; +} @@ -1485,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_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.settings.v1.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_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.settings.v1.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<google_protobuf_any_pb.Any>; setDetailsList(value: Array<google_protobuf_any_pb.Any>): Status; addDetails(value?: google_protobuf_any_pb.Any, index?: number): google_protobuf_any_pb.Any; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Status.AsObject; static toObject(includeInstance: boolean, msg: Status): Status.AsObject; diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 253dcd383..a8dfab98b 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -3,13 +3,14 @@ import { inject, injectable } from '@theia/core/shared/inversify'; 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, @@ -25,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'; @@ -36,8 +43,8 @@ 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 { Mutable } from '@theia/core/lib/common/types'; +import type { Mutable } from '@theia/core/lib/common/types'; +import { BoardDiscovery, createApiPort } from './board-discovery'; namespace Uploadable { export type Request = UploadRequest | UploadUsingProgrammerRequest; @@ -50,13 +57,10 @@ type CompileSummaryFragment = Partial<Mutable<CompileSummary>>; 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; @@ -172,7 +176,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { return request; } - upload(options: CoreService.Options.Upload): Promise<void> { + upload(options: CoreService.Options.Upload): Promise<ApiUploadResponse> { const { usingProgrammer } = options; return this.doUpload( options, @@ -201,14 +205,45 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { ) => (request: REQ) => ClientReadableStream<RESP>, errorCtor: ApplicationError.Constructor<number, CoreError.ErrorLocation[]>, task: string - ): Promise<void> { + ): Promise<ApiUploadResponse> { + const portBeforeUpload = options.port; + const uploadResponseFragment: Mutable<Partial<ApiUploadResponse>> = { + portAfterUpload: options.port, // assume no port changes during the upload + }; const coreClient = await this.coreClient; const { client, instance } = coreClient; const progressHandler = this.createProgressHandler(options); - const handler = this.createOnDataHandler(progressHandler); + // Track responses for port changes. No port changes are expected when uploading using a programmer. + const updateUploadResponseFragmentHandler = (response: RESP) => { + if (response instanceof UploadResponse) { + // TODO: this instanceof should not be here but in `upload`. the upload and upload using programmer gRPC APIs are not symmetric + const uploadResult = response.getResult(); + if (uploadResult) { + const port = uploadResult.getUpdatedUploadPort(); + if (port) { + uploadResponseFragment.portAfterUpload = createApiPort(port); + console.info( + `Received port after upload [${ + options.port ? Port.keyOf(options.port) : '' + }, ${options.fqbn}, ${ + options.sketch.name + }]. Before port: ${JSON.stringify( + portBeforeUpload + )}, after port: ${JSON.stringify( + uploadResponseFragment.portAfterUpload + )}` + ); + } + } + } + }; + const handler = this.createOnDataHandler( + progressHandler, + updateUploadResponseFragmentHandler + ); const grpcCall = responseFactory(client); return this.notifyUploadWillStart(options).then(() => - new Promise<void>((resolve, reject) => { + new Promise<ApiUploadResponse>((resolve, reject) => { grpcCall(this.initUploadRequest(request, options, instance)) .on('data', handler.onData) .on('error', (error) => { @@ -234,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, + }) + ); }) ); } @@ -302,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 }) + ); }) ); } @@ -379,21 +434,25 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { port, }: { fqbn?: string | undefined; - port?: Port | undefined; + port?: PortIdentifier; }): Promise<void> { - this.boardDiscovery.setUploadInProgress(true); - return this.monitorManager.notifyUploadStarted(fqbn, port); + if (fqbn && port) { + return this.monitorManager.notifyUploadStarted(fqbn, port); + } } private async notifyUploadDidFinish({ fqbn, port, + afterPort, }: { fqbn?: string | undefined; - port?: Port | undefined; + port?: PortIdentifier; + afterPort?: PortIdentifier; }): Promise<void> { - this.boardDiscovery.setUploadInProgress(false); - return this.monitorManager.notifyUploadFinished(fqbn, port); + if (fqbn && port && afterPort) { + return this.monitorManager.notifyUploadFinished(fqbn, port, afterPort); + } } private mergeSourceOverrides( @@ -410,21 +469,28 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { } } - private createPort(port: Port | undefined): RpcPort | undefined { + 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(); - rpcPort.setAddress(port.address); - rpcPort.setLabel(port.addressLabel); rpcPort.setProtocol(port.protocol); - rpcPort.setProtocolLabel(port.protocolLabel); - if (port.hardwareId !== undefined) { - rpcPort.setHardwareId(port.hardwareId); - } - if (port.properties) { - for (const [key, value] of Object.entries(port.properties)) { - rpcPort.getPropertiesMap().set(key, value); + 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); + } } } return rpcPort; diff --git a/arduino-ide-extension/src/node/monitor-manager.ts b/arduino-ide-extension/src/node/monitor-manager.ts index 4eea5b46a..9931e3937 100644 --- a/arduino-ide-extension/src/node/monitor-manager.ts +++ b/arduino-ide-extension/src/node/monitor-manager.ts @@ -7,6 +7,8 @@ import { MonitorSettings, PluggableMonitorSettings, Port, + PortIdentifier, + portIdentifierEquals, } from '../common/protocol'; import { CoreClientAware } from './core-client-provider'; import { MonitorService } from './monitor-service'; @@ -180,13 +182,7 @@ export class MonitorManager extends CoreClientAware { * @param fqbn the FQBN of the board connected to port * @param port port to monitor */ - async notifyUploadStarted(fqbn?: string, port?: Port): Promise<void> { - if (!fqbn || !port) { - // We have no way of knowing which monitor - // to retrieve if we don't have this information. - return; - } - + async notifyUploadStarted(fqbn: string, port: PortIdentifier): Promise<void> { const monitorID = this.monitorID(fqbn, port); this.addToMonitorIDsByUploadState('uploadInProgress', monitorID); @@ -204,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<void> { let portDidChangeOnUpload = false; + const beforeMonitorID = this.monitorID(fqbn, beforePort); + this.removeFromMonitorIDsByUploadState('uploadInProgress', beforeMonitorID); - // We have no way of knowing which monitor - // to retrieve if we don't have this information. - if (fqbn && port) { - const monitorID = this.monitorID(fqbn, port); - this.removeFromMonitorIDsByUploadState('uploadInProgress', monitorID); - - const monitor = this.monitorServices.get(monitorID); - if (monitor) { + 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); } @@ -256,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]; @@ -355,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/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/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index d3ad0e58e..95493bb19 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -6,7 +6,7 @@ import path from 'node:path'; import glob from 'glob'; import crypto from 'node:crypto'; import PQueue from 'p-queue'; -import { Mutable } from '@theia/core/lib/common/types'; +import type { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; import { ILogger } from '@theia/core/lib/common/logger'; import { FileUri } from '@theia/core/lib/node/file-uri'; @@ -128,11 +128,11 @@ export class SketchesServiceImpl uri: string, detectInvalidSketchNameError = true ): Promise<SketchWithDetails> { - 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<Stats | Error>(); lstat(requestSketchPath, (err, result) => err ? stat.resolve(err) : stat.resolve(result) 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>( + FrontendApplicationStateService + ).state = 'ready'; + boardsServiceProvider = container.get<BoardsServiceProvider>( + BoardsServiceProvider + ); + notificationCenter = container.get<NotificationCenter>(NotificationCenter); + toDisposeAfterEach = new DisposableCollection( + Disposable.create(() => boardsServiceProvider.onStop()) + ); + boardsServiceProvider.onStart(); + await boardsServiceProvider.ready; + }); + + afterEach(() => { + toDisposeAfterEach.dispose(); + }); + + it('should update the port (port identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(mkr1000SerialPort); + expect(didUpdate).to.be.true; + const expectedEvent: PortIdentifierChangeEvent = { + previousSelectedPort: unoSerialPort, + selectedPort: mkr1000SerialPort, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should update the port (boards config)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig({ + selectedPort: mkr1000SerialPort, + selectedBoard: uno, + }); + expect(didUpdate).to.be.true; + const expectedEvent: PortIdentifierChangeEvent = { + previousSelectedPort: unoSerialPort, + selectedPort: mkr1000SerialPort, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should not update the port if did not change (port identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(unoSerialPort); + expect(didUpdate).to.be.false; + expect(events).to.be.empty; + }); + + it('should update the board (board identifier)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig(mkr1000); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should update the board (boards config)', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const didUpdate = boardsServiceProvider.updateConfig({ + selectedBoard: mkr1000, + selectedPort: unoSerialPort, + }); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000, + }; + expect(events).deep.equals([expectedEvent]); + }); + + it('should 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(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{ + getDetectedPorts() { + return {}; + }, + }); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(< + NotificationServiceServer + >{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toConstantValue(<BoardsDataStore>{}); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + // 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<MessageService>; -// let boardsService: IMock<BoardsService>; -// let boardsServiceClient: IMock<BoardsServiceProvider>; -// let responseService: IMock<ResponseServiceArduino>; -// let boardsManagerFrontendContribution: IMock<BoardsListWidgetFrontendContribution>; -// let boardsManagerWidget: IMock<ListWidget<BoardsPackage>>; - -// let testContainer: Container; - -// beforeEach(() => { -// testContainer = new Container(); -// messageService = Mock.ofType<MessageService>(); -// boardsService = Mock.ofType<BoardsService>(); -// boardsServiceClient = Mock.ofType<BoardsServiceProvider>(); -// responseService = Mock.ofType<ResponseServiceArduino>(); -// boardsManagerFrontendContribution = -// Mock.ofType<BoardsListWidgetFrontendContribution>(); -// boardsManagerWidget = Mock.ofType<ListWidget<BoardsPackage>>(); - -// boardsManagerWidget.setup((b) => -// b.refresh(aPackage.name.toLocaleLowerCase()) -// ); - -// boardsManagerFrontendContribution -// .setup((b) => b.openView({ reveal: true })) -// .returns(async () => boardsManagerWidget.object); - -// messageService -// .setup((m) => m.showProgress(It.isAny(), It.isAny())) -// .returns(async () => ({ -// cancel: () => null, -// id: '', -// report: () => null, -// result: Promise.resolve(''), -// })); - -// responseService -// .setup((r) => r.onProgressDidChange(It.isAny())) -// .returns(() => ({ dispose: () => null })); - -// const module = new ContainerModule((bind) => { -// bind(BoardsAutoInstaller).toSelf(); -// bind(MessageService).toConstantValue(messageService.object); -// bind(BoardsService).toConstantValue(boardsService.object); -// bind(BoardsServiceProvider).toConstantValue(boardsServiceClient.object); -// bind(ResponseServiceArduino).toConstantValue(responseService.object); -// bind(BoardsListWidgetFrontendContribution).toConstantValue( -// boardsManagerFrontendContribution.object -// ); -// }); - -// testContainer.load(module); -// subject = testContainer.get(BoardsAutoInstaller); -// }); - -// context('when it starts', () => { -// it('should register to the BoardsServiceClient in order to check the packages every a new board is plugged in', () => { -// subject.onStart(); -// boardsServiceClient.verify( -// (b) => b.onBoardsConfigChanged(It.isAny()), -// Times.once() -// ); -// }); - -// context('and it checks the installable packages', () => { -// context(`and a port and a board a selected`, () => { -// beforeEach(() => { -// boardsServiceClient -// .setup((b) => b.boardsConfig) -// .returns(() => aBoardConfig); -// }); -// context('if no package for the board is already installed', () => { -// context('if a candidate package for the board is found', () => { -// beforeEach(() => { -// boardsService -// .setup((b) => b.search(It.isValue({}))) -// .returns(async () => [aPackage]); -// }); -// it('should show a notification suggesting to install that package', async () => { -// messageService -// .setup((m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) -// ) -// .returns(() => Promise.resolve('Install Manually')); -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.once() -// ); -// }); -// context(`if the answer to the message is 'Yes'`, () => { -// beforeEach(() => { -// messageService -// .setup((m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) -// ) -// .returns(() => Promise.resolve('Yes')); -// }); -// it('should install the package', async () => { -// subject.onStart(); - -// await tick(); - -// messageService.verify( -// (m) => m.showProgress(It.isAny(), It.isAny()), -// Times.once() -// ); -// }); -// }); -// context( -// `if the answer to the message is 'Install Manually'`, -// () => { -// beforeEach(() => { -// messageService -// .setup((m) => -// m.info( -// It.isAnyString(), -// It.isAnyString(), -// It.isAnyString() -// ) -// ) -// .returns(() => Promise.resolve('Install Manually')); -// }); -// it('should open the boards manager widget', () => { -// subject.onStart(); -// }); -// } -// ); -// }); -// context('if a candidate package for the board is not found', () => { -// beforeEach(() => { -// boardsService -// .setup((b) => b.search(It.isValue({}))) -// .returns(async () => []); -// }); -// it('should do nothing', async () => { -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.never() -// ); -// }); -// }); -// }); -// context( -// 'if one of the packages for the board is already installed', -// () => { -// beforeEach(() => { -// boardsService -// .setup((b) => b.search(It.isValue({}))) -// .returns(async () => [aPackage, anInstalledPackage]); -// messageService -// .setup((m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) -// ) -// .returns(() => Promise.resolve('Yes')); -// }); -// it('should do nothing', async () => { -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => -// m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.never() -// ); -// }); -// } -// ); -// }); -// context('and there is no selected board or port', () => { -// it('should do nothing', async () => { -// subject.onStart(); -// await tick(); -// messageService.verify( -// (m) => m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), -// Times.never() -// ); -// }); -// }); -// }); -// }); -// }); diff --git a/arduino-ide-extension/src/test/browser/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/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/common/board-list.test.ts b/arduino-ide-extension/src/test/common/board-list.test.ts new file mode 100644 index 000000000..a9c5248b9 --- /dev/null +++ b/arduino-ide-extension/src/test/common/board-list.test.ts @@ -0,0 +1,594 @@ +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('defaultAction', () => { + it("'select' should be the default action for identifier boards", () => { + const { items } = createBoardList({ + ...detectedPort(mkr1000SerialPort, mkr1000), + }); + const item = items[0]; + expect(item.defaultAction.type).to.be.equal('select-boards-config'); + expect(item.defaultAction.params).to.be.deep.equal({ + selectedPort: mkr1000SerialPort, + selectedBoard: mkr1000, + }); + }); + + it("'select' should be the default action for manually selected items (no discovered boards)", () => { + const { items } = createBoardList( + { + ...detectedPort(undiscoveredSerialPort), + }, + emptyBoardsConfig(), + { + ...history(undiscoveredSerialPort, uno), + } + ); + const item = items[0]; + expect(item.defaultAction.type).to.be.equal('select-boards-config'); + expect(item.defaultAction.params).to.be.deep.equal({ + selectedPort: undiscoveredSerialPort, + selectedBoard: uno, + }); + }); + + it("'select' should be the default action for manually selected items (ambiguous boards)", () => { + const { items } = createBoardList( + { + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32SerialPort, mkr1000), + } + ); + const item = items[0]; + expect(item.defaultAction.type).to.be.equal('select-boards-config'); + expect(item.defaultAction.params).to.be.deep.equal({ + selectedBoard: mkr1000, + selectedPort: nanoEsp32SerialPort, + }); + }); + + it("'edit' should be the default action for ports with no boards", () => { + const { items } = createBoardList({ + ...detectedPort(undiscoveredSerialPort), + }); + const item = items[0]; + expect(item).to.be.not.undefined; + expect(item.defaultAction.type).to.be.equal('edit-boards-config'); + const params = <EditBoardsConfigActionParams>item.defaultAction.params; + const expectedParams: EditBoardsConfigActionParams = { + query: '', + portToSelect: undiscoveredSerialPort, + }; + expect(params).to.be.deep.equal(expectedParams); + }); + + it("'edit' should be the default action for ports with multiple boards (unique board name)", () => { + const { items } = createBoardList({ + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }); + const item = items[0]; + expect(item).to.be.not.undefined; + expect(item.defaultAction.type).to.be.equal('edit-boards-config'); + const params = <EditBoardsConfigActionParams>item.defaultAction.params; + const expectedParams: EditBoardsConfigActionParams = { + query: arduinoNanoEsp32.name, + portToSelect: nanoEsp32SerialPort, + searchSet: [arduinoNanoEsp32, esp32NanoEsp32], + }; + expect(params).to.be.deep.equal(expectedParams); + }); + + it("'edit' should be the default action for ports with multiple boards (no unique board name)", () => { + const { items } = createBoardList({ + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3DevModule, + esp32S3Box + ), + }); + const item = items[0]; + expect(item).to.be.not.undefined; + expect(item.defaultAction.type).to.be.equal('edit-boards-config'); + const params = <EditBoardsConfigActionParams>item.defaultAction.params; + const expectedParams: EditBoardsConfigActionParams = { + query: '', + portToSelect: nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + searchSet: [esp32S3Box, esp32S3DevModule], + }; + expect(params).to.be.deep.equal(expectedParams); + }); + }); + + describe('otherActions', () => { + it('should provide no other actions for identified board', () => { + const { items } = createBoardList({ + ...detectedPort(mkr1000SerialPort, mkr1000), + }); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it('should provide no other actions for identified board (when historical revision is self)', () => { + const { items } = createBoardList( + { + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + emptyBoardsConfig(), + { + ...history(mkr1000SerialPort, mkr1000), + } + ); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it('should provide no other actions for unknown boards', () => { + const { items } = createBoardList({ + ...detectedPort(undiscoveredSerialPort), + }); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it('should provide no other actions for ambiguous boards', () => { + const { items } = createBoardList({ + ...detectedPort( + nanoEsp32SerialPort, + arduinoNanoEsp32, + esp32NanoEsp32 + ), + }); + const item = items[0]; + expect(item.otherActions).to.be.empty; + }); + + it("should provide 'edit' action for unidentified items with manually selected board", () => { + const { items } = createBoardList( + { + ...detectedPort(undiscoveredSerialPort), + }, + emptyBoardsConfig(), + { + ...history(undiscoveredSerialPort, uno), + } + ); + const item = items[0]; + const expectedParams: EditBoardsConfigActionParams = { + query: uno.name, + portToSelect: undiscoveredSerialPort, + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedParams, + type: 'edit-boards-config', + }, + }); + }); + + it("should provide 'edit' action for ambiguous items with manually selected board (unique board name)", () => { + const { items } = createBoardList( + { + ...detectedPort( + nanoEsp32SerialPort, + esp32NanoEsp32, + arduinoNanoEsp32 + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32SerialPort, arduinoNanoEsp32), + } + ); + const item = items[0]; + const expectedParams: EditBoardsConfigActionParams = { + query: arduinoNanoEsp32.name, + portToSelect: nanoEsp32SerialPort, + searchSet: [arduinoNanoEsp32, esp32NanoEsp32], + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedParams, + type: 'edit-boards-config', + }, + }); + }); + + it("should provide 'edit' action for ambiguous items with manually selected board (no unique board name)", () => { + const { items } = createBoardList( + { + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3Box, + esp32S3DevModule + ), + }, + emptyBoardsConfig(), + { + ...history(nanoEsp32DetectsMultipleEsp32BoardsSerialPort, uno), + } + ); + const item = items[0]; + const expectedParams: EditBoardsConfigActionParams = { + query: '', + portToSelect: nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + searchSet: [esp32S3Box, esp32S3DevModule], + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedParams, + type: 'edit-boards-config', + }, + }); + }); + + it("should provide 'edit' and 'revert' actions for identified items with a manually overridden board", () => { + const { items } = createBoardList( + { + ...detectedPort(mkr1000SerialPort, mkr1000), + }, + emptyBoardsConfig(), + { + ...history(mkr1000SerialPort, uno), + } + ); + const item = items[0]; + const expectedEditParams: EditBoardsConfigActionParams = { + query: uno.name, + portToSelect: mkr1000SerialPort, + }; + const expectedRevertParams: SelectBoardsConfigActionParams = { + selectedBoard: mkr1000, + selectedPort: item.port, + }; + expect(item.otherActions).to.be.deep.equal({ + edit: { + params: expectedEditParams, + type: 'edit-boards-config', + }, + revert: { + params: expectedRevertParams, + type: 'select-boards-config', + }, + }); + }); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/common/boards-service.test.ts b/arduino-ide-extension/src/test/common/boards-service.test.ts index 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 = <AttachedBoardsChangeEvent & any>{ - oldState: { - boards: [ - { - name: 'Arduino MKR1000', - fqbn: 'arduino:samd:mkr1000', - port: '/dev/cu.usbmodem14601', - }, - { - name: 'Arduino Uno', - fqbn: 'arduino:avr:uno', - port: '/dev/cu.usbmodem14501', - }, - ], - ports: [ - { - protocol: 'serial', - address: '/dev/cu.usbmodem14501', - }, - { - protocol: 'serial', - address: '/dev/cu.usbmodem14601', - }, - { - protocol: 'serial', - address: '/dev/cu.Bluetooth-Incoming-Port', - }, - { protocol: 'serial', address: '/dev/cu.MALS' }, - { protocol: 'serial', address: '/dev/cu.SOC' }, - ], - }, - 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 = <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 = <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 = <BoardInfo>info; expect(boardInfo.VID).to.be.equal(vid); @@ -187,7 +235,3 @@ describe('boards-service', () => { }); }); }); - -function never<T>(): Promise<T> { - return new Deferred<T>().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<void> { + if (arg2 instanceof Error) { + return this.error(String(arg2), params); + } + switch (logLevel) { + case LogLevel.INFO: + return this.info(arg2, params); + case LogLevel.WARN: + return this.warn(arg2, params); + case LogLevel.TRACE: + return this.trace(arg2, params); + case LogLevel.ERROR: + return this.error(arg2, params); + case LogLevel.FATAL: + return this.fatal(arg2, params); + default: + return this.info(arg2, params); + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override async info(arg: string | Loggable, ...params: any[]): Promise<void> { + if (params.length) { + console.info(arg, ...params); + } else { + console.info(arg); + } + } + + override async trace( + arg: string | Loggable, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + if (params.length) { + console.trace(arg, ...params); + } else { + console.trace(arg); + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override async warn(arg: string | Loggable, ...params: any[]): Promise<void> { + if (params.length) { + console.warn(arg, ...params); + } else { + console.warn(arg); + } + } + + override async error( + arg: string | Loggable, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + if (params.length) { + console.error(arg, ...params); + } else { + console.error(arg); + } + } + + override async fatal( + arg: string | Loggable, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...params: any[] + ): Promise<void> { + return this.error(arg, params); + } +} diff --git a/arduino-ide-extension/src/test/common/fixtures.ts b/arduino-ide-extension/src/test/common/fixtures.ts new file mode 100644 index 000000000..294984524 --- /dev/null +++ b/arduino-ide-extension/src/test/common/fixtures.ts @@ -0,0 +1,176 @@ +import { + BoardIdentifier, + DetectedPort, + DetectedPorts, + Port, +} from '../../common/protocol/boards-service'; + +export const mkr1000: BoardIdentifier = { + name: 'Arduino MKR1000', + fqbn: 'arduino:samd:mkr1000', +}; +export const uno: BoardIdentifier = { + name: 'Arduino Uno', + fqbn: 'arduino:avr:uno', +}; +export const arduinoNanoEsp32: BoardIdentifier = { + fqbn: 'arduino:esp32:nano_nora', + name: 'Arduino Nano ESP32', +}; +export const esp32NanoEsp32: BoardIdentifier = { + fqbn: 'esp32:esp32:nano_nora', + name: 'Arduino Nano ESP32', +}; +export const esp32S3DevModule: BoardIdentifier = { + name: 'ESP32S3 Dev Module', + fqbn: 'esp32:esp32:esp32s3', +}; +export const esp32S3Box: BoardIdentifier = { + name: 'ESP32-S3-Box', + fqbn: 'esp32:esp32:esp32s3box', +}; + +export const bluetoothSerialPort: Port = { + address: '/dev/cu.Bluetooth-Incoming-Port', + addressLabel: '/dev/cu.Bluetooth-Incoming-Port', + protocol: 'serial', + protocolLabel: 'Serial Port', + properties: {}, + hardwareId: '', +}; +export const builtinSerialPort: Port = { + address: '/dev/cu.BLTH', + addressLabel: '/dev/cu.BLTH', + protocol: 'serial', + protocolLabel: 'Serial Port', + properties: {}, + hardwareId: '', +}; +export const undiscoveredSerialPort: Port = { + address: '/dev/cu.usbserial-0001', + addressLabel: '/dev/cu.usbserial-0001', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0xEA60', + serialNumber: '0001', + vid: '0x10C4', + }, + hardwareId: '0001', +}; +export const mkr1000NetworkPort: Port = { + address: '192.168.0.104', + addressLabel: 'Arduino at 192.168.0.104', + protocol: 'network', + protocolLabel: 'Network Port', + properties: { + '.': 'mkr1000', + auth_upload: 'yes', + board: 'mkr1000', + hostname: 'Arduino.local.', + port: '65280', + ssh_upload: 'no', + tcp_check: 'no', + }, + hardwareId: '', +}; +export const undiscoveredUsbToUARTSerialPort: Port = { + address: '/dev/cu.SLAB_USBtoUART', + addressLabel: '/dev/cu.SLAB_USBtoUART', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0xEA60', + serialNumber: '0001', + vid: '0x10C4', + }, + hardwareId: '0001', +}; +export const mkr1000SerialPort: Port = { + address: '/dev/cu.usbmodem14301', + addressLabel: '/dev/cu.usbmodem14301', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x804E', + serialNumber: '94A3397C5150435437202020FF150838', + vid: '0x2341', + }, + hardwareId: '94A3397C5150435437202020FF150838', +}; +export const unoSerialPort: Port = { + address: '/dev/cu.usbmodem14201', + addressLabel: '/dev/cu.usbmodem14201', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x0043', + serialNumber: '75830303934351618212', + vid: '0x2341', + }, + hardwareId: '75830303934351618212', +}; +export const nanoEsp32SerialPort: Port = { + address: '/dev/cu.usbmodem3485187BD9882', + addressLabel: '/dev/cu.usbmodem3485187BD9882', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x0070', + serialNumber: '3485187BD988', + vid: '0x2341', + }, + hardwareId: '3485187BD988', +}; +export const nanoEsp32DetectsMultipleEsp32BoardsSerialPort: Port = { + address: 'COM41', + addressLabel: 'COM41', + protocol: 'serial', + protocolLabel: 'Serial Port (USB)', + properties: { + pid: '0x1001', + serialNumber: '', + vid: '0x303A', + }, +}; + +export function createPort(address: string, protocol = 'serial'): Port { + return { + address, + addressLabel: `Address label: ${address}`, + protocol, + protocolLabel: `Protocol label: ${protocol}`, + }; +} + +export function detectedPort( + port: Port, + ...boards: BoardIdentifier[] +): { [portKey: string]: DetectedPort } { + return { [Port.keyOf(port)]: boards.length ? { port, boards } : { port } }; +} + +export function history( + port: Port, + board: BoardIdentifier +): { [portKey: string]: BoardIdentifier } { + return { [Port.keyOf(port)]: board }; +} + +export const detectedPorts: DetectedPorts = { + ...detectedPort(builtinSerialPort), + ...detectedPort(bluetoothSerialPort), + ...detectedPort(unoSerialPort, uno), + ...detectedPort(mkr1000SerialPort, mkr1000), + ...detectedPort(mkr1000NetworkPort, mkr1000), + ...detectedPort(undiscoveredSerialPort), + ...detectedPort(undiscoveredUsbToUARTSerialPort), + // multiple discovered on the same port with different board names + ...detectedPort( + nanoEsp32DetectsMultipleEsp32BoardsSerialPort, + esp32S3DevModule, + esp32S3Box + ), + // multiple discovered on the same port with the same board name + ...detectedPort(nanoEsp32SerialPort, arduinoNanoEsp32, esp32NanoEsp32), +}; diff --git a/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/boards-service-impl.slow-test.ts index de243d2f6..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,7 +2,7 @@ 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 { createBaseContainer, startDaemon } from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; describe('boards-service-impl', () => { let boardService: BoardsService; diff --git a/arduino-ide-extension/src/test/node/clang-formatter.test.ts b/arduino-ide-extension/src/test/node/clang-formatter.test.ts index b8814a48d..10e5dc543 100644 --- a/arduino-ide-extension/src/test/node/clang-formatter.test.ts +++ b/arduino-ide-extension/src/test/node/clang-formatter.test.ts @@ -12,7 +12,7 @@ import { ClangFormatter, } from '../../node/clang-formatter'; import { spawnCommand } from '../../node/exec-util'; -import { createBaseContainer, startDaemon } from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; const unformattedContent = `void setup ( ) { pinMode(LED_BUILTIN, OUTPUT); } 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 index 8ce8670be..1bc09c929 100644 --- 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 @@ -3,6 +3,7 @@ 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'; @@ -23,7 +24,7 @@ import { createCliConfig, newTempConfigDirPath, startDaemon, -} from './test-bindings'; +} from './node-test-bindings'; const timeout = 5 * 60 * 1_000; // five minutes @@ -66,16 +67,11 @@ describe('core-client-provider', () => { const configDirPath = await prepareTestConfigDir(); deleteSync(join(configDirPath, 'data')); - const now = new Date().toISOString(); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { const { indexUpdateSummaryBeforeInit } = coreClientProvider; - const libUpdateTimestamp = indexUpdateSummaryBeforeInit['library']; - expect(libUpdateTimestamp).to.be.not.empty; - expect(libUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); - const platformUpdateTimestamp = indexUpdateSummaryBeforeInit['platform']; - expect(platformUpdateTimestamp).to.be.not.empty; - expect(platformUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; }); }); @@ -90,14 +86,11 @@ describe('core-client-provider', () => { ); deleteSync(primaryPackageIndexPath); - const now = new Date().toISOString(); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { const { indexUpdateSummaryBeforeInit } = coreClientProvider; - expect(indexUpdateSummaryBeforeInit['library']).to.be.undefined; - const platformUpdateTimestamp = indexUpdateSummaryBeforeInit['platform']; - expect(platformUpdateTimestamp).to.be.not.empty; - expect(platformUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; }); const rawJson = await fs.readFile(primaryPackageIndexPath, { encoding: 'utf8', @@ -149,14 +142,11 @@ describe('core-client-provider', () => { ); deleteSync(libraryPackageIndexPath); - const now = new Date().toISOString(); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { const { indexUpdateSummaryBeforeInit } = coreClientProvider; - const libUpdateTimestamp = indexUpdateSummaryBeforeInit['library']; - expect(libUpdateTimestamp).to.be.not.empty; - expect(libUpdateTimestamp.localeCompare(now)).to.be.greaterThan(0); - expect(indexUpdateSummaryBeforeInit['platform']).to.be.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; + expect(indexUpdateSummaryBeforeInit).to.be.empty; }); const rawJson = await fs.readFile(libraryPackageIndexPath, { encoding: 'utf8', @@ -191,20 +181,38 @@ describe('core-client-provider', () => { const container = await startCli(configDirPath, toDispose); await assertFunctionalCli( container, - async ({ coreClientProvider, boardsService, coreService }) => { + async ({ coreClientProvider, boardsService }) => { const { indexUpdateSummaryBeforeInit } = coreClientProvider; expect(indexUpdateSummaryBeforeInit).to.be.not.undefined; expect(indexUpdateSummaryBeforeInit).to.be.empty; - - // IDE2 cannot recover from a 3rd party package index issue. - // Only when the primary package or library index is corrupt. - // https://github.com/arduino/arduino-ide/issues/2021 - await coreService.updateIndex({ types: ['platform'] }); - 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 { @@ -277,7 +285,7 @@ async function prepareTestConfigDir( const params = { configDirPath: newTempConfigDirPath(), configOverrides }; const container = await createContainer(params); const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl); - const cliPath = await daemon.getExecPath(); + const cliPath = daemon.getExecPath(); const configDirUriProvider = container.get<ConfigDirUriProvider>(ConfigDirUriProvider); const configDirPath = FileUri.fsPath(configDirUriProvider.configDirUri()); 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 0a0fd253c..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 @@ -11,7 +11,7 @@ import { SketchesService, isCompileSummary, } from '../../common/protocol'; -import { createBaseContainer, startDaemon } from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; const testTimeout = 30_000; const setupTimeout = 5 * 60 * 1_000; // five minutes 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 index abba88357..ac419dd2d 100644 --- a/arduino-ide-extension/src/test/node/core-service-impl.test.ts +++ b/arduino-ide-extension/src/test/node/core-service-impl.test.ts @@ -1,5 +1,10 @@ import { expect } from 'chai'; -import { Port } from '../../node/cli-protocol/cc/arduino/cli/commands/v1/port_pb'; +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', () => { @@ -22,9 +27,18 @@ describe('core-service-impl', () => { protocolLabel: 'serial port', properties, } as const; - const actual = new CoreServiceImpl()['createPort'](port); + 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 Port() + const expected = new RpcPort() .setAddress(port.address) .setHardwareId(port.hardwareId) .setLabel(port.addressLabel) @@ -33,7 +47,7 @@ describe('core-service-impl', () => { Object.entries(properties).forEach(([key, value]) => expected.getPropertiesMap().set(key, value) ); - expect((<Port>actual).toObject(false)).to.be.deep.equal( + expect((<RpcPort>actual).toObject(false)).to.be.deep.equal( expected.toObject(false) ); }); 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 694b86d96..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,7 +2,7 @@ import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { LibrarySearch, LibraryService } from '../../common/protocol'; -import { createBaseContainer, startDaemon } from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; describe('library-service-impl', () => { let libraryService: LibraryService; 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 78% rename from arduino-ide-extension/src/test/node/test-bindings.ts rename to arduino-ide-extension/src/test/node/node-test-bindings.ts index 30d8513a9..2b4c651f7 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -1,18 +1,9 @@ -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 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'; @@ -23,19 +14,18 @@ import { interfaces, } from '@theia/core/shared/inversify'; import deepmerge from 'deepmerge'; -import { promises as fs, mkdirSync } from 'node:fs'; 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, @@ -52,7 +42,7 @@ import { import { ArduinoDaemonImpl } from '../../node/arduino-daemon-impl'; import { BoardDiscovery } from '../../node/board-discovery'; import { BoardsServiceImpl } from '../../node/boards-service-impl'; -import { CLI_CONFIG, CliConfig, DefaultCliConfig } from '../../node/cli-config'; +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'; @@ -70,87 +60,10 @@ import { ConfigDirUriProvider, EnvVariablesServer, } from '../../node/theia/env-variables/env-variables-server'; +import { bindCommon } from '../common/common-test-bindings'; const tracked = track(); -@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<void> { - if (arg2 instanceof Error) { - return this.error(String(arg2), params); - } - switch (logLevel) { - case LogLevel.INFO: - return this.info(arg2, params); - case LogLevel.WARN: - return this.warn(arg2, params); - case LogLevel.TRACE: - return this.trace(arg2, params); - case LogLevel.ERROR: - return this.error(arg2, params); - case LogLevel.FATAL: - return this.fatal(arg2, params); - default: - return this.info(arg2, params); - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - override async info(arg: string | Loggable, ...params: any[]): Promise<void> { - if (params.length) { - console.info(arg, ...params); - } else { - console.info(arg); - } - } - - override async trace( - arg: string | Loggable, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...params: any[] - ): Promise<void> { - if (params.length) { - console.trace(arg, ...params); - } else { - console.trace(arg); - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - override async warn(arg: string | Loggable, ...params: any[]): Promise<void> { - if (params.length) { - console.warn(arg, ...params); - } else { - console.warn(arg); - } - } - - override async error( - arg: string | Loggable, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...params: any[] - ): Promise<void> { - if (params.length) { - console.error(arg, ...params); - } else { - console.error(arg); - } - } - - override async fatal( - arg: string | Loggable, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...params: any[] - ): Promise<void> { - return this.error(arg, params); - } -} - @injectable() class SilentArduinoDaemon extends ArduinoDaemonImpl { protected override onData(): void { @@ -160,7 +73,7 @@ class SilentArduinoDaemon extends ArduinoDaemonImpl { @injectable() class TestBoardDiscovery extends BoardDiscovery { - mutableAvailablePorts: AvailablePorts = {}; + mutableDetectedPorts: DetectedPorts = {}; override async start(): Promise<void> { // NOOP @@ -168,8 +81,8 @@ class TestBoardDiscovery extends BoardDiscovery { override async stop(): Promise<void> { // NOOP } - override get availablePorts(): AvailablePorts { - return this.mutableAvailablePorts; + override get detectedPorts(): DetectedPorts { + return this.mutableDetectedPorts; } } @@ -221,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 { @@ -309,6 +222,7 @@ export async function createBaseContainer( } 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); @@ -336,15 +250,10 @@ export async function createBaseContainer( 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(CommandRegistry).toSelf().inSingletonScope(); - bind(CommandService).toService(CommandRegistry); - bindContributionProvider(bind, CommandContribution); bind(TestBoardDiscovery).toSelf().inSingletonScope(); bind(BoardDiscovery).toService(TestBoardDiscovery); bind(IsTempSketch).toSelf().inSingletonScope(); 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 908bc827d..082a7474d 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 @@ -12,7 +12,7 @@ import { sync as rimrafSync } from 'rimraf'; import { Sketch, SketchesService } from '../../common/protocol'; import { SketchesServiceImpl } from '../../node/sketches-service-impl'; import { ErrnoException } from '../../node/utils/errors'; -import { createBaseContainer, startDaemon } from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; const testTimeout = 10_000; diff --git a/i18n/en.json b/i18n/en.json index 9a5b38eda..4fa5c1cff 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" }, From 5a76be306a125a7fccd32a092646bbd7aabfaaa3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 20:02:43 +0000 Subject: [PATCH 224/384] build(deps): Bump svenstaro/upload-release-action from 2.6.1 to 2.7.0 Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.6.1 to 2.7.0. - [Release notes](https://github.com/svenstaro/upload-release-action/releases) - [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenstaro/upload-release-action/compare/2.6.1...2.7.0) --- updated-dependencies: - dependency-name: svenstaro/upload-release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 00b49cf53..c5977a986 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -276,7 +276,7 @@ jobs: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] - uses: svenstaro/upload-release-action@2.6.1 + uses: svenstaro/upload-release-action@2.7.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} From db01efead3d131951ccb09bfc4b365406218ea9f Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Sat, 19 Aug 2023 12:36:43 +0200 Subject: [PATCH 225/384] fix: expand boards if available on detected port moved the board inference logic from UI to model Closes #2175 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../certificate-uploader-component.tsx | 17 +-- .../select-board-components.tsx | 22 +--- .../firmware-uploader-component.tsx | 24 ++-- .../src/common/protocol/board-list.ts | 31 +++-- .../src/test/common/board-list.test.ts | 124 ++++++++++++++++++ 5 files changed, 166 insertions(+), 52 deletions(-) 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 21f8f2406..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,10 +1,7 @@ import { nls } from '@theia/core/lib/common/nls'; import React from '@theia/core/shared/react'; import Tippy from '@tippyjs/react'; -import { - BoardList, - isInferredBoardListItem, -} from '../../../common/protocol/board-list'; +import type { BoardList } from '../../../common/protocol/board-list'; import { boardIdentifierEquals, portIdentifierEquals, @@ -50,9 +47,7 @@ export const CertificateUploaderComponent = ({ if (!selectedItem) { return; } - const board = isInferredBoardListItem(selectedItem) - ? selectedItem.inferredBoard - : selectedItem.board; + const board = selectedItem.board; if (!board.fqbn) { return; } @@ -76,13 +71,9 @@ export const CertificateUploaderComponent = ({ if (!item) { return; } - const board = isInferredBoardListItem(item) - ? item.inferredBoard - : item.board; - const selectedBoard = isInferredBoardListItem(selectedItem) - ? selectedItem.inferredBoard - : selectedItem?.board; + const board = item.board; const port = item.port; + const selectedBoard = selectedItem?.board; const selectedPort = selectedItem?.port; if ( 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 49aa5617d..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,14 +1,12 @@ import { nls } from '@theia/core/lib/common'; import React from '@theia/core/shared/react'; -import { +import type { BoardList, BoardListItemWithBoard, - InferredBoardListItem, - isInferredBoardListItem, } from '../../../common/protocol/board-list'; import { ArduinoSelect } from '../../widgets/arduino-select'; -export type BoardOptionValue = BoardListItemWithBoard | InferredBoardListItem; +export type BoardOptionValue = BoardListItemWithBoard; type BoardOption = { value: BoardOptionValue | undefined; label: string }; export const SelectBoardComponent = ({ @@ -46,9 +44,7 @@ export const SelectBoardComponent = ({ 'Select a board...' ); const updatableBoards = boardList.boards.filter((item) => { - const fqbn = ( - isInferredBoardListItem(item) ? item.inferredBoard : item.board - ).fqbn; + const fqbn = item.board.fqbn; return fqbn && updatableFqbns.includes(fqbn); }); let selBoard = -1; @@ -57,15 +53,12 @@ export const SelectBoardComponent = ({ if (selectedItem === item) { selBoard = i; } - const board = isInferredBoardListItem(item) - ? item.inferredBoard - : item.board; return { label: nls.localize( 'arduino/certificate/boardAtPort', '{0} at {1}', - board.name, - item.port?.address ?? '' + item.board.name, + item.port.address ?? '' ), value: item, }; @@ -100,10 +93,7 @@ export const SelectBoardComponent = ({ label: nls.localize( 'arduino/certificate/boardAtPort', '{0} at {1}', - (isInferredBoardListItem(selectedItem) - ? selectedItem.inferredBoard - : selectedItem.board - ).name, + selectedItem.board.name, selectedItem.port.address ?? '' ), }) || diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx index 774645ae4..d7ba26803 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx @@ -9,10 +9,9 @@ import { ArduinoFirmwareUploader, FirmwareInfo, } from '../../../common/protocol/arduino-firmware-uploader'; -import { +import type { BoardList, BoardListItemWithBoard, - isInferredBoardListItem, } from '../../../common/protocol/board-list'; import { ArduinoSelect } from '../../widgets/arduino-select'; import { SelectBoardComponent } from '../certificate-uploader/select-board-components'; @@ -63,9 +62,7 @@ export const FirmwareUploaderComponent = ({ } // fetch the firmwares for the selected board - const board = isInferredBoardListItem(selectedItem) - ? selectedItem.inferredBoard - : selectedItem.board; + const board = selectedItem.board; const firmwaresForFqbn = await firmwareUploader.availableFirmwares( board.fqbn || '' ); @@ -89,11 +86,14 @@ export const FirmwareUploaderComponent = ({ (firmware) => firmware.firmware_version === selectedFirmware?.value ); + const selectedBoard = selectedItem?.board; + const selectedPort = selectedItem?.port; try { const installStatus = - !!firmwareToFlash && - !!selectedItem?.board && - (await flashFirmware(firmwareToFlash, selectedItem?.port)); + firmwareToFlash && + selectedBoard && + selectedPort && + (await flashFirmware(firmwareToFlash, selectedPort)); setInstallFeedback((installStatus && 'ok') || 'fail'); } catch { @@ -106,13 +106,9 @@ export const FirmwareUploaderComponent = ({ if (!item) { return; } - const board = isInferredBoardListItem(item) - ? item.inferredBoard - : item.board; - const selectedBoard = isInferredBoardListItem(selectedItem) - ? selectedItem.inferredBoard - : selectedItem?.board; + const board = item.board; const port = item.port; + const selectedBoard = selectedItem?.board; const selectedPort = selectedItem?.port; if ( diff --git a/arduino-ide-extension/src/common/protocol/board-list.ts b/arduino-ide-extension/src/common/protocol/board-list.ts index ee2c0448f..f17bf0600 100644 --- a/arduino-ide-extension/src/common/protocol/board-list.ts +++ b/arduino-ide-extension/src/common/protocol/board-list.ts @@ -362,9 +362,12 @@ export interface BoardList { readonly selectedIndex: number; /** - * Contains all boards recognized from the detected port, and an optional unrecognized one that is derived from the detected port and the `initParam#selectedBoard`. + * 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 | InferredBoardListItem)[]; + readonly boards: readonly BoardListItemWithBoard[]; /** * If `predicate` is not defined, no ports are filtered. @@ -511,17 +514,27 @@ function collectPorts( function collectBoards( items: readonly BoardListItem[] -): readonly (BoardListItemWithBoard | InferredBoardListItem)[] { - const boards: (BoardListItemWithBoard | InferredBoardListItem)[] = []; +): readonly BoardListItemWithBoard[] { + const result: BoardListItemWithBoard[] = []; for (let i = 0; i < items.length; i++) { + const boards: BoardListItemWithBoard[] = []; const item = items[i]; - if (isInferredBoardListItem(item)) { - boards.push(item); - } else if (item.board?.fqbn) { - boards.push(<Required<BoardListItem>>item); + 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 boards; + return result; } function findSelectedIndex( diff --git a/arduino-ide-extension/src/test/common/board-list.test.ts b/arduino-ide-extension/src/test/common/board-list.test.ts index a9c5248b9..fe02fa4a1 100644 --- a/arduino-ide-extension/src/test/common/board-list.test.ts +++ b/arduino-ide-extension/src/test/common/board-list.test.ts @@ -328,6 +328,130 @@ describe('board-list', () => { 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({ From 420d31ff4b3af4d31f8e18500c4d944dc6d34c75 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Sat, 19 Aug 2023 12:56:15 +0200 Subject: [PATCH 226/384] chore(cli): pin version to `0.34.0-rc.1` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 2dde27623..4c013b1d8 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -172,11 +172,7 @@ ], "arduino": { "arduino-cli": { - "version": { - "owner": "arduino", - "repo": "arduino-cli", - "commitish": "38479dc" - } + "version": "0.34.0-rc.1" }, "arduino-fwuploader": { "version": "2.3.0" From b25665561e3f39296e635f145988355453d06c19 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 18 Aug 2023 11:51:37 +0200 Subject: [PATCH 227/384] fix: handle `UNKNOWN` code on `syscall: 'stat'` Closes #2166 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/sketches-service-impl.ts | 3 +- .../src/node/utils/errors.ts | 24 ++++- .../node/sketches-service-impl.slow-test.ts | 102 +++++++++++++++++- 3 files changed, 125 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 95493bb19..0fe8a2158 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -677,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`. @@ -689,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/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/test/node/sketches-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/sketches-service-impl.slow-test.ts index 082a7474d..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 @@ -6,16 +6,116 @@ 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 { 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 { + 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; From 9a99957e73d1b9cbfa9a109cfb5ee821c454c6b9 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Sun, 20 Aug 2023 21:53:43 +0200 Subject: [PATCH 228/384] fix: incorrect certificate flashing command string (#2181) Use a `string` array of command flags instead of the concatenated final `string` command. Ref: arduino/arduino-ide#2067 Closes arduino/arduino-ide#2179 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/contributions/upload-certificate.ts | 13 ++++++------- .../common/protocol/arduino-firmware-uploader.ts | 13 +++++++++---- .../src/node/arduino-firmware-uploader-impl.ts | 14 ++++++++++++-- 3 files changed, 27 insertions(+), 13 deletions(-) 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/common/protocol/arduino-firmware-uploader.ts b/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts index 3cf9437d3..7e24afcb3 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-firmware-uploader.ts @@ -1,19 +1,24 @@ -import { Port } from "./boards-service"; +import type { Port } from './boards-service'; export const ArduinoFirmwareUploaderPath = '/services/arduino-firmware-uploader'; export const ArduinoFirmwareUploader = Symbol('ArduinoFirmwareUploader'); -export type FirmwareInfo = { +export interface FirmwareInfo { board_name: string; board_fqbn: string; module: string; firmware_version: string; Latest: boolean; -}; +} +export interface UploadCertificateParams { + readonly fqbn: string; + readonly address: string; + readonly urls: readonly string[]; +} export interface ArduinoFirmwareUploader { list(fqbn?: string): Promise<FirmwareInfo[]>; flash(firmware: FirmwareInfo, port: Port): Promise<string>; - uploadCertificates(command: string): Promise<any>; + uploadCertificates(params: UploadCertificateParams): Promise<unknown>; updatableBoards(): Promise<string[]>; availableFirmwares(fqbn: string): Promise<FirmwareInfo[]>; } diff --git a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts index d1c1d0cb5..5def6a74b 100644 --- a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts +++ b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts @@ -4,6 +4,7 @@ import type { Port } from '../common/protocol'; import { ArduinoFirmwareUploader, FirmwareInfo, + UploadCertificateParams, } from '../common/protocol/arduino-firmware-uploader'; import { spawnCommand } from './exec-util'; import { MonitorManager } from './monitor-manager'; @@ -17,8 +18,17 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { @inject(MonitorManager) private readonly monitorManager: MonitorManager; - async uploadCertificates(command: string): Promise<string> { - return await this.runCommand(['certificates', 'flash', command]); + async uploadCertificates(params: UploadCertificateParams): Promise<string> { + const { fqbn, address, urls } = params; + return await this.runCommand([ + 'certificates', + 'flash', + '-b', + fqbn, + '-a', + address, + ...urls.flatMap((url) => ['-u', url]), + ]); } async list(fqbn?: string): Promise<FirmwareInfo[]> { From 2aae9e0a07e2ae26d5330fdd7875c7d33001c889 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Sun, 20 Aug 2023 18:03:45 +0200 Subject: [PATCH 229/384] fix: execute the Arduino CLI without a `shell` Closes arduino/arduino-ide#2112 Ref: arduino/arduino-ide#2067 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/src/node/arduino-daemon-impl.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index d2fe7d81b..b7af78627 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -173,10 +173,9 @@ export class ArduinoDaemonImpl const cliPath = this.getExecPath(); const ready = new Deferred<{ daemon: ChildProcess; port: string }>(); const options = { - shell: true, env: { ...deepClone(process.env), NO_COLOR: String(true) }, }; - const daemon = spawn(`"${cliPath}"`, args, options); + 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. From 57fa18b94060cadca80e0687eed674bd0042da8c Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Sun, 20 Aug 2023 18:09:48 +0200 Subject: [PATCH 230/384] fix: do not start obsolete daemon watcher process Before arduino/arduino-cli#488, IDE2 required a way to stop the daemon process if the parent (backend) process crashed. However, this mechanism is no longer necessary as the CLI daemon process is not actually a true daemon process. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/arduino-daemon-impl.ts | 17 -------------- .../src/node/daemon-watcher.ts | 22 ------------------- 2 files changed, 39 deletions(-) delete mode 100644 arduino-ide-extension/src/node/daemon-watcher.ts diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index b7af78627..16db90631 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -10,7 +10,6 @@ import { } from '@theia/core/lib/common/disposable'; import { Event, Emitter } from '@theia/core/lib/common/event'; import { deepClone } from '@theia/core/lib/common/objects'; -import { environment } from '@theia/application-package/lib/environment'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; import { ArduinoDaemon, NotificationServiceServer } from '../common/protocol'; @@ -71,22 +70,6 @@ export class ArduinoDaemonImpl 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(() => { if (daemon.pid) { 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 842a4e2f2..000000000 --- a/arduino-ide-extension/src/node/daemon-watcher.ts +++ /dev/null @@ -1,22 +0,0 @@ -import psTree from 'ps-tree'; -import kill from '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) { - const parsedPid = Number.parseInt(PID, 10); - if (!Number.isNaN(parsedPid)) { - kill(parsedPid); - } - } - kill(daemonPid, () => process.exit()); - }); - } -}, 1000); From ea91904f00c78f16d552bee3f7d24d9426f67041 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Fri, 18 Aug 2023 21:00:59 -0700 Subject: [PATCH 231/384] Do full run of "Arduino IDE" workflow on tag push The project was recently switched to using a "trunk-based" development strategy. This necessitated some adjustments to the configuration of the GitHub Actions workflows in order to ensure the CI system could be used to effectively validate the project at the state staged for release in the release branch. A `run-determination` job was added to the workflow. This job determines whether the conditions under which the workflow was triggered indicate that the rest of the jobs in the workflow should be run. A validation workflow should run fully under any of the following conditions: - The trigger event was something other than a branch creation - The trigger event was a release branch creation Since the project is fully validated prior to a release, running the workflow when triggered by a release tag is pointless (and even harmful in some specific standardized workflows not currently used in this repository), so (even if for no other reason than efficiency) verification workflows are configured to not run under these conditions. The standardized Arduino tooling workflows follow a modular design where each workflow has a narrow scope of purpose. That path was not taken by those who set up the infrastructure for this repository. They instead created a single massive monolithic "Arduino IDE" workflow that performs many unrelated operations under various conditions. This workflow generates releases in addition to doing validation. Even though it is pointless to run the workflow's validation operations when the workflow is triggered by a release tag, it is essential to run it for the release generation. Previously, the code used in the "Arduino IDE" workflow's `run-determination` job was configured as appropriate for a verification workflow. This meant that a release would not be generated on push of a release tag as intended. The bug is fixed by adjusting the code to do a full run of the workflow when triggered by a release tag. --- .github/workflows/build.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5977a986..1c830648d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,12 +46,10 @@ jobs: 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 + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX ]]; then # Run the other jobs. RESULT="true" From 10b38820bcc91e3f88effe55bc63575060dcfb87 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Fri, 18 Aug 2023 12:34:28 -0700 Subject: [PATCH 232/384] Generalize name of "Firmware Updater" Some Arduino boards have a supplemental hardware module that provides functionality separate from the primary microcontroller the sketch program runs on. Enhancements or fixes to the firmware that runs on these supplemental modules may be made over time so it is important for the users of these boards to have an easy way to update the firmware. Arduino IDE provides a tool for doing this. At the time the tool was created, the poor choice was made to include the names of the specific modules it supported at the time in the tool's name. As was inevitable, that list has changed, rendering the tool name no longer accurate. The immediate problem is that support has been added for updating the "bridge" and radio module on the UNO R4 WiFi. That module is neither a "WiFi101" nor a "NINA", so the tool name does not reflect the support for the UNO R4 WiFi. More significant changes in the supported modules are under way and will be introduced in the next release: - Dropping support for the "WiFi101" module - Adding support for the module on the Portenta C33 board Rather than attempting to maintain a regularly changing and overly verbose name that includes the list of every supported module, it is better to use a name for the tool that only describes its general purpose, leaving the task of describing the specific supported modules to the documentation. --- .../src/browser/contributions/upload-firmware.ts | 2 +- i18n/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/i18n/en.json b/i18n/en.json index 4fa5c1cff..91b37f6a1 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -250,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", From 5fd02b9fd7d20d7d71c12c6935c309f978c757c6 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 21 Aug 2023 13:03:33 +0200 Subject: [PATCH 233/384] fix: falsy context menu `handlerId` The very first context menu item with ID `0` has not had a click handler Ref: eclipse-theia/theia#12500 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../arduino-electron-main-module.ts | 6 +++ .../src/electron-main/theia/theia-api-main.ts | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 arduino-ide-extension/src/electron-main/theia/theia-api-main.ts 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 b1a1bfd10..e02635423 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,6 +1,7 @@ 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, @@ -17,6 +18,7 @@ import { ElectronArduino } from './electron-arduino'; import { IDEUpdaterImpl } from './ide-updater/ide-updater-impl'; import { ElectronMainApplication } from './theia/electron-main-application'; import { ElectronMainWindowServiceImpl } from './theia/electron-main-window-service'; +import { TheiaMainApiFixFalsyHandlerId } from './theia/theia-api-main'; import { TheiaElectronWindow } from './theia/theia-electron-window'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -52,4 +54,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronArduino).toSelf().inSingletonScope(); bind(ElectronMainApplicationContribution).toService(ElectronArduino); + + // eclipse-theia/theia#12500 + bind(TheiaMainApiFixFalsyHandlerId).toSelf().inSingletonScope(); + rebind(TheiaMainApi).toService(TheiaMainApiFixFalsyHandlerId); }); 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; + }); + } +} From ea2c54bff0019485513dd599644cd756c82bd4fa Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 22 Aug 2023 13:27:00 +0200 Subject: [PATCH 234/384] chore(deps): Use `arduino-fwuploader@2.4.0` Ref: arduino/arduino-fwuploader#211 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 4c013b1d8..d502c5d59 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -175,7 +175,7 @@ "version": "0.34.0-rc.1" }, "arduino-fwuploader": { - "version": "2.3.0" + "version": "2.4.0" }, "arduino-language-server": { "version": "0.7.4" From b723951d78e61e7fed98848326ac6ece0138af89 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 23 Aug 2023 09:42:53 +0200 Subject: [PATCH 235/384] chore(deps): Use `arduino-cli@0.34.0` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index d502c5d59..3131cfb50 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -172,7 +172,7 @@ ], "arduino": { "arduino-cli": { - "version": "0.34.0-rc.1" + "version": "0.34.0" }, "arduino-fwuploader": { "version": "2.4.0" From e03e5eb6036c2d91400f81af0792dc0428e9a842 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 24 Aug 2023 12:37:27 +0200 Subject: [PATCH 236/384] chore: bump the version to `2.2.0` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3131cfb50..eccac3c59 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.1.2", + "version": "2.2.0", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 3803fecbb..f7a0993ba 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.1.2", + "version": "2.2.0", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.39.0", "@theia/terminal": "1.39.0", "@theia/workspace": "1.39.0", - "arduino-ide-extension": "2.1.2" + "arduino-ide-extension": "2.2.0" }, "devDependencies": { "@theia/cli": "1.39.0", diff --git a/package.json b/package.json index 3d07690f0..61113c1ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.1.2", + "version": "2.2.0", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From e08439b6a489f0c7cc9dc9f9b26eb6b316cc1bbd Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Thu, 24 Aug 2023 17:04:58 +0200 Subject: [PATCH 237/384] fix: missing app icon for AppImage on Linux (#2190) Closes #131 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../arduino-electron-main-module.ts | 5 +++ .../src/electron-main/fix-app-image-icon.ts | 31 +++++++++++++++++++ electron-app/package.json | 1 + 3 files changed, 37 insertions(+) create mode 100644 arduino-ide-extension/src/electron-main/fix-app-image-icon.ts 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 e02635423..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 @@ -15,6 +15,7 @@ import { } from '../common/protocol/ide-updater'; 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'; @@ -58,4 +59,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // 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/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/electron-app/package.json b/electron-app/package.json index f7a0993ba..25bfbdd26 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -119,6 +119,7 @@ "arduino-ide-electron-main.js", "src-gen", "lib", + "resources/icons/512x512.png", "!**node_modules/**" ], "extraResources": [ From e5b5b2a4be0d13bf89286eb1e7a22cb8ba9b55aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 02:09:43 +0000 Subject: [PATCH 238/384] Updated translation files --- i18n/af.json | 30 ++- i18n/ar.json | 298 ++++++++++++------------ i18n/az.json | 30 ++- i18n/bg.json | 30 ++- i18n/bn.json | 538 -------------------------------------------- i18n/ca.json | 350 ----------------------------- i18n/ca_ES.json | 56 ++--- i18n/cs.json | 30 ++- i18n/da.json | 538 -------------------------------------------- i18n/de.json | 82 +++---- i18n/el.json | 30 ++- i18n/es.json | 30 ++- i18n/eu.json | 30 ++- i18n/fa.json | 30 ++- i18n/fil.json | 30 ++- i18n/fr.json | 30 ++- i18n/he.json | 30 ++- i18n/hi.json | 538 -------------------------------------------- i18n/hu.json | 30 ++- i18n/hy.json | 352 ----------------------------- i18n/id.json | 172 +++++++------- i18n/it.json | 34 +-- i18n/ja.json | 30 ++- i18n/ko.json | 46 ++-- i18n/my.json | 380 ------------------------------- i18n/my_MM.json | 30 ++- i18n/ne.json | 64 +++--- i18n/nl.json | 30 ++- i18n/no_NO.json | 352 ----------------------------- i18n/pl.json | 30 ++- i18n/pt.json | 54 +++-- i18n/ro.json | 30 ++- i18n/ru.json | 30 ++- i18n/sl.json | 538 -------------------------------------------- i18n/sq.json | 350 ----------------------------- i18n/sr.json | 30 ++- i18n/sv.json | 538 -------------------------------------------- i18n/sv_SE.json | 334 --------------------------- i18n/ta.json | 350 ----------------------------- i18n/th.json | 126 ++++++----- i18n/tr.json | 30 ++- i18n/uk.json | 80 ++++--- i18n/uk_UA.json | 334 --------------------------- i18n/uz.json | 380 ------------------------------- i18n/vi.json | 118 +++++----- i18n/zh-Hant.json | 512 ++++++++++++++++++++--------------------- i18n/zh.json | 44 ++-- i18n/zh_TW.json | 562 +++++++++++++++++++++++----------------------- 48 files changed, 1526 insertions(+), 7194 deletions(-) delete mode 100644 i18n/bn.json delete mode 100644 i18n/ca.json delete mode 100644 i18n/da.json delete mode 100644 i18n/hi.json delete mode 100644 i18n/hy.json delete mode 100644 i18n/my.json delete mode 100644 i18n/no_NO.json delete mode 100644 i18n/sl.json delete mode 100644 i18n/sq.json delete mode 100644 i18n/sv.json delete mode 100644 i18n/sv_SE.json delete mode 100644 i18n/ta.json delete mode 100644 i18n/uk_UA.json delete mode 100644 i18n/uz.json 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 <Keyboard.h>' ؟", @@ -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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.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 <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc", - "privacyPolicy": "Privacy Policy" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware successfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.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/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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "choose": "Choose", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "manualProxy": "Manual proxy configuration", - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noProxy": "No proxy", - "showVerbose": "Show verbose output during", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.verbose": "True for verbose upload output. False by default.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", - "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds...", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}." - }, - "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "upload": { - "error": "{0} error: {1}" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, - "theia": { - "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "collapse": "Collapse", - "expand": "Expand" - }, - "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", - "newFileName": "New name for file", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - } -} diff --git a/i18n/id.json b/i18n/id.json 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 <b>{0}:{1}</b> necessita altre dipendenze che attualmente non sono installate:", "needsOneDependency": "La libreria <b>{0}:{1}</b> necessita di dipendenze che attualmente non sono installate:", @@ -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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "account": "Account", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", - "embed": "Embed:", - "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "menu": { - "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "choose": "Choose", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "manualProxy": "Manual proxy configuration", - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noProxy": "No proxy", - "showVerbose": "Show verbose output during", - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.verbose": "True for verbose upload output. False by default.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity." - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", - "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds...", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}." - }, - "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "Are you sure you want to close the sketch?", - "configureAndUpload": "Configure And Upload", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "exportBinary": "Export Compiled Binary", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "saveFolderAs": "Save sketch folder as...", - "saveSketchAs": "Save sketch folder as...", - "saveTempSketch": "Save your sketch to open it again later.", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" - }, - "upload": { - "error": "{0} error: {1}" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - }, - "theia": { - "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "quitMessage": "Any unsaved changes will not be saved.", - "quitTitle": "Are you sure you want to quit?" - }, - "debug": { - "start": "Start...", - "startError": "There was an error starting the debug session, check the logs for more details.", - "typeNotSupported": "The debug session type \"{0}\" is not supported." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "collapse": "Collapse", - "expand": "Expand" - }, - "workspace": { - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "fileNewName": "Name for new file", - "invalidExtension": ".{0} is not a valid extension", - "invalidFilename": "Invalid filename.", - "newFileName": "New name for file", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - } -} diff --git a/i18n/pl.json b/i18n/pl.json index 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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.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 <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc", - "privacyPolicy": "Privacy Policy" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware successfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/sr.json b/i18n/sr.json index 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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.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 <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named as \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware succesfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}'", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/ta.json b/i18n/ta.json deleted file mode 100644 index 1ebc51e5d..000000000 --- a/i18n/ta.json +++ /dev/null @@ -1,350 +0,0 @@ -{ - "arduino": { - "common": { - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "noBoardSelected": "No board selected", - "selectedOn": "on {0}", - "notConnected": "[not connected]", - "serialMonitor": "Serial Monitor", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "later": "Later", - "selectBoard": "Select Board", - "unknown": "Unknown", - "processing": "Processing", - "saveChangesToSketch": "Do you want to save changes to this sketch before closing?", - "loseChanges": "If you don't save, your changes will be lost." - }, - "ide-updater": { - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "notNowButton": "Not now", - "versionDownloaded": "Arduino IDE {0} has been downloaded.", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "closeAndInstallButton": "Close and Install", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "updateAvailable": "Update Available", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "skipVersionButton": "Skip Version", - "downloadButton": "Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "goToDownloadButton": "Go To Download", - "ideUpdaterDialog": "Software Update", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE" - }, - "menu": { - "sketch": "Sketch", - "tools": "Tools" - }, - "debug": { - "optimizeForDebugging": "Optimize for Debugging", - "debugWithMessage": "Debug - {0}", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "debuggingNotSupported": "Debugging is not supported by '{0}'" - }, - "preferences": { - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "upload.verbose": "True for verbose upload output. False by default.", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": "Adjust the zoom level of the window. The original size is 0 and each increment above (e.g. 1) or below (e.g. -1) represents zooming 20% larger or smaller. You can also enter decimals to adjust the zoom level with a finer granularity.", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "board.certificates": "List of certificates that can be uploaded to boards", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEnpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.audience": "The OAuth2 audience.", - "auth.registerUri": "The URI used to register a new user.", - "network": "Network", - "sketchbook.location": "Sketchbook location", - "browse": "Browse", - "files.inside.sketches": "Show files inside Sketches", - "editorFontSize": "Editor font size", - "interfaceScale": "Interface scale", - "showVerbose": "Show verbose output during", - "compilerWarnings": "Compiler warnings", - "automatic": "Automatic", - "compile": "compile", - "upload": "upload", - "verifyAfterUpload": "Verify code after upload", - "editorQuickSuggestions": "Editor Quick Suggestions", - "additionalManagerURLs": "Additional Boards Manager URLs", - "noProxy": "No proxy", - "manualProxy": "Manual proxy configuration", - "newSketchbookLocation": "Select new sketchbook location", - "choose": "Choose", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.theme": "Invalid theme." - }, - "cloud": { - "signIn": "SIGN IN", - "signOut": "Sign Out", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "privateVisibility": "Private. Only you can view the Sketch.", - "publicVisibility": "Public. Anyone with the link can view the Sketch.", - "link": "Link:", - "embed": "Embed:", - "cloudSketchbook": "Cloud Sketchbook", - "shareSketch": "Share Sketch", - "showHideRemoveSketchbook": "Show/Hide Remote Sketchbook", - "pullSketch": "Pull Sketch", - "openInCloudEditor": "Open in Cloud Editor", - "options": "Options...", - "share": "Share...", - "remote": "Remote", - "emptySketchbook": "Your Sketchbook is empty", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches.", - "signInToCloud": "Sign in to Arduino Cloud", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "learnMore": "Learn more", - "continue": "Continue", - "pushSketch": "Push Sketch", - "pushSketchMsg": "This is a Public Sketch. Before pushing, make sure any sensitive information is defined in arduino_secrets.h files. You can make a Sketch private from the Share panel.", - "pull": "Pull", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", - "donePulling": "Done pulling ‘{0}’.", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", - "push": "Push", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "donePushing": "Done pushing ‘{0}’.", - "connected": "Connected", - "offline": "Offline", - "profilePicture": "Profile picture" - }, - "board": { - "installManually": "Install Manually", - "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", - "configDialogTitle": "Select Other Board & Port", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "programmer": "Programmer", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "reselectLater": "Reselect later", - "noneSelected": "No boards selected.", - "noPortsSelected": "No ports selected for board: '{0}'.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "openBoardsConfig": "Select other board and port…", - "boardListItem": "{0} at {1}", - "selectBoardForInfo": "Please select a board to obtain board info.", - "platformMissing": "The platform for the selected '{0}' board is not installed.", - "selectPortForInfo": "Please select a port to obtain board info.", - "boardInfo": "Board Info", - "board": "Board{0}", - "port": "Port{0}", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)" - }, - "boardsManager": "Boards Manager", - "about": { - "label": "About {0}", - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}" - }, - "contributions": { - "addFile": "Add File", - "replaceTitle": "Replace", - "fileAdded": "One file added to the sketch." - }, - "replaceMsg": "Replace the existing version of {0}?", - "library": { - "addZip": "Add .ZIP Library...", - "zipLibrary": "Library", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "include": "Include Library", - "manageLibraries": "Manage Libraries...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "title": "Library Manager", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc", - "privacyPolicy": "Privacy Policy" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware successfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}')", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/th.json b/i18n/th.json 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 <Keyboard.h>'?", @@ -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 <b>{0}:{1}</b> needs another dependency currently not installed:", "overwriteExistingLibrary": "Do you want to overwrite the existing library?", "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", + "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 <b>{0}:{1}</b> needs another dependency currently not installed:", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "dependenciesForLibrary": "Dependencies for library {0}:{1}", - "installAll": "Install all", - "installOnly": "Install {0} only", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}" - }, - "selectZip": "Select a zip file containing the library you'd like to add", - "sketch": { - "archiveSketch": "Archive Sketch", - "saveSketchAs": "Save sketch folder as...", - "createdArchive": "Created archive '{0}'.", - "new": "New", - "openRecent": "Open Recent", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named as \"{1}\".\nCreate this folder, move the file, and continue?", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "saveFolderAs": "Save sketch folder as...", - "sketchbook": "Sketchbook", - "upload": "Upload", - "uploadUsingProgrammer": "Upload Using Programmer", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "doneUploading": "Done uploading.", - "configureAndUpload": "Configure And Upload", - "verifyOrCompile": "Verify/Compile", - "exportBinary": "Export Compiled Binary", - "verify": "Verify", - "doneCompiling": "Done compiling.", - "couldNotConnectToSerial": "Could not reconnect to serial port. {0}", - "openSketchInNewWindow": "Open Sketch in New Window", - "openFolder": "Open Folder", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "close": "Are you sure you want to close the sketch?" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "doneBurningBootloader": "Done burning bootloader." - }, - "editor": { - "copyForForum": "Copy for Forum (Markdown)", - "commentUncomment": "Comment/Uncomment", - "increaseIndent": "Increase Indent", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "decreaseFontSize": "Decrease Font Size", - "autoFormat": "Auto Format" - }, - "examples": { - "menu": "Examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "builtInExamples": "Built-in examples", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board" - }, - "help": { - "search": "Search on Arduino.cc", - "keyword": "Type a keyword", - "gettingStarted": "Getting Started", - "environment": "Environment", - "troubleshooting": "Troubleshooting", - "reference": "Reference", - "findInReference": "Find in Reference", - "faq": "Frequently Asked Questions", - "visit": "Visit Arduino.cc" - }, - "certificate": { - "uploadRootCertificates": "Upload SSL Root Certificates", - "openContext": "Open context", - "remove": "Remove", - "upload": "Upload", - "addURL": "Add URL to fetch SSL certificate", - "enterURL": "Enter URL", - "selectCertificateToUpload": "1. Select certificate to upload", - "addNew": "Add New", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "uploadingCertificates": "Uploading certificates.", - "certificatesUploaded": "Certificates uploaded.", - "uploadFailed": "Upload failed. Please try again.", - "selectBoard": "Select a board...", - "boardAtPort": "{0} at {1}", - "noSupportedBoardConnected": "No supported board connected" - }, - "firmware": { - "updater": "WiFi101 / WiFiNINA Firmware Updater", - "selectBoard": "Select Board", - "checkUpdates": "Check Updates", - "selectVersion": "Select firmware version", - "install": "Install", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "installingFirmware": "Installing firmware.", - "successfullyInstalled": "Firmware succesfully installed.", - "failedInstall": "Installation failed. Please try again." - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "userFields": { - "cancel": "Cancel", - "upload": "Upload" - }, - "serial": { - "toggleTimestamp": "Toggle Timestamp", - "autoscroll": "Autoscroll", - "timestamp": "Timestamp", - "noLineEndings": "No Line Ending", - "newLine": "New Line", - "carriageReturn": "Carriage Return", - "newLineCarriageReturn": "Both NL & CR", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "message": "Message ({0} + Enter to send message to '{1}' on '{2}'", - "connectionBusy": "Connection failed. Serial port is busy: {0}", - "disconnected": "Disconnected {0} from {1}.", - "unexpectedError": "Unexpected error. Reconnecting {0} on port {1}.", - "failedReconnect": "Failed to reconnect {0} to serial port after 10 consecutive attempts. The {1} serial port is busy.", - "reconnect": "Reconnecting {0} to {1} in {2} seconds..." - }, - "component": { - "uninstall": "Uninstall", - "uninstallMsg": "Do you want to uninstall {0}?", - "by": "by", - "version": "Version {0}", - "moreInfo": "More info", - "install": "INSTALL", - "filterSearch": "Filter your search..." - }, - "electron": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "unsavedChanges": "Any unsaved changes will not be saved." - }, - "compile": { - "error": "Compilation error: {0}" - }, - "upload": { - "error": "{0} error: {1}" - }, - "burnBootloader": { - "error": "Error while burning the bootloader: {0}" - } - }, - "theia": { - "core": { - "couldNotSave": "Could not save the sketch. Please copy your unsaved work into your favorite text editor, and restart the IDE.", - "offline": "Offline", - "daemonOffline": "CLI Daemon Offline", - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon." - }, - "debug": { - "start": "Start...", - "typeNotSupported": "The debug session type \"{0}\" is not supported.", - "startError": "There was an error starting the debug session, check the logs for more details." - }, - "editor": { - "unsavedTitle": "Unsaved – {0}" - }, - "messages": { - "expand": "Expand", - "collapse": "Collapse" - }, - "workspace": { - "fileNewName": "Name for new file", - "invalidFilename": "Invalid filename.", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file", - "deleteCurrentSketch": "Do you want to delete the current sketch?", - "sketchDirectoryError": "There was an error creating the sketch directory. See the log for more details. The application will probably not work as expected." - } - }, - "cloud": { - "GoToCloud": "GO TO CLOUD" - } -} diff --git a/i18n/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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "account": "Account", - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling ‘{0}’.", - "donePushing": "Done pushing ‘{0}’.", - "embed": "Embed:", - "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "menu": { - "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 <Keyboard.h>'?", @@ -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 <Keyboard.h>'?", - "mouseError": "找不到 'Mouse', 請檢查草稿碼中是否有 '#include <Mouse.h>'?" + "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include <Keyboard.h>'。", + "mouseError": "找不到 'Mouse',請檢查是否缺少 '#include <Mouse.h>'。" }, "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": "函式庫<b>{0}:{1}</b>需要以下未安装的相依元件:", - "needsOneDependency": "函式庫<b>{0}:{1}</b>需要另一個未安装的相依元件:", - "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": "程式庫<b>{0}:{1}</b>需要下列未安裝的相依程式:", + "needsOneDependency": "程式庫<b>{0}:{1}</b>需要其他未安装的相依程式:", + "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 <Keyboard.h>'。", - "mouseError": "找不到 'Mouse',請檢查項目是否包含 '#include <Mouse.h>'。" + "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include <Keyboard.h>'。", + "mouseError": "找不到 'Mouse',請檢查是否缺少 '#include <Mouse.h>'。" }, "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": "函式庫<b>{0}:{1}</b>需要一些未安装的附屬程式:", - "needsOneDependency": "函式庫<b>{0}:{1}</b>需要一些未安装的附屬程式:", - "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": "程式庫<b>{0}:{1}</b>需要下列未安裝的相依程式:", + "needsOneDependency": "程式庫<b>{0}:{1}</b>需要其他未安装的相依程式:", + "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": "新檔案名稱" } } } From 8d2808893cb9b9bc1283145df2529e2c48003911 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 28 Aug 2023 11:35:58 +0200 Subject: [PATCH 239/384] fix: name of translation (`UA`) module Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/i18n/arduino-localization-contribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 66868d80b..224d073bf 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -17,7 +17,7 @@ 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 uk_UAJson from '../resources/i18n/uk_UA.json'; +import ukJson from '../resources/i18n/uk.json'; import zhJson from '../resources/i18n/zh.json'; import zh_HantJson from '../resources/i18n/zh-Hant.json'; @@ -45,7 +45,7 @@ export class ArduinoLocalizationContribution 'pt-br': ptJson, ru: [ruJson], tr: [trJson], - uk: uk_UAJson, + uk: ukJson, 'zh-cn': zhJson, 'zh-tw': zh_HantJson, }; From 95bd2cf2e7b10f0d2905d424156c755318fa1829 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 29 Aug 2023 11:15:24 +0200 Subject: [PATCH 240/384] chore: update version to `2.2.1` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index eccac3c59..eb3344003 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.2.0", + "version": "2.2.1", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 25bfbdd26..5872be3da 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.2.0", + "version": "2.2.1", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.39.0", "@theia/terminal": "1.39.0", "@theia/workspace": "1.39.0", - "arduino-ide-extension": "2.2.0" + "arduino-ide-extension": "2.2.1" }, "devDependencies": { "@theia/cli": "1.39.0", diff --git a/package.json b/package.json index 61113c1ea..d3e4715b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.2.0", + "version": "2.2.1", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From f0704b678cbc844faa5738d6f884a98a021d96b2 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 30 Aug 2023 10:16:20 +0200 Subject: [PATCH 241/384] fix(i18n): corrected the module for `tr` and `ru` Closes arduino/arduino-ide#2201 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/i18n/arduino-localization-contribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 224d073bf..a10842126 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -43,8 +43,8 @@ export class ArduinoLocalizationContribution nl: nlJson, pl: plJson, 'pt-br': ptJson, - ru: [ruJson], - tr: [trJson], + ru: ruJson, + tr: trJson, uk: ukJson, 'zh-cn': zhJson, 'zh-tw': zh_HantJson, From 97e26a9584d94c48cad6c68213ebeca571980aa2 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 31 Aug 2023 10:09:52 +0200 Subject: [PATCH 242/384] fix(ci): fix the changelog generation Pinned `@octokit/rest` to `19.0.13`, so that it works with Node.js 16+. Closes arduino/arduino-ide#2200 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .github/workflows/compose-full-changelog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index f45e7bdff..48a39d40b 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -32,7 +32,7 @@ jobs: - name: Create full changelog id: full-changelog run: | - yarn add @octokit/rest --ignore-workspace-root-check + yarn add @octokit/rest@19.0.13 --ignore-workspace-root-check mkdir "${{ github.workspace }}/${{ env.CHANGELOG_ARTIFACTS }}" # Get the changelog file name to build From 90b886ea92e89c837eaa13ff6b1ec7fbd9ddaf59 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 31 Aug 2023 10:50:15 +0200 Subject: [PATCH 243/384] chore: update to `arduino-fwuploader@2.4.1` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index eb3344003..7a3357d02 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -175,7 +175,7 @@ "version": "0.34.0" }, "arduino-fwuploader": { - "version": "2.4.0" + "version": "2.4.1" }, "arduino-language-server": { "version": "0.7.4" From fe53b8e0d048ef9d135381383204cd68afa69e7b Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 31 Aug 2023 15:35:58 +0200 Subject: [PATCH 244/384] chore: update version to `2.2.2` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 7a3357d02..08e02bc99 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.2.1", + "version": "2.2.2", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 5872be3da..f4608f2c2 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.2.1", + "version": "2.2.2", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.39.0", "@theia/terminal": "1.39.0", "@theia/workspace": "1.39.0", - "arduino-ide-extension": "2.2.1" + "arduino-ide-extension": "2.2.2" }, "devDependencies": { "@theia/cli": "1.39.0", diff --git a/package.json b/package.json index d3e4715b0..a8fd06db1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.2.1", + "version": "2.2.2", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 73ddbefc3e22c65d00ff59cade57fda14af01818 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 19:38:30 +0000 Subject: [PATCH 245/384] build(deps): Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 4 ++-- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/compose-full-changelog.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/sync-labels.yml | 4 ++-- .github/workflows/themes-weekly-pull.yml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c830648d..5b7800173 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,7 +83,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js 16.14 uses: actions/setup-node@v3 @@ -197,7 +197,7 @@ jobs: BODY: ${{ steps.changelog.outputs.BODY }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 # To fetch all history for all branches and tags. diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 2aa398b93..fcbecf287 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -56,7 +56,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js 16.14 uses: actions/setup-node@v3 diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 48a39d40b..02e4a72cd 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js uses: actions/setup-node@v3 diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 3b9b5b2ba..08a2741b3 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js 16.14 uses: actions/setup-node@v3 diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 49f8edc51..e21964761 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js 16.14 uses: actions/setup-node@v3 diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 6f9c91a91..9ecf638e8 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download JSON schema for labels configuration file id: download-schema @@ -106,7 +106,7 @@ jobs: echo "flag=--dry-run" >> $GITHUB_OUTPUT - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download configuration files artifact uses: actions/download-artifact@v3 diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index aaa5d2180..4990e1a3a 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js uses: actions/setup-node@v3 From ec28623a9774702a41598d00a699a7c1048e336e Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Tue, 26 Sep 2023 09:45:03 +0200 Subject: [PATCH 246/384] fix: forward backend logging to electron (#2236) Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .vscode/tasks.json | 5 +- .../theia/electron-main-application.ts | 121 ++++++++++++++---- electron-app/arduino-ide-backend-main.js | 35 +---- electron-app/arduino-ide-electron-main.js | 2 - electron-app/package.json | 2 +- 5 files changed, 106 insertions(+), 59 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 2710dd76f..acc9e168d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,8 +4,11 @@ { "label": "Rebuild App", "type": "shell", - "command": "yarn rebuild:browser && yarn rebuild:electron", + "command": "yarn rebuild", "group": "build", + "options": { + "cwd": "${workspaceFolder}/electron-app" + }, "presentation": { "reveal": "always", "panel": "new", 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 9cb5f74e4..506cd7c18 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts @@ -1,35 +1,33 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +import type { FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; +import { environment } from '@theia/application-package/lib/environment'; import { app, BrowserWindow, contentTracing, - ipcMain, Event as ElectronEvent, + ipcMain, } from '@theia/core/electron-shared/electron'; -import { fork } from '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 { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { isOSX } from '@theia/core/lib/common/os'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types'; import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token'; -import { FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; -import { environment } from '@theia/application-package/lib/environment'; import { ElectronMainApplication as TheiaElectronMainApplication, ElectronMainExecutionParams, } from '@theia/core/lib/electron-main/electron-main-application'; -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 { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window'; -import { IsTempSketch } from '../../node/is-temp-sketch'; -import { ErrnoException } from '../../node/utils/errors'; -import { isAccessibleSketchPath } from '../../node/sketches-service-impl'; +import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window'; import { FileUri } from '@theia/core/lib/node/file-uri'; -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { URI } from '@theia/core/shared/vscode-uri'; +import { log as logToFile, setup as setupFileLog } from 'node-log-rotate'; +import { fork } from 'node:child_process'; +import { promises as fs, rm, rmSync } from 'node:fs'; +import type { AddressInfo } from 'node:net'; +import { isAbsolute, join, resolve } from 'node:path'; import { Sketch } from '../../common/protocol'; import { AppInfo, @@ -39,9 +37,71 @@ import { CHANNEL_SHOW_PLOTTER_WINDOW, isShowPlotterWindowParams, } from '../../electron-common/electron-arduino'; +import { IsTempSketch } from '../../node/is-temp-sketch'; +import { isAccessibleSketchPath } from '../../node/sketches-service-impl'; +import { ErrnoException } from '../../node/utils/errors'; app.commandLine.appendSwitch('disable-http-cache'); +const consoleLogFunctionNames = [ + 'log', + 'trace', + 'debug', + 'info', + 'warn', + 'error', +] as const; +type ConsoleLogSeverity = (typeof consoleLogFunctionNames)[number]; +interface ConsoleLogParams { + readonly severity: ConsoleLogSeverity; + readonly message: string; +} +function isConsoleLogParams(arg: unknown): arg is ConsoleLogParams { + return ( + isObject<ConsoleLogParams>(arg) && + typeof arg.message === 'string' && + typeof arg.severity === 'string' && + consoleLogFunctionNames.includes(arg.severity as ConsoleLogSeverity) + ); +} + +// Patch for on Linux when `XDG_CONFIG_HOME` is not available, `node-log-rotate` creates the folder with `undefined` name. +// See https://github.com/lemon-sour/node-log-rotate/issues/23 and https://github.com/arduino/arduino-ide/issues/394. +// If the IDE2 is running on Linux, and the `XDG_CONFIG_HOME` variable is not available, set it to avoid the `undefined` folder. +// From the specs: https://specifications.freedesktop.org/basedir-spec/latest/ar01s03.html +// "If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used." +function enableFileLogger() { + const os = require('os'); + const util = require('util'); + if (os.platform() === 'linux' && !process.env['XDG_CONFIG_HOME']) { + const { join } = require('path'); + const home = process.env['HOME']; + const xdgConfigHome = home + ? join(home, '.config') + : join(os.homedir(), '.config'); + process.env['XDG_CONFIG_HOME'] = xdgConfigHome; + } + setupFileLog({ + appName: 'Arduino IDE', + maxSize: 10 * 1024 * 1024, + }); + for (const name of consoleLogFunctionNames) { + const original = console[name]; + console[name] = function () { + // eslint-disable-next-line prefer-rest-params + const messages = Object.values(arguments); + const message = util.format(...messages); + original(message); + logToFile(message); + }; + } +} + +const isProductionMode = !environment.electron.isDevMode(); +if (isProductionMode) { + enableFileLogger(); +} + interface WorkspaceOptions { file: string; x: number; @@ -185,7 +245,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { private attachFileAssociations(cwd: string): void { // OSX: register open-file event - if (os.isOSX) { + if (isOSX) { app.on('open-file', async (event, path) => { event.preventDefault(); const resolvedPath = await this.resolvePath(path, cwd); @@ -495,9 +555,14 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { ); console.log(`Starting backend process. PID: ${backendProcess.pid}`); return new Promise((resolve, reject) => { - // The backend server main file is also supposed to send the resolved http(s) server port via IPC. - backendProcess.on('message', (address: AddressInfo) => { - resolve(address.port); + // The forked backend process sends the resolved http(s) server port via IPC, and forwards the log messages. + backendProcess.on('message', (arg: unknown) => { + if (isConsoleLogParams(arg)) { + const { message, severity } = arg; + console[severity](message); + } else if (isAddressInfo(arg)) { + resolve(arg.port); + } }); backendProcess.on('error', (error) => { reject(error); @@ -703,7 +768,7 @@ class InterruptWorkspaceRestoreError extends Error { async function updateFrontendApplicationConfigFromPackageJson( config: FrontendApplicationConfig ): Promise<FrontendApplicationConfig> { - if (environment.electron.isDevMode()) { + if (!isProductionMode) { console.debug( 'Skipping frontend application configuration customizations. Running in dev mode.' ); @@ -777,3 +842,9 @@ function updateAppInfo( }); return toUpdate; } + +function isAddressInfo(arg: unknown): arg is Pick<AddressInfo, 'port'> { + // Cannot do the type-guard on all properties, but the port is sufficient as the address is always `localhost`. + // For example, the `family` might be absent if the address is IPv6. + return isObject<AddressInfo>(arg) && typeof arg.port === 'number'; +} diff --git a/electron-app/arduino-ide-backend-main.js b/electron-app/arduino-ide-backend-main.js index 263b62798..a6e5a12de 100644 --- a/electron-app/arduino-ide-backend-main.js +++ b/electron-app/arduino-ide-backend-main.js @@ -1,42 +1,17 @@ // @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'); +// `true` if the this (backend main) process has been forked. +if (process.send) { 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); + const args = Object.values(arguments); + const message = util.format(...args); + process.send?.({ severity: name, message }); // send the log message to the parent process (electron main) }; } } -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 index 8375b5891..68f506e84 100644 --- a/electron-app/arduino-ide-electron-main.js +++ b/electron-app/arduino-ide-electron-main.js @@ -18,8 +18,6 @@ if (config.buildDate) { ] .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 f4608f2c2..f466fbafb 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -53,7 +53,7 @@ "prepackage": "rimraf dist", "package": "node ./scripts/package.js", "postpackage": "node ./scripts/post-package.js", - "rebuild": "theia rebuild:browser && theia rebuild:electron" + "rebuild": "theia rebuild:browser --cacheRoot ../.. && theia rebuild:electron --cacheRoot ../.." }, "theia": { "target": "electron", From 9f48296d4d37f980eac56d90df9e3008446803d0 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 21 Sep 2023 15:00:11 +0200 Subject: [PATCH 247/384] fix: defer board+port state update for extensions If it is set before the board+port settings are restored from the `localStorage`, extensions will see no board+port. Ref: arduino/arduino-ide#2165 Ref: dankeboy36/esp-exception-decoder#10 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/contributions/update-arduino-state.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts index 35b4c2ab7..e83e46f51 100644 --- a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -76,7 +76,9 @@ export class UpdateArduinoState extends SketchContribution { } override onReady(): void { - this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); // TODO: verify! + this.boardsServiceProvider.ready.then(() => { + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); + }); this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch()); this.updateUserDirPath(this.configService.tryGetSketchDirUri()); this.updateDataDirPath(this.configService.tryGetDataDirUri()); From 7f660d76a8d88767ae0144cf2cdb9ed37811fa11 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 21 Sep 2023 15:32:36 +0200 Subject: [PATCH 248/384] fix: refresh the user-fields at app startup Ref: arduino/arduino-ide#2165 Closes arduino/arduino-ide#2230 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/contributions/user-fields.ts | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/user-fields.ts b/arduino-ide-extension/src/browser/contributions/user-fields.ts index 14a4e55a8..00f2817c6 100644 --- a/arduino-ide-extension/src/browser/contributions/user-fields.ts +++ b/arduino-ide-extension/src/browser/contributions/user-fields.ts @@ -1,10 +1,10 @@ +import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { nls } from '@theia/core/lib/common'; import { BoardUserField, CoreError } from '../../common/protocol'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { MenuModelRegistry, Contribution } from './contribution'; +import { Contribution, MenuModelRegistry } from './contribution'; import { UploadSketch } from './upload-sketch'; @injectable() @@ -21,12 +21,11 @@ export class UserFields extends Contribution { protected override init(): void { super.init(); - this.boardsServiceProvider.onBoardsConfigDidChange(async () => { - const userFields = - await this.boardsServiceProvider.selectedBoardUserFields(); - this.boardRequiresUserFields = userFields.length > 0; - this.menuManager.update(); - }); + this.boardsServiceProvider.onBoardsConfigDidChange(() => this.refresh()); + } + + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.refresh()); } override registerMenus(registry: MenuModelRegistry): void { @@ -37,6 +36,13 @@ export class UserFields extends Contribution { }); } + private async refresh(): Promise<void> { + const userFields = + await this.boardsServiceProvider.selectedBoardUserFields(); + this.boardRequiresUserFields = userFields.length > 0; + this.menuManager.update(); + } + private selectedFqbnAddress(): string | undefined { const { boardsConfig } = this.boardsServiceProvider; const fqbn = boardsConfig.selectedBoard?.fqbn; From 5939b65511786fa683f20608412591200d6dd8fb Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 24 Aug 2023 13:47:27 +0200 Subject: [PATCH 249/384] chore: update `prettier` config narrow the `resources` folder constraint in the .gitignore Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .gitignore | 2 +- .prettierignore | 11 +++++++++++ .prettierrc | 7 ------- .prettierrc.json | 28 ++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 .prettierignore delete mode 100644 .prettierrc create mode 100644 .prettierrc.json diff --git a/.gitignore b/.gitignore index 298d9c059..570b7df39 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ node_modules/ lib/ downloads/ -resources/ +arduino-ide-extension/src/node/resources arduino-ide-extension/Examples/ src-gen/ gen-webpack.config.js diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..0f7b8aa47 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +lib +dist +plugins +src-gen +i18n +gen-webpack* +.browser_modules +arduino-ide-extension/src/node/resources +cli-protocol +*color-theme.json +arduino-icons.json diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 47e5c04d7..000000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "singleQuote": true, - "tabWidth": 2, - "useTabs": false, - "printWidth": 80, - "endOfLine": "auto" -} diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..686348c10 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,28 @@ +{ + "singleQuote": true, + "tabWidth": 2, + "useTabs": false, + "printWidth": 80, + "endOfLine": "auto", + "overrides": [ + { + "files": "*.json", + "options": { + "tabWidth": 2 + } + }, + { + "files": "*.css", + "options": { + "tabWidth": 4, + "singleQuote": false + } + }, + { + "files": "*.html", + "options": { + "tabWidth": 4 + } + } + ] +} From 8a5dee930787e02f2862170af00f0f521e93a204 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 24 Aug 2023 13:59:43 +0200 Subject: [PATCH 250/384] chore: format resources :lipstick: Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .eslintrc.js | 122 ++--- .github/ISSUE_TEMPLATE/bug-report.yml | 2 +- .github/ISSUE_TEMPLATE/feature-request.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 11 +- .github/dependabot.yml | 2 +- .github/label-configuration-files/labels.yml | 32 +- .github/workflows/build.yml | 2 +- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/sync-labels.yml | 10 +- .github/workflows/themes-weekly-pull.yml | 4 +- .vscode/launch.json | 15 +- .vscode/settings.json | 2 +- .vscode/tasks.json | 5 +- arduino-ide-extension/README.md | 24 +- .../src/browser/arduino-preferences.ts | 4 +- .../browser/contributions/upload-firmware.ts | 5 +- .../src/browser/style/arduino-select.css | 4 +- .../browser/style/boards-config-dialog.css | 306 +++++------ .../src/browser/style/browser-menu.css | 2 +- .../style/certificate-uploader-dialog.css | 81 ++- .../src/browser/style/cloud-sketchbook.css | 39 +- .../src/browser/style/custom-codicon.css | 8 +- .../src/browser/style/dialogs.css | 17 +- .../src/browser/style/editor.css | 6 +- .../style/firmware-uploader-dialog.css | 26 +- .../src/browser/style/fonts.css | 487 +++++++++--------- .../src/browser/style/ide-updater-dialog.css | 112 ++-- .../src/browser/style/index.css | 206 ++++---- .../src/browser/style/list-widget.css | 32 +- .../src/browser/style/main.css | 35 +- .../src/browser/style/monitor.css | 8 +- .../src/browser/style/progress-bar.css | 36 +- .../src/browser/style/settings-dialog.css | 2 +- .../src/browser/style/settings-step-input.css | 6 +- .../src/browser/style/sketchbook.css | 76 ++- .../src/browser/style/user-fields-dialog.css | 30 +- .../browser/theia/core/tab-bar-decorator.ts | 6 +- .../theia/monaco/monaco-editor-provider.ts | 10 +- .../theia/navigator/navigator-contribution.ts | 3 +- .../output/output-toolbar-contribution.ts | 4 +- .../src/browser/theia/scm/scm-contribution.ts | 5 +- .../widgets/cloud-sketchbook/README.md | 2 +- .../cloud-sketchbook-widget.ts | 6 +- .../src/common/protocol/library-service.ts | 4 +- arduino-ide-extension/tsconfig.json | 13 +- docs/README.md | 40 +- docs/internal/Arm.md | 99 ++-- electron-app/resources/preload.html | 135 ++++- lerna.json | 2 +- scripts/themes/theme-tokens-pull.js | 4 +- scripts/update-version.js | 59 ++- 53 files changed, 1157 insertions(+), 1002 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index ba733c944..603ad7886 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,66 +1,66 @@ module.exports = { - parser: '@typescript-eslint/parser', // Specifies the ESLint parser - parserOptions: { - ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features - sourceType: 'module', // Allows for the use of imports - ecmaFeatures: { - jsx: true, // Allows for the parsing of JSX - }, + parser: '@typescript-eslint/parser', // Specifies the ESLint parser + parserOptions: { + ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features + sourceType: 'module', // Allows for the use of imports + ecmaFeatures: { + jsx: true, // Allows for the parsing of JSX }, - ignorePatterns: [ - 'node_modules/*', - '**/node_modules/*', - '.node_modules/*', - '.github/*', - '.browser_modules/*', - 'docs/*', - 'scripts/*', - 'electron-app/lib/*', - 'electron-app/src-gen/*', - 'electron-app/gen-webpack*.js', - '!electron-app/webpack.config.js', - 'plugins/*', - 'arduino-ide-extension/src/node/cli-protocol', - ], - settings: { - react: { - version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use - }, + }, + ignorePatterns: [ + 'node_modules/*', + '**/node_modules/*', + '.node_modules/*', + '.github/*', + '.browser_modules/*', + 'docs/*', + 'scripts/*', + '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', + ], + settings: { + react: { + version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use }, - extends: [ - 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin - 'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react - 'plugin:react-hooks/recommended', // Uses recommended rules from react hooks - 'plugin:prettier/recommended', - 'prettier', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + }, + extends: [ + 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin + 'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react + 'plugin:react-hooks/recommended', // Uses recommended rules from react hooks + 'plugin:prettier/recommended', + 'prettier', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + ], + plugins: ['prettier', 'unused-imports'], + rules: { + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'warn', + '@typescript-eslint/no-empty-interface': 'warn', + 'no-unused-vars': 'off', + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': [ + 'warn', + { + vars: 'all', + varsIgnorePattern: '^_', + args: 'after-used', + argsIgnorePattern: '^_', + }, ], - plugins: ['prettier', 'unused-imports'], - rules: { - '@typescript-eslint/no-unused-expressions': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-empty-function': 'warn', - '@typescript-eslint/no-empty-interface': 'warn', - 'no-unused-vars': 'off', - 'unused-imports/no-unused-imports': 'error', - 'unused-imports/no-unused-vars': [ - 'warn', - { - vars: 'all', - varsIgnorePattern: '^_', - args: 'after-used', - argsIgnorePattern: '^_', - }, - ], - 'react/display-name': 'warn', - eqeqeq: ['error', 'smart'], - 'guard-for-in': 'off', - 'id-blacklist': 'off', - 'id-match': 'off', - 'no-underscore-dangle': 'off', - 'no-unused-expressions': 'off', - 'no-var': 'error', - radix: 'error', - 'prettier/prettier': 'warn', - }, + 'react/display-name': 'warn', + eqeqeq: ['error', 'smart'], + 'guard-for-in': 'off', + 'id-blacklist': 'off', + 'id-match': 'off', + 'no-underscore-dangle': 'off', + 'no-unused-expressions': 'off', + 'no-var': 'error', + radix: 'error', + 'prettier/prettier': 'warn', + }, }; diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 62db515f8..4e647d8da 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,7 +1,7 @@ name: Bug report description: Report a problem with the code or documentation in this repository. labels: - - "type: imperfection" + - 'type: imperfection' body: - type: textarea id: description diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index dbfc57856..955315a05 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -1,7 +1,7 @@ name: Feature request description: Suggest an enhancement to this project. labels: - - "type: enhancement" + - 'type: enhancement' body: - type: textarea id: description diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 43749222b..b9e9f9102 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,18 @@ ### Motivation + <!-- Why this pull request? --> ### Change description + <!-- What does your code do? --> ### Other information + <!-- Any additional information that could help the review process --> ### Reviewer checklist -* [ ] PR addresses a single concern. -* [ ] The PR has no duplicates (please search among the [Pull Requests](https://github.com/arduino/arduino-ide/pulls) before creating one) -* [ ] PR title and description are properly filled. -* [ ] Docs have been added / updated (for bug fixes / features) \ No newline at end of file +- [ ] PR addresses a single concern. +- [ ] The PR has no duplicates (please search among the [Pull Requests](https://github.com/arduino/arduino-ide/pulls) before creating one) +- [ ] PR title and description are properly filled. +- [ ] Docs have been added / updated (for bug fixes / features) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f640b0391..06f3449ea 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,4 +12,4 @@ updates: schedule: interval: daily labels: - - "topic: infrastructure" + - 'topic: infrastructure' diff --git a/.github/label-configuration-files/labels.yml b/.github/label-configuration-files/labels.yml index b0ae38dc2..3b3e27853 100644 --- a/.github/label-configuration-files/labels.yml +++ b/.github/label-configuration-files/labels.yml @@ -1,27 +1,27 @@ # Used by the "Sync Labels" workflow # See: https://github.com/Financial-Times/github-label-sync#label-config-file -- name: "topic: accessibility" - color: "00ffff" +- name: 'topic: accessibility' + color: '00ffff' description: Enabling the use of the software by everyone -- name: "topic: CLI" - color: "00ffff" +- name: 'topic: CLI' + color: '00ffff' description: Related to Arduino CLI -- name: "topic: cloud" - color: "00ffff" +- name: 'topic: cloud' + color: '00ffff' description: Related to Arduino Cloud and cloud sketches -- name: "topic: debugger" - color: "00ffff" +- name: 'topic: debugger' + color: '00ffff' description: Related to the integrated debugger -- name: "topic: language server" - color: "00ffff" +- name: 'topic: language server' + color: '00ffff' description: Related to the Arduino Language Server -- name: "topic: serial monitor" - color: "00ffff" +- name: 'topic: serial monitor' + color: '00ffff' description: Related to the Serial Monitor -- name: "topic: theia" - color: "00ffff" +- name: 'topic: theia' + color: '00ffff' description: Related to the Theia IDE framework -- name: "topic: theme" - color: "00ffff" +- name: 'topic: theme' + color: '00ffff' description: Related to GUI theming diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5b7800173..222e00548 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.19" + GO_VERSION: '1.19' JOB_TRANSFER_ARTIFACT: build-artifacts CHANGELOG_ARTIFACTS: changelog diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index fcbecf287..bf50d7624 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -2,7 +2,7 @@ name: Check Internationalization env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.19" + GO_VERSION: '1.19' # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 08a2741b3..303ad5116 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -2,7 +2,7 @@ name: i18n-nightly-push env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.19" + GO_VERSION: '1.19' on: schedule: diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index e21964761..ac4d45809 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -2,7 +2,7 @@ name: i18n-weekly-pull env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.19" + GO_VERSION: '1.19' on: schedule: diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 9ecf638e8..0ec11e7f3 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -5,15 +5,15 @@ name: Sync Labels on: push: paths: - - ".github/workflows/sync-labels.ya?ml" - - ".github/label-configuration-files/*.ya?ml" + - '.github/workflows/sync-labels.ya?ml' + - '.github/label-configuration-files/*.ya?ml' pull_request: paths: - - ".github/workflows/sync-labels.ya?ml" - - ".github/label-configuration-files/*.ya?ml" + - '.github/workflows/sync-labels.ya?ml' + - '.github/label-configuration-files/*.ya?ml' schedule: # Run daily at 8 AM UTC to sync with changes to shared label configurations. - - cron: "0 8 * * *" + - cron: '0 8 * * *' workflow_dispatch: repository_dispatch: diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 4990e1a3a..78261389a 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -8,8 +8,8 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: "1.19" - NODE_VERSION: 16.x + GO_VERSION: '1.19' + NODE_VERSION: '18.17' jobs: pull-from-jsonbin: diff --git a/.vscode/launch.json b/.vscode/launch.json index 11c115550..2a8081fb8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ "name": "App", "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", "windows": { - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" }, "cwd": "${workspaceFolder}/electron-app", "args": [ @@ -19,7 +19,7 @@ "--no-app-auto-install", "--plugins=local-dir:./plugins", "--hosted-plugin-inspect=9339", - "--no-ping-timeout", + "--no-ping-timeout" ], "env": { "NODE_ENV": "development" @@ -42,7 +42,7 @@ "name": "App [Dev]", "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", "windows": { - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" }, "cwd": "${workspaceFolder}/electron-app", "args": [ @@ -56,7 +56,7 @@ "--hosted-plugin-inspect=9339", "--content-trace", "--open-devtools", - "--no-ping-timeout", + "--no-ping-timeout" ], "env": { "NODE_ENV": "development" @@ -115,15 +115,12 @@ "request": "attach", "name": "Attach by Process ID", "processId": "${command:PickProcess}" - }, + } ], "compounds": [ { "name": "Launch Electron Backend & Frontend", - "configurations": [ - "App", - "Attach to Electron Frontend" - ] + "configurations": ["App", "Attach to Electron Frontend"] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 848b9a2de..0d8f3bbd2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,5 +8,5 @@ "typescript.tsdk": "node_modules/typescript/lib", "editor.codeActionsOnSave": { "source.fixAll.eslint": true - }, + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index acc9e168d..b53773f8b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -40,10 +40,7 @@ { "label": "Watch All", "type": "shell", - "dependsOn": [ - "Watch Extension", - "Watch App" - ] + "dependsOn": ["Watch Extension", "Watch App"] } ] } diff --git a/arduino-ide-extension/README.md b/arduino-ide-extension/README.md index db9cff8bc..e6cd0f8bd 100644 --- a/arduino-ide-extension/README.md +++ b/arduino-ide-extension/README.md @@ -55,12 +55,14 @@ The Config Service knows about your system, like for example the default sketch - checking whether a file is in a data or sketch directory ### `"arduino"` configuration in the `package.json`: - - `"cli"`: - - `"version"` type `string` | `{ owner: string, repo: string, commitish?: string }`: if the type is a `string` and is a valid semver, it will get the corresponding [released](https://github.com/arduino/arduino-cli/releases) CLI. If the type is `string` and is a [date in `YYYYMMDD`](https://arduino.github.io/arduino-cli/latest/installation/#nightly-builds) format, it will get a nightly CLI. If the type is an object, a CLI, build from the sources in the `owner/repo` will be used. If `commitish` is not defined, the HEAD of the default branch will be used. In any other cases an error is thrown. + +- `"cli"`: + - `"version"` type `string` | `{ owner: string, repo: string, commitish?: string }`: if the type is a `string` and is a valid semver, it will get the corresponding [released](https://github.com/arduino/arduino-cli/releases) CLI. If the type is `string` and is a [date in `YYYYMMDD`](https://arduino.github.io/arduino-cli/latest/installation/#nightly-builds) format, it will get a nightly CLI. If the type is an object, a CLI, build from the sources in the `owner/repo` will be used. If `commitish` is not defined, the HEAD of the default branch will be used. In any other cases an error is thrown. #### Rebuild gRPC protocol interfaces - - Some CLI updates can bring changes to the gRPC interfaces, as the API might change. gRPC interfaces can be updated running the command - `yarn --cwd arduino-ide-extension generate-protocol` + +- Some CLI updates can bring changes to the gRPC interfaces, as the API might change. gRPC interfaces can be updated running the command + `yarn --cwd arduino-ide-extension generate-protocol` ### Update **clangd** and **ClangFormat** @@ -72,11 +74,13 @@ The [**clangd** C++ language server](https://clangd.llvm.org/) and the [**ClangF 1. Submit a pull request in [the `arduino/tooling-project-assets` repository](https://github.com/arduino/tooling-project-assets) to update the version in the `vars.DEFAULT_CLANG_FORMAT_VERSION` field of [`Taskfile.yml`](https://github.com/arduino/tooling-project-assets/blob/main/Taskfile.yml). ### Customize Icons + ArduinoIde uses a customized version of FontAwesome. In order to update/replace icons follow the following steps: - - import the file `arduino-icons.json` in [Icomoon](https://icomoon.io/app/#/projects) - - load it - - edit the icons as needed - - !! download the **new** `arduino-icons.json` file and put it in this repo - - Click on "Generate Font" in Icomoon, then download - - place the updated fonts in the `src/style/fonts` directory + +- import the file `arduino-icons.json` in [Icomoon](https://icomoon.io/app/#/projects) +- load it +- edit the icons as needed +- !! download the **new** `arduino-icons.json` file and put it in this repo +- Click on "Generate Font" in Icomoon, then download +- place the updated fonts in the `src/style/fonts` directory diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index ebe525d60..f2c83a7f6 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -58,7 +58,9 @@ type StrictPreferenceSchemaProperties<T extends object> = { [p in keyof T]: PreferenceSchemaProperty; }; type ArduinoPreferenceSchemaProperties = - StrictPreferenceSchemaProperties<ArduinoConfiguration> & { 'arduino.window.zoomLevel': PreferenceSchemaProperty }; + StrictPreferenceSchemaProperties<ArduinoConfiguration> & { + 'arduino.window.zoomLevel': PreferenceSchemaProperty; + }; const properties: ArduinoPreferenceSchemaProperties = { 'arduino.language.log': { diff --git a/arduino-ide-extension/src/browser/contributions/upload-firmware.ts b/arduino-ide-extension/src/browser/contributions/upload-firmware.ts index e01a8fb55..7ed85c996 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-firmware.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-firmware.ts @@ -45,10 +45,7 @@ export namespace UploadFirmware { export namespace Commands { export const OPEN: Command = { id: 'arduino-upload-firmware-open', - label: nls.localize( - 'arduino/firmware/updater', - 'Firmware Updater' - ), + label: nls.localize('arduino/firmware/updater', 'Firmware Updater'), category: 'Arduino', }; } diff --git a/arduino-ide-extension/src/browser/style/arduino-select.css b/arduino-ide-extension/src/browser/style/arduino-select.css index 25b4989bb..8bd53b041 100644 --- a/arduino-ide-extension/src/browser/style/arduino-select.css +++ b/arduino-ide-extension/src/browser/style/arduino-select.css @@ -38,7 +38,9 @@ .arduino-select__control.arduino-select__control--menu-is-open { border: 1px solid !important; border-color: var(--theia-focusBorder) !important; - border-bottom-color: var(--theia-sideBar-background) !important; /* if the bottom border color has the same color as the background of the control, we make the border "invisible" */ + border-bottom-color: var( + --theia-sideBar-background + ) !important; /* if the bottom border color has the same color as the background of the control, we make the border "invisible" */ } .arduino-select__value-container .arduino-select__single-value { diff --git a/arduino-ide-extension/src/browser/style/boards-config-dialog.css b/arduino-ide-extension/src/browser/style/boards-config-dialog.css index ad18afc7f..cc86271ee 100644 --- a/arduino-ide-extension/src/browser/style/boards-config-dialog.css +++ b/arduino-ide-extension/src/browser/style/boards-config-dialog.css @@ -1,324 +1,324 @@ #select-board-dialog-container > .dialogBlock { - width: 640px; - height: 500px; + width: 640px; + height: 500px; } div#select-board-dialog { - margin: 5px; - height: 100%; + margin: 5px; + height: 100%; } div#select-board-dialog .selectBoardContainer { - display: flex; - gap: 10px; - overflow: hidden; - max-height: 100%; - height: 100%; + display: flex; + gap: 10px; + overflow: hidden; + max-height: 100%; + height: 100%; } .select-board-dialog .head { - margin: 5px; + margin: 5px; } .dialogContent.select-board-dialog { - height: 100%; + height: 100%; } div.dialogContent.select-board-dialog > div.head .title { - font-weight: 400; - letter-spacing: 0.02em; - font-size: 1.2em; - color: var(--theia-editorWidget-foreground); - margin-bottom: 10px; + font-weight: 400; + letter-spacing: 0.02em; + font-size: 1.2em; + color: var(--theia-editorWidget-foreground); + margin-bottom: 10px; } - div#select-board-dialog .selectBoardContainer .list .item.selected { - background: var(--theia-secondaryButton-hoverBackground); + background: var(--theia-secondaryButton-hoverBackground); } div#select-board-dialog .selectBoardContainer .list .item.selected i { - color: var(--theia-arduino-branding-primary); + color: var(--theia-arduino-branding-primary); } #select-board-dialog .selectBoardContainer .search, #select-board-dialog .selectBoardContainer .search input, #select-board-dialog .selectBoardContainer .list, #select-board-dialog .selectBoardContainer .list { - background: var(--theia-editor-background); + background: var(--theia-editor-background); } #select-board-dialog .selectBoardContainer .search input { - border: none; - width: 100%; - height: auto; - max-height: 37px; - padding: 10px 5px 10px 10px; - margin: 0; - vertical-align: top; - display: flex; - color: var(--theia-input-foreground); + border: none; + width: 100%; + height: auto; + max-height: 37px; + padding: 10px 5px 10px 10px; + margin: 0; + vertical-align: top; + display: flex; + color: var(--theia-input-foreground); } #select-board-dialog .selectBoardContainer .search input:focus { - box-shadow: none; + box-shadow: none; } #select-board-dialog .selectBoardContainer .container { - flex: 1; - overflow: hidden; - max-height: 100%; + flex: 1; + overflow: hidden; + max-height: 100%; } #select-board-dialog .selectBoardContainer .container .content { - display: flex; - flex-direction: column; - max-height: 100%; - height: 100%; + display: flex; + flex-direction: column; + max-height: 100%; + height: 100%; } #select-board-dialog .selectBoardContainer .left.container .content { - margin: 0 5px 0 0; + margin: 0 5px 0 0; } #select-board-dialog .selectBoardContainer .right.container .content { - margin: 0 0 0 5px; + margin: 0 0 0 5px; } #select-board-dialog .selectBoardContainer .container .content .title { - color: var(--theia-editorWidget-foreground); - padding: 0px 0px 10px 0px; - text-transform: uppercase; + color: var(--theia-editorWidget-foreground); + padding: 0px 0px 10px 0px; + text-transform: uppercase; } #select-board-dialog .selectBoardContainer .container .content .footer { - padding: 10px 5px 10px 0px; + padding: 10px 5px 10px 0px; } #select-board-dialog .selectBoardContainer .container .content .loading { - font-size: var(--theia-ui-font-size1); - color: var(--theia-editorWidget-foreground); - padding: 10px 5px 10px 10px; - text-transform: uppercase; - /* The max, min-height comes from `.list` 200px + 47px top padding - 2 * 10px top padding */ - max-height: 227px; - min-height: 227px; + font-size: var(--theia-ui-font-size1); + color: var(--theia-editorWidget-foreground); + padding: 10px 5px 10px 10px; + text-transform: uppercase; + /* The max, min-height comes from `.list` 200px + 47px top padding - 2 * 10px top padding */ + max-height: 227px; + min-height: 227px; } #select-board-dialog .selectBoardContainer .list .item { - padding: 10px 5px 10px 10px; - display: flex; - white-space: nowrap; - overflow-x: hidden; - flex: 1 0; + padding: 10px 5px 10px 10px; + display: flex; + white-space: nowrap; + overflow-x: hidden; + flex: 1 0; } #select-board-dialog .selectBoardContainer .list .item .selected-icon { - margin-left: auto; + margin-left: auto; } #select-board-dialog .selectBoardContainer .list .item .details { - font-size: var(--theia-ui-font-size1); - opacity: var(--theia-mod-disabled-opacity); - width: 155px; /* used heuristics for the calculation */ - white-space: pre; - overflow: hidden; - text-overflow: ellipsis; + font-size: var(--theia-ui-font-size1); + opacity: var(--theia-mod-disabled-opacity); + width: 155px; /* used heuristics for the calculation */ + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; } #select-board-dialog .selectBoardContainer .list .item.missing { - opacity: var(--theia-mod-disabled-opacity); + opacity: var(--theia-mod-disabled-opacity); } #select-board-dialog .selectBoardContainer .list .item:hover { - background: var(--theia-secondaryButton-hoverBackground); + background: var(--theia-secondaryButton-hoverBackground); } #select-board-dialog .selectBoardContainer .list .label { - white-space: pre; - overflow: hidden; - text-overflow: ellipsis; + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; } #select-board-dialog .selectBoardContainer .list { - max-height: 200px; - overflow-y: auto; - flex: 1; + max-height: 200px; + overflow-y: auto; + flex: 1; } #select-board-dialog .selectBoardContainer .ports.list { - margin: 47px 0px 0px 0px; /* 47 is 37 as input height for the `Boards`, plus 10 margin bottom. */ + margin: 47px 0px 0px 0px; /* 47 is 37 as input height for the `Boards`, plus 10 margin bottom. */ } #select-board-dialog .selectBoardContainer .search { - margin-bottom: 10px; - display: flex; - align-items: center; - padding-right: 5px; + margin-bottom: 10px; + display: flex; + align-items: center; + padding-right: 5px; } .arduino-boards-toolbar-item-container { - align-items: center; - background: var(--theia-arduino-toolbar-dropdown-background); - border-radius: 1px; - color: var(--theia-arduino-toolbar-dropdown-label); - border: 1px solid var(--theia-arduino-toolbar-dropdown-border); - display: flex; - gap: 10px; - height: var(--arduino-button-height); - margin: 0 4px; - overflow: hidden; - padding: 0 10px; - width: 210px; + align-items: center; + background: var(--theia-arduino-toolbar-dropdown-background); + border-radius: 1px; + color: var(--theia-arduino-toolbar-dropdown-label); + border: 1px solid var(--theia-arduino-toolbar-dropdown-border); + display: flex; + gap: 10px; + height: var(--arduino-button-height); + margin: 0 4px; + overflow: hidden; + padding: 0 10px; + width: 210px; } .arduino-boards-toolbar-item--protocol, .arduino-boards-dropdown-item--protocol { - align-items: center; - display: flex; - font-size: 16px; + align-items: center; + display: flex; + font-size: 16px; } .arduino-boards-toolbar-item--protocol, .arduino-boards-dropdown-item--protocol { - color: var(--theia-arduino-toolbar-dropdown-label); + color: var(--theia-arduino-toolbar-dropdown-label); } .arduino-boards-toolbar-item-container .arduino-boards-toolbar-item { - display: flex; - align-items: baseline; - width: 100%; + display: flex; + align-items: baseline; + width: 100%; } .arduino-boards-toolbar-item--label { - width: 100%; + width: 100%; } .arduino-boards-toolbar-item--label-connected { - font-family: 'Open Sans Bold'; - font-style: normal; - font-weight: 700; - font-size: 14px; + font-family: "Open Sans Bold"; + font-style: normal; + font-weight: 700; + font-size: 14px; } .arduino-boards-toolbar-item-container .caret { - width: 10px; - margin-right: 5px; + width: 10px; + margin-right: 5px; } .arduino-boards-dropdown-list { - margin: -1px; - z-index: 1; - border: 1px solid var(--theia-arduino-toolbar-dropdown-border); - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-size: 12px; + margin: -1px; + z-index: 1; + border: 1px solid var(--theia-arduino-toolbar-dropdown-border); + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-size: 12px; } .arduino-boards-dropdown-list:focus { - border: 1px solid var(--theia-arduino-toolbar-dropdown-borderActive); + border: 1px solid var(--theia-arduino-toolbar-dropdown-borderActive); } .arduino-boards-dropdown-list--items-container { - overflow: auto; - max-height: 404px; - background: var(--theia-arduino-toolbar-dropdown-background); + overflow: auto; + max-height: 404px; + background: var(--theia-arduino-toolbar-dropdown-background); } .arduino-boards-dropdown-list--items-container::-webkit-scrollbar { - background: var(--theia-arduino-toolbar-dropdown-background); + background: var(--theia-arduino-toolbar-dropdown-background); } .arduino-boards-dropdown-item { - background: var(--theia-arduino-toolbar-dropdown-background); - color: var(--theia-arduino-toolbar-dropdown-label); - cursor: default; - display: flex; - font-size: var(--theia-ui-font-size1); - justify-content: space-between; - padding: 10px; + background: var(--theia-arduino-toolbar-dropdown-background); + color: var(--theia-arduino-toolbar-dropdown-label); + cursor: default; + display: flex; + font-size: var(--theia-ui-font-size1); + justify-content: space-between; + padding: 10px; } .arduino-boards-dropdown-item--board-header { - display: flex; - align-items: center; + display: flex; + align-items: center; } .arduino-boards-dropdown-item--label { - overflow: hidden; - flex: 1; + overflow: hidden; + flex: 1; } /* Redefine default codicon size https://github.com/microsoft/vscode/commit/38cd0a377b7abef34fb07fe770fc633e68819ba6 */ -.arduino-boards-dropdown-item .codicon[class*='codicon-'] { - font-size: 14px; +.arduino-boards-dropdown-item .codicon[class*="codicon-"] { + font-size: 14px; } .arduino-boards-dropdown-item .p-TabBar-toolbar { - padding: 0px; - margin: 0px; - flex-direction: column; + padding: 0px; + margin: 0px; + flex-direction: column; } .arduino-boards-dropdown-item .p-TabBar-toolbar .item { - margin: 0px; + margin: 0px; } .arduino-boards-dropdown-item .p-TabBar-toolbar .item .action-label { - padding: 0px; + padding: 0px; } .arduino-boards-dropdown-item--board-label { - font-size: 14px; + font-size: 14px; } .arduino-boards-dropdown-item .arduino-boards-dropdown-item--protocol { - margin-right: 10px; + margin-right: 10px; } .arduino-boards-dropdown-item--port-label { - font-size: 12px; + font-size: 12px; } .arduino-boards-dropdown-item:hover { - background: var(--theia-arduino-toolbar-dropdown-option-backgroundHover); + background: var(--theia-arduino-toolbar-dropdown-option-backgroundHover); } .arduino-boards-dropdown-item--selected, .arduino-boards-dropdown-item--selected:hover { - background: var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); - border: 1px solid var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); + background: var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); + border: 1px solid + var(--theia-arduino-toolbar-dropdown-option-backgroundSelected); } .arduino-boards-dropdown-item--selected -.arduino-boards-dropdown-item--port-label { - color: var(--theia-arduino-toolbar-dropdown-label); + .arduino-boards-dropdown-item--port-label { + color: var(--theia-arduino-toolbar-dropdown-label); } .arduino-boards-dropdown-item--selected .fa { - color: var(--theia-arduino-toolbar-dropdown-iconSelected); + color: var(--theia-arduino-toolbar-dropdown-iconSelected); } .arduino-board-dropdown-footer { - color: var(--theia-secondaryButton-foreground); - border-top: 1px solid var(--theia-dropdown-border); + color: var(--theia-secondaryButton-foreground); + border-top: 1px solid var(--theia-dropdown-border); } @media only screen and (max-height: 400px) { - div.dialogContent.select-board-dialog > div.head { - display: none; - } + div.dialogContent.select-board-dialog > div.head { + display: none; + } - #select-board-dialog .selectBoardContainer .container .content .title { - display: none; - } + #select-board-dialog .selectBoardContainer .container .content .title { + display: none; + } } #select-board-dialog .no-result { - text-transform: uppercase; - height: 100%; - user-select: none; - padding: 10px 5px; - overflow-wrap: break-word; + text-transform: uppercase; + height: 100%; + user-select: none; + padding: 10px 5px; + overflow-wrap: break-word; } diff --git a/arduino-ide-extension/src/browser/style/browser-menu.css b/arduino-ide-extension/src/browser/style/browser-menu.css index b5ecc5303..85fb053a8 100644 --- a/arduino-ide-extension/src/browser/style/browser-menu.css +++ b/arduino-ide-extension/src/browser/style/browser-menu.css @@ -12,4 +12,4 @@ .p-MenuBar-item.p-mod-active { color: var(--theia-menubar-selectionForeground); -} \ No newline at end of file +} diff --git a/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css b/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css index 18216a78a..1b57cab45 100644 --- a/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css +++ b/arduino-ide-extension/src/browser/style/certificate-uploader-dialog.css @@ -1,76 +1,75 @@ #certificate-uploader-dialog-container > .dialogBlock { - width: 600px; + width: 600px; } .certificate-uploader-dialog .theia-select { - border: none !important; + border: none !important; } .certificate-uploader-dialog .arduino-select__control { - height: 31px; - background: var(--theia-dropdown-background) !important; + height: 31px; + background: var(--theia-dropdown-background) !important; } -.certificate-uploader-dialog .dialogRow > button{ - margin-right: 3px; +.certificate-uploader-dialog .dialogRow > button { + margin-right: 3px; } .certificate-uploader-dialog .certificate-list { - border: 1px solid var(--theia-editorWidget-border); - border-radius: 2px;; - color: var(--theia-editor-foreground); - background-color: var(--theia-editor-background); - overflow: auto; - height: 120px; - flex: 1; + border: 1px solid var(--theia-editorWidget-border); + border-radius: 2px; + color: var(--theia-editor-foreground); + background-color: var(--theia-editor-background); + overflow: auto; + height: 120px; + flex: 1; } .certificate-uploader-dialog .certificate-list .certificate-row { - display: flex; - padding: 6px 10px 5px 10px + display: flex; + padding: 6px 10px 5px 10px; } .certificate-uploader-dialog .certificate-list .certificate-row:hover { - background-color: var(--theia-list-activeSelectionBackground); + background-color: var(--theia-list-activeSelectionBackground); } .certificate-uploader-dialog .upload-status { - display: flex; - align-items: center; - flex: 1; + display: flex; + align-items: center; + flex: 1; } -.certificate-uploader-dialog .success { - display: flex; - align-items: center; - color: #1DA086; +.certificate-uploader-dialog .success { + display: flex; + align-items: center; + color: #1da086; } -.certificate-uploader-dialog .warn { - color: #C11F09; +.certificate-uploader-dialog .warn { + color: #c11f09; } -.certificate-uploader-dialog .status-icon { - margin-right: 10px; +.certificate-uploader-dialog .status-icon { + margin-right: 10px; } .certificate-uploader-dialog .add-cert-btn { - display: flex; - align-items: center; - justify-content: space-between; + display: flex; + align-items: center; + justify-content: space-between; } .certificate-uploader-dialog .add-cert-btn .caret { - margin-left: 6px; + margin-left: 6px; } .certificate-add { - padding: 16px; - border-radius: 3px; - border: 1px solid var(--theia-editorWidget-border); - color: var(--theia-editorWidget-foreground); - background-color: var(--theia-editorWidget-background); + padding: 16px; + border-radius: 3px; + border: 1px solid var(--theia-editorWidget-border); + color: var(--theia-editorWidget-foreground); + background-color: var(--theia-editorWidget-background); } .certificate-add input { - margin-top: 12px; - padding: 0 12px; - width: 100%; - box-sizing: border-box; - + margin-top: 12px; + padding: 0 12px; + width: 100%; + box-sizing: border-box; } diff --git a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css index 8982aaf34..62938e219 100644 --- a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css +++ b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css @@ -23,8 +23,7 @@ -webkit-mask-size: 100%; } -.p-mod-current -.cloud-sketchbook-tree-icon { +.p-mod-current .cloud-sketchbook-tree-icon { background-color: var(--theia-foreground); -webkit-mask: url(../icons/arduino-cloud-filled.svg); -webkit-mask-position: center; @@ -33,49 +32,49 @@ } .sketchbook-trees-container -.p-TabBar[data-orientation="horizontal"] -> .p-TabBar-content { + .p-TabBar[data-orientation="horizontal"] + > .p-TabBar-content { justify-content: center; border-bottom: 1px solid var(--theia-tree-indentGuidesStroke); } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab -> div.p-TabBar-tabLabel { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab + > div.p-TabBar-tabLabel { display: none; width: 0px; max-width: 0px; } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab -> div.p-TabBar-tabCloseIcon { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab + > div.p-TabBar-tabCloseIcon { display: none; width: 0px; max-width: 0px; } .sketchbook-trees-container -.p-TabBar[data-orientation="horizontal"] -.p-TabBar-tab { + .p-TabBar[data-orientation="horizontal"] + .p-TabBar-tab { min-width: 55px; } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab { padding-left: 20px; } .sketchbook-trees-container -.p-Widget.p-TabBar.p-DockPanel-tabBar -> ul -> li.p-TabBar-tab.p-mod-current { + .p-Widget.p-TabBar.p-DockPanel-tabBar + > ul + > li.p-TabBar-tab.p-mod-current { border-bottom: 2px solid var(--theia-activityBar-activeBorder); } diff --git a/arduino-ide-extension/src/browser/style/custom-codicon.css b/arduino-ide-extension/src/browser/style/custom-codicon.css index 48542e4ff..4acf37315 100644 --- a/arduino-ide-extension/src/browser/style/custom-codicon.css +++ b/arduino-ide-extension/src/browser/style/custom-codicon.css @@ -1,4 +1,4 @@ -.codicon-debug-alt:before { - font-family: 'FontAwesome' !important; - content: "\e905" !important -} \ No newline at end of file +.codicon-debug-alt:before { + font-family: "FontAwesome" !important; + content: "\e905" !important; +} diff --git a/arduino-ide-extension/src/browser/style/dialogs.css b/arduino-ide-extension/src/browser/style/dialogs.css index cb73abd60..1592057a3 100644 --- a/arduino-ide-extension/src/browser/style/dialogs.css +++ b/arduino-ide-extension/src/browser/style/dialogs.css @@ -9,7 +9,7 @@ total = padding + margin = 96px */ max-width: calc(100% - 96px) !important; - + min-width: 424px; max-height: 560px; padding: 0 var(--arduino-button-height); @@ -56,14 +56,23 @@ } .p-Widget.dialogOverlay .dialogControl .spinner, -.p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow .spinner { +.p-Widget.dialogOverlay + .dialogBlock + .dialogContent + .dialogSection + .dialogRow + .spinner { background: var(--theia-icon-loading) center center no-repeat; animation: theia-spin 1.25s linear infinite; width: 30px; height: 30px; } -.p-Widget.dialogOverlay .dialogBlock .dialogContent .dialogSection .dialogRow:first-child { +.p-Widget.dialogOverlay + .dialogBlock + .dialogContent + .dialogSection + .dialogRow:first-child { margin-top: 0px; height: 32px; } @@ -78,7 +87,7 @@ } .fa.disabled { - opacity: .4; + opacity: 0.4; } @media only screen and (max-height: 560px) { diff --git a/arduino-ide-extension/src/browser/style/editor.css b/arduino-ide-extension/src/browser/style/editor.css index 81c3a3fdd..db4266569 100644 --- a/arduino-ide-extension/src/browser/style/editor.css +++ b/arduino-ide-extension/src/browser/style/editor.css @@ -1,7 +1,9 @@ /* Show the dirty indicator on unclosable widgets. On hover, it should still show the dot instead of the X. */ /* https://github.com/arduino/arduino-pro-ide/issues/380 */ -.p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable.a-mod-uncloseable.theia-mod-dirty > .p-TabBar-tabCloseIcon:before { - content: "\ea71"; +.p-TabBar.theia-app-centers + .p-TabBar-tab.p-mod-closable.a-mod-uncloseable.theia-mod-dirty + > .p-TabBar-tabCloseIcon:before { + content: "\ea71"; } .monaco-list-row.show-file-icons.focused { diff --git a/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css b/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css index e49f5e5aa..718d840e6 100644 --- a/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css +++ b/arduino-ide-extension/src/browser/style/firmware-uploader-dialog.css @@ -1,31 +1,31 @@ #firmware-uploader-dialog-container > .dialogBlock { - width: 600px; + width: 600px; } .firmware-uploader-dialog .theia-select { - border: none !important; + border: none !important; } .firmware-uploader-dialog .arduino-select__control { - height: 31px; - background: var(--theia-input-background) !important; + height: 31px; + background: var(--theia-input-background) !important; } -.firmware-uploader-dialog .dialogRow > button{ - margin-right: 3px; +.firmware-uploader-dialog .dialogRow > button { + margin-right: 3px; } .firmware-uploader-dialog #firmware-select { - flex: unset; + flex: unset; } -.firmware-uploader-dialog .success { - color: #1DA086; +.firmware-uploader-dialog .success { + color: #1da086; } -.firmware-uploader-dialog .warn { - color: #C11F09; +.firmware-uploader-dialog .warn { + color: #c11f09; } -.firmware-uploader-dialog .status-icon { - margin-right: 10px; +.firmware-uploader-dialog .status-icon { + margin-right: 10px; } diff --git a/arduino-ide-extension/src/browser/style/fonts.css b/arduino-ide-extension/src/browser/style/fonts.css index 93a855910..806b6f047 100644 --- a/arduino-ide-extension/src/browser/style/fonts.css +++ b/arduino-ide-extension/src/browser/style/fonts.css @@ -1,699 +1,698 @@ @font-face { - font-family: 'Open Sans'; - src: url('fonts/OpenSans-Regular-webfont.woff') format('woff'); + font-family: "Open Sans"; + src: url("fonts/OpenSans-Regular-webfont.woff") format("woff"); } @font-face { - font-family: 'Open Sans Bold'; - src: url('fonts/OpenSans-Bold-webfont.woff') format('woff'); + font-family: "Open Sans Bold"; + src: url("fonts/OpenSans-Bold-webfont.woff") format("woff"); } @font-face { - font-family: 'FontAwesome'; - src: - url('fonts/FontAwesome.ttf?h959em') format('truetype'), - url('fonts/FontAwesome.woff?h959em') format('woff'), - url('fonts/FontAwesome.svg?h959em#FontAwesome') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; + font-family: "FontAwesome"; + src: url("fonts/FontAwesome.ttf?h959em") format("truetype"), + url("fonts/FontAwesome.woff?h959em") format("woff"), + url("fonts/FontAwesome.svg?h959em#FontAwesome") format("svg"); + font-weight: normal; + font-style: normal; + font-display: block; } .fa { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'FontAwesome' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: "FontAwesome" !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } .fa-arduino-verify:before { - content: "\e90b"; + content: "\e90b"; } .fa-arduino-upload:before { - content: "\e90c"; + content: "\e90c"; } .fa-arduino-monitor:before { - content: "\e90d"; + content: "\e90d"; } .fa-arduino-sketch-tabs-menu:before { - content: "\e90e"; + content: "\e90e"; } .fa-arduino-plotter:before { - content: "\e90f"; + content: "\e90f"; } .fa-fa-check:before { - content: "\e90a"; + content: "\e90a"; } .fa-arduino-technology-3dimensionscube:before { - content: "\e906"; + content: "\e906"; } .fa-arduino-technology-usb:before { - content: "\e907"; + content: "\e907"; } .fa-arduino-technology-connection:before { - content: "\e908"; + content: "\e908"; } .fa-arduino-technology-bluetooth:before { - content: "\e909"; + content: "\e909"; } .fa-arduino-debugger:before { - content: "\e905"; + content: "\e905"; } .fa-arduino-search:before { - content: "\e901"; + content: "\e901"; } .fa-arduino-boards:before { - content: "\e902"; + content: "\e902"; } .fa-arduino-library:before { - content: "\e903"; + content: "\e903"; } .fa-arduino-folder:before { - content: "\e904"; + content: "\e904"; } .fa-reload:before { - content: "\e900"; + content: "\e900"; } .fa-asterisk:before { - content: "\f069"; + content: "\f069"; } .fa-plus:before { - content: "\f067"; + content: "\f067"; } .fa-question:before { - content: "\f128"; + content: "\f128"; } .fa-minus:before { - content: "\f068"; + content: "\f068"; } .fa-music:before { - content: "\f001"; + content: "\f001"; } .fa-search:before { - content: "\f002"; + content: "\f002"; } .fa-envelope-o:before { - content: "\f003"; + content: "\f003"; } .fa-heart:before { - content: "\f004"; + content: "\f004"; } .fa-star:before { - content: "\f005"; + content: "\f005"; } .fa-star-o:before { - content: "\f006"; + content: "\f006"; } .fa-user:before { - content: "\f007"; + content: "\f007"; } .fa-film:before { - content: "\f008"; + content: "\f008"; } .fa-th-large:before { - content: "\f009"; + content: "\f009"; } .fa-th:before { - content: "\f00a"; + content: "\f00a"; } .fa-th-list:before { - content: "\f00b"; + content: "\f00b"; } .fa-close:before { - content: "\f00d"; + content: "\f00d"; } .fa-remove:before { - content: "\f00d"; + content: "\f00d"; } .fa-times:before { - content: "\f00d"; + content: "\f00d"; } .fa-search-plus:before { - content: "\f00e"; + content: "\f00e"; } .fa-search-minus:before { - content: "\f010"; + content: "\f010"; } .fa-power-off:before { - content: "\f011"; + content: "\f011"; } .fa-signal:before { - content: "\f012"; + content: "\f012"; } .fa-cog:before { - content: "\f013"; + content: "\f013"; } .fa-gear:before { - content: "\f013"; + content: "\f013"; } .fa-trash-o:before { - content: "\f014"; + content: "\f014"; } .fa-home:before { - content: "\f015"; + content: "\f015"; } .fa-file-o:before { - content: "\f016"; + content: "\f016"; } .fa-clock-o:before { - content: "\f017"; + content: "\f017"; } .fa-download:before { - content: "\f019"; + content: "\f019"; } .fa-arrow-circle-o-down:before { - content: "\f01a"; + content: "\f01a"; } .fa-arrow-circle-o-up:before { - content: "\f01b"; + content: "\f01b"; } .fa-inbox:before { - content: "\f01c"; + content: "\f01c"; } .fa-play-circle-o:before { - content: "\f01d"; + content: "\f01d"; } .fa-repeat:before { - content: "\f01e"; + content: "\f01e"; } .fa-rotate-right:before { - content: "\f01e"; + content: "\f01e"; } .fa-refresh:before { - content: "\f021"; + content: "\f021"; } .fa-list-alt:before { - content: "\f022"; + content: "\f022"; } .fa-lock:before { - content: "\f023"; + content: "\f023"; } .fa-volume-off:before { - content: "\f026"; + content: "\f026"; } .fa-volume-down:before { - content: "\f027"; + content: "\f027"; } .fa-volume-up:before { - content: "\f028"; + content: "\f028"; } .fa-qrcode:before { - content: "\f029"; + content: "\f029"; } .fa-tag:before { - content: "\f02b"; + content: "\f02b"; } .fa-tags:before { - content: "\f02c"; + content: "\f02c"; } .fa-book:before { - content: "\f02d"; + content: "\f02d"; } .fa-print:before { - content: "\f02f"; + content: "\f02f"; } .fa-text-height:before { - content: "\f034"; + content: "\f034"; } .fa-text-width:before { - content: "\f035"; + content: "\f035"; } .fa-align-left:before { - content: "\f036"; + content: "\f036"; } .fa-align-center:before { - content: "\f037"; + content: "\f037"; } .fa-align-right:before { - content: "\f038"; + content: "\f038"; } .fa-align-justify:before { - content: "\f039"; + content: "\f039"; } .fa-list:before { - content: "\f03a"; + content: "\f03a"; } .fa-dedent:before { - content: "\f03b"; + content: "\f03b"; } .fa-outdent:before { - content: "\f03b"; + content: "\f03b"; } .fa-indent:before { - content: "\f03c"; + content: "\f03c"; } .fa-pencil:before { - content: "\f040"; + content: "\f040"; } .fa-adjust:before { - content: "\f042"; + content: "\f042"; } .fa-edit:before { - content: "\f044"; + content: "\f044"; } .fa-pencil-square-o:before { - content: "\f044"; + content: "\f044"; } .fa-share-square-o:before { - content: "\f045"; + content: "\f045"; } .fa-check-square-o:before { - content: "\f046"; + content: "\f046"; } .fa-arrows:before { - content: "\f047"; + content: "\f047"; } .fa-step-backward:before { - content: "\f048"; + content: "\f048"; } .fa-fast-backward:before { - content: "\f049"; + content: "\f049"; } .fa-backward:before { - content: "\f04a"; + content: "\f04a"; } .fa-play:before { - content: "\f04b"; + content: "\f04b"; } .fa-pause:before { - content: "\f04c"; + content: "\f04c"; } .fa-stop:before { - content: "\f04d"; + content: "\f04d"; } .fa-forward:before { - content: "\f04e"; + content: "\f04e"; } .fa-fast-forward:before { - content: "\f050"; + content: "\f050"; } .fa-step-forward:before { - content: "\f051"; + content: "\f051"; } .fa-eject:before { - content: "\f052"; + content: "\f052"; } .fa-chevron-left:before { - content: "\f053"; + content: "\f053"; } .fa-chevron-right:before { - content: "\f054"; + content: "\f054"; } .fa-plus-circle:before { - content: "\f055"; + content: "\f055"; } .fa-minus-circle:before { - content: "\f056"; + content: "\f056"; } .fa-times-circle:before { - content: "\f057"; + content: "\f057"; } .fa-check-circle:before { - content: "\f058"; + content: "\f058"; } .fa-question-circle:before { - content: "\f059"; + content: "\f059"; } .fa-info-circle:before { - content: "\f05a"; + content: "\f05a"; } .fa-crosshairs:before { - content: "\f05b"; + content: "\f05b"; } .fa-times-circle-o:before { - content: "\f05c"; + content: "\f05c"; } .fa-check-circle-o:before { - content: "\f05d"; + content: "\f05d"; } .fa-ban:before { - content: "\f05e"; + content: "\f05e"; } .fa-arrow-left:before { - content: "\f060"; + content: "\f060"; } .fa-arrow-right:before { - content: "\f061"; + content: "\f061"; } .fa-arrow-up:before { - content: "\f062"; + content: "\f062"; } .fa-arrow-down:before { - content: "\f063"; + content: "\f063"; } .fa-mail-forward:before { - content: "\f064"; + content: "\f064"; } .fa-share:before { - content: "\f064"; + content: "\f064"; } .fa-expand:before { - content: "\f065"; + content: "\f065"; } .fa-compress:before { - content: "\f066"; + content: "\f066"; } .fa-exclamation-circle:before { - content: "\f06a"; + content: "\f06a"; } .fa-eye:before { - content: "\f06e"; + content: "\f06e"; } .fa-eye-slash:before { - content: "\f070"; + content: "\f070"; } .fa-exclamation-triangle:before { - content: "\f071"; + content: "\f071"; } .fa-warning:before { - content: "\f071"; + content: "\f071"; } .fa-calendar:before { - content: "\f073"; + content: "\f073"; } .fa-random:before { - content: "\f074"; + content: "\f074"; } .fa-comment:before { - content: "\f075"; + content: "\f075"; } .fa-chevron-up:before { - content: "\f077"; + content: "\f077"; } .fa-chevron-down:before { - content: "\f078"; + content: "\f078"; } .fa-retweet:before { - content: "\f079"; + content: "\f079"; } .fa-folder:before { - content: "\f07b"; + content: "\f07b"; } .fa-folder-open:before { - content: "\f07c"; + content: "\f07c"; } .fa-arrows-v:before { - content: "\f07d"; + content: "\f07d"; } .fa-arrows-h:before { - content: "\f07e"; + content: "\f07e"; } .fa-cogs:before { - content: "\f085"; + content: "\f085"; } .fa-gears:before { - content: "\f085"; + content: "\f085"; } .fa-star-half:before { - content: "\f089"; + content: "\f089"; } .fa-heart-o:before { - content: "\f08a"; + content: "\f08a"; } .fa-sign-out:before { - content: "\f08b"; + content: "\f08b"; } .fa-thumb-tack:before { - content: "\f08d"; + content: "\f08d"; } .fa-external-link:before { - content: "\f08e"; + content: "\f08e"; } .fa-sign-in:before { - content: "\f090"; + content: "\f090"; } .fa-upload:before { - content: "\f093"; + content: "\f093"; } .fa-square-o:before { - content: "\f096"; + content: "\f096"; } .fa-bookmark-o:before { - content: "\f097"; + content: "\f097"; } .fa-hdd-o:before { - content: "\f0a0"; + content: "\f0a0"; } .fa-bell-o:before { - content: "\f0a2"; + content: "\f0a2"; } .fa-certificate:before { - content: "\f0a3"; + content: "\f0a3"; } .fa-arrow-circle-left:before { - content: "\f0a8"; + content: "\f0a8"; } .fa-arrow-circle-right:before { - content: "\f0a9"; + content: "\f0a9"; } .fa-arrow-circle-up:before { - content: "\f0aa"; + content: "\f0aa"; } .fa-arrow-circle-down:before { - content: "\f0ab"; + content: "\f0ab"; } .fa-wrench:before { - content: "\f0ad"; + content: "\f0ad"; } .fa-tasks:before { - content: "\f0ae"; + content: "\f0ae"; } .fa-filter:before { - content: "\f0b0"; + content: "\f0b0"; } .fa-briefcase:before { - content: "\f0b1"; + content: "\f0b1"; } .fa-arrows-alt:before { - content: "\f0b2"; + content: "\f0b2"; } .fa-cloud:before { - content: "\f0c2"; + content: "\f0c2"; } .fa-copy:before { - content: "\f0c5"; + content: "\f0c5"; } .fa-files-o:before { - content: "\f0c5"; + content: "\f0c5"; } .fa-floppy-o:before { - content: "\f0c7"; + content: "\f0c7"; } .fa-save:before { - content: "\f0c7"; + content: "\f0c7"; } .fa-square:before { - content: "\f0c8"; + content: "\f0c8"; } .fa-bars:before { - content: "\f0c9"; + content: "\f0c9"; } .fa-navicon:before { - content: "\f0c9"; + content: "\f0c9"; } .fa-reorder:before { - content: "\f0c9"; + content: "\f0c9"; } .fa-list-ul:before { - content: "\f0ca"; + content: "\f0ca"; } .fa-list-ol:before { - content: "\f0cb"; + content: "\f0cb"; } .fa-table:before { - content: "\f0ce"; + content: "\f0ce"; } .fa-caret-down:before { - content: "\f0d7"; + content: "\f0d7"; } .fa-caret-up:before { - content: "\f0d8"; + content: "\f0d8"; } .fa-caret-left:before { - content: "\f0d9"; + content: "\f0d9"; } .fa-caret-right:before { - content: "\f0da"; + content: "\f0da"; } .fa-columns:before { - content: "\f0db"; + content: "\f0db"; } .fa-sort:before { - content: "\f0dc"; + content: "\f0dc"; } .fa-unsorted:before { - content: "\f0dc"; + content: "\f0dc"; } .fa-sort-desc:before { - content: "\f0dd"; + content: "\f0dd"; } .fa-sort-down:before { - content: "\f0dd"; + content: "\f0dd"; } .fa-sort-asc:before { - content: "\f0de"; + content: "\f0de"; } .fa-sort-up:before { - content: "\f0de"; + content: "\f0de"; } .fa-rotate-left:before { - content: "\f0e2"; + content: "\f0e2"; } .fa-undo:before { - content: "\f0e2"; + content: "\f0e2"; } .fa-file-text-o:before { - content: "\f0f6"; + content: "\f0f6"; } .fa-plus-square:before { - content: "\f0fe"; + content: "\f0fe"; } .fa-angle-double-left:before { - content: "\f100"; + content: "\f100"; } .fa-angle-double-right:before { - content: "\f101"; + content: "\f101"; } .fa-angle-double-up:before { - content: "\f102"; + content: "\f102"; } .fa-angle-double-down:before { - content: "\f103"; + content: "\f103"; } .fa-angle-left:before { - content: "\f104"; + content: "\f104"; } .fa-angle-right:before { - content: "\f105"; + content: "\f105"; } .fa-angle-up:before { - content: "\f106"; + content: "\f106"; } .fa-angle-down:before { - content: "\f107"; + content: "\f107"; } .fa-circle-o:before { - content: "\f10c"; + content: "\f10c"; } .fa-spinner:before { - content: "\f110"; + content: "\f110"; } .fa-circle:before { - content: "\f111"; + content: "\f111"; } .fa-mail-reply:before { - content: "\f112"; + content: "\f112"; } .fa-reply:before { - content: "\f112"; + content: "\f112"; } .fa-folder-o:before { - content: "\f114"; + content: "\f114"; } .fa-folder-open-o:before { - content: "\f115"; + content: "\f115"; } .fa-keyboard-o:before { - content: "\f11c"; + content: "\f11c"; } .fa-terminal:before { - content: "\f120"; + content: "\f120"; } .fa-code:before { - content: "\f121"; + content: "\f121"; } .fa-mail-reply-all:before { - content: "\f122"; + content: "\f122"; } .fa-reply-all:before { - content: "\f122"; + content: "\f122"; } .fa-star-half-empty:before { - content: "\f123"; + content: "\f123"; } .fa-star-half-full:before { - content: "\f123"; + content: "\f123"; } .fa-star-half-o:before { - content: "\f123"; + content: "\f123"; } .fa-crop:before { - content: "\f125"; + content: "\f125"; } .fa-code-fork:before { - content: "\f126"; + content: "\f126"; } .fa-chain-broken:before { - content: "\f127"; + content: "\f127"; } .fa-unlink:before { - content: "\f127"; + content: "\f127"; } .fa-info:before { - content: "\f129"; + content: "\f129"; } .fa-exclamation:before { - content: "\f12a"; + content: "\f12a"; } .fa-rocket:before { - content: "\f135"; + content: "\f135"; } .fa-maxcdn:before { - content: "\f136"; + content: "\f136"; } .fa-chevron-circle-left:before { - content: "\f137"; + content: "\f137"; } .fa-chevron-circle-right:before { - content: "\f138"; + content: "\f138"; } .fa-chevron-circle-up:before { - content: "\f139"; + content: "\f139"; } .fa-chevron-circle-down:before { - content: "\f13a"; + content: "\f13a"; } .fa-ellipsis-h:before { - content: "\f141"; + content: "\f141"; } .fa-long-arrow-down:before { - content: "\f175"; + content: "\f175"; } .fa-long-arrow-up:before { - content: "\f176"; + content: "\f176"; } .fa-long-arrow-left:before { - content: "\f177"; + content: "\f177"; } .fa-long-arrow-right:before { - content: "\f178"; + content: "\f178"; } .fa-microchip:before { - content: "\f2db"; + content: "\f2db"; } .fa-arduino-cloud-download:before { - content: "\e910"; + content: "\e910"; } .fa-arduino-cloud-upload:before { - content: "\e914"; + content: "\e914"; } .fa-arduino-cloud:before { - content: "\e915"; + content: "\e915"; } .fa-arduino-cloud-filled:before { - content: "\e912"; + content: "\e912"; } .fa-arduino-cloud-offline:before { - content: "\e913"; + content: "\e913"; } .fa-arduino-cloud-filled-offline:before { - content: "\e911"; + content: "\e911"; } diff --git a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css index 9282a5b11..5d5592baf 100644 --- a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css +++ b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css @@ -1,124 +1,124 @@ #ide-updater-dialog-container > .dialogBlock { - width: 546px; + width: 546px; } .ide-updater-dialog .bold { - font-weight: bold; + font-weight: bold; } .ide-updater-dialog--pre-download { - display: flex; + display: flex; } .ide-updater-dialog--downloading { - flex: 1; + flex: 1; } .ide-updater-dialog--logo-container { - margin-right: var(--arduino-button-height); + margin-right: var(--arduino-button-height); } .ide-updater-dialog--logo { - background: url('./ide-logo.png') round; - width: 52px; - height: 52px; + background: url("./ide-logo.png") round; + width: 52px; + height: 52px; } .dialogContent.ide-updater-dialog - .ide-updater-dialog--content - .ide-updater-dialog--new-version-text.dialogSection { - display: flex; - flex: 1; - flex-direction: column; - margin-top: 0; - min-width: 0; + .ide-updater-dialog--content + .ide-updater-dialog--new-version-text.dialogSection { + display: flex; + flex: 1; + flex-direction: column; + margin-top: 0; + min-width: 0; } .ide-updater-dialog .changelog { - color: var(--theia-editor-foreground); - background-color: var(--theia-editor-background); - font-size: 12px; - overflow: auto; - padding: 0 12px; - cursor: text; - width: 100%; + color: var(--theia-editor-foreground); + background-color: var(--theia-editor-background); + font-size: 12px; + overflow: auto; + padding: 0 12px; + cursor: text; + width: 100%; } .ide-updater-dialog .changelog .fallback { - min-height: 180px; - width: 100%; - display: flex; + min-height: 180px; + width: 100%; + display: flex; } .ide-updater-dialog .changelog .fallback .spinner { - align-self: center; + align-self: center; } .dialogContent.ide-updater-dialog - .ide-updater-dialog--content - .ide-updater-dialog--new-version-text - .dialogRow.changelog-container { - align-items: flex-start; - border: 1px solid var(--theia-editorWidget-border); - border-radius: 2px; - overflow: auto; - max-height: 180px; + .ide-updater-dialog--content + .ide-updater-dialog--new-version-text + .dialogRow.changelog-container { + align-items: flex-start; + border: 1px solid var(--theia-editorWidget-border); + border-radius: 2px; + overflow: auto; + max-height: 180px; } .ide-updater-dialog .changelog a { - color: var(--theia-textLink-foreground); + color: var(--theia-textLink-foreground); } .ide-updater-dialog .changelog a:hover { - text-decoration: underline; - cursor: pointer; + text-decoration: underline; + cursor: pointer; } .ide-updater-dialog .changelog code { - background: var(--theia-textBlockQuote-background); - border-radius: 2px; - padding: 0 2px; + background: var(--theia-textBlockQuote-background); + border-radius: 2px; + padding: 0 2px; } .ide-updater-dialog .changelog a code { - color: var(--theia-textLink-foreground); + color: var(--theia-textLink-foreground); } .ide-updater-dialog .buttons-container { - display: flex; - justify-content: flex-end; - margin-top: var(--arduino-button-height); + display: flex; + justify-content: flex-end; + margin-top: var(--arduino-button-height); } .ide-updater-dialog .buttons-container a.theia-button { - text-decoration: none; - display: flex; - align-items: center; - justify-content: center; + text-decoration: none; + display: flex; + align-items: center; + justify-content: center; } .ide-updater-dialog .buttons-container a.theia-button:hover { - color: var(--theia-button-foreground); + color: var(--theia-button-foreground); } .ide-updater-dialog .buttons-container .push { - margin-right: auto; + margin-right: auto; } .ide-updater-dialog--content { - max-height: 100%; - overflow: hidden; - display: flex; + max-height: 100%; + overflow: hidden; + display: flex; } #ide-updater-dialog-container .skip-version-button { - margin-left: 79px; - margin-right: auto; + margin-left: 79px; + margin-right: auto; } /* https://github.com/arduino/arduino-ide/pull/2027#issuecomment-1533174638 */ /* https://github.com/eclipse-theia/theia/commit/1b5ff9ee459df14cedc0e8266dd02dae93fcd1bf#diff-d8d45a890507a01141c010ad4a6891edf2ae727cfa6dfe604cebbd667812cccbR68 */ /* Use normal whitespace handling for the changelog content in the update dialog. */ .p-Widget.dialogOverlay .dialogContent.ide-updater-dialog { - white-space: normal; + white-space: normal; } diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index 4f9422aa7..fd7887ae1 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -1,175 +1,177 @@ -@import './list-widget.css'; -@import './boards-config-dialog.css'; -@import './main.css'; -@import './dialogs.css'; -@import './monitor.css'; -@import './arduino-select.css'; -@import './status-bar.css'; -@import './terminal.css'; -@import './editor.css'; -@import './settings-dialog.css'; -@import './firmware-uploader-dialog.css'; -@import './ide-updater-dialog.css'; -@import './certificate-uploader-dialog.css'; -@import './user-fields-dialog.css'; -@import './debug.css'; -@import './sketchbook.css'; -@import './cloud-sketchbook.css'; -@import './fonts.css'; -@import './custom-codicon.css'; -@import './progress-bar.css'; -@import './settings-step-input.css'; +@import "./list-widget.css"; +@import "./boards-config-dialog.css"; +@import "./main.css"; +@import "./dialogs.css"; +@import "./monitor.css"; +@import "./arduino-select.css"; +@import "./status-bar.css"; +@import "./terminal.css"; +@import "./editor.css"; +@import "./settings-dialog.css"; +@import "./firmware-uploader-dialog.css"; +@import "./ide-updater-dialog.css"; +@import "./certificate-uploader-dialog.css"; +@import "./user-fields-dialog.css"; +@import "./debug.css"; +@import "./sketchbook.css"; +@import "./cloud-sketchbook.css"; +@import "./fonts.css"; +@import "./custom-codicon.css"; +@import "./progress-bar.css"; +@import "./settings-step-input.css"; :root { - --arduino-button-height: 28px; + --arduino-button-height: 28px; } /* Revive of the `--theia-icon-loading`. The variable has been removed from Theia while IDE2 still uses is. */ /* The SVG icons are still part of Theia (1.31.1) */ /* https://github.com/arduino/arduino-ide/pull/1662#issuecomment-1324997134 */ body { - --theia-icon-loading: url(../icons/loading-light.svg); - --theia-icon-loading-warning: url(../icons/loading-dark.svg); + --theia-icon-loading: url(../icons/loading-light.svg); + --theia-icon-loading-warning: url(../icons/loading-dark.svg); } body.theia-dark { - --theia-icon-loading: url(../icons/loading-dark.svg); - --theia-icon-loading-warning: url(../icons/loading-light.svg); + --theia-icon-loading: url(../icons/loading-dark.svg); + --theia-icon-loading-warning: url(../icons/loading-light.svg); } .theia-input.warning:focus { - outline-width: 1px; - outline-style: solid; - outline-offset: -1px; - opacity: 1 !important; - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); + outline-width: 1px; + outline-style: solid; + outline-offset: -1px; + opacity: 1 !important; + color: var(--theia-warningForeground); + background-color: var(--theia-warningBackground); } .theia-input.warning { - background-color: var(--theia-warningBackground); + background-color: var(--theia-warningBackground); } .theia-input.warning::placeholder { - color: var(--theia-warningForeground); - background-color: var(--theia-warningBackground); + color: var(--theia-warningForeground); + background-color: var(--theia-warningBackground); } .theia-input.error:focus { - outline-width: 1px; - outline-style: solid; - outline-offset: -1px; - opacity: 1 !important; - color: var(--theia-errorForeground); - background-color: var(--theia-errorBackground); + outline-width: 1px; + outline-style: solid; + outline-offset: -1px; + opacity: 1 !important; + color: var(--theia-errorForeground); + background-color: var(--theia-errorBackground); } .theia-input.error { - background-color: var(--theia-errorBackground); + background-color: var(--theia-errorBackground); } .theia-input.error::placeholder { - color: var(--theia-errorForeground); - background-color: var(--theia-errorBackground); + color: var(--theia-errorForeground); + background-color: var(--theia-errorBackground); } /* Makes the sidepanel a bit wider when opening the widget */ .p-DockPanel-widget { - min-width: 220px; - min-height: 20px; - height: 220px; + min-width: 220px; + min-height: 20px; + height: 220px; } /* Overrule the default Theia CSS button styles. */ button.theia-button, .theia-button { - align-items: center; - display: flex; - font-family: 'Open Sans Bold',sans-serif; - font-style: normal; - font-weight: 700; - font-size: 14px; - justify-content: center; - cursor: pointer; - letter-spacing: .01em; - line-height: 24px; - outline: none; - padding: 0 16px; - position: relative; - text-align: center; - text-decoration: none; - border-width: 2px; - border-radius: 32px; - text-transform: uppercase; - transition: none; - box-shadow: none; + align-items: center; + display: flex; + font-family: "Open Sans Bold", sans-serif; + font-style: normal; + font-weight: 700; + font-size: 14px; + justify-content: center; + cursor: pointer; + letter-spacing: 0.01em; + line-height: 24px; + outline: none; + padding: 0 16px; + position: relative; + text-align: center; + text-decoration: none; + border-width: 2px; + border-radius: 32px; + text-transform: uppercase; + transition: none; + box-shadow: none; } button.theia-button { - height: var(--arduino-button-height); - max-width: none; + height: var(--arduino-button-height); + max-width: none; } .theia-button:active, .theia-button:focus { - box-shadow: 0 0 0 2px var(--theia-focusBorder); + box-shadow: 0 0 0 2px var(--theia-focusBorder); } button.theia-button.secondary { - border: 2px solid var(--theia-secondaryButton-foreground); + border: 2px solid var(--theia-secondaryButton-foreground); } -button.theia-button[disabled], .theia-button[disabled] { - opacity: 0.5; - color: var(--theia-button-foreground); - background-color: var(--theia-button-background); +button.theia-button[disabled], +.theia-button[disabled] { + opacity: 0.5; + color: var(--theia-button-foreground); + background-color: var(--theia-button-background); } -button.secondary[disabled], .theia-button.secondary[disabled] { - color: var(--theia-secondaryButton-foreground); - background-color: var(--theia-secondaryButton-background); +button.secondary[disabled], +.theia-button.secondary[disabled] { + color: var(--theia-secondaryButton-foreground); + background-color: var(--theia-secondaryButton-background); } button.theia-button.message-box-dialog-button { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; } /* To make the progress-bar slightly thicker, and use the color from the status bar */ .theia-progress-bar-container { - width: 100%; - height: 4px; + width: 100%; + height: 4px; } .theia-progress-bar { - height: 4px; - width: 3%; - animation: progress-animation 1.3s 0s infinite - cubic-bezier(0.645, 0.045, 0.355, 1); + height: 4px; + width: 3%; + animation: progress-animation 1.3s 0s infinite + cubic-bezier(0.645, 0.045, 0.355, 1); } .theia-notification-item-progressbar { - height: 4px; - width: 66%; + height: 4px; + width: 66%; } .flex-line { - display: flex; - align-items: center; - white-space: nowrap; + display: flex; + align-items: center; + white-space: nowrap; } .fa-reload { - font-size: 14px; + font-size: 14px; } -.debug-toolbar .debug-action>div { - font-family: var(--theia-ui-font-family); - font-size: var(--theia-ui-font-size0); - display: flex; - align-items: center; - align-self: center; - justify-content: center; - min-height: inherit; +.debug-toolbar .debug-action > div { + font-family: var(--theia-ui-font-family); + font-size: var(--theia-ui-font-size0); + display: flex; + align-items: center; + align-self: center; + justify-content: center; + min-height: inherit; } diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index 19bd45150..2c74ec86a 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -1,6 +1,6 @@ .library-tab-icon { - -webkit-mask: url('../icons/library-tab-icon.svg'); - mask: url('../icons/library-tab-icon.svg'); + -webkit-mask: url("../icons/library-tab-icon.svg"); + mask: url("../icons/library-tab-icon.svg"); } .arduino-list-widget { @@ -82,7 +82,7 @@ } .component-list-item .header .title .name { - font-family: 'Open Sans Bold'; + font-family: "Open Sans Bold"; font-style: normal; font-weight: 700; font-size: 14px; @@ -112,7 +112,9 @@ display: inline-block; justify-self: end; text-align: center; - background-color: var(--theia-arduino-toolbar-dropdown-option-backgroundHover); + background-color: var( + --theia-arduino-toolbar-dropdown-option-backgroundHover + ); padding: 2px 4px 2px 4px; font-size: 12px; max-height: calc(1em + 4px); @@ -131,7 +133,7 @@ display: flex; flex-direction: column; padding-top: 4px; - font-family: 'Open Sans'; + font-family: "Open Sans"; font-style: normal; font-weight: 400; font-size: 12px; @@ -175,8 +177,20 @@ max-width: 8px; } -div.filterable-list-container > div > div > div > div:nth-child(1) > div.separator :first-child, -div.filterable-list-container > div > div > div > div:nth-child(1) > div.separator :last-child { +div.filterable-list-container + > div + > div + > div + > div:nth-child(1) + > div.separator + :first-child, +div.filterable-list-container + > div + > div + > div + > div:nth-child(1) + > div.separator + :last-child { display: none; } @@ -202,11 +216,11 @@ div.filterable-list-container > div > div > div > div:nth-child(1) > div.separat } .component-list-item .theia-button.secondary.no-border { - border: 2px solid var(--theia-button-foreground) + border: 2px solid var(--theia-button-foreground); } .component-list-item .theia-button.secondary.no-border:hover { - border: 2px solid var(--theia-secondaryButton-foreground) + border: 2px solid var(--theia-secondaryButton-foreground); } .component-list-item .theia-button { diff --git a/arduino-ide-extension/src/browser/style/main.css b/arduino-ide-extension/src/browser/style/main.css index 2e310e212..942d3c684 100644 --- a/arduino-ide-extension/src/browser/style/main.css +++ b/arduino-ide-extension/src/browser/style/main.css @@ -1,11 +1,12 @@ -#theia-bottom-content-panel .p-TabBar[data-orientation='horizontal'].theia-app-bottom { +#theia-bottom-content-panel + .p-TabBar[data-orientation="horizontal"].theia-app-bottom { background: var(--theia-editorGroupHeader-tabsBackground); } /* Avoid the Intellisense widget may be cover by the bottom panel partially. TODO: This issue may be resolved after monaco-editor upgrade */ #theia-main-content-panel { - z-index: auto + z-index: auto; } #theia-main-content-panel div[id^="code-editor-opener"] { @@ -23,7 +24,6 @@ border-radius: 1px; } - .p-TabBar-toolbar .item.arduino-tool-item > div { display: flex; justify-content: center; @@ -42,9 +42,15 @@ background: var(--theia-arduino-toolbar-button-hoverBackground); } -.p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-monitor, -.p-TabBar-toolbar .item.arduino-tool-item.enabled:hover > div.toggle-serial-plotter { - background-color: var(--theia-arduino-toolbar-button-secondary-hoverBackground); +.p-TabBar-toolbar + .item.arduino-tool-item.enabled:hover + > div.toggle-serial-monitor, +.p-TabBar-toolbar + .item.arduino-tool-item.enabled:hover + > div.toggle-serial-plotter { + background-color: var( + --theia-arduino-toolbar-button-secondary-hoverBackground + ); border-radius: 14px; } @@ -55,14 +61,14 @@ } .item.arduino-tool-item.toggled { - background-color: unset; - opacity: 1; - border: none; + background-color: unset; + opacity: 1; + border: none; } .item.arduino-tool-item.toggled .arduino-verify-sketch--toolbar, .item.arduino-tool-item.toggled .arduino-upload-sketch--toolbar { - background-color: var(--theia-arduino-toolbar-toggleBackground) !important; + background-color: var(--theia-arduino-toolbar-toggleBackground) !important; } .arduino-tool-icon { @@ -91,7 +97,7 @@ } .arduino-start-debug-icon { - -webkit-mask: url('../icons/debug-dark.svg') 50% 60%; + -webkit-mask: url("../icons/debug-dark.svg") 50% 60%; -webkit-mask-size: 70%; -webkit-mask-repeat: no-repeat; display: flex; @@ -175,7 +181,12 @@ background-color: var(--theia-terminal-background); } -.theia-output .monaco-editor .lines-content.monaco-editor-background .view-lines .view-line .mtk1:not(.theia-output-error):not(.theia-output-warning) { +.theia-output + .monaco-editor + .lines-content.monaco-editor-background + .view-lines + .view-line + .mtk1:not(.theia-output-error):not(.theia-output-warning) { color: var(--theia-terminal-foreground); } diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index dfbed12aa..3ee6e65c8 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -1,6 +1,6 @@ .monitor-tab-icon { - -webkit-mask: url('../icons/monitor-tab-icon.svg'); - mask: url('../icons/monitor-tab-icon.svg'); + -webkit-mask: url("../icons/monitor-tab-icon.svg"); + mask: url("../icons/monitor-tab-icon.svg"); } .serial-monitor { @@ -10,8 +10,8 @@ } .serial-monitor-messages { - white-space: 'pre'; - font-family: monospace + white-space: "pre"; + font-family: monospace; } .serial-monitor-messages pre { diff --git a/arduino-ide-extension/src/browser/style/progress-bar.css b/arduino-ide-extension/src/browser/style/progress-bar.css index d395ece92..7ccc816f9 100644 --- a/arduino-ide-extension/src/browser/style/progress-bar.css +++ b/arduino-ide-extension/src/browser/style/progress-bar.css @@ -1,32 +1,32 @@ .progress-bar { - margin-top: 20px; + margin-top: 20px; } .progress-bar--outer { - background: var(--theia-editorWidget-background); - border-radius: 11px; - height: 6px; - position: relative; - overflow: hidden; + background: var(--theia-editorWidget-background); + border-radius: 11px; + height: 6px; + position: relative; + overflow: hidden; } .progress-bar--inner { - transition: width 1s; - height: 100%; - background: var(--theia-progressBar-background); - border-radius: 11px; + transition: width 1s; + height: 100%; + background: var(--theia-progressBar-background); + border-radius: 11px; } .progress-bar--percentage { - align-items: flex-end; - display: flex; - height: 40px; - justify-content: center; - margin-top: 10px; - width: 100%; + align-items: flex-end; + display: flex; + height: 40px; + justify-content: center; + margin-top: 10px; + width: 100%; } .progress-bar--percentage-text { - font-size: 14px; - line-height: 24px; + font-size: 14px; + line-height: 24px; } diff --git a/arduino-ide-extension/src/browser/style/settings-dialog.css b/arduino-ide-extension/src/browser/style/settings-dialog.css index 61e806ec0..6702e736d 100644 --- a/arduino-ide-extension/src/browser/style/settings-dialog.css +++ b/arduino-ide-extension/src/browser/style/settings-dialog.css @@ -1,5 +1,5 @@ #arduino-settings-dialog-container > .dialogBlock { - height: 531px;; + height: 531px; max-width: 740px !important; width: calc(100% - 96px); } diff --git a/arduino-ide-extension/src/browser/style/settings-step-input.css b/arduino-ide-extension/src/browser/style/settings-step-input.css index 194dadc3c..e7a07f5fd 100644 --- a/arduino-ide-extension/src/browser/style/settings-step-input.css +++ b/arduino-ide-extension/src/browser/style/settings-step-input.css @@ -1,5 +1,5 @@ .settings-step-input-container { - position: relative + position: relative; } .settings-step-input-element::-webkit-inner-spin-button, @@ -25,7 +25,7 @@ right: 14px; } -.settings-step-input-container:hover>.settings-step-input-buttons-container { +.settings-step-input-container:hover > .settings-step-input-buttons-container { display: flex; } @@ -47,4 +47,4 @@ .settings-step-input-button:hover { background: rgba(128, 128, 128, 0.8); -} \ No newline at end of file +} diff --git a/arduino-ide-extension/src/browser/style/sketchbook.css b/arduino-ide-extension/src/browser/style/sketchbook.css index 3ff64000c..33363bc6b 100644 --- a/arduino-ide-extension/src/browser/style/sketchbook.css +++ b/arduino-ide-extension/src/browser/style/sketchbook.css @@ -1,37 +1,36 @@ .sketchbook-tab-icon { - -webkit-mask: url('./sketchbook.svg'); - mask: url('./sketchbook.svg'); + -webkit-mask: url("./sketchbook.svg"); + mask: url("./sketchbook.svg"); } .p-TabBar-tabIcon.sketchbook-tree-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./sketchbook-tree-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: 19px !important; - height: var(--theia-icon-size); - -webkit-mask-size: 100%; + background-color: var(--theia-foreground); + -webkit-mask: url(./sketchbook-tree-icon.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + width: 19px !important; + height: var(--theia-icon-size); + -webkit-mask-size: 100%; } -.p-mod-current -.sketchbook-tree-icon { - background-color: var(--theia-foreground); - -webkit-mask: url(./sketchbook-tree-icon-filled.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - -webkit-mask-size: 100%; +.p-mod-current .sketchbook-tree-icon { + background-color: var(--theia-foreground); + -webkit-mask: url(./sketchbook-tree-icon-filled.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 100%; } .sketchbook-trees-container { - height: 100%; + height: 100%; } .sketchbook-trees-container .create-new { - min-height: 58px; - height: 58px; - display: flex; - align-items: center; - justify-content: center; + min-height: 58px; + height: 58px; + display: flex; + align-items: center; + justify-content: center; } /* By default, theia-button has a left-margin. IDE2 does not need the left margin @@ -39,44 +38,43 @@ for the _New Remote? Sketch_. Otherwise, the button does not fit the default widget width. */ .sketchbook-trees-container .create-new .theia-button { - margin-left: unset; + margin-left: unset; } .sketchbook-tree__opts { - background-color: var(--theia-foreground); - -webkit-mask: url(./sketchbook-opts-icon.svg); - -webkit-mask-position: center; - -webkit-mask-repeat: no-repeat; - width: var(--theia-icon-size); - height: var(--theia-icon-size); + background-color: var(--theia-foreground); + -webkit-mask: url(./sketchbook-opts-icon.svg); + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + width: var(--theia-icon-size); + height: var(--theia-icon-size); } .active-sketch { - font-weight: 500; - background-color: var(--theia-list-activeSelectionBackground) !important; - color: var(--theia-list-activeSelectionForeground) !important; - + font-weight: 500; + background-color: var(--theia-list-activeSelectionBackground) !important; + color: var(--theia-list-activeSelectionForeground) !important; } #arduino-sketchbook-tree-widget .theia-TreeNode { - line-height: 30px; + line-height: 30px; } #arduino-sketchbook-tree-widget .theia-TreeNodeSegmentGrow { - flex: 1; + flex: 1; } .theia-TreeNode .sketchbook-commands-icons { - display: none; + display: none; } .theia-TreeNode:hover .sketchbook-commands-icons, .theia-TreeNode.theia-mod-selected .sketchbook-commands-icons { - display: block; + display: block; } .theia-Tree:focus .theia-TreeNode.theia-mod-selected, .theia-Tree .ReactVirtualized__List:focus .theia-TreeNode.theia-mod-selected { - background: var(--theia-list-inactiveSelectionBackground); - color: var(--theia-list-inactiveSelectionForeground) !important; + background: var(--theia-list-inactiveSelectionBackground); + color: var(--theia-list-inactiveSelectionForeground) !important; } diff --git a/arduino-ide-extension/src/browser/style/user-fields-dialog.css b/arduino-ide-extension/src/browser/style/user-fields-dialog.css index 89a7b149d..19e97b7ac 100644 --- a/arduino-ide-extension/src/browser/style/user-fields-dialog.css +++ b/arduino-ide-extension/src/browser/style/user-fields-dialog.css @@ -1,32 +1,32 @@ .user-fields-container { - max-height: 332px; - overflow: auto; - padding: 2px; + max-height: 332px; + overflow: auto; + padding: 2px; } .user-fields-list { - margin: 16px 0; + margin: 16px 0; } .user-fields-dialog-content { - width: 408px; - max-height: 491px; + width: 408px; + max-height: 491px; } .user-fields-dialog-content .field-label { - color: var(--theia-editorWidget-foreground); - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 21px; - letter-spacing: 0.01em; - text-align: left; + color: var(--theia-editorWidget-foreground); + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 21px; + letter-spacing: 0.01em; + text-align: left; } .user-fields-dialog-content .theia-input { - flex-grow: 1; + flex-grow: 1; } .user-fields-dialog-content .button-container { - justify-content: flex-end; + justify-content: flex-end; } diff --git a/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts b/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts index 0ecf1a373..0f5728d94 100644 --- a/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts +++ b/arduino-ide-extension/src/browser/theia/core/tab-bar-decorator.ts @@ -1,4 +1,8 @@ -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { Title, Widget } from '@theia/core/shared/@phosphor/widgets'; import { EditorWidget } from '@theia/editor/lib/browser'; diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts index 2718b0579..524461b53 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts @@ -4,13 +4,15 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { EditorServiceOverrides, MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; +import { + EditorServiceOverrides, + MonacoEditor, +} from '@theia/monaco/lib/browser/monaco-editor'; import { MonacoEditorProvider as TheiaMonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider'; import { SketchesServiceClientImpl } from '../../sketches-service-client-impl'; import * as monaco from '@theia/monaco-editor-core'; import type { ReferencesModel } from '@theia/monaco-editor-core/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel'; - type CancelablePromise = Promise<ReferencesModel> & { cancel: () => void; }; @@ -39,7 +41,9 @@ export class MonacoEditorProvider extends TheiaMonacoEditorProvider { private installCustomReferencesController(editor: MonacoEditor): Disposable { const control = editor.getControl(); - const referencesController: any = control.getContribution('editor.contrib.referencesController'); + const referencesController: any = control.getContribution( + 'editor.contrib.referencesController' + ); const originalToggleWidget = referencesController.toggleWidget; const toDispose = new DisposableCollection(); const toDisposeBeforeToggleWidget = new DisposableCollection(); diff --git a/arduino-ide-extension/src/browser/theia/navigator/navigator-contribution.ts b/arduino-ide-extension/src/browser/theia/navigator/navigator-contribution.ts index 23d46aaa1..eb508fc04 100644 --- a/arduino-ide-extension/src/browser/theia/navigator/navigator-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/navigator/navigator-contribution.ts @@ -14,7 +14,8 @@ export class FileNavigatorContribution extends TheiaFileNavigatorContribution { constructor( @inject(FileNavigatorPreferences) protected override readonly fileNavigatorPreferences: FileNavigatorPreferences, - @inject(OpenerService) protected override readonly openerService: OpenerService, + @inject(OpenerService) + protected override readonly openerService: OpenerService, @inject(FileNavigatorFilter) protected override readonly fileNavigatorFilter: FileNavigatorFilter, @inject(WorkspaceService) diff --git a/arduino-ide-extension/src/browser/theia/output/output-toolbar-contribution.ts b/arduino-ide-extension/src/browser/theia/output/output-toolbar-contribution.ts index cf0e524a6..660c93ddc 100644 --- a/arduino-ide-extension/src/browser/theia/output/output-toolbar-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/output/output-toolbar-contribution.ts @@ -8,7 +8,9 @@ import { OutputToolbarContribution as TheiaOutputToolbarContribution } from '@th @injectable() export class OutputToolbarContribution extends TheiaOutputToolbarContribution { - override async registerToolbarItems(registry: TabBarToolbarRegistry): Promise<void> { + override async registerToolbarItems( + registry: TabBarToolbarRegistry + ): Promise<void> { await super.registerToolbarItems(registry); // Why is it async? // It's a hack. Currently, it's not possible to unregister a toolbar contribution via API. ( diff --git a/arduino-ide-extension/src/browser/theia/scm/scm-contribution.ts b/arduino-ide-extension/src/browser/theia/scm/scm-contribution.ts index cc759db5b..cda8bd58a 100644 --- a/arduino-ide-extension/src/browser/theia/scm/scm-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/scm/scm-contribution.ts @@ -8,7 +8,10 @@ export class ScmContribution extends TheiaScmContribution { // NOOP } - protected override setStatusBarEntry(id: string, entry: StatusBarEntry): void { + protected override setStatusBarEntry( + id: string, + entry: StatusBarEntry + ): void { // NOOP } } diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/README.md b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/README.md index c5de38c9e..e80c20c50 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/README.md +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/README.md @@ -1 +1 @@ -Sketchcache = is a cache that holds sketches and fileStat objects. \ No newline at end of file +Sketchcache = is a cache that holds sketches and fileStat objects. diff --git a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts index 6e112eefa..528aab2ae 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-sketchbook-widget.ts @@ -1,4 +1,8 @@ -import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import { CloudSketchbookCompositeWidget } from './cloud-sketchbook-composite-widget'; import { SketchbookWidget } from '../sketchbook/sketchbook-widget'; import { ArduinoPreferences } from '../../arduino-preferences'; diff --git a/arduino-ide-extension/src/common/protocol/library-service.ts b/arduino-ide-extension/src/common/protocol/library-service.ts index e8a32d901..a45b9757c 100644 --- a/arduino-ide-extension/src/common/protocol/library-service.ts +++ b/arduino-ide-extension/src/common/protocol/library-service.ts @@ -67,7 +67,7 @@ export namespace LibrarySearch { 'Contributed', 'Retired', ] as const; - export type Type = typeof TypeLiterals[number]; + export type Type = (typeof TypeLiterals)[number]; export namespace Type { export function is(arg: unknown): arg is Type { return typeof arg === 'string' && TypeLiterals.includes(arg as Type); @@ -96,7 +96,7 @@ export namespace LibrarySearch { 'Timing', 'Uncategorized', ] as const; - export type Topic = typeof TopicLiterals[number]; + export type Topic = (typeof TopicLiterals)[number]; export namespace Topic { export function is(arg: unknown): arg is Topic { return typeof arg === 'string' && TopicLiterals.includes(arg as Topic); diff --git a/arduino-ide-extension/tsconfig.json b/arduino-ide-extension/tsconfig.json index 222831ace..35c426010 100644 --- a/arduino-ide-extension/tsconfig.json +++ b/arduino-ide-extension/tsconfig.json @@ -14,18 +14,11 @@ "resolveJsonModule": true, "target": "ES2017", "outDir": "lib", - "lib": [ - "ES2017", - "dom" - ], + "lib": ["ES2017", "dom"], "jsx": "react", "sourceMap": true, "skipLibCheck": true }, - "include": [ - "src" - ], - "files": [ - "../node_modules/nsfw/index.d.ts" - ] + "include": ["src"], + "files": ["../node_modules/nsfw/index.d.ts"] } diff --git a/docs/README.md b/docs/README.md index 802441583..391c66267 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,41 +3,45 @@ Arduino IDE provides a Cloud Sketchbook feature that can be used to upload sketches to Arduino Cloud. ![](assets/remote.png) - - In order to use this feature, a user must be registered on [Arduino Cloud](https://store.arduino.cc/digital/create) and logged in. This feature is completely optional and can be disabled in the IDE via the _"File > Advanced > Hide Cloud Sketchbook"_ menu item. ## Developer guide + A developer could use the content of this repo to create a customized version of this feature and implement a different remote storage as follows: ### 1. Changing remote connection parameters in the Preferences panel (be careful while editing the Preferences panel!) + Here a screenshot of the Preferences panel ![](assets/preferences.png) + - The settings under _Arduino > Auth_ should be edited to match the OAuth2 configuration of your custom cloud sketchbook storage - The setting under _Arduino > Sketch Sync Endpoint_ should be edited to point to your custom cloud sketchbook storage service + ### 2. Implementing the Arduino Cloud Store APIs for your custom cloud sketchbook storage + Following the API Reference below: -| API Call | OpenAPI documentation | -| ------------- | ------------- | -| DELETE create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletedir | -| DELETE create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletefile | -| GET create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_list | -| GET create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_read | -| GET create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_search | -| GET create/v2/sketches/byID/{id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byID | -| GET create/v2/sketches/byPath{path} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byPath | -| POST create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_mkdir | -| POST create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_write | -| POST create/v2/sketches/{sketch.id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_edit | -| POST create/v3/files/cp | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_copy | -| POST create/v3/files/mv | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_move | -| PUT create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_create | +| API Call | OpenAPI documentation | +| ----------------------------------------------------- | --------------------------------------------------------------------- | +| DELETE create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletedir | +| DELETE create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_deletefile | +| GET create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_list | +| GET create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_read | +| GET create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_search | +| GET create/v2/sketches/byID/{id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byID | +| GET create/v2/sketches/byPath{path} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_byPath | +| POST create/v2/files/d/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_mkdir | +| POST create/v2/files/f/$HOME/sketches_v2{posixPath} | https://api2.arduino.cc/create/docs#!/files95v2/files_v2_write | +| POST create/v2/sketches/{sketch.id} | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_edit | +| POST create/v3/files/cp | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_copy | +| POST create/v3/files/mv | https://api2.arduino.cc/create/docs#!/files95v3/files_v3_move | +| PUT create/v2/sketches | https://api2.arduino.cc/create/docs#!/sketches95v2/sketches_v2_create | ## Build the Arduino IDE with this extension To build the Arduino IDE with this extension, run the following in a terminal. On Windows, use _Git Bash_. + ```sh ./bootstrap.sh -``` \ No newline at end of file +``` diff --git a/docs/internal/Arm.md b/docs/internal/Arm.md index c36e16fb3..2c6e711d8 100644 --- a/docs/internal/Arm.md +++ b/docs/internal/Arm.md @@ -3,56 +3,69 @@ Building the Pro IDE on Linux `armv7l` (aka `armhf`) and `aarch64` (aka `arm64`): 1. Install Node.js 16.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script): - ``` - wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash - ``` - Restart your shell then: - ``` - nvm install 16 - nvm use 16 - ``` - Verify: - ``` - node -v - ``` + + ``` + wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash + ``` + + Restart your shell then: + + ``` + nvm install 16 + nvm use 16 + ``` + + Verify: + + ``` + node -v + ``` 2. Install [Yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable): - Configure the Debian package repository; otherwise, you will pull a different `yarn`. - ``` - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list - ``` - Install: - ``` - sudo apt update && sudo apt install --no-install-recommends yarn - ``` - Verify: - ``` - yarn -v - 1.22.4 - ``` + Configure the Debian package repository; otherwise, you will pull a different `yarn`. + + ``` + curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - + echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list + ``` + + Install: + + ``` + sudo apt update && sudo apt install --no-install-recommends yarn + ``` + + Verify: + + ``` + yarn -v + 1.22.4 + ``` 3. Other native [dependencies](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites): - - `make`, - - `gcc`, - - `pkg-config`, - - `build-essential`, - - `libx11-dev`, and - - `libxkbfile-dev` + + - `make`, + - `gcc`, + - `pkg-config`, + - `build-essential`, + - `libx11-dev`, and + - `libxkbfile-dev` 4. [Build it](../development.md#build-from-source) from the source: - ``` - git clone https://github.com/arduino/arduino-ide.git \ - && cd arduino-ide \ - && yarn \ - && yarn rebuild:electron \ - && yarn --cwd ./electron-app start - ``` + + ``` + git clone https://github.com/arduino/arduino-ide.git \ + && cd arduino-ide \ + && yarn \ + && yarn rebuild:electron \ + && yarn --cwd ./electron-app start + ``` 5. Troubleshoot - If you see [`ENOSPC` errors](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#linux) at runtime, increase the default `inotify` watches: - ``` - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - ``` + If you see [`ENOSPC` errors](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#linux) at runtime, increase the default `inotify` watches: + + ``` + echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p + ``` diff --git a/electron-app/resources/preload.html b/electron-app/resources/preload.html index 9843ac97d..e11e1c6bb 100644 --- a/electron-app/resources/preload.html +++ b/electron-app/resources/preload.html @@ -57,7 +57,7 @@ @keyframes preload-spinner { 0% { - transform: scale(1.0); + transform: scale(1); } 50% { @@ -65,48 +65,127 @@ } 100% { - transform: scale(1.0); + transform: scale(1); } } </style> </head> <body> - <div class='spinner-container'> - <div class='custom-spinner'> - <svg id="spinner" xmlns="http://www.w3.org/2000/svg" width="2499" height="2500" - viewBox="0 0 1372.201 1372.684"> - <path fill="#00979D" stroke="#81C9CB" stroke-width=".932" stroke-miterlimit="10" - d="M1371.701 686.024c0 378.658-306.972 685.605-685.549 685.605C307.451 1371.629.5 1064.682.5 686.024.5 307.455 307.451.483 686.152.483c378.594.001 685.549 306.972 685.549 685.541z" /> - <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.3" y1="16.071" x2="1354.901" y2="16.071" - gradientTransform="matrix(1 0 0 -1 16.8 702.696)"> + <div class="spinner-container"> + <div class="custom-spinner"> + <svg + id="spinner" + xmlns="http://www.w3.org/2000/svg" + width="2499" + height="2500" + viewBox="0 0 1372.201 1372.684" + > + <path + fill="#00979D" + stroke="#81C9CB" + stroke-width=".932" + stroke-miterlimit="10" + d="M1371.701 686.024c0 378.658-306.972 685.605-685.549 685.605C307.451 1371.629.5 1064.682.5 686.024.5 307.455 307.451.483 686.152.483c378.594.001 685.549 306.972 685.549 685.541z" + /> + <linearGradient + id="a" + gradientUnits="userSpaceOnUse" + x1="-16.3" + y1="16.071" + x2="1354.901" + y2="16.071" + gradientTransform="matrix(1 0 0 -1 16.8 702.696)" + > <stop offset=".117" stop-color="#fff" stop-opacity="0" /> - <stop offset=".252" stop-color="#c0d1d3" stop-opacity=".153" /> - <stop offset=".387" stop-color="#91b3b7" stop-opacity=".306" /> - <stop offset=".52" stop-color="#6d9fa3" stop-opacity=".457" /> - <stop offset=".65" stop-color="#4d9195" stop-opacity=".604" /> - <stop offset=".776" stop-color="#30888b" stop-opacity=".746" /> - <stop offset=".895" stop-color="#148386" stop-opacity=".881" /> + <stop + offset=".252" + stop-color="#c0d1d3" + stop-opacity=".153" + /> + <stop + offset=".387" + stop-color="#91b3b7" + stop-opacity=".306" + /> + <stop + offset=".52" + stop-color="#6d9fa3" + stop-opacity=".457" + /> + <stop + offset=".65" + stop-color="#4d9195" + stop-opacity=".604" + /> + <stop + offset=".776" + stop-color="#30888b" + stop-opacity=".746" + /> + <stop + offset=".895" + stop-color="#148386" + stop-opacity=".881" + /> <stop offset="1" stop-color="#008184" /> </linearGradient> - <linearGradient id="b" gradientUnits="userSpaceOnUse" x1="-16.8" y1="16.071" x2="1355.401" y2="16.071" - gradientTransform="matrix(1 0 0 -1 16.8 702.696)"> + <linearGradient + id="b" + gradientUnits="userSpaceOnUse" + x1="-16.8" + y1="16.071" + x2="1355.401" + y2="16.071" + gradientTransform="matrix(1 0 0 -1 16.8 702.696)" + > <stop offset="0" stop-color="#fff" stop-opacity="0" /> - <stop offset=".153" stop-color="#c0d1d3" stop-opacity=".153" /> - <stop offset=".306" stop-color="#91b3b7" stop-opacity=".306" /> - <stop offset=".457" stop-color="#6d9fa3" stop-opacity=".457" /> - <stop offset=".604" stop-color="#4d9195" stop-opacity=".604" /> - <stop offset=".746" stop-color="#30888b" stop-opacity=".746" /> - <stop offset=".881" stop-color="#148386" stop-opacity=".881" /> + <stop + offset=".153" + stop-color="#c0d1d3" + stop-opacity=".153" + /> + <stop + offset=".306" + stop-color="#91b3b7" + stop-opacity=".306" + /> + <stop + offset=".457" + stop-color="#6d9fa3" + stop-opacity=".457" + /> + <stop + offset=".604" + stop-color="#4d9195" + stop-opacity=".604" + /> + <stop + offset=".746" + stop-color="#30888b" + stop-opacity=".746" + /> + <stop + offset=".881" + stop-color="#148386" + stop-opacity=".881" + /> <stop offset="1" stop-color="#008184" /> </linearGradient> - <path opacity=".5" fill="url(#a)" stroke="url(#b)" stroke-miterlimit="10" - d="M1371.701 686.595c0 378.65-306.972 685.606-685.549 685.606C307.451 1372.201.5 1065.23.5 686.595.5 308.019 307.451 1.048 686.152 1.048c378.594.016 685.549 306.97 685.549 685.547z" /> + <path + opacity=".5" + fill="url(#a)" + stroke="url(#b)" + stroke-miterlimit="10" + d="M1371.701 686.595c0 378.65-306.972 685.606-685.549 685.606C307.451 1372.201.5 1065.23.5 686.595.5 308.019 307.451 1.048 686.152 1.048c378.594.016 685.549 306.97 685.549 685.547z" + /> <g fill="#FFF"> <path - d="M947.959 931.196c-12.909 0-26.127-.929-39.127-2.864-108.978-15.554-181.848-93.822-222.665-153.989-40.946 60.166-113.811 138.512-222.74 154.045a275.864 275.864 0 0 1-39.133 2.785c-67.753 0-131.358-25.217-179.201-71.003-48.299-46.165-74.951-108.114-74.951-174.171 0-66.14 26.651-128.004 75.021-174.253 47.797-45.793 111.449-70.936 179.231-70.936 12.918 0 26.067.928 39.023 2.783 108.932 15.535 181.794 93.813 222.743 153.99 40.825-60.177 113.689-138.432 222.658-153.99 13-1.863 26.148-2.783 39.066-2.783 67.753 0 131.401 25.208 179.197 70.936 48.345 46.249 74.937 108.113 74.937 174.253 0 66.057-26.524 128.006-74.868 174.171-47.881 45.785-111.434 71.026-179.191 71.026M734.42 686.024c21.283 40.534 84.067 141.676 186.692 156.375 8.984 1.236 18.028 1.923 26.839 1.923 92.185 0 167.225-71.002 167.225-158.322s-75.023-158.321-167.291-158.321c-8.812 0-17.853.629-26.753 1.921-102.644 14.664-165.428 115.806-186.712 156.424M424.393 527.702c-92.308 0-167.36 70.998-167.36 158.321 0 87.305 75.021 158.322 167.245 158.322 8.852 0 17.897-.688 26.879-1.922 102.629-14.697 165.394-115.783 186.689-156.375-21.237-40.535-84.061-141.761-186.689-156.376-8.877-1.341-17.945-1.97-26.764-1.97" /> + d="M947.959 931.196c-12.909 0-26.127-.929-39.127-2.864-108.978-15.554-181.848-93.822-222.665-153.989-40.946 60.166-113.811 138.512-222.74 154.045a275.864 275.864 0 0 1-39.133 2.785c-67.753 0-131.358-25.217-179.201-71.003-48.299-46.165-74.951-108.114-74.951-174.171 0-66.14 26.651-128.004 75.021-174.253 47.797-45.793 111.449-70.936 179.231-70.936 12.918 0 26.067.928 39.023 2.783 108.932 15.535 181.794 93.813 222.743 153.99 40.825-60.177 113.689-138.432 222.658-153.99 13-1.863 26.148-2.783 39.066-2.783 67.753 0 131.401 25.208 179.197 70.936 48.345 46.249 74.937 108.113 74.937 174.253 0 66.057-26.524 128.006-74.868 174.171-47.881 45.785-111.434 71.026-179.191 71.026M734.42 686.024c21.283 40.534 84.067 141.676 186.692 156.375 8.984 1.236 18.028 1.923 26.839 1.923 92.185 0 167.225-71.002 167.225-158.322s-75.023-158.321-167.291-158.321c-8.812 0-17.853.629-26.753 1.921-102.644 14.664-165.428 115.806-186.712 156.424M424.393 527.702c-92.308 0-167.36 70.998-167.36 158.321 0 87.305 75.021 158.322 167.245 158.322 8.852 0 17.897-.688 26.879-1.922 102.629-14.697 165.394-115.783 186.689-156.375-21.237-40.535-84.061-141.761-186.689-156.376-8.877-1.341-17.945-1.97-26.764-1.97" + /> <path - d="M354.37 662.051h152.625v49.181H354.37zM1016.484 662.051h-51.671v-51.747h-49.348v51.747h-51.648v49.181h51.648v51.737h49.348v-51.737h51.671z" /> + d="M354.37 662.051h152.625v49.181H354.37zM1016.484 662.051h-51.671v-51.747h-49.348v51.747h-51.648v49.181h51.648v51.737h49.348v-51.737h51.671z" + /> </g> </svg> </div> diff --git a/lerna.json b/lerna.json index 3b455fab5..13216973d 100644 --- a/lerna.json +++ b/lerna.json @@ -7,4 +7,4 @@ "stream": true } } -} \ No newline at end of file +} diff --git a/scripts/themes/theme-tokens-pull.js b/scripts/themes/theme-tokens-pull.js index b0e9238cc..117a4a196 100644 --- a/scripts/themes/theme-tokens-pull.js +++ b/scripts/themes/theme-tokens-pull.js @@ -6,13 +6,13 @@ const JSONBIN_ID = process.env.JSONBIN_ID; const destFolder = './scripts/themes/tokens'; -if (!fs.existsSync(destFolder)){ +if (!fs.existsSync(destFolder)) { fs.mkdirSync(destFolder); } let req = new XMLHttpRequest(); -req.open('GET', 'https://api.jsonbin.io/v3/b/'+ JSONBIN_ID +'/latest', true); +req.open('GET', 'https://api.jsonbin.io/v3/b/' + JSONBIN_ID + '/latest', true); req.setRequestHeader('X-Master-Key', JSONBIN_MASTER_KEY); req.send(); diff --git a/scripts/update-version.js b/scripts/update-version.js index fea65ed27..e787dba44 100644 --- a/scripts/update-version.js +++ b/scripts/update-version.js @@ -6,41 +6,54 @@ const semver = require('semver'); const targetVersion = process.argv.slice(2).shift(); const repoRootPath = path.join(__dirname, '..'); -const { version: currentVersion } = require(path.join(repoRootPath, 'package.json')); +const { version: currentVersion } = require(path.join( + repoRootPath, + 'package.json' +)); if (!targetVersion) { - console.error('Target version was not specified. Target version must be a valid semver. Use: `yarn update:version x.y.z` to update the versions.'); - process.exit(1); + console.error( + 'Target version was not specified. Target version must be a valid semver. Use: `yarn update:version x.y.z` to update the versions.' + ); + process.exit(1); } if (!semver.valid(targetVersion)) { - console.error(`Target version '${targetVersion}' is not a valid semver. Use: \`yarn update:version x.y.z\` to update the versions.`); - process.exit(1); + console.error( + `Target version '${targetVersion}' is not a valid semver. Use: \`yarn update:version x.y.z\` to update the versions.` + ); + process.exit(1); } if (!semver.gt(targetVersion, currentVersion)) { - console.error(`Target version '${targetVersion}' must be greater than the current version '${currentVersion}'.`); - process.exit(1); + console.error( + `Target version '${targetVersion}' must be greater than the current version '${currentVersion}'.` + ); + process.exit(1); } -console.log(`🛠️ Updating current version from '${currentVersion}' to '${targetVersion}':`); +console.log( + `🛠️ Updating current version from '${currentVersion}' to '${targetVersion}':` +); for (const toUpdate of [ - path.join(repoRootPath, 'package.json'), - path.join(repoRootPath, 'electron-app', 'package.json'), - path.join(repoRootPath, 'arduino-ide-extension', 'package.json') + path.join(repoRootPath, 'package.json'), + path.join(repoRootPath, 'electron-app', 'package.json'), + path.join(repoRootPath, 'arduino-ide-extension', 'package.json'), ]) { - process.stdout.write(` Updating ${toUpdate}'...`); - const pkg = require(toUpdate); - pkg.version = targetVersion; - if ('dependencies' in pkg) { - for (const dep of Object.keys(pkg['dependencies'])) { - if (dep.startsWith('arduino-ide-')) { - pkg['dependencies'][dep] = targetVersion; - } - } + process.stdout.write(` Updating ${toUpdate}'...`); + const pkg = require(toUpdate); + pkg.version = targetVersion; + if ('dependencies' in pkg) { + for (const dep of Object.keys(pkg['dependencies'])) { + if (dep.startsWith('arduino-ide-')) { + pkg['dependencies'][dep] = targetVersion; + } } - fs.writeFileSync(toUpdate, JSON.stringify(pkg, null, 2) + '\n'); - process.stdout.write(` ✅ Done.\n`); + } + fs.writeFileSync(toUpdate, JSON.stringify(pkg, null, 2) + '\n'); + process.stdout.write(` ✅ Done.\n`); } -console.log(`Done. The new version is '${targetVersion}' now. Commit your changes and tag the code for the release. 🚢`); +console.log( + `Done. The new version is '${targetVersion}' now. Commit your changes and tag the code for the release. 🚢` +); From bb4b1450e3be65d4efb44728ca316e26387eb75e Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 24 Aug 2023 15:42:19 +0200 Subject: [PATCH 251/384] chore: use Node.js `>=18.17.0` remove `msvs_version` npm config on win32 Ref: nodejs/node-gyp#2822 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .github/workflows/build.yml | 8 +-- .github/workflows/check-i18n-task.yml | 4 +- .github/workflows/compose-full-changelog.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 4 +- .github/workflows/i18n-weekly-pull.yml | 4 +- docs/internal/Arm.md | 71 -------------------- docs/internal/Ubuntu.md | 18 +++-- package.json | 2 +- 8 files changed, 21 insertions(+), 92 deletions(-) delete mode 100644 docs/internal/Arm.md diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 222e00548..a444f83c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,10 +85,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 16.14 + - name: Install Node.js 18.17 uses: actions/setup-node@v3 with: - node-version: '16.14' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' cache: 'yarn' @@ -131,10 +131,6 @@ jobs: export CSC_FOR_PULL_REQUEST=true fi - if [ "${{ runner.OS }}" = "Windows" ]; then - npm config set msvs_version 2017 --global - fi - npx node-gyp install yarn install --immutable diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index bf50d7624..8def1faf4 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -58,10 +58,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Install Node.js 16.14 + - name: Install Node.js 18.17 uses: actions/setup-node@v3 with: - node-version: '16.14' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' cache: 'yarn' diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 02e4a72cd..4b0fe4914 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -8,7 +8,7 @@ on: env: CHANGELOG_ARTIFACTS: changelog # See: https://github.com/actions/setup-node/#readme - NODE_VERSION: 16.x + NODE_VERSION: '18.17' jobs: create-changelog: diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 303ad5116..402449d29 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -16,10 +16,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 16.14 + - name: Install Node.js 18.17 uses: actions/setup-node@v3 with: - node-version: '16.14' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' cache: 'yarn' diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index ac4d45809..088031e77 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -16,10 +16,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 16.14 + - name: Install Node.js 18.17 uses: actions/setup-node@v3 with: - node-version: '16.14' + node-version: '18.17' registry-url: 'https://registry.npmjs.org' cache: 'yarn' diff --git a/docs/internal/Arm.md b/docs/internal/Arm.md deleted file mode 100644 index 2c6e711d8..000000000 --- a/docs/internal/Arm.md +++ /dev/null @@ -1,71 +0,0 @@ -### Building from the sources on Linux ARM - -Building the Pro IDE on Linux `armv7l` (aka `armhf`) and `aarch64` (aka `arm64`): - -1. Install Node.js 16.x with [nvm](https://github.com/nvm-sh/nvm#install--update-script): - - ``` - wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash - ``` - - Restart your shell then: - - ``` - nvm install 16 - nvm use 16 - ``` - - Verify: - - ``` - node -v - ``` - -2. Install [Yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable): - - Configure the Debian package repository; otherwise, you will pull a different `yarn`. - - ``` - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list - ``` - - Install: - - ``` - sudo apt update && sudo apt install --no-install-recommends yarn - ``` - - Verify: - - ``` - yarn -v - 1.22.4 - ``` - -3. Other native [dependencies](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites): - - - `make`, - - `gcc`, - - `pkg-config`, - - `build-essential`, - - `libx11-dev`, and - - `libxkbfile-dev` - -4. [Build it](../development.md#build-from-source) from the source: - - ``` - git clone https://github.com/arduino/arduino-ide.git \ - && cd arduino-ide \ - && yarn \ - && yarn rebuild:electron \ - && yarn --cwd ./electron-app start - ``` - -5. Troubleshoot - - If you see [`ENOSPC` errors](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#linux) at runtime, increase the default `inotify` watches: - - ``` - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - ``` diff --git a/docs/internal/Ubuntu.md b/docs/internal/Ubuntu.md index de556410c..a7ddc5f1c 100644 --- a/docs/internal/Ubuntu.md +++ b/docs/internal/Ubuntu.md @@ -1,6 +1,8 @@ ### Building and start the app from the sources on Ubuntu Linux -Tested and verified on Ubuntu 18.04.4. The source will be checked out to `~/dev/git/arduino-ide`. +Tested and verified on Ubuntu 22.04. The source will be checked out to `~/dev/git/arduino-ide`. + +> ❗ This is an all-in-one script to create production-ready, minified code; you will need ~16GB of RAM to run it. This script will install libraries you might already have on your system and change the default Node.js version you do not want. If you look for documentation on development, please reference [this](../development.md#prerequisites) section instead. ``` #!/bin/bash -i @@ -11,16 +13,17 @@ sudo apt update \ gcc \ curl \ make \ - python \ + python3 \ pkg-config \ libx11-dev \ libxkbfile-dev \ build-essential \ + libsecret-1-dev \ && wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash \ && source ~/.bashrc \ -&& nvm install 16 \ -&& nvm use 16 \ -&& nvm alias default 16 \ +&& nvm install 18.17 \ +&& nvm use 18.17 \ +&& nvm alias default 18.17 \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \ && sudo apt update && sudo apt install --no-install-recommends yarn \ @@ -28,6 +31,7 @@ sudo apt update \ && rm -rf ~/dev/git/arduino-ide \ && git clone --depth 1 https://github.com/arduino/arduino-ide.git ~/dev/git/arduino-ide \ && yarn --cwd ~/dev/git/arduino-ide \ -&& yarn --cwd ~/dev/git/arduino-ide rebuild:electron \ -&& yarn --cwd ~/dev/git/arduino-ide/electron-app start +&& yarn --cwd ~/dev/git/arduino-ide/electron-app rebuild \ +&& yarn --cwd ~/dev/git/arduino-ide build \ +&& yarn --cwd ~/dev/git/arduino-ide start ``` diff --git a/package.json b/package.json index a8fd06db1..d2636115a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "license": "AGPL-3.0-or-later", "private": true, "engines": { - "node": ">=16.14.0 <17" + "node": ">=18.17.0 <21" }, "devDependencies": { "@theia/cli": "1.39.0", From ed2d8ad13cbbfba81b51c20575d485fdd585320b Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 24 Aug 2023 15:44:42 +0200 Subject: [PATCH 252/384] chore(deps): update `electron@25.5.0` - Update to `electron-builder@24.6.3`. - Fix obsolete electron security section in the development docs. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- docs/development.md | 2 +- electron-app/package.json | 4 +- yarn.lock | 342 ++++++++++++++++++-------------------- 3 files changed, 161 insertions(+), 187 deletions(-) diff --git a/docs/development.md b/docs/development.md index c7620400a..367d2139b 100644 --- a/docs/development.md +++ b/docs/development.md @@ -20,7 +20,7 @@ In Electron, the process that runs the main entry JavaScript file is called the By default, whenever the _Electron main_ process creates a web page, it will instantiate a new `BrowserWindow` instance. Since Electron uses Chromium for displaying web pages, Chromium's multi-process architecture is also used. Each web page in Electron runs in its own process, which is called the renderer process. Each `BrowserWindow` instance runs the web page in its own renderer process. When a `BrowserWindow` instance is destroyed, the corresponding renderer process is also terminated. The main process manages all web pages and their corresponding renderer processes. Each renderer process is isolated and only cares about the web page running in it.<sup>[[1]]</sup> -In normal browsers, web pages usually run in a sandboxed environment, and accessing native resources are disallowed. However, Electron has the power to use Node.js APIs in the web pages allowing lower-level OS interactions. Due to security reasons, accessing native resources is an undesired behavior in the IDE. So 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. +In normal browsers, web pages usually run in a sandboxed environment, and accessing native resources are disallowed. However, Electron has the power to use Node.js APIs in the web pages allowing lower-level OS interactions. Due to security reasons, accessing native resources is an undesired behavior in the IDE. So [`nodeIntegration`](https://www.electronjs.org/docs/latest/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content) is disabled, and [context isolation](https://www.electronjs.org/docs/latest/tutorial/context-isolation) is enabled. The _backend_ process is responsible for: diff --git a/electron-app/package.json b/electron-app/package.json index f466fbafb..98048b91e 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -28,8 +28,8 @@ "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": "^25.5.0", + "electron-builder": "^24.6.3", "electron-notarize": "^1.1.1", "execa": "^7.1.1", "file-type": "^18.5.0", diff --git a/yarn.lock b/yarn.lock index 64517dd61..28e8a35d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -985,6 +985,16 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@electron/asar@^3.2.1": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.4.tgz#7e8635a3c4f6d8b3f8ae6efaf5ecb9fbf3bd9864" + integrity sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + "@electron/get@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" @@ -1000,15 +1010,35 @@ optionalDependencies: global-agent "^3.0.0" -"@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== +"@electron/notarize@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.4.tgz#a7d38773f4cad40df111a5edc64037e5d768ea1e" + integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +"@electron/osx-sign@^1.0.4": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== dependencies: + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" + +"@electron/universal@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777" + integrity sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg== + dependencies: + "@electron/asar" "^3.2.1" "@malept/cross-spawn-promise" "^1.1.0" - asar "^3.1.0" debug "^4.3.1" - dir-compare "^2.4.0" + dir-compare "^3.0.0" fs-extra "^9.0.1" minimatch "^3.0.4" plist "^3.0.4" @@ -2744,6 +2774,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/fs-extra@^4.0.2": version "4.0.12" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.12.tgz#357f68e835d381a12f63967a8bb5d3d81145443a" @@ -2751,13 +2788,6 @@ dependencies: "@types/node" "*" -"@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" @@ -2766,14 +2796,6 @@ "@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== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - "@types/google-protobuf@^3.7.2": version "3.15.6" resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504" @@ -2893,16 +2915,16 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== -"@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== +"@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/minimist@^1.2.0": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" @@ -2943,10 +2965,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== -"@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/node@^18.11.18": + version "18.17.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.9.tgz#b219fa0da3c574399f4a44455ea4b388029afd56" + integrity sha512-fxaKquqYcPOGwE7tC1anJaPJ0GHyOVzfA2oUoXECjBjrtsIz4YJvtNYsq8LUcjEUehEF+jGpx8Z+lFrtT6z0tg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3164,13 +3186,6 @@ dependencies: "@types/yargs-parser" "*" -"@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: - "@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" @@ -3999,36 +4014,38 @@ app-builder-bin@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== +app-builder-lib@24.6.3: + version "24.6.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.3.tgz#5fe7027ec81ea35d5875a6e193c95cbb932eaa2e" + integrity sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/universal" "1.2.1" + "@electron/notarize" "^1.2.3" + "@electron/osx-sign" "^1.0.4" + "@electron/universal" "1.3.4" "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "23.6.0" - builder-util-runtime "9.1.1" + builder-util "24.5.0" + builder-util-runtime "9.2.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" + ejs "^3.1.8" + electron-publish "24.5.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" + isbinaryfile "^5.0.0" js-yaml "^4.1.0" lazy-val "^1.0.5" - minimatch "^3.1.2" - read-config-file "6.2.0" + minimatch "^5.1.1" + read-config-file "6.3.2" sanitize-filename "^1.6.3" - semver "^7.3.7" - tar "^6.1.11" + semver "^7.3.8" + tar "^6.1.12" temp-file "^3.4.0" append-field@^1.0.0: @@ -4249,18 +4266,6 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -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: - 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: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -4539,7 +4544,7 @@ bluebird-lst@^1.0.9: dependencies: bluebird "^3.5.5" -bluebird@^3.5.0, bluebird@^3.5.5: +bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -4666,10 +4671,10 @@ 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-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== buffer-fill@^1.0.0: version "1.0.0" @@ -4715,31 +4720,30 @@ 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== +builder-util-runtime@9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz#3184dcdf7ed6c47afb8df733813224ced4f624fd" + integrity sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA== 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== +builder-util@24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.5.0.tgz#8683c9a7a1c5c9f9a4c4d2789ecca0e47dddd3f9" + integrity sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ== 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" + builder-util-runtime "9.2.1" + chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" - fs-extra "^10.0.0" + fs-extra "^10.1.0" http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" is-ci "^3.0.0" js-yaml "^4.1.0" source-map-support "^0.5.19" @@ -4958,7 +4962,7 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5280,11 +5284,6 @@ colorette@^2.0.16: 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: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" @@ -5305,13 +5304,6 @@ comma-separated-tokens@^2.0.0: 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" @@ -5421,6 +5413,14 @@ conf@^10.2.0: pkg-up "^3.1.0" semver "^7.3.5" +config-file-ts@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.4.tgz#6c0741fbe118a7cf786c65f139030f0448a2cc99" + integrity sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ== + dependencies: + glob "^7.1.6" + typescript "^4.0.2" + 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" @@ -5794,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.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6100,15 +6100,13 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== -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== +dir-compare@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" + integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== dependencies: - buffer-equal "1.0.0" - colors "1.0.3" - commander "2.9.0" - minimatch "3.0.4" + buffer-equal "^1.0.0" + minimatch "^3.0.4" dir-glob@^2.0.0: version "2.2.2" @@ -6124,15 +6122,15 @@ 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== +dmg-builder@24.6.3: + version "24.6.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.3.tgz#508a9516e30b294d18ec466ce3f61b496aa40c0b" + integrity sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg== dependencies: - app-builder-lib "23.6.0" - builder-util "23.6.0" - builder-util-runtime "9.1.1" - fs-extra "^10.0.0" + app-builder-lib "24.6.3" + builder-util "24.5.0" + builder-util-runtime "9.2.1" + fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" optionalDependencies: @@ -6269,30 +6267,29 @@ ee-first@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: +ejs@^3.1.7, ejs@^3.1.8: 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== +electron-builder@^24.6.3: + version "24.6.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.3.tgz#f4f69dd4fae9f80bc9c1ec74d6fe47565ec50cd5" + integrity sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw== 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" + app-builder-lib "24.6.3" + builder-util "24.5.0" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + dmg-builder "24.6.3" + fs-extra "^10.1.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" + read-config-file "6.3.2" + simple-update-notifier "2.0.0" + yargs "^17.6.2" electron-notarize@^1.1.1: version "1.2.2" @@ -6302,28 +6299,16 @@ electron-notarize@^1.1.1: 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== +electron-publish@24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.5.0.tgz#492a4d7caa232e88ee3c18f5c3b4dc637e5e1b3a" + integrity sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA== 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" + builder-util "24.5.0" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + fs-extra "^10.1.0" lazy-val "^1.0.5" mime "^2.5.2" @@ -6374,13 +6359,13 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -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== +electron@^25.5.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-25.7.0.tgz#0076c2e6acfe363f666a7b77d826a6f8a3028bcd" + integrity sha512-P82EzYZ8k9J21x5syhXV7EkezDmEXwycReXnagfzS0kwepnrlWzq1aDIUWdNvzTdHobky4m/nYcL98qd73mEVA== dependencies: "@electron/get" "^2.0.0" - "@types/node" "^16.11.26" + "@types/node" "^18.11.18" extract-zip "^2.0.1" emoji-regex@^7.0.1: @@ -7997,11 +7982,6 @@ graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.1 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" @@ -9081,18 +9061,16 @@ isarray@^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: +isbinaryfile@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -10467,7 +10445,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.0: +minimatch@^5.0.1, minimatch@^5.1.0, minimatch@^5.1.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -11947,7 +11925,7 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -plist@^3.0.1, plist@^3.0.4: +plist@^3.0.4, plist@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== @@ -12497,11 +12475,12 @@ read-cmd-shim@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-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== +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== dependencies: + config-file-ts "^0.2.4" dotenv "^9.0.2" dotenv-expand "^5.1.0" js-yaml "^4.1.0" @@ -13099,11 +13078,6 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semve 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" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -13300,12 +13274,12 @@ simple-get@^3.0.3: once "^1.3.1" simple-concat "^1.0.0" -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== +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== dependencies: - semver "~7.0.0" + semver "^7.5.3" slash@3.0.0, slash@^3.0.0: version "3.0.0" @@ -14081,7 +14055,7 @@ tar@6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: +tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, 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== @@ -14511,7 +14485,7 @@ typeof-article@^0.1.1: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== -typescript@^4.9.3: +typescript@^4.0.2, 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== @@ -15561,7 +15535,7 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.0.1, yargs@^17.5.1, yargs@^17.6.2, yargs@^17.7.2: +yargs@^17.0.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From ce02e263ec336c84739aed5fc43f7a1ac16cfd79 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 27 Sep 2023 12:40:56 +0200 Subject: [PATCH 253/384] fix: storage service injection Store the board config data per sketch and not per IDE installation. The (Theia) default `StorageService` implementation is workspace-scoped when `@theia/workspace` is part of the final application. Closes #2240 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/boards/boards-data-store.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 52507a577..579f30b7a 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -1,5 +1,5 @@ import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { LocalStorageService } from '@theia/core/lib/browser/storage-service'; +import { StorageService } 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'; @@ -23,8 +23,11 @@ export class BoardsDataStore implements FrontendApplicationContribution { private readonly boardsService: BoardsService; @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; - @inject(LocalStorageService) - private readonly storageService: LocalStorageService; + // When `@theia/workspace` is part of the application, the workspace-scoped storage service is the default implementation, and the `StorageService` symbol must be used for the injection. + // https://github.com/eclipse-theia/theia/blob/ba3722b04ff91eb6a4af6a571c9e263c77cdd8b5/packages/workspace/src/browser/workspace-frontend-module.ts#L97-L98 + // In other words, store the data (such as the board configs) per sketch, not per IDE2 installation. https://github.com/arduino/arduino-ide/issues/2240 + @inject(StorageService) + private readonly storageService: StorageService; private readonly onChangedEmitter = new Emitter<string[]>(); private readonly toDispose = new DisposableCollection(this.onChangedEmitter); From 8f4bcc83ecf551e421419ca74bf2d03ba3986ea3 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Fri, 29 Sep 2023 18:40:13 +0200 Subject: [PATCH 254/384] chore(deps): update to `theia@1.41.0` (#2211) Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 40 +- .../browser/arduino-ide-frontend-module.ts | 14 +- .../core/common-frontend-contribution.ts | 14 +- .../theia/monaco/monaco-text-model-service.ts | 4 +- .../src/node/auth/authentication-server.ts | 2 +- .../node/theia/plugin-ext/plugin-reader.ts | 7 +- .../workspace/default-workspace-server.ts | 34 +- electron-app/package.json | 56 +- electron-app/webpack.base.js | 56 +- electron-app/webpack.config.js | 11 +- package.json | 2 +- yarn.lock | 2536 +++++++++-------- 12 files changed, 1438 insertions(+), 1338 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 08e02bc99..c2e777690 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -24,27 +24,27 @@ }, "dependencies": { "@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/application-package": "1.41.0", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/electron": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/keymaps": "1.41.0", + "@theia/markers": "1.41.0", + "@theia/messages": "1.41.0", + "@theia/monaco": "1.41.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", + "@theia/navigator": "1.41.0", + "@theia/outline-view": "1.41.0", + "@theia/output": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/scm": "1.41.0", + "@theia/search-in-workspace": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/typehierarchy": "1.41.0", + "@theia/workspace": "1.41.0", "@tippyjs/react": "^4.2.5", "@types/auth0-js": "^9.14.0", "@types/btoa": "^1.2.3", 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 0300429c9..436dd8e86 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -358,6 +358,9 @@ import { MonacoEditorMenuContribution as TheiaMonacoEditorMenuContribution } fro import { UpdateArduinoState } from './contributions/update-arduino-state'; import { TerminalFrontendContribution } from './theia/terminal/terminal-frontend-contribution'; import { TerminalFrontendContribution as TheiaTerminalFrontendContribution } from '@theia/terminal/lib/browser/terminal-frontend-contribution'; +import { SelectionService } from '@theia/core/lib/common/selection-service'; +import { CommandService } from '@theia/core/lib/common/command'; +import { CorePreferences } from '@theia/core/lib/browser/core-preferences'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -796,10 +799,19 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); const iconThemeService = context.container.get<IconThemeService>(IconThemeService); + const selectionService = + context.container.get<SelectionService>(SelectionService); + const commandService = + context.container.get<CommandService>(CommandService); + const corePreferences = + context.container.get<CorePreferences>(CorePreferences); return new TabBarRenderer( contextMenuRenderer, decoratorService, - iconThemeService + iconThemeService, + selectionService, + commandService, + corePreferences ); }); diff --git a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts index 3444f0ce1..3affee1f4 100644 --- a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts @@ -1,13 +1,13 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { - CommonFrontendContribution as TheiaCommonFrontendContribution, CommonCommands, + CommonFrontendContribution as TheiaCommonFrontendContribution, } from '@theia/core/lib/browser/common-frontend-contribution'; -import { CommandRegistry } from '@theia/core/lib/common/command'; import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application'; -import { KeybindingRegistry } from '@theia/core/lib/browser'; -import { isOSX } from '@theia/core'; +import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; +import type { CommandRegistry } from '@theia/core/lib/common/command'; +import type { MenuModelRegistry } from '@theia/core/lib/common/menu'; +import { isOSX } from '@theia/core/lib/common/os'; +import { injectable } from '@theia/core/shared/inversify'; @injectable() export class CommonFrontendContribution extends TheiaCommonFrontendContribution { @@ -25,6 +25,7 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution CommonCommands.PIN_TAB, CommonCommands.UNPIN_TAB, CommonCommands.NEW_UNTITLED_FILE, + CommonCommands.NEW_UNTITLED_TEXT_FILE, ]) { commandRegistry.unregisterCommand(command); } @@ -48,6 +49,7 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution CommonCommands.ABOUT_COMMAND, CommonCommands.SAVE_WITHOUT_FORMATTING, // Patched for https://github.com/eclipse-theia/theia/pull/8877, CommonCommands.NEW_UNTITLED_FILE, + CommonCommands.NEW_UNTITLED_TEXT_FILE, ]) { registry.unregisterMenuAction(command); } diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts index ec775685a..a7d530095 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts @@ -19,7 +19,9 @@ export class MonacoTextModelService extends TheiaMonacoTextModelService { const factory = this.factories .getContributions() .find(({ scheme }) => resource.uri.scheme === scheme); - const readOnly = this.sketchesServiceClient.isReadOnly(resource.uri); + const readOnly = + Boolean(resource.isReadonly) || + this.sketchesServiceClient.isReadOnly(resource.uri); return factory ? factory.createModel(resource) : new MaybeReadonlyMonacoEditorModel( diff --git a/arduino-ide-extension/src/node/auth/authentication-server.ts b/arduino-ide-extension/src/node/auth/authentication-server.ts index 5d593166d..ac9ac6064 100644 --- a/arduino-ide-extension/src/node/auth/authentication-server.ts +++ b/arduino-ide-extension/src/node/auth/authentication-server.ts @@ -29,7 +29,7 @@ export function createServer( } export async function startServer(server: http.Server): Promise<string> { - let portTimer: NodeJS.Timer; + let portTimer: NodeJS.Timeout; function cancelPortTimer() { clearTimeout(portTimer); 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 1737dd70e..b9030b60b 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 @@ -7,13 +7,14 @@ import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext @injectable() export class HostedPluginReader extends TheiaHostedPluginReader { - override readContribution( + override async readContribution( plugin: PluginPackage - ): PluginContribution | undefined { + ): Promise<PluginContribution | undefined> { const scanner = this.scanner.getScanner(plugin); - const contributions = scanner.getContribution(plugin); + const contributions = await scanner.getContribution(plugin); return this.filterContribution(plugin.name, contributions); } + private filterContribution( pluginName: string, contributions: PluginContribution | undefined 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 332eedc7a..6b3dc459c 100644 --- a/arduino-ide-extension/src/node/theia/workspace/default-workspace-server.ts +++ b/arduino-ide-extension/src/node/theia/workspace/default-workspace-server.ts @@ -1,8 +1,7 @@ -import { promises as fs, constants } from 'node:fs'; -import { injectable, inject } from '@theia/core/shared/inversify'; +import { FileUri } from '@theia/core/lib/node'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { DefaultWorkspaceServer as TheiaDefaultWorkspaceServer } from '@theia/workspace/lib/node/default-workspace-server'; import { SketchesService } from '../../../common/protocol'; -import { FileUri } from '@theia/core/lib/node'; import { IsTempSketch } from '../../is-temp-sketch'; @injectable() @@ -21,26 +20,6 @@ export class DefaultWorkspaceServer extends TheiaDefaultWorkspaceServer { return uri; } - /** - * This is the async re-implementation of the default Theia behavior. - */ - override async getRecentWorkspaces(): Promise<string[]> { - const listUri: string[] = []; - const data = await this.readRecentWorkspacePathsFromUserHome(); - if (data && data.recentRoots) { - await Promise.all( - data.recentRoots - .filter((element) => Boolean(element)) - .map(async (element) => { - if (await this.exists(element)) { - listUri.push(element); - } - }) - ); - } - return listUri; - } - protected override async writeToUserHome( data: RecentWorkspacePathsData ): Promise<void> { @@ -69,15 +48,6 @@ export class DefaultWorkspaceServer extends TheiaDefaultWorkspaceServer { recentRoots, }; } - - private async exists(uri: string): Promise<boolean> { - try { - await fs.access(FileUri.fsPath(uri), constants.R_OK | constants.W_OK); - return true; - } catch { - return false; - } - } } // Remove after https://github.com/eclipse-theia/theia/pull/11603 diff --git a/electron-app/package.json b/electron-app/package.json index 98048b91e..b7f523c02 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -5,24 +5,24 @@ "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { - "@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", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/electron": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/keymaps": "1.41.0", + "@theia/messages": "1.41.0", + "@theia/monaco": "1.41.0", + "@theia/navigator": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/plugin-ext-vscode": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/workspace": "1.41.0", "arduino-ide-extension": "2.2.2" }, "devDependencies": { - "@theia/cli": "1.39.0", + "@theia/cli": "1.41.0", "7zip-min": "^1.4.4", "chmodr": "^1.2.0", "compression-webpack-plugin": "^9.0.0", @@ -201,22 +201,22 @@ "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-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.80.0/file/MS-CEINTL.vscode-language-pack-cs-1.80.0.vsix", + "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.80.0/file/MS-CEINTL.vscode-language-pack-de-1.80.0.vsix", + "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.80.0/file/MS-CEINTL.vscode-language-pack-es-1.80.0.vsix", + "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.80.0/file/MS-CEINTL.vscode-language-pack-fr-1.80.0.vsix", "vscode-language-pack-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-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.80.0/file/MS-CEINTL.vscode-language-pack-it-1.80.0.vsix", + "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.80.0/file/MS-CEINTL.vscode-language-pack-ja-1.80.0.vsix", + "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.80.0/file/MS-CEINTL.vscode-language-pack-ko-1.80.0.vsix", "vscode-language-pack-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-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.80.0/file/MS-CEINTL.vscode-language-pack-pl-1.80.0.vsix", + "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.80.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.80.0.vsix", + "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.80.0/file/MS-CEINTL.vscode-language-pack-ru-1.80.0.vsix", + "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.80.0/file/MS-CEINTL.vscode-language-pack-tr-1.80.0.vsix", "vscode-language-pack-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" + "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.80.0.vsix", + "vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.80.0.vsix" }, "mocha": { "reporter": "spec", diff --git a/electron-app/webpack.base.js b/electron-app/webpack.base.js index d76d61f06..27f721d95 100644 --- a/electron-app/webpack.base.js +++ b/electron-app/webpack.base.js @@ -4,11 +4,10 @@ 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'; +/** + * @param {string} target the name of the `npm` package to resolve. + */ function resolvePackagePath(target, baseDir = __dirname) { const resolvePackageJsonPath = require('resolve-package-path'); const packageJsonPath = resolvePackageJsonPath(target, baseDir); @@ -23,9 +22,11 @@ function resolvePackagePath(target, baseDir = __dirname) { // restore file permissions after webpack copy // https://github.com/webpack-contrib/copy-webpack-plugin/issues/35#issuecomment-1407280257 class PermissionsPlugin { - constructor(targetPath, patchTheia12780 = false) { + /** + * @param {string} targetPath + */ + constructor(targetPath) { this.targetPath = targetPath; - this.patchTheia12780 = patchTheia12780; } /** @@ -34,20 +35,6 @@ class PermissionsPlugin { 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) ); @@ -59,18 +46,9 @@ class PermissionsPlugin { /** * 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' - ); +function createCopyArduinoResourcesPlugins(targetPath, baseDir = __dirname) { const copyOptions = { patterns: [ // binaries @@ -96,25 +74,9 @@ function createCopyArduinoResourcesPlugins( }, ], }; - - 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), + new PermissionsPlugin(targetPath), ]; } diff --git a/electron-app/webpack.config.js b/electron-app/webpack.config.js index 0db6b8024..18a7c8969 100644 --- a/electron-app/webpack.config.js +++ b/electron-app/webpack.config.js @@ -21,20 +21,11 @@ mainWindowConfig.plugins?.push( ); 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 + path.resolve(__dirname, 'lib', 'backend', 'resources') ) ); diff --git a/package.json b/package.json index d2636115a..2583d816e 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "node": ">=18.17.0 <21" }, "devDependencies": { - "@theia/cli": "1.39.0", + "@theia/cli": "1.41.0", "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", "@xhmikosr/downloader": "^13.0.1", diff --git a/yarn.lock b/yarn.lock index 28e8a35d9..a5841435c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,45 +27,46 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@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== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.22.5" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": +"@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.22.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" - integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" + integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== 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/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.6" - "@babel/parser" "^7.22.7" + "@babel/helpers" "^7.22.11" + "@babel/parser" "^7.22.11" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.8" - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" + json5 "^2.2.3" semver "^6.3.1" -"@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== +"@babel/generator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -78,16 +79,16 @@ "@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== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" + integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" -"@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== +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== dependencies: "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" @@ -95,10 +96,10 @@ 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== +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" + integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" @@ -119,10 +120,10 @@ 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== +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -187,7 +188,7 @@ 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": +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": 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== @@ -242,36 +243,36 @@ 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== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" -"@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== +"@babel/helpers@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" + integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.6" - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.22.11" + "@babel/types" "^7.22.11" -"@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== +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" + chalk "^2.4.2" js-tokens "^4.0.0" -"@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/parser@^7.22.11", "@babel/parser@^7.22.5": + version "7.22.14" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" + integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" @@ -294,14 +295,6 @@ 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-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== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -436,14 +429,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-async-generator-functions@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" + integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -462,10 +455,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-block-scoping@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" + integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -477,12 +470,12 @@ "@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== +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -509,14 +502,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@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== +"@babel/plugin-transform-destructuring@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" + integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.22.5": 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== @@ -531,10 +524,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" @@ -547,10 +540,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" @@ -571,10 +564,10 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -586,10 +579,10 @@ dependencies: "@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== +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -609,22 +602,22 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-modules-commonjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" + integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@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== +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -651,29 +644,29 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@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== +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: "@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== +"@babel/plugin-transform-object-rest-spread@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" + integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.22.5" @@ -686,18 +679,18 @@ "@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== +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== 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== +"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" + integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -718,13 +711,13 @@ "@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== +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -735,13 +728,13 @@ 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== +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.1" + regenerator-transform "^0.15.2" "@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" @@ -751,15 +744,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.10.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== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" + integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== 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" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5": @@ -798,10 +791,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -830,12 +823,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.10.0": - 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== + version "7.22.14" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.14.tgz#1cbb468d899f64fa71c53446f13b7ff8c0005cc1" + integrity sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" "@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" @@ -860,69 +853,67 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@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-generator-functions" "^7.22.11" "@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-block-scoping" "^7.22.10" "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" "@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-destructuring" "^7.22.10" "@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-dynamic-import" "^7.22.11" "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" "@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-json-strings" "^7.22.11" "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" "@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-commonjs" "^7.22.11" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" "@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-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.11" "@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-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.12" "@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-private-property-in-object" "^7.22.11" "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" "@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-escapes" "^7.22.10" "@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.22.5" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.11" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" core-js-compat "^3.31.0" semver "^6.3.1" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" @@ -932,11 +923,11 @@ 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== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== dependencies: - regenerator-runtime "^0.13.11" + regenerator-runtime "^0.14.0" "@babel/template@^7.22.5": version "7.22.5" @@ -947,26 +938,26 @@ "@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== +"@babel/traverse@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" + integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" "@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" + "@babel/parser" "^7.22.11" + "@babel/types" "^7.22.11" debug "^4.1.0" globals "^11.1.0" -"@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== +"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -1138,15 +1129,15 @@ dependencies: eslint-visitor-keys "^3.3.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== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== -"@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== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1158,46 +1149,53 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@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== +"@eslint/js@8.48.0": + version "8.48.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== -"@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/core@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" + integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ== + dependencies: + "@floating-ui/utils" "^0.1.1" "@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== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.1.tgz#88b70defd002fe851f17b4a25efb2d3c04d7a8d7" + integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== dependencies: - "@floating-ui/core" "^1.3.1" + "@floating-ui/core" "^1.4.1" + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/utils@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.1.tgz#1a5b1959a528e374e8037c4396c3e825d6cf4a83" + integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== "@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== + version "1.9.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.2.tgz#151148f6485eab8fb13fe53042d25f4ffa9c7d09" + integrity sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g== dependencies: - "@grpc/proto-loader" "^0.7.0" + "@grpc/proto-loader" "^0.7.8" "@types/node" ">=12.12.47" -"@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== +"@grpc/proto-loader@^0.7.8": + version "0.7.9" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.9.tgz#3ca68236f1a0d77566dafa53c715eb31d096279a" + integrity sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ== dependencies: - "@types/long" "^4.0.1" lodash.camelcase "^4.3.0" - long "^4.0.0" + long "^5.0.0" protobufjs "^7.2.4" yargs "^17.7.2" "@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== + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1230,10 +1228,10 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@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== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" @@ -1246,10 +1244,10 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@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== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" @@ -1264,55 +1262,102 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@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== - -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 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== + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@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/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== +"@lerna/child-process@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.2.0.tgz#42de5b0a4eb7479c2a72b4bf61685616740cf818" + integrity sha512-8cRsYYX8rGZTXL1KcLBv0RHD9PMvphWZay8yg4qf2giX6x86dQyTetSU4SplG2LBGVClilmNHJa/CQwvPQNUFA== dependencies: chalk "^4.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== +"@lerna/create@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.2.0.tgz#a8080b419c1f8ab5d575693fcb883a6a0d82c7e0" + integrity sha512-bBypNfwqOQNcfR2nXJ3mWUeIAIoSFpXg8MjuFSf87PzIiyeTEKa3Z57vAa3bDbHQtcB7x6f0rWysK1eQZSH15Q== dependencies: - "@lerna/child-process" "7.1.4" + "@lerna/child-process" "7.2.0" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" dedent "0.7.0" + execa "5.0.0" fs-extra "^11.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + ini "^1.3.8" init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + js-yaml "4.1.0" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "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 ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" p-reduce "^2.1.0" pacote "^15.2.0" pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" semver "^7.3.4" + signal-exit "3.0.7" slash "^3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + upath "2.0.1" + uuid "^9.0.0" validate-npm-package-license "^3.0.4" validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" yargs-parser "20.2.4" "@malept/cross-spawn-promise@^1.1.0": @@ -1354,40 +1399,35 @@ semver "^7.3.5" tar "^6.1.11" -"@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-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-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz#901c5937e1441572ea23e631fe6deca68482fe76" + integrity sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ== -"@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-darwin-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz#fb877fe6bae3c4d3cea29786737840e2ae689066" + integrity sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw== -"@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-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz#986179c38b10ac41fbdaf7d036c825cbc72855d9" + integrity sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA== -"@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-arm@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz#15f2c6fe9e0adc06c21af7e95f484ff4880d79ce" + integrity sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg== -"@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-linux-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz#30cae5c9a202f3e1fa1deb3191b18ffcb2f239a2" + integrity sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw== -"@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== +"@msgpackr-extract/msgpackr-extract-win32-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz#016d855b6bc459fd908095811f6826e45dd4ba64" + integrity sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1462,81 +1502,83 @@ read-package-json-fast "^3.0.0" which "^3.0.0" -"@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== +"@nrwl/devkit@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.7.4.tgz#c69e3ae4455447dc3a0cc5515c149692aadba940" + integrity sha512-Gt2q3cqDWzGP1woavGIo4bl8g9YaXic/Xfsl7qPq0LHJedLj49p1vXetB0wawkavSE2MTyo7yDh6YDK/38XoLw== dependencies: - "@nx/devkit" "16.5.2" + "@nx/devkit" "16.7.4" -"@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== +"@nrwl/tao@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.7.4.tgz#2b2e2cc26ce6c50884da63e69ba8ccf0fcbb9455" + integrity sha512-hH03oF+yVmaf19UZfyLDSuVEh0KasU5YfYezuNsdRkXNdTU/WmpDrk4qoo0j6fVoMPrqbbPOn1YMRtulP2WyYA== dependencies: - nx "16.5.2" + nx "16.7.4" + tslib "^2.3.0" -"@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== +"@nx/devkit@16.7.4", "@nx/devkit@>=16.5.1 < 17": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.7.4.tgz#c03c308bc190a18642e0dc0c183323662c38c426" + integrity sha512-SLito+/TAeDYR+d7IIpp/sBJm41WM+nIevILv0TSQW4Pq0ylUy1nUvV8Pe7l1ohZccDrQuebMUWPwGO0hv8SeQ== dependencies: - "@nrwl/devkit" "16.5.2" + "@nrwl/devkit" "16.7.4" ejs "^3.1.7" + enquirer "~2.3.6" ignore "^5.0.4" semver "7.5.3" tmp "~0.2.1" tslib "^2.3.0" -"@nx/nx-darwin-arm64@16.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== +"@nx/nx-darwin-arm64@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.7.4.tgz#1a797805850444cc6c0aa56668bf6f832093d641" + integrity sha512-pRNjxn6KlcR6iGkU1j/1pzcogwXFv97pYiZaibpF7UV0vfdEUA3EETpDcs+hbNAcKMvVtn/TgN857/5LQ/lGUg== + +"@nx/nx-darwin-x64@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.7.4.tgz#53f681c86d9d8e8bcebfc8ba54dd7b2ec9f71207" + integrity sha512-GANXeabAAWRoF85WDla2ZPxtr8vnqvXjwyCIhRCda8hlKiVCpM98GemucN25z97G5H6MgyV9Dd9t9jrr2Fn0Og== + +"@nx/nx-freebsd-x64@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.7.4.tgz#df88ff9b6ed0b51723d76d711b9467a1a4726f00" + integrity sha512-zmBBDYjPaHhIHx1YASUJJIy+oz7mCrj5f0f3kOzfMraQOjkQZ0xYgNNUzBqmnYu1855yiphu94MkAMYJnbk0jw== + +"@nx/nx-linux-arm-gnueabihf@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.7.4.tgz#2cfac69e65237245560326039bb319691147daed" + integrity sha512-d3Cmz/vdtoSasTUANoh4ZYLJESNA3+PCP/HnXNqmrr6AEHo+T8DcI+qsamO3rmYUSFxTMAeMyoihZMU8OKGZ1A== + +"@nx/nx-linux-arm64-gnu@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.7.4.tgz#492fb66b804aa6154cd44ded6eaaf6cfcb32ea9f" + integrity sha512-W1u4O78lTHCwvUP0vakeKWFXeSZ13nYzbd6FARICnImY2my8vz41rLm6aU9TYWaiOGEGL2xKpHKSgiNwbLjhFw== + +"@nx/nx-linux-arm64-musl@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.7.4.tgz#ad32f35f05067e918eff9a97d8720f3923c034cb" + integrity sha512-Dc8IQFvhfH/Z3GmhBBNNxGd2Ehw6Y5SePEgJj1c2JyPdoVtc2OjGzkUaZkT4z5z77VKtju6Yi10T6Enps+y+kw== + +"@nx/nx-linux-x64-gnu@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.7.4.tgz#40271f7d21ef3ba0676c046b73c84cf9eb1ed94a" + integrity sha512-4B58C/pXeuovSznBOeicsxNieBApbGMoi2du8jR6Is1gYFPv4l8fFHQHHGAa1l5XJC5JuGJqFywS4elInWprNw== + +"@nx/nx-linux-x64-musl@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.7.4.tgz#8bd13692a0922df51c6305df93d69a3c66b4b716" + integrity sha512-spqqvEdGSSeV2ByJHkex5m8MRQfM6lQlnon25XgVBdPR47lKMWSikUsaWCiE7bVAFU9BFyWY2L4HfZ4+LiNY7A== + +"@nx/nx-win32-arm64-msvc@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.7.4.tgz#dfbe5b28c62c1c1ceadad12e79029f76e450d855" + integrity sha512-etNnbuCcSqAYOeDcS6si6qw0WR/IS87ovTzLS17ETKpdHcHN5nM4l02CQyupKiD58ShxrXHxXmvgBfbXxoN5Ew== + +"@nx/nx-win32-x64-msvc@16.7.4": + version "16.7.4" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.7.4.tgz#e4b270107e02e73451d7c5dc7c4237fffe18aa75" + integrity sha512-y6pugK6ino1wvo2FbgtXG2cVbEm3LzJwOSBKBRBXSWhUgjP7T92uGfOt6KVQKpaqDvS9lA9TO/2DcygcLHXh7A== "@octokit/auth-token@^2.4.4": version "2.5.0" @@ -1920,31 +1962,33 @@ 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== +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== dependencies: - 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.2.0" -"@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/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== -"@sigstore/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== +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== dependencies: - "@sigstore/protobuf-specs" "^0.1.0" + "@sigstore/protobuf-specs" "^0.2.0" tuf-js "^1.1.7" "@sinclair/typebox@^0.27.8": @@ -1970,9 +2014,9 @@ 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== + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== "@socket.io/component-emitter@~3.1.0": version "3.1.0" @@ -1998,20 +2042,20 @@ 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== +"@theia/application-manager@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.41.0.tgz#5a6cb2a4d163956c9e94d28411f56d0c8591aebb" + integrity sha512-Fy66EbWp+c8SilIBe8KwYCqi52hC7DXRhLyZ7Kpo5utPZif5FwRDs81UBlpyVLWCWKJABcQjT/Vbp36uCcUT2g== 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.39.0" - "@theia/ffmpeg" "1.39.0" - "@theia/native-webpack-plugin" "1.39.0" + "@theia/application-package" "1.41.0" + "@theia/ffmpeg" "1.41.0" + "@theia/native-webpack-plugin" "1.41.0" "@types/fs-extra" "^4.0.2" - "@types/semver" "^7.3.8" + "@types/semver" "^7.5.0" babel-loader "^8.2.2" buffer "^6.0.3" compression-webpack-plugin "^9.0.0" @@ -2025,7 +2069,7 @@ node-abi "*" node-loader "^2.0.0" path-browserify "^1.0.1" - semver "^7.3.5" + semver "^7.5.4" setimmediate "^1.0.5" source-map "^0.6.1" source-map-loader "^2.0.1" @@ -2038,55 +2082,55 @@ worker-loader "^3.0.8" yargs "^15.3.1" -"@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== +"@theia/application-package@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.41.0.tgz#40e144f7e07c2abab37baabd695a3861c35494bc" + integrity sha512-Aay/87X+ogj/jSec7SPjRrx1ODDSzYK7F2KdgDtqb/IJ3f8KsL/Vh37XeTKzOPlW+rlhRAOzG4rpeuf1duO7MA== dependencies: - "@theia/request" "1.39.0" + "@theia/request" "1.41.0" "@types/fs-extra" "^4.0.2" - "@types/semver" "^5.4.0" + "@types/semver" "^7.5.0" "@types/write-json-file" "^2.2.1" deepmerge "^4.2.2" fs-extra "^4.0.2" is-electron "^2.1.0" nano "^9.0.5" resolve-package-path "^4.0.3" - semver "^5.4.1" + semver "^7.5.4" write-json-file "^2.2.0" -"@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== +"@theia/bulk-edit@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.41.0.tgz#804330845df4477d07f57acd423bddb610a2c1e7" + integrity sha512-JnhYCRyLeLqIXJzlU/L78cBXQ60fw0hDOaYMS0r/ZTqgmgBmTGVKx+HDypTQ1/XP5h96e/J7FxjIXYcHBRisSA== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" - "@theia/filesystem" "1.39.0" - "@theia/monaco" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/monaco" "1.41.0" "@theia/monaco-editor-core" "1.72.3" - "@theia/workspace" "1.39.0" + "@theia/workspace" "1.41.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== +"@theia/callhierarchy@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.41.0.tgz#c925763f71dd2e2773a24a4fec8afbd439ae617a" + integrity sha512-kZmGp10ibHWzmz/dXWiJXl84QYFrh2I6NtgFvFxEmMiGsC1NN1CQfQg+6J0i4OG169FKiE8stn3m60KmXn5fNA== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" ts-md5 "^1.2.2" -"@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" +"@theia/cli@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.41.0.tgz#4243d1cd45f0996dd8699e1e2a3413709866b7a6" + integrity sha512-GgOfB/a1C3kslIN6IVpkD3sSYj8hH30htf2n3En0DiTj6FHECb0Uf2jtccyb9W4XPZyK/P2gd/A4LhzbKXIZiw== + dependencies: + "@theia/application-manager" "1.41.0" + "@theia/application-package" "1.41.0" + "@theia/ffmpeg" "1.41.0" + "@theia/localization-manager" "1.41.0" + "@theia/ovsx-client" "1.41.0" + "@theia/request" "1.41.0" "@types/chai" "^4.2.7" "@types/mocha" "^10.0.0" "@types/node-fetch" "^2.5.7" @@ -2098,26 +2142,26 @@ limiter "^2.1.0" log-update "^4.0.0" mocha "^10.1.0" - puppeteer "^19.7.2" - puppeteer-core "^19.7.2" - puppeteer-to-istanbul "^1.4.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.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== +"@theia/console@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.41.0.tgz#f7f6bcb5f5411bd3ec70ca236bbfaaddb4f524db" + integrity sha512-9H27dDFndjpIpcJA0ujQKe4xLDFCFYw47E+72B3Ci8aQ5HqrTQwzsPK7JvPBvUFN/lrWQrQrwY0ZDZElOhNuig== dependencies: - "@theia/core" "1.39.0" - "@theia/monaco" "1.39.0" + "@theia/core" "1.41.0" + "@theia/monaco" "1.41.0" "@theia/monaco-editor-core" "1.72.3" anser "^2.0.1" -"@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== +"@theia/core@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.41.0.tgz#04d3ad18b2b9c662eaf63c06c9852ea0ad78d1d9" + integrity sha512-XpoBPul1DGFT/CVFmc9b56IfNj5Paa+NKgI3aMRdmjtlYLtFpbjKOZbidWpPVQGLXIvXrpGiSITIQIM21Ojtmw== dependencies: "@babel/runtime" "^7.10.0" "@phosphor/algorithm" "1" @@ -2130,8 +2174,8 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" - "@theia/application-package" "1.39.0" - "@theia/request" "1.39.0" + "@theia/application-package" "1.41.0" + "@theia/request" "1.41.0" "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" @@ -2169,7 +2213,7 @@ lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" markdown-it "^12.3.2" - msgpackr "^1.6.1" + msgpackr "1.6.1" nsfw "^2.2.4" p-debounce "^2.1.0" perfect-scrollbar "^1.3.0" @@ -2188,81 +2232,81 @@ ws "^7.1.2" yargs "^15.3.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/debug@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.41.0.tgz#c4b90d253143bb22662e885087586c17a95a0fa5" + integrity sha512-TkTI9Ls/MyMdCsi3ZqvmqCT2CmWr2v8MSMsCilPThuelPh4l2RcDM0LyXEI1EqTh4Ha3VVW5D1jUpPU2OvDnCA== + dependencies: + "@theia/console" "1.41.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/markers" "1.41.0" + "@theia/monaco" "1.41.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" + "@theia/output" "1.41.0" + "@theia/process" "1.41.0" + "@theia/task" "1.41.0" + "@theia/terminal" "1.41.0" + "@theia/variable-resolver" "1.41.0" + "@theia/workspace" "1.41.0" "@vscode/debugprotocol" "^1.51.0" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -"@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== +"@theia/editor-preview@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.41.0.tgz#1a77a315aa202abfcca027352a4a5533ae7f678c" + integrity sha512-eLIEwgB6Sjbl5d93cNhqRccNIpXaZ7GS6yP2JTrF+YcHyEx1cmVikPcgG0QY0KAPFAGpe294mI6sZNwOBot58g== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" - "@theia/navigator" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/navigator" "1.41.0" -"@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== +"@theia/editor@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.41.0.tgz#666fd31389c03187cc34a19c25c7bc2ed672e9c5" + integrity sha512-VdCg6fjZ9v0ZNHYuo2ZabN/lSyZsL3Cx5aQ+0wITD7Zmtjtl98rHiiqcx+yMSMdSKvhZkYtb50Ze1226FMgiKA== dependencies: - "@theia/core" "1.39.0" - "@theia/variable-resolver" "1.39.0" + "@theia/core" "1.41.0" + "@theia/variable-resolver" "1.41.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== +"@theia/electron@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.41.0.tgz#f9f49b24da5a5eaa1a0ff54861a74e6752fc8111" + integrity sha512-4GcMAt2c75wO+an3VdJUb3cndXuD6/zS8plKCn0KGQTQPgBBabu6SHcG/KfuGYJag2QiSDVHa02tE9904i2qug== dependencies: electron-store "^8.0.0" fix-path "^3.0.0" native-keymap "^2.2.1" -"@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== +"@theia/ffmpeg@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.41.0.tgz#f1724478bb7ab076b19b09f55ca03c206f6f73da" + integrity sha512-Hpgix6cSbgyQ3kgSlcJuhxlianlysC9Ze1LNu/CkZgrAVxvz0nJHMjB1sx7zVeqfeDFdkZHInfkYltBZ6K+WnQ== dependencies: "@electron/get" "^2.0.0" unzipper "^0.9.11" -"@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== +"@theia/file-search@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.41.0.tgz#edfdd13c223bcee5577c79e175715d6319544a50" + integrity sha512-5/YZibMMC7To1bA7lCJBmQ9pqzVaS2aBmr1Jl4ry/jKjGWu7zol3qnt4l2BwyMRNSRIFoEO4aT2M/1NbyAEKoA== dependencies: - "@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" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/process" "1.41.0" + "@theia/workspace" "1.41.0" "@vscode/ripgrep" "^1.14.2" -"@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== +"@theia/filesystem@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.41.0.tgz#71daa0dd7569092566a0e7f6f9a00b7364aee634" + integrity sha512-hJ6mmhdYMp0JG1V5PS5+qiT2rCyt5ZMopeBbn1kOEectbhasgEtgj5u0RKp3nguW+ZZDs4yERJ22Y2HTvV+YeQ== dependencies: - "@theia/core" "1.39.0" + "@theia/core" "1.41.0" "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" "@types/rimraf" "^2.0.2" @@ -2274,27 +2318,28 @@ minimatch "^5.1.0" multer "1.4.4-lts.1" rimraf "^2.6.2" + stat-mode "^1.0.0" tar-fs "^1.16.2" trash "^7.2.0" uuid "^8.0.0" vscode-languageserver-textdocument "^1.0.1" -"@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== +"@theia/keymaps@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.41.0.tgz#41baeaadba0e8c6538d6b1edff190a7f6b25c714" + integrity sha512-1KdUMYJaH5spbDMoMKhR8nikzna836ucUUDP6qCrPeuY3EsdS51ap9JFF+ZK+SrrKCAlW8+iKhAlU9NtSwxJow== dependencies: - "@theia/core" "1.39.0" - "@theia/monaco" "1.39.0" + "@theia/core" "1.41.0" + "@theia/monaco" "1.41.0" "@theia/monaco-editor-core" "1.72.3" - "@theia/preferences" "1.39.0" - "@theia/userstorage" "1.39.0" + "@theia/preferences" "1.41.0" + "@theia/userstorage" "1.41.0" jsonc-parser "^2.2.0" -"@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== +"@theia/localization-manager@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.41.0.tgz#91b7562aaeb5ce7e42e46f36a74d2d90b67bf107" + integrity sha512-y/q2Kelroea6iAjrqeMe5pWEhgKt/WGviZ3NRLzZRz5SMF2EiknZc9JOC1uzXR/RRChqDJq7HdXfP1xh4GdqiA== dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2305,21 +2350,21 @@ glob "^7.2.0" typescript "~4.5.5" -"@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== +"@theia/markers@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.41.0.tgz#fe4e450c0ed67eaed24aed029b3a4168a929785b" + integrity sha512-PC3sMzsh1Sn78PzZPsKK/CxgEPkPkVnHsl54gKgv71gkZxg02ujfSGQlyJ5CKg0ZC4MiEnyjsdX/p+B2EriTUA== dependencies: - "@theia/core" "1.39.0" - "@theia/filesystem" "1.39.0" - "@theia/workspace" "1.39.0" + "@theia/core" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/workspace" "1.41.0" -"@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== +"@theia/messages@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.41.0.tgz#72a4895c9930babf0082823f1d586a8cb4b7433d" + integrity sha512-JmQ9IKgIv1/qOaeQWQOdhlMz2Xip7A6HRUr19JDXcZpvbnKZYSf4l4hDFei8qJgRlWFfs90pcgBuSnnOOUkNUw== dependencies: - "@theia/core" "1.39.0" + "@theia/core" "1.41.0" react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" @@ -2328,278 +2373,292 @@ 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== +"@theia/monaco@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.41.0.tgz#9fc6643c12f001b0814afadc72037428ad72d2e0" + integrity sha512-Atop1W7aOiWEjrFBFhV+OUE5NC+WrKSGv7o5fa3hdG/JaJk3oJ75NpqQjN4CTBDtcNEcc02EncRXZKmXx5ZSlQ== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" - "@theia/filesystem" "1.39.0" - "@theia/markers" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/markers" "1.41.0" "@theia/monaco-editor-core" "1.72.3" - "@theia/outline-view" "1.39.0" + "@theia/outline-view" "1.41.0" fast-plist "^0.1.2" idb "^4.0.5" jsonc-parser "^2.2.0" vscode-oniguruma "1.6.1" vscode-textmate "^7.0.3" -"@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== +"@theia/native-webpack-plugin@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/native-webpack-plugin/-/native-webpack-plugin-1.41.0.tgz#8c23d15281809e431159112aae429ab0c5d49dfb" + integrity sha512-vxf0P41iBmg+3Iex48HBy4eUWVWlcmeJ7EE0xEw/acEvxqAj24hNepldZ28dEAjqyful1tRUO6QuTyqkx0u5vQ== dependencies: 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== +"@theia/navigator@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.41.0.tgz#d85e31492e7e7a473416984c2bac3126b3d77f0e" + integrity sha512-EcSJIjHrpSoOOsR+SsEtokYBTCK3LYWfYxUERoHSLeblnvB//b7g5Em18HH4utWmPDv+5NEm+HUK9LVG27Etiw== dependencies: - "@theia/core" "1.39.0" - "@theia/filesystem" "1.39.0" - "@theia/workspace" "1.39.0" + "@theia/core" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/workspace" "1.41.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== +"@theia/notebook@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/notebook/-/notebook-1.41.0.tgz#5f651c30b035a3ba23cdfc445055278c5b99eef0" + integrity sha512-Hs5Mnt9BCJSx+VwiGIcTOd5cZxoRSZXVcNSVL0ZeBsxVLW8SvDSDFg5W5ZWt56vo3P20vdZ5Isv6DqQrUgpwbQ== + dependencies: + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/monaco" "1.41.0" + uuid "^8.3.2" + +"@theia/outline-view@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.41.0.tgz#6fe502894fcf8092509733b5c28eb0bc7a2e7690" + integrity sha512-BPaZzLleCf6N8T4YSV5HfSGvc3d6FQLQm+7zM305JFfMdWjdvpbS1d/8Yz1pyDsG7G4EZy/pFt7Vxq7SRHztfQ== dependencies: - "@theia/core" "1.39.0" + "@theia/core" "1.41.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== +"@theia/output@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.41.0.tgz#1824adc155a981454172333ff9687880a945e74d" + integrity sha512-BeFUeVzibOQUNGoId0F2nZraTvLNEMgXTCJQycv2xCPHpbSUJSx8fgIo4rBQCwTYcLNT7SFsjUIm8WKD4sC7JA== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" - "@theia/monaco" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/monaco" "1.41.0" "@theia/monaco-editor-core" "1.72.3" "@types/p-queue" "^2.3.1" p-queue "^2.4.2" -"@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== +"@theia/ovsx-client@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.41.0.tgz#a7ecf8d6a55ba202dba1ec4913a7aeada9ff7a75" + integrity sha512-8mV0WO+p4ALW95y3WZmWs5dQwUEmj958qF8hu5PjeQ6t6+mDbkMIeoKr6uofYAxcJP2Jb4LKXwhiNZvK5n+0xQ== dependencies: - "@theia/request" "1.39.0" - semver "^5.4.1" + "@theia/request" "1.41.0" + semver "^7.5.4" -"@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== +"@theia/plugin-ext-vscode@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.41.0.tgz#7e6f3feb09417f57e68b291ecb86c7b66cefea0d" + integrity sha512-ekt6QxJIWmMO+cj/yIg4KhxTyeVbhib2qd2JNIw8Tj8INcRdVPbPOwKXS3a2CMcVD7fjOgydqsdFO/HssaI1bg== 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/callhierarchy" "1.41.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/monaco" "1.41.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" + "@theia/navigator" "1.41.0" + "@theia/plugin" "1.41.0" + "@theia/plugin-ext" "1.41.0" + "@theia/terminal" "1.41.0" + "@theia/typehierarchy" "1.41.0" + "@theia/userstorage" "1.41.0" + "@theia/workspace" "1.41.0" filenamify "^4.1.0" -"@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/plugin-ext@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.41.0.tgz#971dd5196aafddb97fa80a5572326ed77e9b66f3" + integrity sha512-EZ0vbOLlyoJMEUGKPCverJ2a3Tey0NtNUIQRvX0jqzhNbdPtA1Aevw2eUMko5UW6OA1S0LkJ7wEDku+wCIwgzw== + dependencies: + "@theia/bulk-edit" "1.41.0" + "@theia/callhierarchy" "1.41.0" + "@theia/console" "1.41.0" + "@theia/core" "1.41.0" + "@theia/debug" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/editor-preview" "1.41.0" + "@theia/file-search" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/markers" "1.41.0" + "@theia/messages" "1.41.0" + "@theia/monaco" "1.41.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" + "@theia/navigator" "1.41.0" + "@theia/notebook" "1.41.0" + "@theia/output" "1.41.0" + "@theia/plugin" "1.41.0" + "@theia/preferences" "1.41.0" + "@theia/scm" "1.41.0" + "@theia/search-in-workspace" "1.41.0" + "@theia/task" "1.41.0" + "@theia/terminal" "1.41.0" + "@theia/timeline" "1.41.0" + "@theia/typehierarchy" "1.41.0" + "@theia/variable-resolver" "1.41.0" + "@theia/workspace" "1.41.0" "@types/mime" "^2.0.1" "@vscode/debugprotocol" "^1.51.0" "@vscode/proxy-agent" "^0.13.2" + async-mutex "^0.4.0" decompress "^4.2.1" escape-html "^1.0.3" filenamify "^4.1.0" is-electron "^2.2.0" jsonc-parser "^2.2.0" lodash.clonedeep "^4.5.0" - macaddress "^0.2.9" + macaddress "^0.5.3" mime "^2.4.4" ps-tree "^1.2.0" - semver "^5.4.1" + semver "^7.5.4" uuid "^8.0.0" vhost "^3.0.2" 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/plugin@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.41.0.tgz#c7c3ccbe5bc18fa73d4d74f031ec22768e8d65ba" + integrity sha512-buWOnamoySgEAaIAvmn27xEBujejzMHlZ9lCmg09y2nxTW6sNJFEr9yoI/Ik9ktVRZOtVopqQULO90yaVBh3kA== -"@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== +"@theia/preferences@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.41.0.tgz#c0adf3984366694730a75cb43e5af0d11af0a906" + integrity sha512-en/WVgq8GQHTCFl+fCyx8HASV7x7sOSmAp9Lt2y8Ml8ksMUJHmZ64Nzdcc9TZ2qAcebpPSZ4RKe9FWrLYHpa0w== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" - "@theia/filesystem" "1.39.0" - "@theia/monaco" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/monaco" "1.41.0" "@theia/monaco-editor-core" "1.72.3" - "@theia/userstorage" "1.39.0" - "@theia/workspace" "1.39.0" + "@theia/userstorage" "1.41.0" + "@theia/workspace" "1.41.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.39.0": - version "1.39.0" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.39.0.tgz#5b0d4fb5ade9f8d550aab998d794a8645de0a141" - integrity sha512-Jm/pSNDshT09sS6GqQzRYQv7wArE7m31h7UoRksIsgVQM3xNmFOM080hkNhvvM3rTj6yGAVux5qfFZSXqBiAsg== +"@theia/process@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.41.0.tgz#2a2b34e447ea69a43e38fe8ab63e02936278d685" + integrity sha512-UTn+2Bb0jVdH85i3WRMugfbqRs5LGVNPoik1SSaz2/3qQgirT86M0QqSp9H+ys8z3cKuowPt0H/j/173YnPfwQ== dependencies: - "@theia/core" "1.39.0" + "@theia/core" "1.41.0" node-pty "0.11.0-beta17" string-argv "^0.1.1" -"@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== +"@theia/request@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.41.0.tgz#329103397337f49582791e6c4e681aeb24875a6c" + integrity sha512-n+ze+qqZLTzkl1/M27f6+bJpJMbi4uKGJyLfWdRJFx7KFj01JFhiEAh9q4Qf/e5HAadzbYy35FWj4TviCG1lYw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" -"@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== +"@theia/scm@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.41.0.tgz#2d6f5e787bafe38867ca7b903a25252b94861cf8" + integrity sha512-DPFXhDIu9jjF7dDnfSHOYMs33LHDGPP+QaShuO9fhYLBFhzOLD670/JCSK3rznF9wfi+v6htkuGMIAlkKyFaKA== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" - "@theia/filesystem" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.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.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" +"@theia/search-in-workspace@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.41.0.tgz#446027b8b68bcc42919dc2428e08002126a1407e" + integrity sha512-5q3DJUewUtsmkawKgcG/Eu6QF+2p6ZarEmwFaiEY/lNdTpJG311o1rapYT/iIfjcxFFwsHZbjPWwhpNBtJbLlA== + dependencies: + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/navigator" "1.41.0" + "@theia/process" "1.41.0" + "@theia/workspace" "1.41.0" "@vscode/ripgrep" "^1.14.2" 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== +"@theia/task@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.41.0.tgz#3c37dcf932cd8d542fd947f467d4eeebb7578de8" + integrity sha512-1FBb3a66ZNa9tdLXv2qZw31M7sCbcelMXlTC+90AssX7nT4nUdKHkYINnsTMRYWaUR5sb2U86RZi/lJy/g6nSw== 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/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/markers" "1.41.0" + "@theia/monaco" "1.41.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" + "@theia/process" "1.41.0" + "@theia/terminal" "1.41.0" + "@theia/userstorage" "1.41.0" + "@theia/variable-resolver" "1.41.0" + "@theia/workspace" "1.41.0" async-mutex "^0.3.1" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -"@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" +"@theia/terminal@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.41.0.tgz#11762e0da89b7dd599d334f81ff7da1a45139ae2" + integrity sha512-xQ+0yS4ichwGsAUEczlOZwfzQHV3LtnoXwQOgcQjRBtAROmZYpc/ybU9k3O88A1X8F84AT7COcO3PKHVBezjXQ== + dependencies: + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/process" "1.41.0" + "@theia/variable-resolver" "1.41.0" + "@theia/workspace" "1.41.0" xterm "^4.16.0" xterm-addon-fit "^0.5.0" xterm-addon-search "^0.8.2" -"@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== +"@theia/timeline@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.41.0.tgz#f82a95208f3af08a377dbad253d86b6845209d04" + integrity sha512-LxNJqL93Al8q/6qZOQn0ZI/vAoYYaFNK+rnlioq0TJRSFZznRF14sSrzvWRv30rtDoxlJvVDELlUpl9fm3X2zw== dependencies: - "@theia/core" "1.39.0" - "@theia/navigator" "1.39.0" + "@theia/core" "1.41.0" + "@theia/navigator" "1.41.0" -"@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== +"@theia/typehierarchy@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.41.0.tgz#554bff105148651493c60872d1e3763ad069ac88" + integrity sha512-GPOXJm27JWoGXzmn0yYtRZaXVykzFvGaF/cmfw9cFPeLBtm81wGwyUw716SzdCZPimuw825uP/IeWp6wubPSvw== dependencies: - "@theia/core" "1.39.0" - "@theia/editor" "1.39.0" + "@theia/core" "1.41.0" + "@theia/editor" "1.41.0" "@types/uuid" "^7.0.3" uuid "^8.0.0" -"@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== +"@theia/userstorage@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.41.0.tgz#127e564e0163e629391fe974bb6c2bd6cea3e074" + integrity sha512-5afYNaPNdWuqt/eHmnPgfpL2At3mtU2kgP3jrLNPY7tCCyeCxrvz2lz6+Twyb0xsBS8+m6EbiINitjoKvZEF3Q== dependencies: - "@theia/core" "1.39.0" - "@theia/filesystem" "1.39.0" + "@theia/core" "1.41.0" + "@theia/filesystem" "1.41.0" -"@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== +"@theia/variable-resolver@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.41.0.tgz#4c0f9667da930ac4b7a03a12d6d011435d4bde56" + integrity sha512-4CGPGQAN7iVk86q4ZtMsiV9fIi7GvnKpu6qB+yVUQg4Tnc18kYaYPGxQMpoaccmQ9mWQpVTT0JaU8o7ltPFxkA== dependencies: - "@theia/core" "1.39.0" + "@theia/core" "1.41.0" -"@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== +"@theia/workspace@1.41.0": + version "1.41.0" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.41.0.tgz#db474c271f7985349260d1d95549adf4422baa16" + integrity sha512-mM3t3oLCdY+xi/XWlYmG8DKECBY9nm9vcng3eNCz6omsdzRD6SkVTXhqm38E+XG8XLzMYryuwlZYmvaJ2qSoSw== dependencies: - "@theia/core" "1.39.0" - "@theia/filesystem" "1.39.0" - "@theia/variable-resolver" "1.39.0" + "@theia/core" "1.41.0" + "@theia/filesystem" "1.41.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/variable-resolver" "1.41.0" jsonc-parser "^2.2.0" valid-filename "^2.0.1" @@ -2644,9 +2703,9 @@ integrity sha512-tnF0BKFwI+Vzqwb9p7KgpaKStg/WHqbiGWz5GPpn+ZeBvJ1iY7NkmeNJUsHIN/4c7CF2zr8FT5JRhs3F5aAPNw== "@types/bent@^7.0.1": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.3.tgz#b8daa06e72219045b3f67f968d590d3df3875d96" - integrity sha512-5NEIhVzHiZ6wMjFBmJ3gwjxwGug6amMoAn93rtDBttwrODxm+bt63u+MJA7H9NGGM4X1m73sJrAxDapktl036Q== + version "7.3.4" + resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.4.tgz#83352a5c65bbe2a47913606aeec5d74cb8d1977d" + integrity sha512-m2dySDogScw79djR20mBWjn7AOUw9mPwsOy8Hygssy9cijELV1G94+98onpiqSh7uoLsT1tBgeFu96GS9dWYoQ== dependencies: "@types/node" "*" @@ -2737,9 +2796,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.44.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" - integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== + version "8.44.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" + integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2755,9 +2814,9 @@ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@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== + version "4.17.36" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" + integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2824,9 +2883,9 @@ integrity sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ== "@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== + version "21.1.2" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.2.tgz#d04db019ad62174d28c63c927761f2f196825f04" + integrity sha512-bGj+7TaCkOwkJfx7HtS9p22Ij0A2aKMuz8a1+owpkxa1wU/HUBy/WAXhdv90uDdVI9rSjGvUrXmLSeA9VP3JeA== dependencies: "@types/node" "*" "@types/tough-cookie" "*" @@ -2845,9 +2904,9 @@ "@types/node" "*" "@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" - integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b" + integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g== "@types/lodash.debounce@4.0.3": version "4.0.3" @@ -2871,14 +2930,9 @@ "@types/lodash" "*" "@types/lodash@*": - 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" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + version "4.14.197" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" + integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== "@types/markdown-it@^12.2.3": version "12.2.3" @@ -2961,14 +3015,14 @@ form-data "^3.0.0" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.4.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" - integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== "@types/node@^18.11.18": - version "18.17.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.9.tgz#b219fa0da3c574399f4a44455ea4b388029afd56" - integrity sha512-fxaKquqYcPOGwE7tC1anJaPJ0GHyOVzfA2oUoXECjBjrtsIz4YJvtNYsq8LUcjEUehEF+jGpx8Z+lFrtT6z0tg== + version "18.17.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.12.tgz#c6bd7413a13e6ad9cfb7e97dd5c4e904c1821e50" + integrity sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3004,9 +3058,9 @@ integrity sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== "@types/range-parser@*": version "1.2.4" @@ -3042,9 +3096,9 @@ "@types/react" "*" "@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== + version "18.2.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" + integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3082,15 +3136,10 @@ 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.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/semver@^7.3.12", "@types/semver@^7.3.6", "@types/semver@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/send@*": version "0.17.1" @@ -3142,14 +3191,14 @@ integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== "@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== + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== "@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== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.6.tgz#455e838428ae709f82c85c677dcf5115f2061ac1" + integrity sha512-U/wu4HTp6T2dUmKqDtOUKS9cYhawuf8txqKF3Jp1iMDG8fP5HtjSldcN0g4m+/h7XHU1to1/HDCT0qeeUiu0EA== "@types/verror@^1.10.3": version "1.10.6" @@ -3157,9 +3206,9 @@ 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== + version "1.81.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.81.0.tgz#c27228dd063002e0e00611be70b0497beaa24d39" + integrity sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w== "@types/write-json-file@^2.2.1": version "2.2.1" @@ -3295,9 +3344,9 @@ integrity sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ== "@vscode/debugprotocol@^1.51.0": - version "1.61.0" - resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.61.0.tgz#82bbcaba5a925f1f58246c9f50b669855c9f23f9" - integrity sha512-K/kF27jIStVFqlmUaGc2u+Dj8IR7YdEiSqShWr7MWhDudqpAW7uu7XMwoFwjpuC9LSaVwJMIX7EFC5OJ/RmnDQ== + version "1.63.0" + resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.63.0.tgz#f6d16c382765d2533e515939ac2857aa1ed7ba35" + integrity sha512-7gewwv69pA7gcJUhtJsru5YN7E1AwwnlBrF5mJY4R/NGInOUqOYOWHlqQwG+4AXn0nXWbcn26MHgaGI9Q26SqA== "@vscode/proxy-agent@^0.13.2": version "0.13.2" @@ -3541,9 +3590,9 @@ 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== + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -3642,12 +3691,10 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -4212,14 +4259,14 @@ array.prototype.flatmap@^1.3.1: 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== +array.prototype.reduce@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" + integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" @@ -4320,6 +4367,13 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -4341,9 +4395,9 @@ atomically@^1.7.0: integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== auth0-js@^9.14.0: - version "9.22.0" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.22.0.tgz#5b17632e547fa69e3755d9e5bae1cbea072c0e97" - integrity sha512-gyqxSyftzF8TK1sooPEk8DsP/I7bMMJi3lx8nnDZor8LjUXKr1kP40pLd0YzIDESO9sKu5TD2QMBooykc5bSZg== + version "9.22.1" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.22.1.tgz#8266f859f215199c70c4ef2988ab0bd63f67b3f4" + integrity sha512-AcyJiWhsyG5zdx40O9i/okpLLEvB23/6CivWynmGtP43s2C4GSq3E+XdCRw64ifmZ7t6ZK4Yzfpiqy5KVXEtJg== dependencies: base64-js "^1.5.1" idtoken-verifier "^2.2.2" @@ -4387,9 +4441,9 @@ axios@^0.21.1: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -4419,29 +4473,29 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -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== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.1" - "@nicolo-ribaudo/semver-v6" "^6.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -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== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" core-js-compat "^3.31.0" -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== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" bail@^2.0.0: version "2.0.2" @@ -4638,14 +4692,14 @@ browser-stdout@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.21.9: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" update-browserslist-db "^1.0.11" btoa@^1.2.1: @@ -4785,15 +4839,15 @@ bytesish@^0.4.1: integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== 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== + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== dependencies: "@npmcli/fs" "^3.1.0" fs-minipass "^3.0.0" glob "^10.2.2" lru-cache "^7.7.1" - minipass "^5.0.0" + minipass "^7.0.3" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" @@ -4828,14 +4882,14 @@ cacheable-lookup@^7.0.0: 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== + version "10.2.13" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.13.tgz#b7012bb4a2acdb18cb54d2dff751d766b3500842" + integrity sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA== dependencies: "@types/http-cache-semantics" "^4.0.1" get-stream "^6.0.1" http-cache-semantics "^4.1.1" - keyv "^4.5.2" + keyv "^4.5.3" mimic-response "^4.0.0" normalize-url "^8.0.0" responselike "^3.0.0" @@ -4898,10 +4952,10 @@ camelcase@^6.0.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== +caniuse-lite@^1.0.30001517: + version "1.0.30001525" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" + integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== capital-case@^1.0.4: version "1.0.4" @@ -4918,9 +4972,9 @@ caseless@~0.12.0: integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chai@^4.2.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + version "4.3.8" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" + integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" @@ -4953,7 +5007,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.4.2: +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== @@ -5053,10 +5107,10 @@ 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== +chromium-bidi@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.4.tgz#44f25d4fa5d2f3debc3fc3948d0657194cac4407" + integrity sha512-4BX5cSaponuvVT1+SbLYTOAgDoVtX/Khoc9UsbFJ/AsPVUeFAM3RiIDFI6XFhLYMi9WmVJqh1ZH+dRpNKkKwiQ== dependencies: mitt "3.0.0" @@ -5571,11 +5625,11 @@ copy-webpack-plugin@^8.1.1: serialize-javascript "^5.0.1" 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== + version "3.32.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" + integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== dependencies: - browserslist "^4.21.9" + browserslist "^4.21.10" core-util-is@1.0.2: version "1.0.2" @@ -5595,10 +5649,10 @@ 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== +cosmiconfig@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" + integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" @@ -6027,7 +6081,7 @@ 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== @@ -6058,19 +6112,19 @@ detect-libc@^1.0.3: integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== detect-libc@^2.0.0, detect-libc@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -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== +devtools-protocol@0.0.1094867: + version "0.0.1094867" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz#2ab93908e9376bd85d4e0604aa2651258f13e374" + integrity sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ== dezalgo@^1.0.4: version "1.0.4" @@ -6080,10 +6134,10 @@ dezalgo@^1.0.4: 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-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@3.5.0, diff@^3.4.0: version "3.5.0" @@ -6151,9 +6205,9 @@ dmg-license@^1.0.11: verror "^1.10.0" dns-packet@^5.2.4: - version "5.6.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -6230,10 +6284,10 @@ dotenv@^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== +dotenv@~16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== drivelist@^9.0.2, drivelist@^9.2.4: version "9.2.4" @@ -6340,10 +6394,10 @@ electron-store@^8.0.0: conf "^10.2.0" type-fest "^2.17.0" -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-to-chromium@^1.4.477: + version "1.4.508" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" + integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== electron-updater@^4.6.5: version "4.6.5" @@ -6360,9 +6414,9 @@ electron-updater@^4.6.5: semver "^7.3.5" electron@^25.5.0: - version "25.7.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-25.7.0.tgz#0076c2e6acfe363f666a7b77d826a6f8a3028bcd" - integrity sha512-P82EzYZ8k9J21x5syhXV7EkezDmEXwycReXnagfzS0kwepnrlWzq1aDIUWdNvzTdHobky4m/nYcL98qd73mEVA== + version "25.8.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-25.8.0.tgz#60c84f1f256924ac5a0aff13276b901b0c43767a" + integrity sha512-T3kC1a/3ntSaYMCVVfUUc9v7myPzi6J2GP0Ad/CyfWKDPp054dGyKxb2EEjKnxQQ7wfjsT1JTEdBG04x6ekVBw== dependencies: "@electron/get" "^2.0.0" "@types/node" "^18.11.18" @@ -6407,26 +6461,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.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== +engine.io-client@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.2.tgz#8709e22c291d4297ae80318d3c8baeae71f0e002" + integrity sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" - engine.io-parser "~5.1.0" + engine.io-parser "~5.2.1" ws "~8.11.0" xmlhttprequest-ssl "~2.0.0" -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-parser@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" + integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== -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== +engine.io@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c" + integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -6436,7 +6490,7 @@ engine.io@~6.5.0: cookie "~0.4.1" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.1.0" + engine.io-parser "~5.2.1" ws "~8.11.0" enhanced-resolve@^5.15.0: @@ -6447,7 +6501,15 @@ enhanced-resolve@^5.15.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, enquirer@~2.3.6: +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -6508,7 +6570,7 @@ 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.20.4, es-abstract@^1.21.2: +es-abstract@^1.20.4, es-abstract@^1.22.1: 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== @@ -6558,6 +6620,26 @@ es-array-method-boxes-properly@^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-iterator-helpers@^1.0.12: + version "1.0.14" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365" + integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.0" + safe-array-concat "^1.0.0" + 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" @@ -6635,9 +6717,9 @@ escodegen@^2.0.0: source-map "~0.6.1" 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== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-plugin-prettier@^4.2.1: version "4.2.1" @@ -6652,14 +6734,15 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== 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== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -6669,7 +6752,7 @@ eslint-plugin-react@^7.32.2: object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.4" - semver "^6.3.0" + semver "^6.3.1" string.prototype.matchall "^4.0.8" eslint-plugin-unused-imports@^2.0.0: @@ -6692,40 +6775,40 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -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== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.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-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.39.0: - version "8.45.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== + version "8.48.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.48.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -6748,7 +6831,7 @@ eslint@^8.39.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0: +espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -6911,9 +6994,9 @@ execa@^5.0.0, execa@^5.1.1: 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== + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.1" @@ -7077,9 +7160,9 @@ fast-diff@^1.1.2: 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== + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-glob@3.2.7: version "3.2.7" @@ -7093,9 +7176,9 @@ fast-glob@3.2.7: micromatch "^4.0.4" 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== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -7320,11 +7403,12 @@ fix-path@^3.0.0: shell-path "^2.1.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" flat@^4.1.0: @@ -7339,7 +7423,7 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -7507,11 +7591,11 @@ fs-minipass@^2.0.0: 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== + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: - minipass "^5.0.0" + minipass "^7.0.3" fs.realpath@^1.0.0: version "1.0.0" @@ -7524,9 +7608,9 @@ fsevents@~2.1.1: integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fstream@^1.0.12: version "1.0.12" @@ -7544,16 +7628,16 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +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== @@ -7817,9 +7901,9 @@ glob@7.2.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== + version "10.3.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" + integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== dependencies: foreground-child "^3.1.0" jackspeak "^2.0.3" @@ -7878,9 +7962,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -8079,12 +8163,12 @@ handlebars@4.7.4: uglify-js "^3.1.4" handlebars@^4.0.11, 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== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -8540,9 +8624,9 @@ inline-style-parser@0.1.1: integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inquirer@^8.2.4: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -8558,7 +8642,7 @@ inquirer@^8.2.4: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" inspect-with-kind@^1.0.5: version "1.0.5" @@ -8567,7 +8651,7 @@ inspect-with-kind@^1.0.5: dependencies: kind-of "^6.0.2" -internal-slot@^1.0.3, internal-slot@^1.0.5: +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== @@ -8647,6 +8731,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -8698,10 +8789,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -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== +is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -8719,7 +8810,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -8778,6 +8869,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + 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" @@ -8795,7 +8893,7 @@ 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-generator-function@^1.0.7: +is-generator-function@^1.0.10, 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== @@ -8826,6 +8924,11 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" @@ -8956,6 +9059,11 @@ is-self-closing@^1.0.1: dependencies: self-closing-tags "^1.0.1" +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -9012,21 +9120,22 @@ is-text-path@^1.0.1: text-extensions "^1.0.0" 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== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== 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" + which-typed-array "^1.1.11" is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -9034,6 +9143,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -9093,10 +9210,20 @@ 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== +iterator.prototype@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.1.tgz#ab5b790e23ec00658f5974e032a2b05188bd3a5c" + integrity sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ== + dependencies: + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.3" + 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== + version "2.3.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.1.tgz#ce2effa4c458e053640e61938865a5b5fae98456" + integrity sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -9113,19 +9240,19 @@ jake@^10.8.5: 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== + version "29.6.4" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.4.tgz#85aaa6c92a79ae8cd9a54ebae8d5b6d9a513314a" + integrity sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw== dependencies: chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.6.1" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.6.3" -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-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-worker@^27.4.5: version "27.5.1" @@ -9273,7 +9400,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -9310,9 +9437,9 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== "jsx-ast-utils@^2.4.1 || ^3.0.0": - 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== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" array.prototype.flat "^1.3.1" @@ -9347,7 +9474,7 @@ keytar@7.2.0: node-addon-api "^3.0.0" prebuild-install "^6.0.0" -keyv@^4.0.0, keyv@^4.5.2: +keyv@^4.0.0, keyv@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== @@ -9403,12 +9530,12 @@ lcid@^2.0.0: invert-kv "^2.0.0" 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== + version "7.2.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.2.0.tgz#55ab3de42032168a75fc7a2ce184a8acb7efc5ea" + integrity sha512-E13iAY4Tdo+86m4ClAe0j0bP7f8QG2neJReglILPOe+gAOoX17TGqEWanmkDELlUXOrTTwnte0ewc6I6/NOqpg== dependencies: - "@lerna/child-process" "7.1.4" - "@lerna/create" "7.1.4" + "@lerna/child-process" "7.2.0" + "@lerna/create" "7.2.0" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -9812,11 +9939,6 @@ logging-helpers@^1.0.0: isobject "^3.0.0" log-utils "^0.2.1" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - long@^5.0.0: version "5.2.3" resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" @@ -9881,9 +10003,9 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== "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== + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== lzma-native@^8.0.5: version "8.0.6" @@ -9894,10 +10016,10 @@ lzma-native@^8.0.5: node-gyp-build "^4.2.1" readable-stream "^3.6.0" -macaddress@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" - integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== +macaddress@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.5.3.tgz#2b9d6832be934cb775749f30f57d6537184a2bda" + integrity sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg== make-dir@3.1.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" @@ -10488,11 +10610,11 @@ minipass-collect@^1.0.2: minipass "^3.0.0" 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== + version "3.0.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" + integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== dependencies: - minipass "^5.0.0" + minipass "^7.0.3" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -10544,10 +10666,10 @@ minipass@^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== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -10707,26 +10829,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@^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== +msgpackr-extract@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz#4bb749b58d9764cfdc0d91c7977a007b08e8f262" + integrity sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog== dependencies: - node-gyp-build-optional-packages "5.0.7" + node-gyp-build-optional-packages "5.0.3" optionalDependencies: - "@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.9.5" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.9.5.tgz#ac548c5f4546db895e84e46d39d813be961dc527" - integrity sha512-/IJ3cFSN6Ci3eG2wLhbFEL6GT63yEaoN/R5My2QkV6zro+OJaVRLPlwvxY7EtHYSmDlQpk8stvOQTL2qJFkDRg== + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-arm" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-x64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-win32-x64" "2.2.0" + +msgpackr@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.6.1.tgz#4f3c94d6a5b819b838ffc736eddaf60eba436d20" + integrity sha512-Je+xBEfdjtvA4bKaOv8iRhjC8qX2oJwpYH4f7JrG4uMVJVmnmkAT4pjKdbztKprGj3iwjcxPzb5umVZ02Qq3tA== optionalDependencies: - msgpackr-extract "^3.0.2" + msgpackr-extract "^2.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -10871,9 +10993,9 @@ no-case@^3.0.4: tslib "^2.0.3" 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== + version "3.47.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.47.0.tgz#6cbfa2916805ae25c2b7156ca640131632eb05e8" + integrity sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A== dependencies: semver "^7.3.5" @@ -10927,30 +11049,30 @@ node-fetch@2.6.7: whatwg-url "^5.0.0" 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== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-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== + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: 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-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-gyp-build@^4.2.1, node-gyp-build@^4.3.0: - 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== + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== node-gyp@^9.0.0, node-gyp@^9.3.0: version "9.4.0" @@ -10985,6 +11107,11 @@ node-log-rotate@^0.1.5: lodash "^4.17.15" moment "^2.25.3" +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== + node-pty@0.11.0-beta17: version "0.11.0-beta17" resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta17.tgz#7df6a60dced6bf7a3a282b65cf51980c68954af6" @@ -10992,7 +11119,7 @@ node-pty@0.11.0-beta17: dependencies: nan "^2.14.0" -node-releases@^2.0.12: +node-releases@^2.0.13: 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== @@ -11076,9 +11203,9 @@ npm-bundled@^3.0.0: npm-normalize-package-bin "^3.0.0" 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== + version "6.2.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.2.0.tgz#fae55b9967b03ac309695ec96629492d5cedf371" + integrity sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g== dependencies: semver "^7.1.1" @@ -11129,9 +11256,9 @@ npm-packlist@^7.0.0: 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== + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== dependencies: npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" @@ -11226,12 +11353,12 @@ nwsapi@^2.2.4: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -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== +nx@16.7.4, "nx@>=16.5.1 < 17": + version "16.7.4" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.7.4.tgz#355cfe9187822fa29676b88da1673a09acab990e" + integrity sha512-L0Cbikk5kO+IBH0UQ2BOAut5ndeHXBlACKzjOPOCluY8WYh2sxWYt9/N/juFBN3XXRX7ionTr1PhWUzNE0Mzqw== dependencies: - "@nrwl/tao" "16.5.2" + "@nrwl/tao" "16.7.4" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" @@ -11241,7 +11368,7 @@ nx@16.5.2, "nx@>=16.5.1 < 17": cli-cursor "3.1.0" cli-spinners "2.6.1" cliui "^7.0.2" - dotenv "~10.0.0" + dotenv "~16.3.1" enquirer "~2.3.6" fast-glob "3.2.7" figures "3.2.0" @@ -11253,6 +11380,7 @@ nx@16.5.2, "nx@>=16.5.1 < 17": jsonc-parser "3.2.0" lines-and-columns "~2.0.3" minimatch "3.0.5" + node-machine-id "1.1.12" npm-run-path "^4.0.1" open "^8.4.0" semver "7.5.3" @@ -11266,16 +11394,16 @@ nx@16.5.2, "nx@>=16.5.1 < 17": yargs "^17.6.2" yargs-parser "21.1.1" 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" + "@nx/nx-darwin-arm64" "16.7.4" + "@nx/nx-darwin-x64" "16.7.4" + "@nx/nx-freebsd-x64" "16.7.4" + "@nx/nx-linux-arm-gnueabihf" "16.7.4" + "@nx/nx-linux-arm64-gnu" "16.7.4" + "@nx/nx-linux-arm64-musl" "16.7.4" + "@nx/nx-linux-x64-gnu" "16.7.4" + "@nx/nx-linux-x64-musl" "16.7.4" + "@nx/nx-win32-arm64-msvc" "16.7.4" + "@nx/nx-win32-x64-msvc" "16.7.4" object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -11329,41 +11457,41 @@ object.assign@^4.1.4: object-keys "^1.1.1" 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== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" 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== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.getownpropertydescriptors@^2.0.3: - 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== + version "2.1.7" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" + integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== dependencies: - array.prototype.reduce "^1.0.5" + array.prototype.reduce "^1.0.6" call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" safe-array-concat "^1.0.0" 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== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.pick@^1.3.0: version "1.3.0" @@ -11373,13 +11501,13 @@ object.pick@^1.3.0: isobject "^3.0.1" 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== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" on-finished@2.4.1: version "2.4.1" @@ -11981,9 +12109,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 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== + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -12046,12 +12174,12 @@ prettier@^2.3.1: 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== +pretty-format@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" + integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== dependencies: - "@jest/schemas" "^29.6.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -12115,9 +12243,9 @@ property-information@^6.0.0: integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== 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== + version "7.2.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" + integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -12215,24 +12343,24 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^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== +puppeteer-core@19.7.2: + version "19.7.2" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.7.2.tgz#deee9ef915829b6a1d1a3a008625c29eeb251161" + integrity sha512-PvI+fXqgP0uGJxkyZcX51bnzjFA73MODZOAv0fSD35yR7tvbqwtMV3/Y+hxQ0AMMwzxkEebP6c7po/muqxJvmQ== dependencies: - "@puppeteer/browsers" "0.5.0" - chromium-bidi "0.4.7" + chromium-bidi "0.4.4" cross-fetch "3.1.5" debug "4.3.4" - devtools-protocol "0.0.1107588" + devtools-protocol "0.0.1094867" extract-zip "2.0.1" https-proxy-agent "5.0.1" proxy-from-env "1.1.0" + rimraf "3.0.2" tar-fs "2.1.1" unbzip2-stream "1.4.3" - ws "8.13.0" + ws "8.11.0" -puppeteer-to-istanbul@^1.4.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== @@ -12242,17 +12370,16 @@ puppeteer-to-istanbul@^1.4.0: v8-to-istanbul "^1.2.1" yargs "^15.3.1" -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== +puppeteer@19.7.2: + version "19.7.2" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.7.2.tgz#1b3ce99a093cc2f8f84dfb06f066d0757ea79d4b" + integrity sha512-4Lm7Qpe/LU95Svirei/jDLDvR5oMrl9BPGd7HMY5+Q28n+BhvKuW97gKkR+1LlI86bO8J3g8rG/Ll5kv9J1nlQ== dependencies: - "@puppeteer/browsers" "0.5.0" - cosmiconfig "8.1.3" + cosmiconfig "8.0.0" https-proxy-agent "5.0.1" progress "2.0.3" proxy-from-env "1.1.0" - puppeteer-core "19.11.1" + puppeteer-core "19.7.2" qs@6.11.0: version "6.11.0" @@ -12628,6 +12755,18 @@ 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== +reflect.getprototypeof@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + 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" @@ -12640,15 +12779,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.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-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== -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== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -12660,7 +12799,7 @@ 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.3, regexp.prototype.flags@^1.5.0: +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== @@ -12802,11 +12941,11 @@ 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.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -12868,7 +13007,7 @@ rimraf@2, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -13066,12 +13205,12 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: 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== @@ -13247,17 +13386,19 @@ signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, s 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== + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sigstore@^1.3.0, sigstore@^1.4.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.7.0.tgz#9186e6c8ce1ab0cba5d97b414212d40f0a01564e" - integrity sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q== + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== dependencies: - "@sigstore/protobuf-specs" "^0.1.0" - "@sigstore/tuf" "^1.0.1" + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" make-fetch-happen "^11.0.1" simple-concat@^1.0.0: @@ -13365,13 +13506,13 @@ socket.io-adapter@~2.5.2: ws "~8.11.0" socket.io-client@^4.5.3: - 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== + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" + integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.5.1" + engine.io-client "~6.5.2" socket.io-parser "~4.2.4" socket.io-parser@~4.2.4: @@ -13383,15 +13524,15 @@ socket.io-parser@~4.2.4: debug "~4.3.1" socket.io@^4.5.3: - version "4.7.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.1.tgz#9009f31bf7be25478895145e92fbc972ad1db900" - integrity sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw== + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" + integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== dependencies: accepts "~1.3.4" base64id "~2.0.0" cors "~2.8.5" debug "~4.3.2" - engine.io "~6.5.0" + engine.io "~6.5.2" socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" @@ -13570,11 +13711,11 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 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== + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== dependencies: - minipass "^5.0.0" + minipass "^7.0.3" ssri@^9.0.1: version "9.0.1" @@ -13614,9 +13755,9 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 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== + version "2.15.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.1.tgz#396ad286d8bc3eeef8f5cea3f029e81237c024c6" + integrity sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA== dependencies: fast-fifo "^1.1.0" queue-tick "^1.0.1" @@ -13694,17 +13835,17 @@ string-width@^5.0.1, string-width@^5.1.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== + version "4.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" + integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" string.prototype.trim@^1.2.7: @@ -13907,9 +14048,9 @@ style-loader@^2.0.0: schema-utils "^3.0.0" 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== + version "0.4.2" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" + integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== dependencies: inline-style-parser "0.1.1" @@ -14105,9 +14246,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" 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== + version "5.19.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" + integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -14342,9 +14483,9 @@ tslib@^1.10.0, tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 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== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -14481,9 +14622,9 @@ typeof-article@^0.1.1: kind-of "^3.1.0" "typescript@>=3 < 6": - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== typescript@^4.0.2, typescript@^4.9.3: version "4.9.5" @@ -14829,11 +14970,16 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" -v8-compile-cache@2.3.0, v8-compile-cache@^2.2.0: +v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +v8-compile-cache@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + v8-to-istanbul@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-1.2.1.tgz#8f63a94b7f91243f5dcc6a495540b5653beb1279" @@ -15039,9 +15185,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 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== + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -15107,6 +15253,34 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" @@ -15117,17 +15291,16 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== -which-typed-array@^1.1.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== +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== 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" @@ -15218,7 +15391,7 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -15291,20 +15464,20 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.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@8.11.0, 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== 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.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== +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== xdg-basedir@^4.0.0: version "4.0.0" @@ -15487,19 +15660,6 @@ yargs@16.2.0, yargs@^16.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" From 57975f8d91c7158becdbf3a74d0713a50aa577ca Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:41:14 +0200 Subject: [PATCH 255/384] fix: use board+port at startup if it's restored (#2242) - update status bar if board+port is restored, - refresh the debug toolbar if board+port is restored, - init `Include Library` if board+port is ready, and - init library examples if board+port is ready Closes #2237 Closes #2239 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/contributions/debug.ts | 6 ++-- .../src/browser/contributions/examples.ts | 4 +-- .../browser/contributions/include-library.ts | 30 ++++++++----------- .../browser/contributions/selected-board.ts | 10 ++++--- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index ee07d7aa5..5dec4655c 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -19,7 +19,7 @@ import { SketchContribution, TabBarToolbarRegistry, } from './contribution'; -import { MaybePromise, MenuModelRegistry, nls } from '@theia/core/lib/common'; +import { MenuModelRegistry, nls } from '@theia/core/lib/common'; import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoMenus } from '../menu/arduino-menus'; @@ -99,8 +99,8 @@ export class Debug extends SketchContribution { this.notificationCenter.onPlatformDidUninstall(() => this.refreshState()); } - override onReady(): MaybePromise<void> { - this.refreshState(); + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.refreshState()); } override registerCommands(registry: CommandRegistry): void { diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index 3796b7535..9bb2cbd56 100644 --- a/arduino-ide-extension/src/browser/contributions/examples.ts +++ b/arduino-ide-extension/src/browser/contributions/examples.ts @@ -300,8 +300,8 @@ export class LibraryExamples extends Examples { this.notificationCenter.onLibraryDidUninstall(() => this.update()); } - override async onReady(): Promise<void> { - this.update(); // no `await` + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.update()); } protected override handleBoardChanged(board: Board | undefined): void { diff --git a/arduino-ide-extension/src/browser/contributions/include-library.ts b/arduino-ide-extension/src/browser/contributions/include-library.ts index 5d77e9ec3..9b2a45101 100644 --- a/arduino-ide-extension/src/browser/contributions/include-library.ts +++ b/arduino-ide-extension/src/browser/contributions/include-library.ts @@ -2,7 +2,6 @@ import PQueue from 'p-queue'; import { inject, injectable } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; -import { EditorManager } from '@theia/editor/lib/browser'; import { MenuModelRegistry, MenuPath } from '@theia/core/lib/common/menu'; import { Disposable, @@ -22,28 +21,25 @@ import { CurrentSketch } from '../sketches-service-client-impl'; @injectable() export class IncludeLibrary extends SketchContribution { @inject(CommandRegistry) - protected readonly commandRegistry: CommandRegistry; + private readonly commandRegistry: CommandRegistry; @inject(MenuModelRegistry) - protected readonly menuRegistry: MenuModelRegistry; + private readonly menuRegistry: MenuModelRegistry; @inject(MainMenuManager) - protected readonly mainMenuManager: MainMenuManager; - - @inject(EditorManager) - protected override readonly editorManager: EditorManager; + private readonly mainMenuManager: MainMenuManager; @inject(NotificationCenter) - protected readonly notificationCenter: NotificationCenter; + private readonly notificationCenter: NotificationCenter; @inject(BoardsServiceProvider) - protected readonly boardsServiceProvider: BoardsServiceProvider; + private readonly boardsServiceProvider: BoardsServiceProvider; @inject(LibraryService) - protected readonly libraryService: LibraryService; + private readonly libraryService: LibraryService; - protected readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); - protected readonly toDispose = new DisposableCollection(); + private readonly queue = new PQueue({ autoStart: true, concurrency: 1 }); + private readonly toDispose = new DisposableCollection(); override onStart(): void { this.boardsServiceProvider.onBoardsConfigDidChange(() => @@ -56,8 +52,8 @@ export class IncludeLibrary extends SketchContribution { this.notificationCenter.onDidReinitialize(() => this.updateMenuActions()); } - override async onReady(): Promise<void> { - this.updateMenuActions(); + override onReady(): void { + this.boardsServiceProvider.ready.then(() => this.updateMenuActions()); } override registerMenus(registry: MenuModelRegistry): void { @@ -93,7 +89,7 @@ export class IncludeLibrary extends SketchContribution { }); } - protected async updateMenuActions(): Promise<void> { + private async updateMenuActions(): Promise<void> { return this.queue.add(async () => { this.toDispose.dispose(); this.mainMenuManager.update(); @@ -139,7 +135,7 @@ export class IncludeLibrary extends SketchContribution { }); } - protected registerLibrary( + private registerLibrary( libraryOrPlaceholder: LibraryPackage | string, menuPath: MenuPath ): Disposable { @@ -172,7 +168,7 @@ export class IncludeLibrary extends SketchContribution { ); } - protected async includeLibrary(library: LibraryPackage): Promise<void> { + private async includeLibrary(library: LibraryPackage): Promise<void> { const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return; diff --git a/arduino-ide-extension/src/browser/contributions/selected-board.ts b/arduino-ide-extension/src/browser/contributions/selected-board.ts index 8c1ad74d6..00fbba575 100644 --- a/arduino-ide-extension/src/browser/contributions/selected-board.ts +++ b/arduino-ide-extension/src/browser/contributions/selected-board.ts @@ -19,16 +19,18 @@ export class SelectedBoard extends Contribution { private readonly boardsServiceProvider: BoardsServiceProvider; override onStart(): void { - this.boardsServiceProvider.onBoardListDidChange(() => - this.update(this.boardsServiceProvider.boardList) + this.boardsServiceProvider.onBoardListDidChange((boardList) => + this.update(boardList) ); } override onReady(): void { - this.update(this.boardsServiceProvider.boardList); + this.boardsServiceProvider.ready.then(() => this.update()); } - private update(boardList: BoardList): void { + private update( + boardList: BoardList = this.boardsServiceProvider.boardList + ): void { const { selectedBoard, selectedPort } = boardList.boardsConfig; this.statusBar.setElement('arduino-selected-board', { alignment: StatusBarAlignment.RIGHT, From 4708bae9abf83a3be017ed0eaa94f2bd373cef60 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Mon, 2 Oct 2023 18:10:37 -0700 Subject: [PATCH 256/384] Use separate attributes for human identifier and runner identifier in build job matrix The "Arduino IDE" GitHub Actions workflow uses a job matrix to make the builds for each host target in parallel. The same steps are used for each job, but some configuration adjustments must be made on a per-target basis. This is done through various attributes in the matrix configuration. Previously the `os` attribute was used for two distinct things: - The machine identifier of the GitHub Actions runner machine of the job. - The differentiator in the human-targeted job name. The attribute name "os" (for "operating system") was misleading because runners are differentiated by more than only the operating system on the machine. The use of a machine identifier as a differentiator in the human-targeted job name was a bad idea because these identifiers would only effectively communicate the nature of a build to humans who are quite knowledgeable about the GitHub Actions workflow syntax. The impact of these poor decisions has not been too severe previously due to there only being a single job for each operating system. However, there is a need for multiple jobs per operating system in order to support multiple host architectures (e.g., macOS x86 and ARM). The solution is to: - Use an appropriate name for the runner identifier attribute. - Use a dedicated attribute for the human friendly job name differentiator. --- .github/workflows/build.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a444f83c0..57266d1ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,24 +61,27 @@ jobs: echo "result=$RESULT" >> $GITHUB_OUTPUT build: - name: build (${{ matrix.config.os }}) + name: build (${{ matrix.config.name }}) needs: run-determination if: needs.run-determination.outputs.result == 'true' strategy: matrix: config: - - os: windows-2019 + - name: Windows # Human identifier for the job. + runs-on: windows-2019 certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX # Name of the secret that contains the certificate. certificate-password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD # Name of the secret that contains the certificate password. certificate-extension: pfx # File extension for the certificate. - - os: ubuntu-20.04 - - os: macos-latest + - name: Linux + runs-on: ubuntu-20.04 + - name: macOS x86 + runs-on: macos-latest # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 certificate-password-secret: KEYCHAIN_PASSWORD certificate-extension: p12 - runs-on: ${{ matrix.config.os }} + runs-on: ${{ matrix.config.runs-on }} timeout-minutes: 90 steps: From f0706e1849914ff87ca6bc76d08f1a08aba595ad Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 3 Oct 2023 00:32:01 -0700 Subject: [PATCH 257/384] Deduplicate type determination code in build workflow The "Arduino IDE" GitHub Actions workflow is used to generate several distinct types of builds: - Tester builds of commits - Nightly builds - Release builds Different actions must be performed depending on which type of build is being produced. The workflow contains code that uses various criteria to determine the build type. Previously that code was duplicated in multiple places: - The packaging job - The changelog generation job - The nightly build publishing job - The release publishing job This duplication is avoided by moving the code to a dedicated job that makes the build type information available to all subsequent jobs via outputs. --- .github/workflows/build.yml | 63 ++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57266d1ec..f152452ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,10 +60,43 @@ jobs: echo "result=$RESULT" >> $GITHUB_OUTPUT - build: - name: build (${{ matrix.config.name }}) + build-type-determination: needs: run-determination if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + outputs: + is-release: ${{ steps.determination.outputs.is-release }} + is-nightly: ${{ steps.determination.outputs.is-nightly }} + permissions: {} + steps: + - name: Determine the type of build + id: determination + run: | + if [[ + "${{ startsWith(github.ref, 'refs/tags/') }}" == "true" + ]]; then + is_release="true" + is_nightly="false" + elif [[ + "${{ github.event_name }}" == "schedule" || + ( + "${{ github.event_name }}" == "workflow_dispatch" && + "${{ github.ref }}" == "refs/heads/main" + ) + ]]; then + is_release="false" + is_nightly="true" + else + is_release="false" + is_nightly="false" + fi + + echo "is-release=$is_release" >> $GITHUB_OUTPUT + echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT + + build: + name: build (${{ matrix.config.name }}) + needs: build-type-determination strategy: matrix: config: @@ -120,8 +153,8 @@ jobs: AC_TEAM_ID: ${{ secrets.AC_TEAM_ID }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - IS_NIGHTLY: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') }} - IS_RELEASE: ${{ startsWith(github.ref, 'refs/tags/') }} + IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }} + IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }} run: | # See: https://www.electron.build/code-signing @@ -190,7 +223,9 @@ jobs: path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} changelog: - needs: build + needs: + - build-type-determination + - build runs-on: ubuntu-latest outputs: BODY: ${{ steps.changelog.outputs.BODY }} @@ -203,7 +238,7 @@ jobs: - name: Generate Changelog id: changelog env: - IS_RELEASE: ${{ startsWith(github.ref, 'refs/tags/') }} + IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} run: | export LATEST_TAG=$(git describe --abbrev=0) export GIT_LOG=$(git log --pretty=" - %s [%h]" $LATEST_TAG..HEAD | sed 's/ *$//g') @@ -229,15 +264,19 @@ jobs: echo "$BODY" > CHANGELOG.txt - name: Upload Changelog [GitHub Actions] - if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') + if: needs.build-type-determination.outputs.is-nightly == 'true' uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: CHANGELOG.txt publish: - needs: changelog - if: github.repository == 'arduino/arduino-ide' && (github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')) + needs: + - build-type-determination + - changelog + if: > + github.repository == 'arduino/arduino-ide' && + needs.build-type-determination.outputs.is-nightly == 'true' runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] @@ -257,8 +296,10 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} release: - needs: changelog - if: startsWith(github.ref, 'refs/tags/') + needs: + - build-type-determination + - changelog + if: needs.build-type-determination.outputs.is-release == 'true' runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] From 7e1d441e6a5c358c201c7bdb80f01013399f41ce Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 3 Oct 2023 18:44:33 -0700 Subject: [PATCH 258/384] Add native Apple Silicon target to build workflow On every release tag, and manual trigger when the "Include builds on non-free runners" checkbox is checked, make the Arduino IDE build for native Apple Silicon host in addition to the builds that are always generated by the "Arduino IDE" GitHub Actions workflow. Previously, the build workflow only produced a build for x86-64 (AKA "Intel") macOS hosts. Although it is possible to use those builds on Apple Silicon machines via the Rosetta 2 translation software, the performance is significantly inferior to a native build so we must also provide Apple Silicon native builds. Previously the Apple Silicon builds were produced manually. The reason for using that inefficient and error-prone approach instead of the automated continuous deployment system used for other builds was that GitHub did not provide the necessary Apple Silicon runner machines and Arduino was not capable of setting up such self-hosted machines in a manner that would make them feasible for the project maintainers to use. GitHub hosted Apple Silicon runner machines are now available so we can add the target to the build workflow. GitHub gives unlimited use of the basic runner machines for workflow runs in public repositories. However, the macOS ARM architecture is only provided in runner machines which are classified as "larger runner". Use of these runners is charged on a per-minute basis, without any of the free allowances GitHub provides for the normal runners. In order to avoid unnecessary expenditures, native Apple Silicon builds must be generated only when there is compelling reason to do so. Such a build is needed for every release, so the workflow is configured to always generate the builds when triggered by a tag. In addition to releases, Apple Silicon tester builds for pull requests that might have special implications for this target. For this reason, the workflow is configured to allow Apple Silicon builds to be triggered manually by a repository maintainer. The workflow uses a job matrix to run the build for each target on the appropriate runner machine in parallel, using the universally applicable workflow code for all jobs. It uses another job matrix to generate individual workflow artifacts for the tester builds of each target. Previously it was possible to always use the same matrix configurations for all workflow runs. With the addition of the selectively run macOS ARM job, it is now necessary to generate these matrixes on the fly. The electron-updater package used by Arduino IDE's auto-update capability uses a data file (known as the "channel update info file") to check for the availability of updates. A single "channel update info file" is used for the data of the macOS x86 and ARM builds. Since a separate job is used to produce each of those builds, this means the "channel update info file" produced by each of the macOS build jobs must be merged into a single file. --- .github/workflows/build.yml | 308 +++++++++++++++++++++++++++++---- package.json | 1 + scripts/merge-channel-files.js | 73 ++++++++ 3 files changed, 345 insertions(+), 37 deletions(-) create mode 100644 scripts/merge-channel-files.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f152452ad..3f118c2b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,11 +12,17 @@ on: - '.vscode/**' - 'docs/**' - 'scripts/**' + - '!scripts/merge-channel-files.js' - 'static/**' - '*.md' tags: - '[0-9]+.[0-9]+.[0-9]+*' workflow_dispatch: + inputs: + paid-runners: + description: Include builds on non-free runners + type: boolean + default: false pull_request: paths-ignore: - '.github/**' @@ -24,6 +30,7 @@ on: - '.vscode/**' - 'docs/**' - 'scripts/**' + - '!scripts/merge-channel-files.js' - 'static/**' - '*.md' schedule: @@ -32,8 +39,69 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml GO_VERSION: '1.19' + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: '18.17' JOB_TRANSFER_ARTIFACT: build-artifacts CHANGELOG_ARTIFACTS: changelog + STAGED_CHANNEL_FILES_ARTIFACT: staged-channel-files + BASE_BUILD_DATA: | + - config: + # Human identifier for the job. + name: Windows + runs-on: windows-2019 + # Name of the secret that contains the certificate. + certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX + # Name of the secret that contains the certificate password. + certificate-password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD + # File extension for the certificate. + certificate-extension: pfx + # Quoting on the value is required here to allow the same comparison expression syntax to be used for this + # and the companion needs.select-targets.outputs.merge-channel-files property (output values always have string + # type). + mergeable-channel-file: 'false' + artifacts: + - path: '*Windows_64bit.exe' + name: Windows_X86-64_interactive_installer + - path: '*Windows_64bit.msi' + name: Windows_X86-64_MSI + - path: '*Windows_64bit.zip' + name: Windows_X86-64_zip + - config: + name: Linux + runs-on: ubuntu-20.04 + mergeable-channel-file: 'false' + artifacts: + - path: '*Linux_64bit.zip' + name: Linux_X86-64_zip + - path: '*Linux_64bit.AppImage' + name: Linux_X86-64_app_image + - config: + name: macOS x86 + runs-on: macos-latest + # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: + # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate + certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 + certificate-password-secret: KEYCHAIN_PASSWORD + certificate-extension: p12 + mergeable-channel-file: 'true' + artifacts: + - path: '*macOS_64bit.dmg' + name: macOS_X86-64_dmg + - path: '*macOS_64bit.zip' + name: macOS_X86-64_zip + PAID_RUNNER_BUILD_DATA: | + - config: + name: macOS ARM + runs-on: macos-latest-xlarge + certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 + certificate-password-secret: KEYCHAIN_PASSWORD + certificate-extension: p12 + mergeable-channel-file: 'true' + artifacts: + - path: '*macOS_arm64.dmg' + name: macOS_arm64_dmg + - path: '*macOS_arm64.zip' + name: macOS_arm64_zip jobs: run-determination: @@ -67,6 +135,7 @@ jobs: outputs: is-release: ${{ steps.determination.outputs.is-release }} is-nightly: ${{ steps.determination.outputs.is-nightly }} + channel-name: ${{ steps.determination.outputs.channel-name }} permissions: {} steps: - name: Determine the type of build @@ -77,6 +146,7 @@ jobs: ]]; then is_release="true" is_nightly="false" + channel_name="stable" elif [[ "${{ github.event_name }}" == "schedule" || ( @@ -86,34 +156,101 @@ jobs: ]]; then is_release="false" is_nightly="true" + channel_name="nightly" else is_release="false" is_nightly="false" + channel_name="nightly" fi echo "is-release=$is_release" >> $GITHUB_OUTPUT echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT + echo "channel-name=$channel_name" >> $GITHUB_OUTPUT + + select-targets: + needs: build-type-determination + runs-on: ubuntu-latest + outputs: + artifact-matrix: ${{ steps.assemble.outputs.artifact-matrix }} + build-matrix: ${{ steps.assemble.outputs.build-matrix }} + merge-channel-files: ${{ steps.assemble.outputs.merge-channel-files }} + permissions: {} + steps: + - name: Assemble target data + id: assemble + run: | + # Only run the builds that incur runner charges on release or select manually triggered runs. + if [[ + "${{ needs.build-type-determination.outputs.is-release }}" == "true" || + "${{ github.event.inputs.paid-runners }}" == "true" + ]]; then + build_matrix="$( + ( + echo "${{ env.BASE_BUILD_DATA }}"; + echo "${{ env.PAID_RUNNER_BUILD_DATA }}" + ) | \ + yq \ + --output-format json \ + '[.[].config]' + )" + + artifact_matrix="$( + ( + echo "${{ env.BASE_BUILD_DATA }}"; + echo "${{ env.PAID_RUNNER_BUILD_DATA }}" + ) | \ + yq \ + --output-format json \ + '[.[].artifacts.[]]' + )" + + # The build matrix produces two macOS jobs (x86 and ARM) so the "channel update info files" + # generated by each must be merged. + merge_channel_files="true" + + else + build_matrix="$( + echo "${{ env.BASE_BUILD_DATA }}" | \ + yq \ + --output-format json \ + '[.[].config]' + )" + + artifact_matrix="$( + echo "${{ env.BASE_BUILD_DATA }}" | \ + yq \ + --output-format json \ + '[.[].artifacts.[]]' + )" + + merge_channel_files="false" + fi + + # Set workflow step outputs. + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings + delimiter="$RANDOM" + echo "build-matrix<<$delimiter" >> $GITHUB_OUTPUT + echo "$build_matrix" >> $GITHUB_OUTPUT + echo "$delimiter" >> $GITHUB_OUTPUT + + delimiter="$RANDOM" + echo "artifact-matrix<<$delimiter" >> $GITHUB_OUTPUT + echo "$artifact_matrix" >> $GITHUB_OUTPUT + echo "$delimiter" >> $GITHUB_OUTPUT + + echo "merge-channel-files=$merge_channel_files" >> $GITHUB_OUTPUT build: name: build (${{ matrix.config.name }}) - needs: build-type-determination + needs: + - build-type-determination + - select-targets + env: + # Location of artifacts generated by build. + BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts strategy: matrix: - config: - - name: Windows # Human identifier for the job. - runs-on: 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. - - name: Linux - runs-on: ubuntu-20.04 - - name: macOS x86 - runs-on: macos-latest - # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: - # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate - certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 - certificate-password-secret: KEYCHAIN_PASSWORD - certificate-extension: p12 + config: ${{ fromJson(needs.select-targets.outputs.build-matrix) }} runs-on: ${{ matrix.config.runs-on }} timeout-minutes: 90 @@ -121,10 +258,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 18.17 + - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: '18.17' + node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' cache: 'yarn' @@ -179,35 +316,131 @@ jobs: yarn --cwd electron-app build yarn --cwd electron-app package + # Both macOS jobs generate a "channel update info file" with same path and name. The second job to complete would + # overwrite the file generated by the first in the workflow artifact. + - name: Stage channel file for merge + if: > + needs.select-targets.outputs.merge-channel-files == 'true' && + matrix.config.mergeable-channel-file == 'true' + run: | + staged_channel_files_path="${{ runner.temp }}/staged-channel-files" + mkdir "$staged_channel_files_path" + mv \ + "${{ env.BUILD_ARTIFACTS_PATH }}/${{ needs.build-type-determination.outputs.channel-name }}-mac.yml" \ + "${staged_channel_files_path}/${{ needs.build-type-determination.outputs.channel-name }}-mac-${{ runner.arch }}.yml" + + # Set workflow environment variable for use in other steps. + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "STAGED_CHANNEL_FILES_PATH=$staged_channel_files_path" >> "$GITHUB_ENV" + + - name: Upload staged-for-merge channel file artifact + uses: actions/upload-artifact@v3 + if: > + needs.select-targets.outputs.merge-channel-files == 'true' && + matrix.config.mergeable-channel-file == 'true' + with: + if-no-files-found: error + name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} + path: ${{ env.STAGED_CHANNEL_FILES_PATH }} + - name: Upload [GitHub Actions] uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: electron-app/dist/build-artifacts + path: ${{ env.BUILD_ARTIFACTS_PATH }} + + merge-channel-files: + needs: + - build-type-determination + - select-targets + - build + if: needs.select-targets.outputs.merge-channel-files == 'true' + runs-on: ubuntu-latest + permissions: {} + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "CHANNEL_FILES_PATH=${{ runner.temp }}/channel-files" >> "$GITHUB_ENV" + + - name: Checkout + uses: actions/checkout@v4 + + - name: Download staged-for-merge channel files artifact + uses: actions/download-artifact@v3 + with: + name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} + path: ${{ env.CHANNEL_FILES_PATH }} + + - name: Remove no longer needed artifact + uses: geekyeggo/delete-artifact@v2 + with: + name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://registry.npmjs.org' + cache: 'yarn' + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install dependencies + run: yarn + + - name: Merge "channel update info files" + run: | + node \ + ./scripts/merge-channel-files.js \ + --channel "${{ needs.build-type-determination.outputs.channel-name }}" \ + --input "${{ env.CHANNEL_FILES_PATH }}" + + - name: Upload merged channel files to job transfer artifact + uses: actions/upload-artifact@v3 + with: + if-no-files-found: error + name: ${{ env.JOB_TRANSFER_ARTIFACT }} + path: ${{ env.CHANNEL_FILES_PATH }} + + # This job serves only as a container for the logic necessary to allow dependent jobs to run if the + # merge-channel-files job was skipped. + merge-channel-files-complete: + needs: + - merge-channel-files + if: > + always() && + ( + needs.merge-channel-files.result == 'skipped' || + needs.merge-channel-files.result == 'success' + ) + runs-on: ubuntu-latest + permissions: {} + steps: + # GitHub Actions requires every job to have >=1 step. + - name: Dummy step + run: '' artifacts: name: ${{ matrix.artifact.name }} artifact - needs: build + needs: + - select-targets + - build if: always() && needs.build.result != 'skipped' runs-on: ubuntu-latest strategy: matrix: - artifact: - - path: '*Linux_64bit.zip' - name: Linux_X86-64_zip - - path: '*Linux_64bit.AppImage' - name: Linux_X86-64_app_image - - path: '*macOS_64bit.dmg' - name: macOS_dmg - - path: '*macOS_64bit.zip' - name: macOS_zip - - path: '*Windows_64bit.exe' - name: Windows_X86-64_interactive_installer - - path: '*Windows_64bit.msi' - name: Windows_X86-64_MSI - - path: '*Windows_64bit.zip' - name: Windows_X86-64_zip + artifact: ${{ fromJson(needs.select-targets.outputs.artifact-matrix) }} steps: - name: Download job transfer artifact @@ -273,6 +506,7 @@ jobs: publish: needs: - build-type-determination + - merge-channel-files-complete - changelog if: > github.repository == 'arduino/arduino-ide' && @@ -298,6 +532,7 @@ jobs: release: needs: - build-type-determination + - merge-channel-files-complete - changelog if: needs.build-type-determination.outputs.is-release == 'true' runs-on: ubuntu-latest @@ -329,8 +564,6 @@ jobs: run: | # See: https://github.com/arduino/arduino-ide/issues/2018 rm "${{ env.JOB_TRANSFER_ARTIFACT }}/stable-linux.yml" - # See: https://github.com/arduino/arduino-ide/issues/408 - rm "${{ env.JOB_TRANSFER_ARTIFACT }}/stable-mac.yml" - name: Publish Release [S3] if: github.repository == 'arduino/arduino-ide' @@ -347,6 +580,7 @@ jobs: # This job must run after all jobs that use the transfer artifact. needs: - build + - merge-channel-files - publish - release - artifacts diff --git a/package.json b/package.json index 2583d816e..70e9c0ac7 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "eslint-plugin-unused-imports": "^2.0.0", "husky": "^6.0.0", "ignore-styles": "^5.0.1", + "js-yaml": "4.1.0", "lerna": "^7.1.4", "lint-staged": "^11.0.0", "node-fetch": "^2.6.1", diff --git a/scripts/merge-channel-files.js b/scripts/merge-channel-files.js new file mode 100644 index 000000000..aa5cc2400 --- /dev/null +++ b/scripts/merge-channel-files.js @@ -0,0 +1,73 @@ +// @ts-check + +const yaml = require('js-yaml'); +const fs = require('fs'); +const path = require('path'); + +if (process.argv.includes('--help') || process.argv.includes('-h')) { + console.log( + `Usage: +merge-channel-files.js [FLAG]... + +Merge the "channel update info files" used by electron-updater. + +Flags: + --channel <name> The name of the update channel. + -h, --help Print help for the script + --input <path> The path of the folder that contains the files to merge. +` + ); + process.exit(0); +} + +const channelFlagIndex = process.argv.indexOf('--channel'); +if (channelFlagIndex < 0) { + console.error('Missing required --channel flag'); + process.exit(1); +} +const channel = process.argv[channelFlagIndex + 1]; +if (!channel) { + console.error('--channel value must be set'); + process.exit(1); +} + +const inputFlagIndex = process.argv.indexOf('--input'); +if (inputFlagIndex < 0) { + console.error('Missing required --input flag'); + process.exit(1); +} +const channelFilesFolder = process.argv[inputFlagIndex + 1]; +if (!channelFilesFolder) { + console.error('--input value must be set'); + process.exit(1); +} + +// Staging file filename suffixes are named according to `runner.arch`. +// https://docs.github.com/en/actions/learn-github-actions/contexts#runner-context +const x86ChannelFilePath = path.join( + channelFilesFolder, + channel + '-mac-X64.yml' +); +const arm64ChannelFilePath = path.join( + channelFilesFolder, + channel + '-mac-ARM64.yml' +); + +const x86Data = yaml.load( + fs.readFileSync(x86ChannelFilePath, { encoding: 'utf8' }) +); +const arm64Data = yaml.load( + fs.readFileSync(arm64ChannelFilePath, { encoding: 'utf8' }) +); + +const mergedData = x86Data; +mergedData['files'] = mergedData['files'].concat(arm64Data['files']); + +fs.writeFileSync( + path.join(channelFilesFolder, channel + '-mac.yml'), + yaml.dump(mergedData, { lineWidth: -1 }) +); + +// Clean up by removing staging files. +fs.rmSync(x86ChannelFilePath); +fs.rmSync(arm64ChannelFilePath); From 136545491dcae9be90c6bf415a07fdb09687494c Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Thu, 5 Oct 2023 04:35:58 -0700 Subject: [PATCH 259/384] Deduplicate S3 publishing determination code in build workflow The "Arduino IDE" GitHub Actions workflow uploads the nightly and release builds to Amazon S3, from which they are downloaded by the auto-update as well as directly by users via the links on the "Software" page of arduino.cc. The workflow can also be useful in forks. Either by those who want to test contributions staged in their fork prior to submitting a PR to the parent repo, or by those maintaining a hard fork of the project. Even though these forks wouldn't (and couldn't due to lack of access to the encrypted credential secrets only available to the workflow when ran in a trusted context in Arduino's repo)credentials stored in Arduino's repo) use the S3 upload component of the workflow, they may still find it valuable for continuous integration as well as continuous deployment via the tester builds and release builds the workflow also publishes to the GitHub repository it runs in. For this reason, the workflow contains code to determine whether it should attempt the S3 uploads. Previously that code was duplicated in both the nightly and release publishing jobs of the workflow. Since the workflow already contains a job specifically for the purpose of determining the characteristics of the build being performed and making that information available from single source for use throughout the rest of the workflow, it makes sense to also move the S3 upload determination code to that job. --- .github/workflows/build.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f118c2b8..c4184a8dc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -136,6 +136,7 @@ jobs: is-release: ${{ steps.determination.outputs.is-release }} is-nightly: ${{ steps.determination.outputs.is-nightly }} channel-name: ${{ steps.determination.outputs.channel-name }} + publish-to-s3: ${{ steps.determination.outputs.publish-to-s3 }} permissions: {} steps: - name: Determine the type of build @@ -166,6 +167,8 @@ jobs: echo "is-release=$is_release" >> $GITHUB_OUTPUT echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT echo "channel-name=$channel_name" >> $GITHUB_OUTPUT + # Only attempt upload to Amazon S3 if the credentials are available. + echo "publish-to-s3=${{ github.repository == 'arduino/arduino-ide' }}" >> $GITHUB_OUTPUT select-targets: needs: build-type-determination @@ -509,7 +512,7 @@ jobs: - merge-channel-files-complete - changelog if: > - github.repository == 'arduino/arduino-ide' && + needs.build-type-determination.outputs.publish-to-s3 == 'true' && needs.build-type-determination.outputs.is-nightly == 'true' runs-on: ubuntu-latest steps: @@ -566,7 +569,7 @@ jobs: rm "${{ env.JOB_TRANSFER_ARTIFACT }}/stable-linux.yml" - name: Publish Release [S3] - if: github.repository == 'arduino/arduino-ide' + if: needs.build-type-determination.outputs.publish-to-s3 == 'true' uses: docker://plugins/s3 env: PLUGIN_SOURCE: '${{ env.JOB_TRANSFER_ARTIFACT }}/*' From 3f4d2745a86220a3846641bf0ae0ba4280c7baa8 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Thu, 5 Oct 2023 04:48:00 -0700 Subject: [PATCH 260/384] Use a generalized criterion for S3 publishing determination in build workflow The "Arduino IDE" GitHub Actions workflow uploads the nightly and release builds to Amazon S3, from which they are downloaded by the auto-update as well as directly by users via the links on the "Software" page of arduino.cc. The workflow can also be useful in forks. Either by those who want to test contributions staged in their fork prior to submitting a PR to the parent repo, or by those maintaining a hard fork of the project. Even though these forks wouldn't (and couldn't due to lack of access to the encrypted credential secrets only available to the workflow when ran in a trusted context in Arduino's repo)credentials stored in Arduino's repo) use the S3 upload component of the workflow, they may still find it valuable for continuous integration as well as continuous deployment via the tester builds and release builds the workflow also publishes to the GitHub repository it runs in. For this reason, the workflow contains code to determine whether it should attempt the S3 uploads. Previously the repository name was used as the criteria in that code. The project specificity of that approach makes the workflow less easily reusable. A more generally applicable criterion is whether the encrypted credential certificate is defined. The new criterion allows the workflow to be used in any repository where the administrator has created an encrypted secret containing their AWS credentials. That might be other projects owned by Arduino, or even 3rd party projects where the owners want to take a similar build publishing approach using their own AWS account. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c4184a8dc..15b1e2906 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -168,7 +168,7 @@ jobs: echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT echo "channel-name=$channel_name" >> $GITHUB_OUTPUT # Only attempt upload to Amazon S3 if the credentials are available. - echo "publish-to-s3=${{ github.repository == 'arduino/arduino-ide' }}" >> $GITHUB_OUTPUT + echo "publish-to-s3=${{ secrets.AWS_SECRET_ACCESS_KEY != '' }}" >> $GITHUB_OUTPUT select-targets: needs: build-type-determination From 0b2410d49add0ba16aeb1fb2bab47fa3acd7e268 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Sat, 7 Oct 2023 10:38:54 +0200 Subject: [PATCH 261/384] test: run cloud sketches tests on the CI (#2092) - fix(test): integration tests are more resilient. - run the Create integration tests with other slow tests, - queued `PUT`/`DELETE` requests to make the test timeout happy, - reduced the `/sketches/search` offset to 1/5th and - remove Create API logging. - fix(linter): ignore `lib` folder. Remove obsolete `.node_modules` pattern. - feat(ci): enable Create API integration tests. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> Co-authored-by: per1234 <accounts@perglass.com> --- .eslintrc.js | 2 +- .github/workflows/build.yml | 5 + .../src/browser/create/create-api.ts | 20 +--- .../src/browser/create/typings.ts | 7 ++ ...te-api.test.ts => create-api.slow-test.ts} | 97 +++++++++++++++---- 5 files changed, 94 insertions(+), 37 deletions(-) rename arduino-ide-extension/src/test/browser/{create-api.test.ts => create-api.slow-test.ts} (83%) diff --git a/.eslintrc.js b/.eslintrc.js index 603ad7886..da16cbb76 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,7 +10,6 @@ module.exports = { ignorePatterns: [ 'node_modules/*', '**/node_modules/*', - '.node_modules/*', '.github/*', '.browser_modules/*', 'docs/*', @@ -21,6 +20,7 @@ module.exports = { '!electron-app/webpack.config.js', 'plugins/*', 'arduino-ide-extension/src/node/cli-protocol', + '**/lib/*', ], settings: { react: { diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 15b1e2906..9fe97891b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -296,6 +296,11 @@ jobs: IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }} IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }} + # The CREATE_* environment vars are only used to run tests. These secrets are optional. Dependent tests will + # be skipped if not available. + CREATE_USERNAME: ${{ secrets.CREATE_USERNAME }} + CREATE_PASSWORD: ${{ secrets.CREATE_PASSWORD }} + CREATE_CLIENT_SECRET: ${{ secrets.CREATE_CLIENT_SECRET }} run: | # See: https://www.electron.build/code-signing if [ $CAN_SIGN = false ]; then diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 89244a427..7f4cfed22 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -179,7 +179,8 @@ export class CreateApi { ); }) .catch((reason) => { - if (reason?.status === 404) return [] as Create.Resource[]; + if (reason?.status === 404) + return [] as Create.Resource[]; // TODO: must not swallow 404 else throw reason; }); } @@ -486,18 +487,12 @@ export class CreateApi { await this.run(url, init, ResponseResultProvider.NOOP); } - private fetchCounter = 0; private async run<T>( requestInfo: URL, init: RequestInit | undefined, resultProvider: ResponseResultProvider = ResponseResultProvider.JSON ): Promise<T> { - const fetchCount = `[${++this.fetchCounter}]`; - const fetchStart = performance.now(); - const method = init?.method ? `${init.method}: ` : ''; - const url = requestInfo.toString(); const response = await fetch(requestInfo.toString(), init); - const fetchEnd = performance.now(); if (!response.ok) { let details: string | undefined = undefined; try { @@ -508,18 +503,7 @@ export class CreateApi { const { statusText, status } = response; throw new CreateError(statusText, status, details); } - const parseStart = performance.now(); const result = await resultProvider(response); - const parseEnd = performance.now(); - console.debug( - `HTTP ${fetchCount} ${method}${url} [fetch: ${( - fetchEnd - fetchStart - ).toFixed(2)} ms, parse: ${(parseEnd - parseStart).toFixed( - 2 - )} ms] body: ${ - typeof result === 'string' ? result : JSON.stringify(result) - }` - ); return result; } diff --git a/arduino-ide-extension/src/browser/create/typings.ts b/arduino-ide-extension/src/browser/create/typings.ts index fe2ca1af8..b5dcf6f59 100644 --- a/arduino-ide-extension/src/browser/create/typings.ts +++ b/arduino-ide-extension/src/browser/create/typings.ts @@ -82,6 +82,13 @@ export function isNotFound(err: unknown): err is NotFoundError { return isErrorWithStatusOf(err, 404); } +export type UnprocessableContentError = CreateError & { status: 422 }; +export function isUnprocessableContent( + err: unknown +): err is UnprocessableContentError { + return isErrorWithStatusOf(err, 422); +} + function isErrorWithStatusOf( err: unknown, status: number diff --git a/arduino-ide-extension/src/test/browser/create-api.test.ts b/arduino-ide-extension/src/test/browser/create-api.slow-test.ts similarity index 83% rename from arduino-ide-extension/src/test/browser/create-api.test.ts rename to arduino-ide-extension/src/test/browser/create-api.slow-test.ts index a9b52c11b..b5f4ee96c 100644 --- a/arduino-ide-extension/src/test/browser/create-api.test.ts +++ b/arduino-ide-extension/src/test/browser/create-api.slow-test.ts @@ -5,17 +5,24 @@ import { } from '@theia/core/shared/inversify'; import { assert, expect } from 'chai'; import fetch from 'cross-fetch'; +import { rejects } from 'node:assert'; import { posix } from 'node:path'; +import PQueue from 'p-queue'; +import queryString from 'query-string'; import { v4 } from 'uuid'; import { ArduinoPreferences } from '../../browser/arduino-preferences'; import { AuthenticationClientService } from '../../browser/auth/authentication-client-service'; import { CreateApi } from '../../browser/create/create-api'; import { splitSketchPath } from '../../browser/create/create-paths'; -import { Create, CreateError } from '../../browser/create/typings'; +import { + Create, + CreateError, + isNotFound, + isUnprocessableContent, +} from '../../browser/create/typings'; import { SketchCache } from '../../browser/widgets/cloud-sketchbook/cloud-sketch-cache'; import { SketchesService } from '../../common/protocol'; import { AuthenticationSession } from '../../node/auth/types'; -import queryString from 'query-string'; /* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ @@ -44,6 +51,11 @@ describe('create-api', () => { await cleanAllSketches(); }); + afterEach(async function () { + this.timeout(timeout); + await cleanAllSketches(); + }); + function createContainer(accessToken: string): Container { const container = new Container({ defaultScope: 'Singleton' }); container.load( @@ -120,13 +132,14 @@ describe('create-api', () => { async function cleanAllSketches(): Promise<void> { let sketches = await createApi.sketches(); - // Cannot delete the sketches with `await Promise.all` as all delete promise successfully resolve, but the sketch is not deleted from the server. - await sketches - .map(({ path }) => createApi.deleteSketch(path)) - .reduce(async (acc, curr) => { - await acc; - return curr; - }, Promise.resolve()); + const deleteExecutionQueue = new PQueue({ + concurrency: 5, + autoStart: true, + }); + sketches.forEach(({ path }) => + deleteExecutionQueue.add(() => createApi.deleteSketch(path)) + ); + await deleteExecutionQueue.onIdle(); sketches = await createApi.sketches(); expect(sketches).to.be.empty; } @@ -229,8 +242,52 @@ describe('create-api', () => { expect(findByName(otherName, sketches)).to.be.not.undefined; }); + it('should error with HTTP 422 when reading a file but is a directory', async () => { + const name = v4(); + const content = 'void setup(){} void loop(){}'; + const posixPath = toPosix(name); + + await createApi.createSketch(posixPath, content); + const resources = await createApi.readDirectory(posixPath); + expect(resources).to.be.not.empty; + + await rejects(createApi.readFile(posixPath), (thrown) => + isUnprocessableContent(thrown) + ); + }); + + it('should error with HTTP 422 when listing a directory but is a file', async () => { + const name = v4(); + const content = 'void setup(){} void loop(){}'; + const posixPath = toPosix(name); + + await createApi.createSketch(posixPath, content); + const mainSketchFilePath = posixPath + posixPath + '.ino'; + const sketchContent = await createApi.readFile(mainSketchFilePath); + expect(sketchContent).to.be.equal(content); + + await rejects(createApi.readDirectory(mainSketchFilePath), (thrown) => + isUnprocessableContent(thrown) + ); + }); + + it("should error with HTTP 404 when deleting a non-existing directory via the '/files/d' endpoint", async () => { + const name = v4(); + const posixPath = toPosix(name); + + const sketches = await createApi.sketches(); + const sketch = findByName(name, sketches); + expect(sketch).to.be.undefined; + + await rejects(createApi.deleteDirectory(posixPath), (thrown) => + isNotFound(thrown) + ); + }); + ['.', '-', '_'].map((char) => { - it(`should create a new sketch with '${char}' in the sketch folder name although it's disallowed from the Create Editor`, async () => { + it(`should create a new sketch with '${char}' (character code: ${char.charCodeAt( + 0 + )}) in the sketch folder name although it's disallowed from the Create Editor`, async () => { const name = `sketch${char}`; const posixPath = toPosix(name); const newSketch = await createApi.createSketch( @@ -300,19 +357,23 @@ describe('create-api', () => { diff < 0 ? '<' : diff > 0 ? '>' : '=' } limit)`, async () => { const content = 'void setup(){} void loop(){}'; - const maxLimit = 50; // https://github.com/arduino/arduino-ide/pull/875 + const maxLimit = 10; 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<unknown>); + const createExecutionQueue = new PQueue({ + concurrency: 5, + autoStart: true, + }); + sketchNames.forEach((name) => + createExecutionQueue.add(() => + createApi.createSketch(toPosix(name), content) + ) + ); + await createExecutionQueue.onIdle(); createApi.resetRequestRecording(); - const sketches = await createApi.sketches(); + const sketches = await createApi.sketches(maxLimit); const allRequests = createApi.requestRecording.slice(); expect(sketches.length).to.be.equal(sketchCount); From a8e63c8c90d37ecf9f16cf2c95e728ad15c3d03f Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 9 Oct 2023 17:08:00 +0200 Subject: [PATCH 262/384] test: relax accessible sketch path test condition - Do not expect `EACCESS` on Linux. - Run the test only if `EACCESS` occurs via the `stat` syscall. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../node/sketches-service-impl.slow-test.ts | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) 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 3454fb278..f9d750d3c 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 @@ -6,7 +6,6 @@ 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 { rejects } from 'node:assert/strict'; import { promises as fs } from 'node:fs'; import { basename, join } from 'node:path'; import { sync as rimrafSync } from 'rimraf'; @@ -67,19 +66,30 @@ describe('isAccessibleSketchPath', () => { 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(); - } + it('should ignore EACCESS', async function () { const sketchFolderPath = join(testDirPath, 'my_sketch'); const mainSketchFilePath = join(sketchFolderPath, 'my_sketch.ino'); await fs.mkdir(sketchFolderPath, { recursive: true }); await fs.writeFile(mainSketchFilePath, '', { encoding: 'utf8' }); await fs.chmod(mainSketchFilePath, 0o000); // remove all permissions - await rejects(fs.readFile(mainSketchFilePath), ErrnoException.isEACCES); + try { + await fs.readFile(mainSketchFilePath); + // If reading the file without sufficient permissions does not result in EACCESS error, do not run the test. + // For example, a `stat` syscall does not result in an EACCESS on Windows after stripping the file permissions. + // an `open` syscall would, but IDE2 on purpose does not check the files. + // the sketch files are provided by the CLI after loading the sketch. + console.info( + 'Skip. Reading the file content without permissions was successful.' + ); + return this.skip(); + } catch (err) { + expect( + ErrnoException.isEACCES(err), + `Expected an error with EACCES code. Got: ${ + typeof err === 'object' ? JSON.stringify(err) : err + }` + ).to.be.true; + } const actual = await isAccessibleSketchPath(sketchFolderPath); expect(actual).to.be.equal(mainSketchFilePath); }); From ed1cb6bcf90d9a064ac4186c24a058e23a93a0ab Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 10 Oct 2023 07:02:42 -0700 Subject: [PATCH 263/384] Make Linux build in a container for compatibility with older distros Background ---------- The Linux build of Arduino IDE is dynamically linked against the libstdc++ and glibc shared libraries. This results in it having a dependency on the version of the libraries that happens to be present in the environment it is built in. Although newer versions of the shared libraries are compatible with executables linked against an older version, the reverse is not true. This means that building Arduino IDE on a Linux machine with a recent distro version installed causes the IDE to error on startup for users who have a distro with older versions of the dependencies. For example: ``` Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /home/per/Downloads/arduino-ide_nightly-20231006_Linux_64bit/resources/app/lib/backend/native/nsfw.node) ``` or: ``` Error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /home/per/Downloads/arduino-ide_2.0.5-snapshot-90b1f67_Linux_64bit/resources/app/node_modules/nsfw/build/Release/nsfw.node) ``` We were originally able to achieve our targeted range of Linux distro compatibility by running the Linux build in the ubuntu-18.04 GitHub Actions hosted runner machine. Unfortunately GitHub stopped offering that runner machine. This meant we were forced to update to using the ubuntu-20.04 runner machine instead, which caused the loss of compatibility of the automatically generated builds with previously supported distro versions (e.g., Ubuntu 18.04). Since that time, the release builds have been produced manually, which is inefficient and prone to human error. Update ------ The identified solution to restoring fully automated builds with the target range of Linux distro compatibility is to run the build in a Docker container that provides the suitable environment. This means a combination of an older distro version with the modern versions of the development tool dependencies of the build. Such a combination was achieved by creating a bespoke image based on the ubuntu:18.04 image. The Dockerfile is hosted in the Arduino IDE repository in order to allow it to be maintained in parallel with the code and infrastructure. Image Publishing ---------------- A "Push Container Images" GitHub Actions continuous delivery workflow is added to push updated images to the GitHub Container registry when a commit that modifies relevant files is pushed to the main branch. This means the image does not have formally versioned tags and the IDE build uses the container that results from the configuration at the tip of the main branch at the time of the build. I think that is a reasonable approach in this use case where the image is targeted to a single application rather than intended to be used by multiple projects. Container Validation -------------------- The build workflow is configured to trigger on completion of that push workflow in order to provide validation of the IDE build using the updated container as well as the resulting tester builds of the IDE. A "Check Containers" GitHub Actions continuous integration workflow is added to provide basic validation for changes to the Dockerfile. It will automatically build the image and run the container on any push or pull request that modifies relevant files. Container Workflow Design ------------------------- With the goal of reusability, the image data is contained in a job matrix in the workflow to allow them to accommodate any number of arbitrary images. Build Workflow Configuration ---------------------------- A container property is added to the build job matrix data. If the container.image property is set to null, GitHub Actions will run the job directly in the runner environment instead of in a container. This allows us to produce the builds using either a container or a bare runner machine as is appropriate for each target. Unfortunately the latest v4 version of the actions/checkout action used to checkout the repository into the job environment has a dependency on a higher version of glibc than is provided by the Linux container. For this reason, the workflow is configured to use actions/checkout@v3 for the Linux build job. We will likely receive pull requests from Dependabot offering to update this outdated action dependency for the v4 and at each subsequent major version release of the action (which are not terribly frequent). We must decline the bump of the action in that specific step, but accept the bumps of all other usages of the action in the workflows. Dependabot remembers when you decline a bump so this should not be too bothersome. --- .github/workflows/assets/linux.Dockerfile | 112 ++++++++++++++++++++ .github/workflows/build.yml | 36 ++++++- .github/workflows/check-containers.yml | 58 ++++++++++ .github/workflows/push-container-images.yml | 70 ++++++++++++ 4 files changed, 274 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/assets/linux.Dockerfile create mode 100644 .github/workflows/check-containers.yml create mode 100644 .github/workflows/push-container-images.yml diff --git a/.github/workflows/assets/linux.Dockerfile b/.github/workflows/assets/linux.Dockerfile new file mode 100644 index 000000000..6f7dde117 --- /dev/null +++ b/.github/workflows/assets/linux.Dockerfile @@ -0,0 +1,112 @@ +# The Arduino IDE Linux build workflow job runs in this container. +# syntax=docker/dockerfile:1 + +FROM ubuntu:18.04 + +# See: https://unofficial-builds.nodejs.org/download/release/ +ARG node_version="18.17.1" + +RUN \ + apt-get \ + --yes \ + update + +# This is required to get add-apt-repository +RUN \ + apt-get \ + --yes \ + install \ + "software-properties-common=0.96.24.32.22" + +# Install Git +# The PPA is required to get a modern version of Git. The version in the Ubuntu 18.04 package repository is 2.17.1, +# while action/checkout@v3 requires 2.18 or higher. +RUN \ + add-apt-repository \ + --yes \ + "ppa:git-core/ppa" && \ + apt-get \ + --yes \ + update && \ + \ + apt-get \ + --yes \ + install \ + "git=1:2.42.0-0ppa1~ubuntu18.04.1" && \ + \ + apt-get \ + --yes \ + purge \ + "software-properties-common" + +# The repository path must be added to safe.directory, otherwise any Git operations on it would fail with a +# "dubious ownership" error. actions/checkout configures this, but it is not applied to containers. +RUN \ + git config \ + --add \ + --global \ + "safe.directory" "/__w/arduino-ide/arduino-ide" +ENV \ + GIT_CONFIG_GLOBAL="/root/.gitconfig" + +# Install Python +# The Python installed by actions/setup-python has dependency on a higher version of glibc than available in the +# ubuntu:18.04 container. +RUN \ + apt-get \ + --yes \ + install \ + "python3.8-minimal=3.8.0-3ubuntu1~18.04.2" && \ + \ + ln \ + --symbolic \ + --force \ + "$(which python3.8)" \ + "/usr/bin/python3" + +# Install Theia's package dependencies +# These are pre-installed in the GitHub Actions hosted runner machines. +RUN \ + apt-get \ + --yes \ + install \ + "libsecret-1-dev=0.18.6-1" \ + "libx11-dev=2:1.6.4-3ubuntu0.4" \ + "libxkbfile-dev=1:1.0.9-2" + +# Install Node.js +# It is necessary to use the "unofficial" linux-x64-glibc-217 build because the official Node.js 18.x is dynamically +# linked against glibc 2.28, while Ubuntu 18.04 has glibc 2.27. +ARG node_installation_path="/tmp/node-installation" +ARG artifact_name="node-v${node_version}-linux-x64-glibc-217" +RUN \ + mkdir "$node_installation_path" && \ + cd "$node_installation_path" && \ + \ + apt-get \ + --yes \ + install \ + "wget=1.19.4-1ubuntu2.2" && \ + \ + archive_name="${artifact_name}.tar.xz" && \ + wget \ + "https://unofficial-builds.nodejs.org/download/release/v${node_version}/${archive_name}" && \ + \ + apt-get \ + --yes \ + purge \ + "wget" && \ + \ + tar \ + --file="$archive_name" \ + --extract && \ + rm "$archive_name" +ENV PATH="${PATH}:${node_installation_path}/${artifact_name}/bin" + +# Install Yarn +# Yarn is pre-installed in the GitHub Actions hosted runner machines. +RUN \ + npm \ + install \ + --global \ + "yarn@1.22.19" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9fe97891b..888298258 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,6 +35,13 @@ on: - '*.md' schedule: - cron: '0 3 * * *' # run every day at 3AM (https://docs.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule) + workflow_run: + workflows: + - Push Container Images + branches: + - main + types: + - completed env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml @@ -49,6 +56,10 @@ env: # Human identifier for the job. name: Windows runs-on: windows-2019 + # The value is a string representing a JSON document. + # Setting this to null causes the job to run directly in the runner machine instead of in a container. + container: | + null # Name of the secret that contains the certificate. certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX # Name of the secret that contains the certificate password. @@ -68,7 +79,11 @@ env: name: Windows_X86-64_zip - config: name: Linux - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest + container: | + { + \"image\": \"ghcr.io/arduino/arduino-ide/linux:main\" + } mergeable-channel-file: 'false' artifacts: - path: '*Linux_64bit.zip' @@ -78,6 +93,8 @@ env: - config: name: macOS x86 runs-on: macos-latest + container: | + null # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: # https://www.kencochrane.com/2020/08/01/build-and-sign-golang-binaries-for-macos-with-github-actions/#exporting-the-developer-certificate certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 @@ -93,6 +110,8 @@ env: - config: name: macOS ARM runs-on: macos-latest-xlarge + container: | + null certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 certificate-password-secret: KEYCHAIN_PASSWORD certificate-extension: p12 @@ -255,13 +274,26 @@ jobs: matrix: config: ${{ fromJson(needs.select-targets.outputs.build-matrix) }} runs-on: ${{ matrix.config.runs-on }} + container: ${{ fromJSON(matrix.config.container) }} + defaults: + run: + # Avoid problems caused by different default shell for container jobs (sh) vs non-container jobs (bash). + shell: bash + timeout-minutes: 90 steps: - name: Checkout + if: fromJSON(matrix.config.container).image == null uses: actions/checkout@v4 + - name: Checkout + # actions/checkout@v4 has dependency on a higher version of glibc than available in the Linux container. + if: fromJSON(matrix.config.container).image != null + uses: actions/checkout@v3 + - name: Install Node.js + if: fromJSON(matrix.config.container).image == null uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VERSION }} @@ -269,6 +301,7 @@ jobs: cache: 'yarn' - name: Install Python 3.x + if: fromJSON(matrix.config.container).image == null uses: actions/setup-python@v4 with: python-version: '3.x' @@ -285,7 +318,6 @@ jobs: version: 3.x - name: Package - shell: bash env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} AC_USERNAME: ${{ secrets.AC_USERNAME }} diff --git a/.github/workflows/check-containers.yml b/.github/workflows/check-containers.yml new file mode 100644 index 000000000..21e9c74ee --- /dev/null +++ b/.github/workflows/check-containers.yml @@ -0,0 +1,58 @@ +name: Check Containers + +on: + pull_request: + paths: + - ".github/workflows/check-containers.ya?ml" + - "**.Dockerfile" + - "**/Dockerfile" + push: + paths: + - ".github/workflows/check-containers.ya?ml" + - "**.Dockerfile" + - "**/Dockerfile" + repository_dispatch: + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 7 * * MON" + workflow_dispatch: + +jobs: + run: + name: Run (${{ matrix.image.path }}) + runs-on: ubuntu-latest + permissions: {} + services: + registry: + image: registry:2 + ports: + - 5000:5000 + + env: + IMAGE_NAME: name/app:latest + REGISTRY: localhost:5000 + + strategy: + fail-fast: false + matrix: + image: + - path: .github/workflows/assets/linux.Dockerfile + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build and push to local registry + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.image.path }} + push: true + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Run container + run: | + docker \ + run \ + --rm \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} diff --git a/.github/workflows/push-container-images.yml b/.github/workflows/push-container-images.yml new file mode 100644 index 000000000..52f638bd2 --- /dev/null +++ b/.github/workflows/push-container-images.yml @@ -0,0 +1,70 @@ +name: Push Container Images + +on: + pull_request: + paths: + - ".github/workflows/push-container-images.ya?ml" + push: + paths: + - ".github/workflows/push-container-images.ya?ml" + - "**.Dockerfile" + - "**/Dockerfile" + repository_dispatch: + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * MON" + workflow_dispatch: + +jobs: + push: + name: Push (${{ matrix.image.name }}) + # Only run the job when GITHUB_TOKEN has the privileges required for Container registry login. + if: > + ( + github.event_name != 'pull_request' && + github.repository == 'arduino/arduino-ide' + ) || + ( + github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name == 'arduino/arduino-ide' + ) + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + strategy: + fail-fast: false + matrix: + image: + - path: .github/workflows/assets/linux.Dockerfile + name: ${{ github.repository }}/linux + registry: ghcr.io + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + password: ${{ secrets.GITHUB_TOKEN }} + registry: ${{ matrix.image.registry }} + username: ${{ github.repository_owner }} + + - name: Extract metadata for image + id: metadata + uses: docker/metadata-action@v5 + with: + images: ${{ matrix.image.registry }}/${{ matrix.image.name }} + + - name: Build and push image + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.image.path }} + labels: ${{ steps.metadata.outputs.labels }} + # Workflow is triggered on relevant events for the sake of a "dry run" validation but image is only pushed to + # registry on commit to the main branch. + push: ${{ github.ref == 'refs/heads/main' }} + tags: ${{ steps.metadata.outputs.tags }} From 153e34f11b9c16801eecba9d9f6f931c12b231b8 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 2 Oct 2023 18:05:22 +0200 Subject: [PATCH 264/384] chore(deps): update dependencies To fix all security vulnerabilities detected by `Dependabot`. - remove `shelljs`. replace with `fs` and `console`. - remove `uuid`. replace with `@phosphor/coreutils`. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 13 +- arduino-ide-extension/scripts/download-cli.js | 17 +- .../scripts/download-examples.js | 37 +- .../scripts/download-fwuploader.js | 15 +- arduino-ide-extension/scripts/download-ls.js | 15 +- arduino-ide-extension/scripts/downloader.js | 103 +- .../scripts/generate-protocol.js | 81 +- arduino-ide-extension/scripts/utils.js | 89 +- .../theia/workspace/workspace-input-dialog.ts | 6 +- .../src/electron-browser/preload.ts | 4 +- .../src/node/board-discovery.ts | 4 +- .../arduino/cli/commands/v1/commands_pb.d.ts | 34 + .../cc/arduino/cli/commands/v1/commands_pb.js | 290 +- .../src/node/grpc-progressible.ts | 12 +- .../src/test/browser/create-api.slow-test.ts | 24 +- electron-app/package.json | 2 +- yarn.lock | 3484 +++++------------ 17 files changed, 1477 insertions(+), 2753 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index c2e777690..866844ab8 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -109,7 +109,7 @@ "devDependencies": { "@octokit/rest": "^18.12.0", "@types/chai": "^4.2.7", - "@types/mocha": "^5.2.7", + "@types/mocha": "^10.0.0", "@types/react-window": "^1.8.5", "@xhmikosr/downloader": "^13.0.1", "chai": "^4.2.0", @@ -118,18 +118,15 @@ "decompress-tarbz2": "^4.1.1", "decompress-targz": "^4.1.1", "decompress-unzip": "^4.0.1", - "grpc_tools_node_protoc_ts": "^4.1.0", - "mocha": "^7.0.0", + "grpc_tools_node_protoc_ts": "^5.3.3", + "mocha": "^10.2.0", "mockdate": "^3.0.5", "moment": "^2.24.0", "ncp": "^2.0.0", - "rimraf": "^2.6.1", - "shelljs": "^0.8.3", - "uuid": "^3.2.1", - "yargs": "^11.1.0" + "rimraf": "^2.6.1" }, "optionalDependencies": { - "grpc-tools": "^1.9.0", + "grpc-tools": "^1.12.4", "protoc": "^1.0.4" }, "mocha": { diff --git a/arduino-ide-extension/scripts/download-cli.js b/arduino-ide-extension/scripts/download-cli.js index 7fbe70d87..df4873706 100755 --- a/arduino-ide-extension/scripts/download-cli.js +++ b/arduino-ide-extension/scripts/download-cli.js @@ -2,7 +2,6 @@ (async () => { const path = require('path'); - const shell = require('shelljs'); const semver = require('semver'); const moment = require('moment'); const downloader = require('./downloader'); @@ -29,8 +28,8 @@ })(); if (!version) { - shell.echo(`Could not retrieve CLI version info from the 'package.json'.`); - shell.exit(1); + console.log(`Could not retrieve CLI version info from the 'package.json'.`); + process.exit(1); } const { platform, arch } = process; @@ -71,24 +70,24 @@ } })(); if (!suffix) { - shell.echo(`The CLI is not available for ${platform} ${arch}.`); - shell.exit(1); + console.log(`The CLI is not available for ${platform} ${arch}.`); + process.exit(1); } if (semver.valid(version)) { const url = `https://downloads.arduino.cc/arduino-cli/arduino-cli_${version}_${suffix}`; - shell.echo( + console.log( `📦 Identified released version of the CLI. Downloading version ${version} from '${url}'` ); await downloader.downloadUnzipFile(url, destinationPath, 'arduino-cli'); } else if (moment(version, 'YYYYMMDD', true).isValid()) { const url = `https://downloads.arduino.cc/arduino-cli/nightly/arduino-cli_nightly-${version}_${suffix}`; - shell.echo( + console.log( `🌙 Identified nightly version of the CLI. Downloading version ${version} from '${url}'` ); await downloader.downloadUnzipFile(url, destinationPath, 'arduino-cli'); } else { - shell.echo(`🔥 Could not interpret 'version': ${version}`); - shell.exit(1); + console.log(`🔥 Could not interpret 'version': ${version}`); + process.exit(1); } } else { taskBuildFromGit(version, destinationPath, 'CLI'); diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index d34732408..029517d43 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -5,10 +5,14 @@ const version = '1.10.0'; (async () => { const os = require('node:os'); - const { existsSync, promises: fs } = require('node:fs'); + const { + existsSync, + promises: fs, + mkdirSync, + readdirSync, + cpSync, + } = require('node:fs'); const path = require('node:path'); - const shell = require('shelljs'); - const { v4 } = require('uuid'); const { exec } = require('./utils'); const destination = path.join( @@ -20,31 +24,38 @@ const version = '1.10.0'; 'Examples' ); if (existsSync(destination)) { - shell.echo( + console.log( `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); - } + const repository = await fs.mkdtemp( + path.join(os.tmpdir(), 'arduino-examples-') + ); exec( 'git', ['clone', 'https://github.com/arduino/arduino-examples.git', repository], - shell + { logStdout: true } ); exec( 'git', ['-C', repository, 'checkout', `tags/${version}`, '-b', version], - shell + { logStdout: true } ); - shell.mkdir('-p', destination); - shell.cp('-fR', path.join(repository, 'examples', '*'), destination); + mkdirSync(destination, { recursive: true }); + const examplesPath = path.join(repository, 'examples'); + const exampleResources = readdirSync(examplesPath); + for (const exampleResource of exampleResources) { + cpSync( + path.join(examplesPath, exampleResource), + path.join(destination, exampleResource), + { recursive: true } + ); + } const isSketch = async (pathLike) => { try { @@ -104,5 +115,5 @@ const version = '1.10.0'; JSON.stringify(examples, null, 2), { encoding: 'utf8' } ); - shell.echo(`Generated output to ${path.join(destination, 'examples.json')}`); + console.log(`Generated output to ${path.join(destination, 'examples.json')}`); })(); diff --git a/arduino-ide-extension/scripts/download-fwuploader.js b/arduino-ide-extension/scripts/download-fwuploader.js index 6cc13338f..99c30887a 100755 --- a/arduino-ide-extension/scripts/download-fwuploader.js +++ b/arduino-ide-extension/scripts/download-fwuploader.js @@ -2,7 +2,6 @@ (async () => { const path = require('node:path'); - const shell = require('shelljs'); const semver = require('semver'); const downloader = require('./downloader'); const { taskBuildFromGit } = require('./utils'); @@ -28,10 +27,10 @@ })(); if (!version) { - shell.echo( + console.log( `Could not retrieve Firmware Uploader version info from the 'package.json'.` ); - shell.exit(1); + process.exit(1); } const { platform, arch } = process; @@ -71,14 +70,14 @@ } })(); if (!suffix) { - shell.echo( + console.log( `The Firmware Uploader is not available for ${platform} ${arch}.` ); - shell.exit(1); + process.exit(1); } if (semver.valid(version)) { const url = `https://downloads.arduino.cc/arduino-fwuploader/arduino-fwuploader_${version}_${suffix}`; - shell.echo( + console.log( `📦 Identified released version of the Firmware Uploader. Downloading version ${version} from '${url}'` ); await downloader.downloadUnzipFile( @@ -87,8 +86,8 @@ 'arduino-fwuploader' ); } else { - shell.echo(`🔥 Could not interpret 'version': ${version}`); - shell.exit(1); + console.log(`🔥 Could not interpret 'version': ${version}`); + process.exit(1); } } else { taskBuildFromGit(version, destinationPath, 'Firmware Uploader'); diff --git a/arduino-ide-extension/scripts/download-ls.js b/arduino-ide-extension/scripts/download-ls.js index 0dbb8b3cf..8fc2e1989 100755 --- a/arduino-ide-extension/scripts/download-ls.js +++ b/arduino-ide-extension/scripts/download-ls.js @@ -5,7 +5,6 @@ (() => { const path = require('path'); - const shell = require('shelljs'); const downloader = require('./downloader'); const { goBuildFromGit } = require('./utils'); @@ -25,20 +24,20 @@ })(); if (!DEFAULT_LS_VERSION) { - shell.echo( + console.log( `Could not retrieve Arduino Language Server version info from the 'package.json'.` ); - shell.exit(1); + process.exit(1); } if (!DEFAULT_CLANGD_VERSION) { - shell.echo( + console.log( `Could not retrieve clangd version info from the 'package.json'.` ); - shell.exit(1); + process.exit(1); } - const yargs = require('yargs') + const yargs = require('@theia/core/shared/yargs') .option('ls-version', { alias: 'lv', default: DEFAULT_LS_VERSION, @@ -114,10 +113,10 @@ throw new Error(`Unsupported platform/arch: ${platformArch}.`); } if (!lsSuffix || !clangdSuffix) { - shell.echo( + console.log( `The arduino-language-server is not available for ${platform} ${arch}.` ); - shell.exit(1); + process.exit(1); } if (typeof lsVersion === 'string') { diff --git a/arduino-ide-extension/scripts/downloader.js b/arduino-ide-extension/scripts/downloader.js index ed62aa1b9..dc1939ccc 100644 --- a/arduino-ide-extension/scripts/downloader.js +++ b/arduino-ide-extension/scripts/downloader.js @@ -1,20 +1,19 @@ +// @ts-check + const fs = require('fs'); const path = require('path'); -const shell = require('shelljs'); const decompress = require('decompress'); const unzip = require('decompress-unzip'); const untargz = require('decompress-targz'); const untarbz2 = require('decompress-tarbz2'); -process.on('unhandledRejection', (reason, _) => { - shell.echo(String(reason)); - shell.exit(1); - throw reason; +process.on('unhandledRejection', (reason) => { + console.log(String(reason)); + process.exit(1); }); process.on('uncaughtException', (error) => { - shell.echo(String(error)); - shell.exit(1); - throw error; + console.log(String(error)); + process.exit(1); }); /** @@ -30,55 +29,42 @@ exports.downloadUnzipFile = async ( force = false ) => { if (fs.existsSync(targetFile) && !force) { - shell.echo(`Skipping download because file already exists: ${targetFile}`); + console.log(`Skipping download because file already exists: ${targetFile}`); return; } - if (!fs.existsSync(path.dirname(targetFile))) { - if (shell.mkdir('-p', path.dirname(targetFile)).code !== 0) { - shell.echo('Could not create new directory.'); - shell.exit(1); - } - } + fs.mkdirSync(path.dirname(targetFile), { recursive: true }); const downloads = path.join(__dirname, '..', 'downloads'); - if (shell.rm('-rf', targetFile, downloads).code !== 0) { - shell.exit(1); - } + fs.rmSync(targetFile, { recursive: true, force: true }); + fs.rmSync(downloads, { recursive: true, force: true }); - shell.echo(`>>> Downloading from '${url}'...`); - const { default: download } = await import('@xhmikosr/downloader'); + console.log(`>>> Downloading from '${url}'...`); const data = await download(url); - shell.echo(`<<< Download succeeded.`); + console.log(`<<< Download succeeded.`); - shell.echo('>>> Decompressing...'); + console.log('>>> Decompressing...'); const files = await decompress(data, downloads, { plugins: [unzip(), untargz(), untarbz2()], }); if (files.length === 0) { - shell.echo('Error ocurred while decompressing the archive.'); - shell.exit(1); + console.log('Error ocurred while decompressing the archive.'); + process.exit(1); } const fileIndex = files.findIndex((f) => f.path.startsWith(filePrefix)); if (fileIndex === -1) { - shell.echo( + console.log( `The downloaded artifact does not contain any file with prefix ${filePrefix}.` ); - shell.exit(1); + process.exit(1); } - shell.echo('<<< Decompressing succeeded.'); + console.log('<<< Decompressing succeeded.'); - if ( - shell.mv('-f', path.join(downloads, files[fileIndex].path), targetFile) - .code !== 0 - ) { - shell.echo(`Could not move file to target path: ${targetFile}`); - shell.exit(1); - } + fs.renameSync(path.join(downloads, files[fileIndex].path), targetFile); if (!fs.existsSync(targetFile)) { - shell.echo(`Could not find file: ${targetFile}`); - shell.exit(1); + console.log(`Could not find file: ${targetFile}`); + process.exit(1); } - shell.echo(`Done: ${targetFile}`); + console.log(`Done: ${targetFile}`); }; /** @@ -86,7 +72,7 @@ exports.downloadUnzipFile = async ( * @param targetDir {string} Directory into which to decompress the archive * @param targetFile {string} Path to the main file expected after decompressing * @param force {boolean} Whether to download even if the target file exists - * @param decompressOptions {import('decompress').DecompressOptions} + * @param decompressOptions {import('decompress').DecompressOptions|undefined} [decompressOptions] */ exports.downloadUnzipAll = async ( url, @@ -96,22 +82,16 @@ exports.downloadUnzipAll = async ( decompressOptions = undefined ) => { if (fs.existsSync(targetFile) && !force) { - shell.echo(`Skipping download because file already exists: ${targetFile}`); + console.log(`Skipping download because file already exists: ${targetFile}`); return; } - if (!fs.existsSync(targetDir)) { - if (shell.mkdir('-p', targetDir).code !== 0) { - shell.echo('Could not create new directory.'); - shell.exit(1); - } - } + fs.mkdirSync(targetDir, { recursive: true }); - shell.echo(`>>> Downloading from '${url}'...`); - const { default: download } = await import('@xhmikosr/downloader'); + console.log(`>>> Downloading from '${url}'...`); const data = await download(url); - shell.echo(`<<< Download succeeded.`); + console.log(`<<< Download succeeded.`); - shell.echo('>>> Decompressing...'); + console.log('>>> Decompressing...'); let options = { plugins: [unzip(), untargz(), untarbz2()], }; @@ -120,14 +100,27 @@ exports.downloadUnzipAll = async ( } const files = await decompress(data, targetDir, options); if (files.length === 0) { - shell.echo('Error ocurred while decompressing the archive.'); - shell.exit(1); + console.log('Error ocurred while decompressing the archive.'); + process.exit(1); } - shell.echo('<<< Decompressing succeeded.'); + console.log('<<< Decompressing succeeded.'); if (!fs.existsSync(targetFile)) { - shell.echo(`Could not find file: ${targetFile}`); - shell.exit(1); + console.log(`Could not find file: ${targetFile}`); + process.exit(1); } - shell.echo(`Done: ${targetFile}`); + console.log(`Done: ${targetFile}`); }; + +/** + * @param {string} url + * @returns {Promise<import('node:buffer').Buffer>} + */ +async function download(url) { + const { default: download } = await import('@xhmikosr/downloader'); + /** @type {import('node:buffer').Buffer} */ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const data = await download(url); + return data; +} diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index f0737a2ec..5b5301575 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -3,22 +3,18 @@ (async () => { const os = require('node:os'); const path = require('node:path'); + const { mkdirSync, promises: fs } = require('node:fs'); 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 repository = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); 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); + console.log(`Could not parse the 'package.json'.`); + process.exit(1); } const defaultVersion = { @@ -48,21 +44,21 @@ // 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); + console.log(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); + process.exit(1); } if (!repo) { - shell.echo(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); - shell.exit(1); + console.log(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); + process.exit(1); } 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.`); + console.log(`>>> Cloning repository from '${url}'...`); + exec('git', ['clone', url, repository], { logStdout: true }); + console.log(`<<< Repository cloned.`); const { platform } = process; const resourcesFolder = path.join( @@ -76,10 +72,12 @@ resourcesFolder, `arduino-cli${platform === 'win32' ? '.exe' : ''}` ); - const versionJson = exec(cli, ['version', '--format', 'json'], shell).trim(); + const versionJson = exec(cli, ['version', '--format', 'json'], { + logStdout: true, + }).trim(); if (!versionJson) { - shell.echo(`Could not retrieve the CLI version from ${cli}.`); - shell.exit(1); + console.log(`Could not retrieve the CLI version from ${cli}.`); + process.exit(1); } // As of today (28.01.2021), the `VersionString` can be one of the followings: // - `nightly-YYYYMMDD` stands for the nightly build, we use the , the `commitish` from the `package.json` to check out the code. @@ -103,45 +101,51 @@ version !== '0.0.0-git' && version !== 'git-snapshot' ) { - shell.echo(`>>> Checking out tagged version: '${version}'...`); - exec('git', ['-C', repository, 'fetch', '--all', '--tags'], shell); + console.log(`>>> Checking out tagged version: '${version}'...`); + exec('git', ['-C', repository, 'fetch', '--all', '--tags'], { + logStdout: true, + }); exec( 'git', ['-C', repository, 'checkout', `tags/${version}`, '-b', version], - shell + { logStdout: true } ); - shell.echo(`<<< Checked out tagged version: '${version}'.`); + console.log(`<<< Checked out tagged version: '${version}'.`); } else if (commitish) { - shell.echo( + console.log( `>>> Checking out commitish from 'package.json': '${commitish}'...` ); - exec('git', ['-C', repository, 'checkout', commitish], shell); - shell.echo( + exec('git', ['-C', repository, 'checkout', commitish], { logStdout: true }); + console.log( `<<< Checked out commitish from 'package.json': '${commitish}'.` ); } else if (versionObject.Commit) { - shell.echo( + console.log( `>>> Checking out commitish from the CLI: '${versionObject.Commit}'...` ); - exec('git', ['-C', repository, 'checkout', versionObject.Commit], shell); - shell.echo( + exec('git', ['-C', repository, 'checkout', versionObject.Commit], { + logStdout: true, + }); + console.log( `<<< Checked out commitish from the CLI: '${versionObject.Commit}'.` ); } else { - shell.echo(`WARN: no 'git checkout'. Generating from the HEAD revision.`); + console.log(`WARN: no 'git checkout'. Generating from the HEAD revision.`); } - shell.echo('>>> Generating TS/JS API from:'); - exec('git', ['-C', repository, 'rev-parse', '--abbrev-ref', 'HEAD'], shell); + console.log('>>> Generating TS/JS API from:'); + exec('git', ['-C', repository, 'rev-parse', '--abbrev-ref', 'HEAD'], { + logStdout: true, + }); const rpc = path.join(repository, 'rpc'); const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol'); - shell.mkdir('-p', out); + mkdirSync(out, { recursive: true }); const protos = await new Promise((resolve) => glob('**/*.proto', { cwd: rpc }, (error, matches) => { if (error) { - shell.echo(error.stack ?? error.message); + console.log(error.stack ?? error.message); resolve([]); return; } @@ -149,12 +153,11 @@ }) ); if (!protos || protos.length === 0) { - shell.echo(`Could not find any .proto files under ${rpc}.`); - shell.exit(1); + console.log(`Could not find any .proto files under ${rpc}.`); + process.exit(1); } // Generate JS code from the `.proto` files. - exec( 'grpc_tools_node_protoc', [ @@ -164,7 +167,7 @@ rpc, ...protos, ], - shell + { logStdout: true } ); // Generate the `.d.ts` files for JS. @@ -183,8 +186,8 @@ rpc, ...protos, ], - shell + { logStdout: true } ); - shell.echo('<<< Generation was successful.'); + console.log('<<< Generation was successful.'); })(); diff --git a/arduino-ide-extension/scripts/utils.js b/arduino-ide-extension/scripts/utils.js index b932b444c..8b06a3cb1 100644 --- a/arduino-ide-extension/scripts/utils.js +++ b/arduino-ide-extension/scripts/utils.js @@ -3,24 +3,21 @@ const exec = ( /** @type {string} */ command, /** @type {readonly string[]} */ args, - /** @type {import('shelljs')|undefined}*/ shell = undefined, - /** @type {import('node:child_process').ExecFileSyncOptionsWithStringEncoding|undefined} */ options = undefined + /** @type {Partial<import('node:child_process').ExecFileSyncOptionsWithStringEncoding> & { logStdout?: boolean }|undefined} */ options = undefined ) => { try { - const stdout = require('node:child_process').execFileSync( - command, - args, - options ? options : { encoding: 'utf8' } - ); - if (shell) { - shell.echo(stdout.trim()); + const stdout = require('node:child_process').execFileSync(command, args, { + encoding: 'utf8', + ...(options ?? {}), + }); + if (options?.logStdout) { + console.log(stdout.trim()); } return stdout; } catch (err) { - if (shell) { - shell.echo(err instanceof Error ? err.message : String(err)); - shell.exit(1); - } + console.log( + `Failed to execute ${command} with args: ${JSON.stringify(args)}` + ); throw err; } }; @@ -59,32 +56,31 @@ function buildFromGit(command, version, destinationPath, taskName) { const fs = require('node:fs'); const path = require('node:path'); const temp = require('temp'); - const shell = require('shelljs'); // We assume an object with `owner`, `repo`, commitish?` properties. if (typeof version !== 'object') { - shell.echo( + console.log( `Expected a \`{ owner, repo, commitish }\` object. Got <${version}> instead.` ); } const { owner, repo, commitish } = version; if (!owner) { - shell.echo(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); - shell.exit(1); + console.log(`Could not retrieve 'owner' from ${JSON.stringify(version)}`); + process.exit(1); } if (!repo) { - shell.echo(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); - shell.exit(1); + console.log(`Could not retrieve 'repo' from ${JSON.stringify(version)}`); + process.exit(1); } const url = `https://github.com/${owner}/${repo}.git`; - shell.echo( + console.log( `Building ${taskName} from ${url}. Commitish: ${ commitish ? commitish : 'HEAD' }` ); if (fs.existsSync(destinationPath)) { - shell.echo( + console.log( `Skipping the ${taskName} build because it already exists: ${destinationPath}` ); return; @@ -97,48 +93,51 @@ function buildFromGit(command, version, destinationPath, taskName) { 'node', 'resources' ); - if (shell.mkdir('-p', resourcesFolder).code !== 0) { - shell.echo('Could not create resources folder.'); - shell.exit(1); - } + fs.mkdirSync(resourcesFolder, { recursive: true }); const tempRepoPath = temp.mkdirSync(); - shell.echo(`>>> Cloning ${taskName} source to ${tempRepoPath}...`); - exec('git', ['clone', url, tempRepoPath], shell); - shell.echo(`<<< Cloned ${taskName} repo.`); + console.log(`>>> Cloning ${taskName} source to ${tempRepoPath}...`); + exec('git', ['clone', url, tempRepoPath], { logStdout: true }); + console.log(`<<< Cloned ${taskName} repo.`); if (commitish) { - shell.echo(`>>> Checking out ${commitish}...`); - exec('git', ['-C', tempRepoPath, 'checkout', commitish], shell); - shell.echo(`<<< Checked out ${commitish}.`); + console.log(`>>> Checking out ${commitish}...`); + exec('git', ['-C', tempRepoPath, 'checkout', commitish], { + logStdout: true, + }); + console.log(`<<< Checked out ${commitish}.`); } - exec('git', ['-C', tempRepoPath, 'rev-parse', '--short', 'HEAD'], shell); + exec('git', ['-C', tempRepoPath, 'rev-parse', '--short', 'HEAD'], { + logStdout: true, + }); - shell.echo(`>>> Building the ${taskName}...`); - exec(command, ['build'], shell, { cwd: tempRepoPath, encoding: 'utf8' }); - shell.echo(`<<< Done ${taskName} build.`); + console.log(`>>> Building the ${taskName}...`); + exec(command, ['build'], { + cwd: tempRepoPath, + encoding: 'utf8', + logStdout: true, + }); + console.log(`<<< Done ${taskName} build.`); const binName = path.basename(destinationPath); if (!fs.existsSync(path.join(tempRepoPath, binName))) { - shell.echo( + console.log( `Could not find the ${taskName} at ${path.join(tempRepoPath, binName)}.` ); - shell.exit(1); + process.exit(1); } const binPath = path.join(tempRepoPath, binName); - shell.echo( + console.log( `>>> Copying ${taskName} from ${binPath} to ${destinationPath}...` ); - if (shell.cp(binPath, destinationPath).code !== 0) { - shell.exit(1); - } - shell.echo(`<<< Copied the ${taskName}.`); + fs.copyFileSync(binPath, destinationPath); + console.log(`<<< Copied the ${taskName}.`); - shell.echo(`<<< Verifying ${taskName}...`); + console.log(`<<< Verifying ${taskName}...`); if (!fs.existsSync(destinationPath)) { - shell.exit(1); + process.exit(1); } - shell.echo(`>>> Verified ${taskName}.`); + console.log(`>>> Verified ${taskName}.`); } diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts index 9f48fbb52..8fcabd177 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-input-dialog.ts @@ -1,4 +1,3 @@ -import { MaybePromise } from '@theia/core'; import { Dialog, DialogError } from '@theia/core/lib/browser/dialogs'; import { LabelProvider } from '@theia/core/lib/browser/label-provider'; import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; @@ -10,13 +9,14 @@ import type { Progress, ProgressUpdate, } from '@theia/core/lib/common/message-service-protocol'; +import type { MaybePromise } from '@theia/core/lib/common/types'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; import { Widget } from '@theia/core/shared/@phosphor/widgets'; import { inject } from '@theia/core/shared/inversify'; import { WorkspaceInputDialog as TheiaWorkspaceInputDialog, WorkspaceInputDialogProps, } from '@theia/workspace/lib/browser/workspace-input-dialog'; -import { v4 } from 'uuid'; export class WorkspaceInputDialog extends TheiaWorkspaceInputDialog { private skipShowErrorMessageOnOpen: boolean; @@ -161,7 +161,7 @@ export class WorkspaceInputDialogWithProgress< const cancellationSource = new CancellationTokenSource(); const progress: Progress = { - id: v4(), + id: UUID.uuid4(), cancel: () => cancellationSource.cancel(), report: (update: ProgressUpdate) => { this.setProgressMessage(update); diff --git a/arduino-ide-extension/src/electron-browser/preload.ts b/arduino-ide-extension/src/electron-browser/preload.ts index b70529423..ed4d2d11c 100644 --- a/arduino-ide-extension/src/electron-browser/preload.ts +++ b/arduino-ide-extension/src/electron-browser/preload.ts @@ -7,7 +7,7 @@ import { CHANNEL_REQUEST_RELOAD, MenuDto, } from '@theia/core/lib/electron-common/electron-api'; -import { v4 } from 'uuid'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; import type { Sketch } from '../common/protocol/sketches-service'; import { CHANNEL_APP_INFO, @@ -43,7 +43,7 @@ function convertMenu( } return menu.map((item) => { - let nodeId = v4(); + let nodeId = UUID.uuid4(); if (item.execute) { if (!item.id) { throw new Error( diff --git a/arduino-ide-extension/src/node/board-discovery.ts b/arduino-ide-extension/src/node/board-discovery.ts index 3ca946e0b..5d6c137de 100644 --- a/arduino-ide-extension/src/node/board-discovery.ts +++ b/arduino-ide-extension/src/node/board-discovery.ts @@ -9,9 +9,9 @@ import { deepClone } from '@theia/core/lib/common/objects'; import { Deferred } from '@theia/core/lib/common/promise-util'; import type { Mutable } from '@theia/core/lib/common/types'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; import { inject, injectable, named } from '@theia/core/shared/inversify'; import { isDeepStrictEqual } from 'util'; -import { v4 } from 'uuid'; import { Unknown } from '../common/nls'; import { Board, @@ -168,7 +168,7 @@ export class BoardDiscovery }); const wrapper = { stream, - uuid: v4(), + uuid: UUID.uuid4(), dispose: () => { this.logger.info('disposing requesting cancel'); // Cancelling the stream will kill the discovery `builtin:mdns-discovery process`. 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 73ed929aa..6957c8971 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 @@ -420,6 +420,29 @@ export namespace LoadSketchRequest { } } +export class SketchProfile extends jspb.Message { + getName(): string; + setName(value: string): SketchProfile; + getFqbn(): string; + setFqbn(value: string): SketchProfile; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SketchProfile.AsObject; + static toObject(includeInstance: boolean, msg: SketchProfile): SketchProfile.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SketchProfile, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SketchProfile; + static deserializeBinaryFromReader(message: SketchProfile, reader: jspb.BinaryReader): SketchProfile; +} + +export namespace SketchProfile { + export type AsObject = { + name: string, + fqbn: string, + } +} + export class LoadSketchResponse extends jspb.Message { getMainFile(): string; setMainFile(value: string): LoadSketchResponse; @@ -443,6 +466,15 @@ export class LoadSketchResponse extends jspb.Message { setDefaultPort(value: string): LoadSketchResponse; getDefaultProtocol(): string; setDefaultProtocol(value: string): LoadSketchResponse; + clearProfilesList(): void; + getProfilesList(): Array<SketchProfile>; + setProfilesList(value: Array<SketchProfile>): LoadSketchResponse; + addProfiles(value?: SketchProfile, index?: number): SketchProfile; + + hasDefaultProfile(): boolean; + clearDefaultProfile(): void; + getDefaultProfile(): SketchProfile | undefined; + setDefaultProfile(value?: SketchProfile): LoadSketchResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LoadSketchResponse.AsObject; @@ -464,6 +496,8 @@ export namespace LoadSketchResponse { defaultFqbn: string, defaultPort: string, defaultProtocol: string, + profilesList: Array<SketchProfile.AsObject>, + defaultProfile?: SketchProfile.AsObject, } } 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 00132ca3b..5ce1aa6bc 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 @@ -55,6 +55,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.NewSketchRequest', null, glo 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.SketchProfile', 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); @@ -418,6 +419,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.LoadSketchRequest'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SketchProfile = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SketchProfile, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SketchProfile.displayName = 'proto.cc.arduino.cli.commands.v1.SketchProfile'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -3196,12 +3218,172 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setSketchPath = fun + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SketchProfile.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.SketchProfile} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + 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.SketchProfile} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.SketchProfile; + return proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SketchProfile.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.SketchProfile} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.repeatedFields_ = [3,4,5]; +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.repeatedFields_ = [3,4,5,9]; @@ -3241,7 +3423,10 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeI 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, "") + defaultProtocol: jspb.Message.getFieldWithDefault(msg, 8, ""), + profilesList: jspb.Message.toObjectList(msg.getProfilesList(), + proto.cc.arduino.cli.commands.v1.SketchProfile.toObject, includeInstance), + defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f) }; if (includeInstance) { @@ -3310,6 +3495,16 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader var value = /** @type {string} */ (reader.readString()); msg.setDefaultProtocol(value); break; + case 9: + var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); + msg.addProfiles(value); + break; + case 10: + var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); + msg.setDefaultProfile(value); + break; default: reader.skipField(); break; @@ -3395,6 +3590,22 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = fu f ); } + f = message.getProfilesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 9, + f, + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter + ); + } + f = message.getDefaultProfile(); + if (f != null) { + writer.writeMessage( + 10, + f, + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter + ); + } }; @@ -3599,6 +3810,81 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultProtocol }; +/** + * repeated SketchProfile profiles = 9; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getProfilesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 9)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setProfilesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 9, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addProfiles = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 9, opt_value, proto.cc.arduino.cli.commands.v1.SketchProfile, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearProfilesList = function() { + return this.setProfilesList([]); +}; + + +/** + * optional SketchProfile default_profile = 10; + * @return {?proto.cc.arduino.cli.commands.v1.SketchProfile} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getDefaultProfile = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.SketchProfile} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 10)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.SketchProfile|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultProfile = function(value) { + return jspb.Message.setWrapperField(this, 10, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearDefaultProfile = function() { + return this.setDefaultProfile(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.hasDefaultProfile = function() { + return jspb.Message.getField(this, 10) != null; +}; + + diff --git a/arduino-ide-extension/src/node/grpc-progressible.ts b/arduino-ide-extension/src/node/grpc-progressible.ts index dbb77750c..3a36bdf79 100644 --- a/arduino-ide-extension/src/node/grpc-progressible.ts +++ b/arduino-ide-extension/src/node/grpc-progressible.ts @@ -1,5 +1,5 @@ -import { v4 } from 'uuid'; -import { +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; +import type { IndexType, IndexUpdateDidCompleteParams, IndexUpdateDidFailParams, @@ -16,10 +16,10 @@ import { } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; import { DownloadProgress, - TaskProgress, + DownloadProgressEnd, DownloadProgressStart, DownloadProgressUpdate, - DownloadProgressEnd, + TaskProgress, } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CompileResponse } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; import { @@ -170,7 +170,7 @@ export namespace ExecuteWithProgress { progressId, reportResult, }: ExecuteWithProgress.Options): (response: R) => void { - const uuid = v4(); + const uuid = UUID.uuid4(); let message = ''; let url = ''; return (response: R) => { @@ -330,7 +330,7 @@ export class IndexesUpdateProgressHandler { onComplete?: (params: IndexUpdateDidCompleteParams) => void; } ) { - this.progressId = v4(); + this.progressId = UUID.uuid4(); this.results = []; this.total = IndexesUpdateProgressHandler.total(types, additionalUrlsCount); // Note: at this point, the IDE2 backend might not have any connected clients, so this notification is not delivered to anywhere diff --git a/arduino-ide-extension/src/test/browser/create-api.slow-test.ts b/arduino-ide-extension/src/test/browser/create-api.slow-test.ts index b5f4ee96c..f14b0ade5 100644 --- a/arduino-ide-extension/src/test/browser/create-api.slow-test.ts +++ b/arduino-ide-extension/src/test/browser/create-api.slow-test.ts @@ -1,3 +1,4 @@ +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; import { Container, ContainerModule, @@ -9,7 +10,6 @@ import { rejects } from 'node:assert'; import { posix } from 'node:path'; import PQueue from 'p-queue'; import queryString from 'query-string'; -import { v4 } from 'uuid'; import { ArduinoPreferences } from '../../browser/arduino-preferences'; import { AuthenticationClientService } from '../../browser/auth/authentication-client-service'; import { CreateApi } from '../../browser/create/create-api'; @@ -145,7 +145,7 @@ describe('create-api', () => { } it('should delete sketch', async () => { - const name = v4(); + const name = UUID.uuid4(); const content = 'alma\nkorte'; const posixPath = toPosix(name); @@ -185,8 +185,8 @@ describe('create-api', () => { }); it('should rename a sketch folder with all its content', async () => { - const name = v4(); - const newName = v4(); + const name = UUID.uuid4(); + const newName = UUID.uuid4(); const content = 'void setup(){} void loop(){}'; const posixPath = toPosix(name); const newPosixPath = toPosix(newName); @@ -214,8 +214,8 @@ describe('create-api', () => { }); it('should error with HTTP 409 (Conflict) when renaming a sketch and the target already exists', async () => { - const name = v4(); - const otherName = v4(); + const name = UUID.uuid4(); + const otherName = UUID.uuid4(); const content = 'void setup(){} void loop(){}'; const posixPath = toPosix(name); const otherPosixPath = toPosix(otherName); @@ -243,7 +243,7 @@ describe('create-api', () => { }); it('should error with HTTP 422 when reading a file but is a directory', async () => { - const name = v4(); + const name = UUID.uuid4(); const content = 'void setup(){} void loop(){}'; const posixPath = toPosix(name); @@ -257,7 +257,7 @@ describe('create-api', () => { }); it('should error with HTTP 422 when listing a directory but is a file', async () => { - const name = v4(); + const name = UUID.uuid4(); const content = 'void setup(){} void loop(){}'; const posixPath = toPosix(name); @@ -272,7 +272,7 @@ describe('create-api', () => { }); it("should error with HTTP 404 when deleting a non-existing directory via the '/files/d' endpoint", async () => { - const name = v4(); + const name = UUID.uuid4(); const posixPath = toPosix(name); const sketches = await createApi.sketches(); @@ -316,7 +316,7 @@ describe('create-api', () => { }); it("should fetch the sketch when transforming the 'secrets' into '#include' and the sketch is not in the cache", async () => { - const name = v4(); + const name = UUID.uuid4(); const posixPath = toPosix(name); const newSketch = await createApi.createSketch( posixPath, @@ -359,7 +359,9 @@ describe('create-api', () => { const content = 'void setup(){} void loop(){}'; const maxLimit = 10; const sketchCount = maxLimit + diff; - const sketchNames = [...Array(sketchCount).keys()].map(() => v4()); + const sketchNames = [...Array(sketchCount).keys()].map(() => + UUID.uuid4() + ); const createExecutionQueue = new PQueue({ concurrency: 5, diff --git a/electron-app/package.json b/electron-app/package.json index b7f523c02..3254dd07e 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -28,7 +28,7 @@ "compression-webpack-plugin": "^9.0.0", "copy-webpack-plugin": "^8.1.1", "dateformat": "^5.0.3", - "electron": "^25.5.0", + "electron": "^26.2.4", "electron-builder": "^24.6.3", "electron-notarize": "^1.1.1", "execa": "^7.1.1", diff --git a/yarn.lock b/yarn.lock index a5841435c..1c38ab984 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,7 +27,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -35,38 +35,38 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@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/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@^7.10.0": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -79,32 +79,32 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== 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-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -112,9 +112,9 @@ 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== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" @@ -131,18 +131,18 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@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-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@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== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -151,30 +151,30 @@ dependencies: "@babel/types" "^7.22.5" -"@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== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.23.0" -"@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== +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@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== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -189,21 +189,21 @@ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - 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== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== 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-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" "@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== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -232,63 +232,63 @@ 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-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@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-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@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== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + 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.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: "@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-transform-optional-chaining" "^7.22.15" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -429,10 +429,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" - integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" @@ -455,10 +455,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -479,18 +479,18 @@ "@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== +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.15" "@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-replace-supers" "^7.22.9" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" @@ -502,10 +502,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -548,10 +548,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@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== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -595,31 +595,31 @@ "@babel/helper-plugin-utils" "^7.22.5" "@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== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" - integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" - integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" @@ -660,16 +660,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" - integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.15" "@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-parameters" "^7.22.15" "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" @@ -687,19 +687,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" - integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== 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== +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -744,11 +744,11 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.10.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" - integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== dependencies: - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" babel-plugin-polyfill-corejs2 "^0.4.5" babel-plugin-polyfill-corejs3 "^0.8.3" @@ -823,16 +823,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.10.0": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.14.tgz#1cbb468d899f64fa71c53446f13b7ff8c0005cc1" - integrity sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" + integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" + "@babel/compat-data" "^7.22.20" + "@babel/helper-compilation-targets" "^7.22.15" "@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/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" "@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" @@ -853,39 +853,39 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@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.11" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" "@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.10" + "@babel/plugin-transform-block-scoping" "^7.22.15" "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-classes" "^7.22.15" "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.10" + "@babel/plugin-transform-destructuring" "^7.22.15" "@babel/plugin-transform-dotall-regex" "^7.22.5" "@babel/plugin-transform-duplicate-keys" "^7.22.5" "@babel/plugin-transform-dynamic-import" "^7.22.11" "@babel/plugin-transform-exponentiation-operator" "^7.22.5" "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.15" "@babel/plugin-transform-function-name" "^7.22.5" "@babel/plugin-transform-json-strings" "^7.22.11" "@babel/plugin-transform-literals" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" "@babel/plugin-transform-member-expression-literals" "^7.22.5" "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.11" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" "@babel/plugin-transform-modules-systemjs" "^7.22.11" "@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.11" "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" "@babel/plugin-transform-object-super" "^7.22.5" "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.12" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" "@babel/plugin-transform-private-methods" "^7.22.5" "@babel/plugin-transform-private-property-in-object" "^7.22.11" "@babel/plugin-transform-property-literals" "^7.22.5" @@ -901,7 +901,7 @@ "@babel/plugin-transform-unicode-regex" "^7.22.5" "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.11" + "@babel/types" "^7.22.19" babel-plugin-polyfill-corejs2 "^0.4.5" babel-plugin-polyfill-corejs3 "^0.8.3" babel-plugin-polyfill-regenerator "^0.5.2" @@ -923,44 +923,44 @@ 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.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== dependencies: regenerator-runtime "^0.14.0" -"@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== +"@babel/template@^7.22.15", "@babel/template@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== +"@babel/traverse@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@develar/schema-utils@~2.6.5": @@ -977,19 +977,18 @@ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@electron/asar@^3.2.1": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.4.tgz#7e8635a3c4f6d8b3f8ae6efaf5ecb9fbf3bd9864" - integrity sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g== + version "3.2.7" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.7.tgz#bb8117dc6fd0c06a922ae7fb1c0e2d433e35a6e5" + integrity sha512-8FaSCAIiZGYFWyjeevPQt+0e9xCK9YmJ2Rjg5SXgdsXon6cRnU0Yxnbe6CvJbQn26baifur2Y2G5EBayRIsjyg== dependencies: - chromium-pickle-js "^0.2.0" commander "^5.0.0" glob "^7.1.6" minimatch "^3.0.4" "@electron/get@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" - integrity sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" + integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== dependencies: debug "^4.1.1" env-paths "^2.2.0" @@ -1001,15 +1000,16 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.4.tgz#a7d38773f4cad40df111a5edc64037e5d768ea1e" - integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg== +"@electron/notarize@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3" + integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA== dependencies: debug "^4.1.1" fs-extra "^9.0.1" + promise-retry "^2.0.1" -"@electron/osx-sign@^1.0.4": +"@electron/osx-sign@1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== @@ -1021,10 +1021,10 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777" - integrity sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg== +"@electron/universal@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" + integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== dependencies: "@electron/asar" "^3.2.1" "@malept/cross-spawn-promise" "^1.1.0" @@ -1130,9 +1130,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -1149,50 +1149,50 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.48.0": - version "8.48.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== +"@eslint/js@8.51.0": + version "8.51.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" + integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== -"@floating-ui/core@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" - integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ== +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== dependencies: - "@floating-ui/utils" "^0.1.1" + "@floating-ui/utils" "^0.1.3" "@floating-ui/dom@^1.0.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.1.tgz#88b70defd002fe851f17b4a25efb2d3c04d7a8d7" - integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== + version "1.5.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== dependencies: - "@floating-ui/core" "^1.4.1" - "@floating-ui/utils" "^0.1.1" + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" -"@floating-ui/utils@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.1.tgz#1a5b1959a528e374e8037c4396c3e825d6cf4a83" - integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== +"@floating-ui/utils@^0.1.3": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" + integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== "@grpc/grpc-js@^1.8.14": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.2.tgz#151148f6485eab8fb13fe53042d25f4ffa9c7d09" - integrity sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g== + version "1.9.5" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.5.tgz#22e283754b7b10d1ad26c3fb21849028dcaabc53" + integrity sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw== dependencies: "@grpc/proto-loader" "^0.7.8" "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.7.8": - version "0.7.9" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.9.tgz#3ca68236f1a0d77566dafa53c715eb31d096279a" - integrity sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ== + version "0.7.10" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" + integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== dependencies: lodash.camelcase "^4.3.0" long "^5.0.0" protobufjs "^7.2.4" yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.10": +"@humanwhocodes/config-array@^0.11.11": version "0.11.11" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== @@ -1280,21 +1280,21 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@lerna/child-process@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.2.0.tgz#42de5b0a4eb7479c2a72b4bf61685616740cf818" - integrity sha512-8cRsYYX8rGZTXL1KcLBv0RHD9PMvphWZay8yg4qf2giX6x86dQyTetSU4SplG2LBGVClilmNHJa/CQwvPQNUFA== +"@lerna/child-process@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.3.0.tgz#c56488a8a881f22a64793bf9339c5a2450a18559" + integrity sha512-rA+fGUo2j/LEq6w1w8s6oVikLbJTWoIDVpYMc7bUCtwDOUuZKMQiRtjmpavY3fTm7ltu42f4AKflc2A70K4wvA== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.2.0.tgz#a8080b419c1f8ab5d575693fcb883a6a0d82c7e0" - integrity sha512-bBypNfwqOQNcfR2nXJ3mWUeIAIoSFpXg8MjuFSf87PzIiyeTEKa3Z57vAa3bDbHQtcB7x6f0rWysK1eQZSH15Q== +"@lerna/create@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.3.0.tgz#5438c231f617b8e825731390d394f8684af471d5" + integrity sha512-fjgiKjg9VXwQ4ZKKsrXICEKRiC3yo6+FprR0mc55uz0s5e9xupoSGLobUTTBdE7ncNB3ibqml8dfaAn/+ESajQ== dependencies: - "@lerna/child-process" "7.2.0" + "@lerna/child-process" "7.3.0" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -1325,7 +1325,7 @@ libnpmpublish "7.3.0" load-json-file "6.2.0" lodash "^4.17.21" - make-dir "3.1.0" + make-dir "4.0.0" minimatch "3.0.5" multimatch "5.0.0" node-fetch "2.6.7" @@ -1502,27 +1502,27 @@ read-package-json-fast "^3.0.0" which "^3.0.0" -"@nrwl/devkit@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.7.4.tgz#c69e3ae4455447dc3a0cc5515c149692aadba940" - integrity sha512-Gt2q3cqDWzGP1woavGIo4bl8g9YaXic/Xfsl7qPq0LHJedLj49p1vXetB0wawkavSE2MTyo7yDh6YDK/38XoLw== +"@nrwl/devkit@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.10.0.tgz#ac8c5b4db00f12c4b817c937be2f7c4eb8f2593c" + integrity sha512-fRloARtsDQoQgQ7HKEy0RJiusg/HSygnmg4gX/0n/Z+SUS+4KoZzvHjXc6T5ZdEiSjvLypJ+HBM8dQzIcVACPQ== dependencies: - "@nx/devkit" "16.7.4" + "@nx/devkit" "16.10.0" -"@nrwl/tao@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.7.4.tgz#2b2e2cc26ce6c50884da63e69ba8ccf0fcbb9455" - integrity sha512-hH03oF+yVmaf19UZfyLDSuVEh0KasU5YfYezuNsdRkXNdTU/WmpDrk4qoo0j6fVoMPrqbbPOn1YMRtulP2WyYA== +"@nrwl/tao@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.10.0.tgz#94642a0380709b8e387e1e33705a5a9624933375" + integrity sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q== dependencies: - nx "16.7.4" + nx "16.10.0" tslib "^2.3.0" -"@nx/devkit@16.7.4", "@nx/devkit@>=16.5.1 < 17": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.7.4.tgz#c03c308bc190a18642e0dc0c183323662c38c426" - integrity sha512-SLito+/TAeDYR+d7IIpp/sBJm41WM+nIevILv0TSQW4Pq0ylUy1nUvV8Pe7l1ohZccDrQuebMUWPwGO0hv8SeQ== +"@nx/devkit@16.10.0", "@nx/devkit@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.10.0.tgz#7e466be2dee2dcb1ccaf286786ca2a0a639aa007" + integrity sha512-IvKQqRJFDDiaj33SPfGd3ckNHhHi6ceEoqCbAP4UuMXOPPVOX6H0KVk+9tknkPb48B7jWIw6/AgOeWkBxPRO5w== dependencies: - "@nrwl/devkit" "16.7.4" + "@nrwl/devkit" "16.10.0" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -1530,55 +1530,55 @@ tmp "~0.2.1" tslib "^2.3.0" -"@nx/nx-darwin-arm64@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.7.4.tgz#1a797805850444cc6c0aa56668bf6f832093d641" - integrity sha512-pRNjxn6KlcR6iGkU1j/1pzcogwXFv97pYiZaibpF7UV0vfdEUA3EETpDcs+hbNAcKMvVtn/TgN857/5LQ/lGUg== - -"@nx/nx-darwin-x64@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.7.4.tgz#53f681c86d9d8e8bcebfc8ba54dd7b2ec9f71207" - integrity sha512-GANXeabAAWRoF85WDla2ZPxtr8vnqvXjwyCIhRCda8hlKiVCpM98GemucN25z97G5H6MgyV9Dd9t9jrr2Fn0Og== - -"@nx/nx-freebsd-x64@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.7.4.tgz#df88ff9b6ed0b51723d76d711b9467a1a4726f00" - integrity sha512-zmBBDYjPaHhIHx1YASUJJIy+oz7mCrj5f0f3kOzfMraQOjkQZ0xYgNNUzBqmnYu1855yiphu94MkAMYJnbk0jw== - -"@nx/nx-linux-arm-gnueabihf@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.7.4.tgz#2cfac69e65237245560326039bb319691147daed" - integrity sha512-d3Cmz/vdtoSasTUANoh4ZYLJESNA3+PCP/HnXNqmrr6AEHo+T8DcI+qsamO3rmYUSFxTMAeMyoihZMU8OKGZ1A== - -"@nx/nx-linux-arm64-gnu@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.7.4.tgz#492fb66b804aa6154cd44ded6eaaf6cfcb32ea9f" - integrity sha512-W1u4O78lTHCwvUP0vakeKWFXeSZ13nYzbd6FARICnImY2my8vz41rLm6aU9TYWaiOGEGL2xKpHKSgiNwbLjhFw== - -"@nx/nx-linux-arm64-musl@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.7.4.tgz#ad32f35f05067e918eff9a97d8720f3923c034cb" - integrity sha512-Dc8IQFvhfH/Z3GmhBBNNxGd2Ehw6Y5SePEgJj1c2JyPdoVtc2OjGzkUaZkT4z5z77VKtju6Yi10T6Enps+y+kw== - -"@nx/nx-linux-x64-gnu@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.7.4.tgz#40271f7d21ef3ba0676c046b73c84cf9eb1ed94a" - integrity sha512-4B58C/pXeuovSznBOeicsxNieBApbGMoi2du8jR6Is1gYFPv4l8fFHQHHGAa1l5XJC5JuGJqFywS4elInWprNw== - -"@nx/nx-linux-x64-musl@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.7.4.tgz#8bd13692a0922df51c6305df93d69a3c66b4b716" - integrity sha512-spqqvEdGSSeV2ByJHkex5m8MRQfM6lQlnon25XgVBdPR47lKMWSikUsaWCiE7bVAFU9BFyWY2L4HfZ4+LiNY7A== - -"@nx/nx-win32-arm64-msvc@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.7.4.tgz#dfbe5b28c62c1c1ceadad12e79029f76e450d855" - integrity sha512-etNnbuCcSqAYOeDcS6si6qw0WR/IS87ovTzLS17ETKpdHcHN5nM4l02CQyupKiD58ShxrXHxXmvgBfbXxoN5Ew== - -"@nx/nx-win32-x64-msvc@16.7.4": - version "16.7.4" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.7.4.tgz#e4b270107e02e73451d7c5dc7c4237fffe18aa75" - integrity sha512-y6pugK6ino1wvo2FbgtXG2cVbEm3LzJwOSBKBRBXSWhUgjP7T92uGfOt6KVQKpaqDvS9lA9TO/2DcygcLHXh7A== +"@nx/nx-darwin-arm64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz#0c73010cac7a502549483b12bad347da9014e6f1" + integrity sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ== + +"@nx/nx-darwin-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz#2ccf270418d552fd0a8e0d6089aee4944315adaa" + integrity sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg== + +"@nx/nx-freebsd-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.10.0.tgz#c3ee6914256e69493fed9355b0d6661d0e86da44" + integrity sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw== + +"@nx/nx-linux-arm-gnueabihf@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.10.0.tgz#a961eccbb38acb2da7fc125b29d1fead0b39152f" + integrity sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA== + +"@nx/nx-linux-arm64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.10.0.tgz#795f20072549d03822b5c4639ef438e473dbb541" + integrity sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g== + +"@nx/nx-linux-arm64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.10.0.tgz#f2428ee6dbe2b2c326e8973f76c97666def33607" + integrity sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ== + +"@nx/nx-linux-x64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.10.0.tgz#d36c2bcf94d49eaa24e3880ddaf6f1f617de539b" + integrity sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA== + +"@nx/nx-linux-x64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.10.0.tgz#78bd2ab97a583b3d4ea3387b67fd7b136907493c" + integrity sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q== + +"@nx/nx-win32-arm64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.10.0.tgz#ef20ec8d0c83d66e73e20df12d2c788b8f866396" + integrity sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA== + +"@nx/nx-win32-x64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.10.0.tgz#7410a51d0f8be631eec9552f01b2e5946285927c" + integrity sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA== "@octokit/auth-token@^2.4.4": version "2.5.0" @@ -1660,9 +1660,9 @@ integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== "@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== + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== "@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" @@ -2698,21 +2698,21 @@ minimatch "^9.0.0" "@types/auth0-js@^9.14.0": - 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== + version "9.21.1" + resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.1.tgz#3883693ae84746153507ea6e9bfa8c68811c1906" + integrity sha512-K8X2aBZynfeqjRI15P6fcpzcjAPXfppAVwaUNXxXnXmXMx66pz5IwQ5ZpzaDg8Q1P6aVF8+N2RZMTcBoOME9HA== "@types/bent@^7.0.1": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.4.tgz#83352a5c65bbe2a47913606aeec5d74cb8d1977d" - integrity sha512-m2dySDogScw79djR20mBWjn7AOUw9mPwsOy8Hygssy9cijELV1G94+98onpiqSh7uoLsT1tBgeFu96GS9dWYoQ== + version "7.3.5" + resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.5.tgz#0676776c1ea70bed464234435b80a6acbc8d9c7d" + integrity sha512-7PTYvy4UERqRPwlz/2KMXyCu08JpvN+SHBOH1Kzp+haZFsX1xrC+RI5qFVERTIDp1XoA+VnfatRmSM7x/0p3vw== dependencies: "@types/node" "*" "@types/body-parser@*", "@types/body-parser@^1.16.4", "@types/body-parser@^1.17.0": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.3" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== dependencies: "@types/connect" "*" "@types/node" "*" @@ -2735,14 +2735,14 @@ "@types/responselike" "^1.0.0" "@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== + version "4.3.7" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.7.tgz#5457bc3dce72f20ae533366682a6298471d1c610" + integrity sha512-/k+vesl92vMvMygmQrFe9Aimxi6oQXFUX9mA5HanTrKUSAMoLauSi6PNFOdRw0oeqilaW600GNx2vSaT2f8aIQ== "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== dependencies: "@types/node" "*" @@ -2757,9 +2757,9 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": - version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + version "2.8.14" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== dependencies: "@types/node" "*" @@ -2769,16 +2769,16 @@ integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== "@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== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" + integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== dependencies: "@types/ms" "*" "@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== + version "3.5.6" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.5.6.tgz#2524928a13888cebb59dc18e0c793022e7d02dfd" + integrity sha512-5BV7iGX/NmFGqAQn+YDBK++kO7IbZf0mIn8mwdJACIpZsMUqJvEin0riqNDbmS3SQL8u00dGnbC0FFJQptTSWw== "@types/dompurify@^2.2.2": version "2.4.0" @@ -2788,35 +2788,35 @@ "@types/trusted-types" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" + integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.44.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" + integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@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== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" + integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== "@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== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.1.tgz#e94892d60bcf582e3ee95ddedb89f77373925746" + integrity sha512-QfUFdKjGSc+iCf8OFZhqJKfDuqB6lP57kSMkPw8ba3yNDANicUwCdaPt5ytZ4nDXXVFxQkvT8v73I4stSVrCxA== "@types/express-serve-static-core@^4.17.33": - version "4.17.36" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" - integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + version "4.17.37" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" + integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2824,9 +2824,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.16.0": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2841,9 +2841,9 @@ "@types/node" "*" "@types/fs-extra@^4.0.2": - version "4.0.12" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.12.tgz#357f68e835d381a12f63967a8bb5d3d81145443a" - integrity sha512-alTHKMXq1kGPB9sddbbjJ4OJ9UJ/xiXaaoDzbLhontmlnZLwlJpvIUE8lI7YtcO45gcI9Cwt8hPfmU1rgmVHSQ== + version "4.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.13.tgz#0499ef6ab6dd1c9e05c5247383867a47f5929e0b" + integrity sha512-rMZ7c4t5/EQc2FD7OTbS5XPHCR4hUSVwkiTN0/CXaLDTwxE3IPNMrCKEroLDSYB0K7UTpEH6TAcN30ff+MJw9w== dependencies: "@types/node" "*" @@ -2856,45 +2856,45 @@ "@types/node" "*" "@types/google-protobuf@^3.7.2": - version "3.15.6" - resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504" - integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== + version "3.15.7" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.7.tgz#882e7351bc8ccf30bb21c507cc4597cf76f8888b" + integrity sha512-pIEMnb04J60c5eExVLUY/R4eWT5QEQ5cC792JOSfDI3kLjaKC4TjdgMp3xIrN1vxbi2Zk8LcscTm0VaNrIdniA== "@types/hast@^2.0.0": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" - integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" + integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== dependencies: "@types/unist" "^2" -"@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-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" + integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== "@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== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== "@types/js-yaml@^3.12.2": - version "3.12.7" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.7.tgz#330c5d97a3500e9c903210d6e49f02964af04a0e" - integrity sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ== + version "3.12.8" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.8.tgz#d47f0ceac930a644266001979d07d7b94808a5c8" + integrity sha512-6McoI148SFmiE2m2Y9lpzwN238grgzEn2J1mHoc8UWwDKvAUsjl100jjqoj5ORVqDwWuEmD+zlOES0+jI7fZCA== "@types/jsdom@^21.1.1": - version "21.1.2" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.2.tgz#d04db019ad62174d28c63c927761f2f196825f04" - integrity sha512-bGj+7TaCkOwkJfx7HtS9p22Ij0A2aKMuz8a1+owpkxa1wU/HUBy/WAXhdv90uDdVI9rSjGvUrXmLSeA9VP3JeA== + version "21.1.3" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.3.tgz#a88c5dc65703e1b10b2a7839c12db49662b43ff0" + integrity sha512-1zzqSP+iHJYV4lB3lZhNBa012pubABkj9yG/GuXuf6LZH1cSPIJBqFDrm5JX65HHt6VOnNYdTui/0ySerRbMgA== dependencies: "@types/node" "*" "@types/tough-cookie" "*" parse5 "^7.0.0" "@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== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/keyv@^3.1.4": version "3.1.4" @@ -2930,9 +2930,9 @@ "@types/lodash" "*" "@types/lodash@*": - version "4.14.197" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" - integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== + version "4.14.199" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" + integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== "@types/markdown-it@^12.2.3": version "12.2.3" @@ -2943,26 +2943,26 @@ "@types/mdurl" "*" "@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== + version "3.0.13" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" + integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== dependencies: "@types/unist" "^2" "@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.3.tgz#d0aefccdd1a96f4bec76047d6b314601f0b0f3de" + integrity sha512-T5k6kTXak79gwmIOaDF2UUQXFbnBE0zBUzF20pz7wDYu0RQMzWg+Ml/Pz50214NsFHBITkoi5VtdjFZnJ2ijjA== "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" + integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" + integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== "@types/mime@^2.0.1": version "2.0.3" @@ -2980,54 +2980,51 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" + integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== "@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" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== + version "10.0.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.2.tgz#96d63314255540a36bf24da094cce7a13668d73b" + integrity sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.32" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" + integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== "@types/multer@^1.4.7": - version "1.4.7" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e" - integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== + version "1.4.8" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.8.tgz#8d98c36f6a4e0b228a9f262cd66e881d7cd64039" + integrity sha512-VMZOW6mnmMMhA5m3fsCdXBwFwC+a+27/8gctNMuQC4f7UtWcF79KAFGoIfKZ4iqrElgWIa3j5vhMJDp0iikQ1g== dependencies: "@types/express" "*" "@types/node-fetch@^2.5.7": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" - integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== + version "2.6.6" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" + integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== dependencies: "@types/node" "*" - form-data "^3.0.0" + form-data "^4.0.0" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.5.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" - integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + version "20.8.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.4.tgz#0e9ebb2ff29d5c3302fc84477d066fa7c6b441aa" + integrity sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A== + dependencies: + undici-types "~5.25.1" "@types/node@^18.11.18": - version "18.17.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.12.tgz#c6bd7413a13e6ad9cfb7e97dd5c4e904c1821e50" - integrity sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ== + version "18.18.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.4.tgz#519fef47a13cf869be290c20fc6ae9b7fe887aa7" + integrity sha512-t3rNFBgJRugIhackit2mVcLfF6IRc0JE4oeizPQL8Zrm8n2WY/0wOdpOPhdtG0V9Q2TlW/axbF1MJ6z+Yj/kKQ== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" + integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== "@types/p-queue@^2.3.1": version "2.3.2" @@ -3040,22 +3037,22 @@ 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== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.3.tgz#8571d797ed09e0ee2700f7e40bbdec7fd80966ef" + integrity sha512-DXkBoKc7jwUR0p439icInmXXMJNhoImdpOrrgA5/nDFK7LVtcJ9MyQNKhJEKpEztnHGWnNWMWLOIR62By0Ln0A== dependencies: "@types/node" "*" xmlbuilder ">=11.0.1" "@types/prop-types@*", "@types/prop-types@^15.0.0": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" + integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== "@types/ps-tree@^1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.2.tgz#5c60773a38ffb1402e049902a7b7a8d3c67cd59a" - integrity sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.3.tgz#12a05ebbdc253ed2b2a6055560667e60814791d0" + integrity sha512-J8IrehehphLtxpABSekURTw9jthrlLcM4llH1I2fZ0zKaxq8jI/O1+Q/tabAJgBY/ffoqDxPRNYBM1lFUXm0lw== "@types/qs@*": version "6.9.8" @@ -3063,14 +3060,14 @@ integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" + integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== "@types/react-dom@^18.0.6": - 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== + version "18.2.12" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.12.tgz#58479c463d1e0b7f1ee7cd80e09186189f9ec32d" + integrity sha512-QWZuiA/7J/hPIGocXreCRbx7wyoeet9ooxfbSA+zbIWqyQEE7GMtRn4A37BdYyksnN+/NDnWgfxZH9UVGDw1hg== dependencies: "@types/react" "*" @@ -3082,32 +3079,32 @@ "@types/react" "*" "@types/react-transition-group@^4.4.0": - 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== + version "4.4.7" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.7.tgz#bf69f269d74aa78b99097673ca6dd6824a68ef1c" + integrity sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg== dependencies: "@types/react" "*" "@types/react-window@^1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.6.tgz#4faba05b86abd36f40b612a5b02e28fadcf95c7c" + integrity sha512-AVJr3A5rIO9dQQu5TwTN0lP2c1RtuqyyZGCt7PGP8e5gUpn1PuQRMJb/u3UpdbwTHh4wbEi33UMW5NI0IXt1Mg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.15": - version "18.2.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" - integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== + version "18.2.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.27.tgz#746e52b06f3ccd5d7a724fd53769b70792601440" + integrity sha512-Wfv7B7FZiR2r3MIqbAlXoY1+tXm4bOqfz4oRr+nyXdBqapDBZ0l/IGcSlAfvxIHEEJjkPU0MYAc/BlFPOcrgLw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@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== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" + integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== dependencies: "@types/node" "*" @@ -3120,39 +3117,39 @@ "@types/node" "*" "@types/route-parser@^0.1.1": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@types/route-parser/-/route-parser-0.1.4.tgz#155686e569d19ff97779bf6bcb513360587748dd" - integrity sha512-lwH3SeyKwCAwP7oUoJNryPDdbW3Bx5lrB6mhV5iebqzOJHIut6wlaSxpQR4Lsk6j7wC08pGenr/xE8I/A4J3Fg== + version "0.1.5" + resolved "https://registry.yarnpkg.com/@types/route-parser/-/route-parser-0.1.5.tgz#5fee03ea01d2d457603eab3e46f4fa52573fb5c8" + integrity sha512-W17Tv0Y3uecmsqisMC5HwobDSEy7RXQfBxnbcBnVP0f6QbxFWCK+dEtC0u259nZFRgTYXHKaKbZzCtMgiYYAqg== "@types/safer-buffer@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/safer-buffer/-/safer-buffer-2.1.0.tgz#8c498815fe00af8f8b23d63eb3fd6fae6ae2ab7a" - integrity sha512-04WlrCdOLy1Ejpwc3A7qyZzsH6uqeWoH+XO80V8S8NRubGg+E4FMMM3VAS6jZZ8w+dXki1/5FI5upmMDQlaQsQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/safer-buffer/-/safer-buffer-2.1.1.tgz#7d504d3d5b9cba87723543d0da3f47649d4feb52" + integrity sha512-L/QB8WCfXIRPguK8h3L+o1QO9b2NltRpj6y8dYusvzGPJhPZtw9lWYb9gmLvf30qS7j6cZ/wUBXXu36UEtH1XQ== dependencies: "@types/node" "*" "@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + version "0.16.4" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" + integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== "@types/semver@^7.3.12", "@types/semver@^7.3.6", "@types/semver@^7.5.0": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@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== + version "0.17.2" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" + integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== dependencies: "@types/mime" "^1" "@types/node" "*" "@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== + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" + integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== dependencies: "@types/http-errors" "*" "@types/mime" "*" @@ -3167,9 +3164,9 @@ "@types/tar-stream" "*" "@types/tar-stream@*": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-2.2.2.tgz#be9d0be9404166e4b114151f93e8442e6ab6fb1d" - integrity sha512-1AX+Yt3icFuU6kxwmPakaiGrJUwG44MpuiqPg4dSolRFk6jmvs4b3IbUol9wKDLIgU76gevn3EwE8y/DkSJCZQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-3.1.1.tgz#a0d936ec27c732e5287a84055b849637ee609974" + integrity sha512-/1E+a09mAFQwhlEHqiS3LuNWIBiyrn0HqUWZk2IyGzodu9zkXbaT5vl94iGlZGnG2IONVFZd84SFhns3MhhAQQ== dependencies: "@types/node" "*" @@ -3181,14 +3178,14 @@ "@types/node" "*" "@types/tough-cookie@*", "@types/tough-cookie@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" + integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== "@types/trusted-types@*": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" + integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== "@types/unist@^2", "@types/unist@^2.0.0": version "2.0.8" @@ -3201,14 +3198,14 @@ integrity sha512-U/wu4HTp6T2dUmKqDtOUKS9cYhawuf8txqKF3Jp1iMDG8fP5HtjSldcN0g4m+/h7XHU1to1/HDCT0qeeUiu0EA== "@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== + version "1.10.7" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.7.tgz#7e2ee21514355a7ae354fa151d96856d18531f72" + integrity sha512-4c5F4T0qMSoXq1KHx7WV1FMuD2h0xdaFoJ7HSVWUfQ8w5YbqCwLOA8K7/yy1I+Txuzvm417dnPUaLmqazX1F7g== "@types/vscode@^1.78.0": - version "1.81.0" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.81.0.tgz#c27228dd063002e0e00611be70b0497beaa24d39" - integrity sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w== + version "1.83.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.83.0.tgz#f787d1d94d0b258b9bb97947396b47c1d364e90f" + integrity sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ== "@types/write-json-file@^2.2.1": version "2.2.1" @@ -3224,21 +3221,21 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^15": - version "15.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" - integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + version "15.0.16" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.16.tgz#258009dc52907e8f03041eb64ffdac297ba4b208" + integrity sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg== dependencies: "@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== + version "2.10.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" + integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== dependencies: "@types/node" "*" @@ -3757,145 +3754,16 @@ anser@^2.0.1: resolved "https://registry.yarnpkg.com/anser/-/anser-2.1.1.tgz#8afae28d345424c82de89cc0e4d1348eb0c5af7c" integrity sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ== -ansi-bgblack@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz#a68ba5007887701b6aafbe3fa0dadfdfa8ee3ca2" - integrity sha512-tp8M/NCmSr6/skdteeo9UgJ2G1rG88X3ZVNZWXUxFw4Wh0PAGaAAWQS61sfBt/1QNcwMTY3EBKOMPujwioJLaw== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgblue@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz#67bdc04edc9b9b5278969da196dea3d75c8c3613" - integrity sha512-R8JmX2Xv3+ichUQE99oL+LvjsyK+CDWo/BtVb4QUz3hOfmf2bdEmiDot3fQcpn2WAHW3toSRdjSLm6bgtWRDlA== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgcyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz#58489425600bde9f5507068dd969ebfdb50fe768" - integrity sha512-6SByK9q2H978bmqzuzA5NPT1lRDXl3ODLz/DjC4URO5f/HqK7dnRKfoO/xQLx/makOz7zWIbRf6+Uf7bmaPSkQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-bggreen@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz#4e3191248529943f4321e96bf131d1c13816af49" - integrity sha512-8TRtOKmIPOuxjpklrkhUbqD2NnVb4WZQuIjXrT+TGKFKzl7NrL7wuNvEap3leMt2kQaCngIN1ZzazSbJNzF+Aw== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgmagenta@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz#9b28432c076eaa999418672a3efbe19391c2c7a1" - integrity sha512-UZYhobiGAlV4NiwOlKAKbkCyxOl1PPZNvdIdl/Ce5by45vwiyNdBetwHk/AjIpo1Ji9z+eE29PUBAjjfVmz5SA== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgred@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgred/-/ansi-bgred-0.1.1.tgz#a76f92838382ba43290a6c1778424f984d6f1041" - integrity sha512-BpPHMnYmRBhcjY5knRWKjQmPDPvYU7wrgBSW34xj7JCH9+a/SEIV7+oSYVOgMFopRIadOz9Qm4zIy+mEBvUOPA== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgwhite@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz#6504651377a58a6ececd0331994e480258e11ba8" - integrity sha512-KIF19t+HOYOorUnHTOhZpeZ3bJsjzStBG2hSGM0WZ8YQQe4c7lj9CtwnucscJDPrNwfdz6GBF+pFkVfvHBq6uw== - dependencies: - ansi-wrap "0.1.0" - -ansi-bgyellow@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz#c3fe2eb08cd476648029e6874d15a0b38f61d44f" - integrity sha512-WyRoOFSIvOeM7e7YdlSjfAV82Z6K1+VUVbygIQ7C/VGzWYuO/d30F0PG7oXeo4uSvSywR0ozixDQvtXJEorq4Q== - dependencies: - ansi-wrap "0.1.0" - -ansi-black@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-black/-/ansi-black-0.1.1.tgz#f6185e889360b2545a1ec50c0bf063fc43032453" - integrity sha512-hl7re02lWus7lFOUG6zexhoF5gssAfG5whyr/fOWK9hxNjUFLTjhbU/b4UHWOh2dbJu9/STSUv+80uWYzYkbTQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-blue@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-blue/-/ansi-blue-0.1.1.tgz#15b804990e92fc9ca8c5476ce8f699777c21edbf" - integrity sha512-8Um59dYNDdQyoczlf49RgWLzYgC2H/28W3JAIyOAU/+WkMcfZmaznm+0i1ikrE0jME6Ypk9CJ9CY2+vxbPs7Fg== - dependencies: - ansi-wrap "0.1.0" - -ansi-bold@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-bold/-/ansi-bold-0.1.1.tgz#3e63950af5acc2ae2e670e6f67deb115d1a5f505" - integrity sha512-wWKwcViX1E28U6FohtWOP4sHFyArELHJ2p7+3BzbibqJiuISeskq6t7JnrLisUngMF5zMhgmXVw8Equjzz9OlA== - dependencies: - ansi-wrap "0.1.0" - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - 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" - integrity sha512-ScRNUT0TovnYw6+Xo3iKh6G+VXDw2Ds7ZRnMIuKBgHY02DgvT2T2K22/tc/916Fi0W/5Z1RzDaHQwnp75hqdbA== - dependencies: - ansi-bgblack "^0.1.1" - ansi-bgblue "^0.1.1" - ansi-bgcyan "^0.1.1" - ansi-bggreen "^0.1.1" - ansi-bgmagenta "^0.1.1" - ansi-bgred "^0.1.1" - ansi-bgwhite "^0.1.1" - ansi-bgyellow "^0.1.1" - ansi-black "^0.1.1" - ansi-blue "^0.1.1" - ansi-bold "^0.1.1" - ansi-cyan "^0.1.1" - ansi-dim "^0.1.1" - ansi-gray "^0.1.1" - ansi-green "^0.1.1" - ansi-grey "^0.1.1" - ansi-hidden "^0.1.1" - ansi-inverse "^0.1.1" - ansi-italic "^0.1.1" - ansi-magenta "^0.1.1" - ansi-red "^0.1.1" - ansi-reset "^0.1.1" - ansi-strikethrough "^0.1.1" - ansi-underline "^0.1.1" - ansi-white "^0.1.1" - ansi-yellow "^0.1.1" - lazy-cache "^2.0.1" - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== - dependencies: - ansi-wrap "0.1.0" - -ansi-dim@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-dim/-/ansi-dim-0.1.1.tgz#40de4c603aa8086d8e7a86b8ff998d5c36eefd6c" - integrity sha512-zAfb1fokXsq4BoZBkL0eK+6MfFctbzX3R4UMcoWrL1n2WHewFKentTvOZv2P11u6P4NtW/V47hVjaN7fJiefOg== - dependencies: - ansi-wrap "0.1.0" - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3903,77 +3771,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== - dependencies: - ansi-wrap "0.1.0" - -ansi-green@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-green/-/ansi-green-0.1.1.tgz#8a5d9a979e458d57c40e33580b37390b8e10d0f7" - integrity sha512-WJ70OI4jCaMy52vGa/ypFSKFb/TrYNPaQ2xco5nUwE0C5H8piume/uAZNNdXXiMQ6DbRmiE7l8oNBHu05ZKkrw== - dependencies: - ansi-wrap "0.1.0" - -ansi-grey@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-grey/-/ansi-grey-0.1.1.tgz#59d98b6ac2ba19f8a51798e9853fba78339a33c1" - integrity sha512-+J1nM4lC+whSvf3T4jsp1KR+C63lypb+VkkwtLQMc1Dlt+nOvdZpFT0wwFTYoSlSwCcLUAaOpHF6kPkYpSa24A== - dependencies: - ansi-wrap "0.1.0" - -ansi-hidden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-hidden/-/ansi-hidden-0.1.1.tgz#ed6a4c498d2bb7cbb289dbf2a8d1dcc8567fae0f" - integrity sha512-8gB1bo9ym9qZ/Obvrse1flRsfp2RE+40B23DhQcKxY+GSeaOJblLnzBOxzvmLTWbi5jNON3as7wd9rC0fNK73Q== - dependencies: - ansi-wrap "0.1.0" - -ansi-inverse@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-inverse/-/ansi-inverse-0.1.1.tgz#b6af45826fe826bfb528a6c79885794355ccd269" - integrity sha512-Kq8Z0dBRhQhDMN/Rso1Nu9niwiTsRkJncfJZXiyj7ApbfJrGrrubHXqXI37feJZkYcIx6SlTBdNCeK0OQ6X6ag== - dependencies: - ansi-wrap "0.1.0" - -ansi-italic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-italic/-/ansi-italic-0.1.1.tgz#104743463f625c142a036739cf85eda688986f23" - integrity sha512-jreCxifSAqbaBvcibeQxcwhQDbEj7gF69XnpA6x83qbECEBaRBD1epqskrmov1z4B+zzQuEdwbWxgzvhKa+PkA== - dependencies: - ansi-wrap "0.1.0" - -ansi-magenta@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-magenta/-/ansi-magenta-0.1.1.tgz#063b5ba16fb3f23e1cfda2b07c0a89de11e430ae" - integrity sha512-A1Giu+HRwyWuiXKyXPw2AhG1yWZjNHWO+5mpt+P+VWYkmGRpLPry0O5gmlJQEvpjNpl4RjFV7DJQ4iozWOmkbQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -3984,21 +3786,7 @@ ansi-regex@^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" - integrity sha512-n+D0qD3B+h/lP0dSwXX1SZMoXufdUVotLMwUuvXa50LtBAh3f+WV8b5nFMfLL/hgoPBUt+rG/pqqzF8krlZKcw== - dependencies: - ansi-wrap "0.1.0" - -ansi-strikethrough@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz#d84877140b2cff07d1c93ebce69904f68885e568" - integrity sha512-gWkLPDvHH2pC9YEKqp8dIl0mg3sRglMPvioqGDIOXiwxjxUwIJ1gF86E2o4R5yLNh8IAkwHbaMtASkJfkQ2hIA== - dependencies: - ansi-wrap "0.1.0" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +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== @@ -4022,33 +3810,7 @@ ansi-styles@^6.1.0: 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" - integrity sha512-D+Bzwio/0/a0Fu5vJzrIT6bFk43TW46vXfSvzysOTEHcXOAUJTVMHWDbELIzGU4AVxVw2rCTb7YyWS4my2cSKQ== - dependencies: - ansi-wrap "0.1.0" - -ansi-white@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-white/-/ansi-white-0.1.1.tgz#9c77b7c193c5ee992e6011d36ec4c921b4578944" - integrity sha512-DJHaF2SRzBb9wZBgqIJNjjTa7JUJTO98sHeTS1sDopyKKRopL1KpaJ20R6W2f/ZGras8bYyIZDtNwYOVXNgNFg== - dependencies: - ansi-wrap "0.1.0" - -ansi-wrap@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== - -ansi-yellow@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-yellow/-/ansi-yellow-0.1.1.tgz#cb9356f2f46c732f0e3199e6102955a77da83c1d" - integrity sha512-6E3D4BQLXHLl3c/NwirWVZ+BCkMq2qsYxdeAGGOijKrx09FaqU+HktFL6QwAwNvgJiMLnv6AQ2C1gFZx0h1CBg== - dependencies: - ansi-wrap "0.1.0" - -anymatch@~3.1.1, anymatch@~3.1.2: +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== @@ -4061,16 +3823,16 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@24.6.3: - version "24.6.3" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.3.tgz#5fe7027ec81ea35d5875a6e193c95cbb932eaa2e" - integrity sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg== +app-builder-lib@24.6.4: + version "24.6.4" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.4.tgz#5bf77dd89d3ee557bc615b9ddfaf383f3e51577b" + integrity sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "^1.2.3" - "@electron/osx-sign" "^1.0.4" - "@electron/universal" "1.3.4" + "@electron/notarize" "2.1.0" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.4.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" @@ -4147,7 +3909,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.10, argparse@^1.0.7: +argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -4159,21 +3921,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-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" @@ -4198,25 +3945,16 @@ array-ify@^1.0.0: integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== 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== + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" -array-sort@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-0.1.4.tgz#662855eaeb671b4188df4451b2f24a0753992b23" - integrity sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ== - dependencies: - default-compare "^1.0.0" - get-value "^2.0.6" - kind-of "^5.0.2" - array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -4234,61 +3972,46 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - array.prototype.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== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" 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.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" - integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" es-abstract "^1.22.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" + es-shim-unscopables "^1.0.0" 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== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" -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== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -4323,11 +4046,6 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -4384,20 +4102,15 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - atomically@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== auth0-js@^9.14.0: - version "9.22.1" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.22.1.tgz#8266f859f215199c70c4ef2988ab0bd63f67b3f4" - integrity sha512-AcyJiWhsyG5zdx40O9i/okpLLEvB23/6CivWynmGtP43s2C4GSq3E+XdCRw64ifmZ7t6ZK4Yzfpiqy5KVXEtJg== + version "9.23.0" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.23.0.tgz#e0f825b12a43ab6696464790470944a59df9c28a" + integrity sha512-AtvbseCU+9/hwCPTGbV9UI7iYc2EmT7rN1dPiRxNUyT4RXIFAnJRkuCSEwa0mhS20jlMPD4b28l5354vxBbYzw== dependencies: base64-js "^1.5.1" idtoken-verifier "^2.2.2" @@ -4408,13 +4121,6 @@ auth0-js@^9.14.0: url-join "^4.0.1" winchan "^0.2.2" -autolinker@~0.28.0: - version "0.28.1" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47" - integrity sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ== - dependencies: - gulp-header "^1.7.1" - autosize@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.4.tgz#924f13853a466b633b9309330833936d8bccce03" @@ -4441,9 +4147,9 @@ axios@^0.21.1: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" - integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" + integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -4483,12 +4189,12 @@ babel-plugin-polyfill-corejs2@^0.4.5: semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + version "0.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" + integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" + core-js-compat "^3.32.2" babel-plugin-polyfill-regenerator@^0.5.2: version "0.5.2" @@ -4517,19 +4223,6 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" @@ -4664,22 +4357,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -4692,15 +4369,15 @@ browser-stdout@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.21.10, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.14.5, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" btoa@^1.2.1: version "1.2.1" @@ -4856,21 +4533,6 @@ cacache@^17.0.0: tar "^6.1.11" unique-filename "^3.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -4882,11 +4544,11 @@ cacheable-lookup@^7.0.0: integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== cacheable-request@^10.2.8: - version "10.2.13" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.13.tgz#b7012bb4a2acdb18cb54d2dff751d766b3500842" - integrity sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA== + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: - "@types/http-cache-semantics" "^4.0.1" + "@types/http-cache-semantics" "^4.0.2" get-stream "^6.0.1" http-cache-semantics "^4.1.1" keyv "^4.5.3" @@ -4937,11 +4599,6 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4952,10 +4609,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== +caniuse-lite@^1.0.30001541: + version "1.0.30001547" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" + integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== capital-case@^1.0.4: version "1.0.4" @@ -4972,17 +4629,17 @@ caseless@~0.12.0: integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chai@^4.2.0: - version "4.3.8" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" - integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== + version "4.3.10" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" + integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.0.8" chainsaw@~0.1.0: version "0.1.0" @@ -5052,31 +4709,18 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" 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" - 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" - chokidar@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -5125,19 +4769,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 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" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== classnames@^2.3.1: version "2.3.2" @@ -5169,9 +4803,9 @@ cli-spinners@2.6.1: 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== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" @@ -5186,24 +4820,6 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -5291,14 +4907,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -5401,7 +5009,7 @@ compare-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: +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== @@ -5444,13 +5052,6 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concat-with-sourcemaps@*: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - conf@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/conf/-/conf-10.2.0.tgz#838e757be963f1a2386dfe048a98f8f69f7b55d6" @@ -5574,11 +5175,16 @@ conventional-recommended-bump@7.0.1: git-semver-tags "^5.0.0" meow "^8.1.2" -convert-source-map@^1.5.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -5606,11 +5212,6 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - copy-webpack-plugin@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz#3f697e162764925c2f0d235f380676125508fd26" @@ -5624,12 +5225,12 @@ copy-webpack-plugin@^8.1.1: schema-utils "^3.0.0" serialize-javascript "^5.0.1" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== +core-js-compat@^3.31.0, core-js-compat@^3.32.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" + integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== dependencies: - browserslist "^4.21.10" + browserslist "^4.22.1" core-util-is@1.0.2: version "1.0.2" @@ -5671,13 +5272,13 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: yaml "^1.10.0" 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== + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - import-fresh "^3.2.1" + import-fresh "^3.3.0" js-yaml "^4.1.0" - parse-json "^5.0.0" + parse-json "^5.2.0" path-type "^4.0.0" cp-file@^10.0.0: @@ -5710,16 +5311,6 @@ crc@^3.8.0: dependencies: buffer "^5.1.0" -create-frame@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/create-frame/-/create-frame-1.0.0.tgz#8b95f2691e3249b6080443e33d0bad9f8f6975aa" - integrity sha512-SnJYqAwa5Jon3cP8e3LMFBoRG2m/hX20vtOnC3ynhyAa6jmy+BqrPoicBtmKUutnJuphXPj7C54yOXF58Tl71Q== - dependencies: - define-property "^0.2.5" - extend-shallow "^2.0.1" - isobject "^3.0.0" - lazy-cache "^2.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" @@ -5749,17 +5340,6 @@ cross-spawn@^4.0.0: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.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" @@ -5824,13 +5404,6 @@ data-urls@^4.0.0: whatwg-mimetype "^3.0.0" whatwg-url "^12.0.0" -date.js@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/date.js/-/date.js-0.3.3.tgz#ef1e92332f507a638795dbb985e951882e50bbda" - integrity sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw== - dependencies: - debug "~3.1.0" - dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -5848,20 +5421,13 @@ 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: 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, 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" @@ -5876,13 +5442,6 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -5891,7 +5450,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5913,7 +5472,7 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: +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== @@ -5990,7 +5549,7 @@ dedent@0.7.0, dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-eql@^4.1.2: +deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -6012,13 +5571,6 @@ deepmerge@^4.2.2: 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" - resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" - integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== - dependencies: - kind-of "^5.0.2" - default-shell@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/default-shell/-/default-shell-1.0.1.tgz#752304bddc6174f49eb29cb988feea0b8813c8bc" @@ -6036,41 +5588,29 @@ defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, 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== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6139,16 +5679,16 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@3.5.0, diff@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - diff@5.0.0: 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@^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.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" @@ -6176,12 +5716,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@24.6.3: - version "24.6.3" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.3.tgz#508a9516e30b294d18ec466ce3f61b496aa40c0b" - integrity sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg== +dmg-builder@24.6.4: + version "24.6.4" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.4.tgz#e19b8305f7e1ea0b4faaa30382c81b9d6de39863" + integrity sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw== dependencies: - app-builder-lib "24.6.3" + app-builder-lib "24.6.4" builder-util "24.5.0" builder-util-runtime "9.2.1" fs-extra "^10.1.0" @@ -6279,6 +5819,11 @@ dotenv-expand@^5.1.0: resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== +dotenv-expand@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + dotenv@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" @@ -6329,15 +5874,15 @@ ejs@^3.1.7, ejs@^3.1.8: jake "^10.8.5" electron-builder@^24.6.3: - version "24.6.3" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.3.tgz#f4f69dd4fae9f80bc9c1ec74d6fe47565ec50cd5" - integrity sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw== + version "24.6.4" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.4.tgz#c51271e49b9a02c9a3ec444f866b6008c4d98a1d" + integrity sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA== dependencies: - app-builder-lib "24.6.3" + app-builder-lib "24.6.4" builder-util "24.5.0" builder-util-runtime "9.2.1" chalk "^4.1.2" - dmg-builder "24.6.3" + dmg-builder "24.6.4" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -6394,10 +5939,10 @@ electron-store@^8.0.0: conf "^10.2.0" type-fest "^2.17.0" -electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== +electron-to-chromium@^1.4.535: + version "1.4.548" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.548.tgz#e695d769e0e801fa6d438b63f6bc9b80372000d6" + integrity sha512-R77KD6mXv37DOyKLN/eW1rGS61N6yHOfapNSX9w+y9DdPG83l9Gkuv7qkCFZ4Ta4JPhrjgQfYbv4Y3TnM1Hi2Q== electron-updater@^4.6.5: version "4.6.5" @@ -6413,20 +5958,15 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -electron@^25.5.0: - version "25.8.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-25.8.0.tgz#60c84f1f256924ac5a0aff13276b901b0c43767a" - integrity sha512-T3kC1a/3ntSaYMCVVfUUc9v7myPzi6J2GP0Ad/CyfWKDPp054dGyKxb2EEjKnxQQ7wfjsT1JTEdBG04x6ekVBw== +electron@^26.2.4: + version "26.3.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-26.3.0.tgz#3267773d170310384db76819cf6375bd98b3cc76" + integrity sha512-7ZpvSHu+jmqialSvywTZnOQZZGLqlyj+yV5HGDrEzFnMiFaXBRpbByHgoUhaExJ/8t/0xKQjKlMRAY65w+zNZQ== dependencies: "@electron/get" "^2.0.0" "@types/node" "^18.11.18" extract-zip "^2.0.1" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -6478,9 +6018,9 @@ engine.io-parser@~5.2.1: integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== engine.io@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c" - integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.3.tgz#80b0692912cef3a417e1b7433301d6397bf0374b" + integrity sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -6516,11 +6056,6 @@ enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -ent@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== - entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" @@ -6565,23 +6100,18 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -error-symbol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/error-symbol/-/error-symbol-0.1.0.tgz#0a4dae37d600d15a29ba453d8ef920f1844333f6" - integrity sha512-VyjaKxUmeDX/m2lxm/aknsJ1GWDWUO2Ze2Ad8S1Pb9dykAm9TjSKp5CjrNyltYqZ5W/PO6TInAmO2/BfwMyT1g== - -es-abstract@^1.20.4, es-abstract@^1.22.1: - 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== +es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" + function.prototype.name "^1.1.6" get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" @@ -6597,37 +6127,32 @@ es-abstract@^1.20.4, es-abstract@^1.22.1: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" 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== + which-typed-array "^1.1.11" es-iterator-helpers@^1.0.12: - version "1.0.14" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365" - integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== dependencies: asynciterator.prototype "^1.0.0" call-bind "^1.0.2" - define-properties "^1.2.0" + define-properties "^1.2.1" es-abstract "^1.22.1" es-set-tostringtag "^2.0.1" function-bind "^1.1.1" @@ -6637,13 +6162,13 @@ es-iterator-helpers@^1.0.12: has-proto "^1.0.1" has-symbols "^1.0.3" internal-slot "^1.0.5" - iterator.prototype "^1.1.0" - safe-array-concat "^1.0.0" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" 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== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -6690,11 +6215,6 @@ escape-html@^1.0.3, escape-html@~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.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - 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" @@ -6705,6 +6225,11 @@ escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escodegen@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" @@ -6789,15 +6314,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.39.0: - version "8.48.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" - integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== + version "8.51.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3" + integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.48.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint/js" "8.51.0" + "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.12.4" @@ -6935,19 +6460,6 @@ execa@^0.5.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - 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" - execa@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" @@ -7008,19 +6520,6 @@ execa@^7.1.1: 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" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -7083,21 +6582,6 @@ ext-name@^5.0.0: ext-list "^2.0.0" sort-keys-length "^1.0.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -7112,20 +6596,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-zip@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" @@ -7142,13 +6612,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -"falsey@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/falsey/-/falsey-0.3.2.tgz#b21c90c5c34660fc192bf909575db95b6880d597" - integrity sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg== - dependencies: - kind-of "^5.0.2" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -7164,17 +6627,6 @@ fast-fifo@^1.1.0, fast-fifo@^1.2.0: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - 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-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" @@ -7316,16 +6768,6 @@ filenamify@^5.1.1: 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" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -7365,13 +6807,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@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" @@ -7380,13 +6815,20 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -7403,35 +6845,28 @@ fix-path@^3.0.0: shell-path "^2.1.0" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== 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== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== font-awesome@^4.7.0: version "4.7.0" @@ -7445,18 +6880,6 @@ for-each@^0.3.3: 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" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== - dependencies: - for-in "^1.0.1" - foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -7470,15 +6893,6 @@ form-data-encoder@^2.1.2: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -7510,13 +6924,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -7532,11 +6939,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== - fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -7602,11 +7004,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -7627,7 +7024,7 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -7695,20 +7092,15 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-func-name@^2.0.0, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-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" @@ -7720,14 +7112,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" -get-object@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/get-object/-/get-object-0.2.0.tgz#d92ff7d5190c64530cda0543dac63a3d47fe8c0c" - integrity sha512-7P6y6k6EzEFmO/XyUyFlXm1YLJy9xeA1x/grNV8276abX5GuwUtYgKFkRFkLixw4hf4Pz9q2vgv/8Ar42R0HuQ== - dependencies: - is-number "^2.0.2" - isobject "^0.2.0" - get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -7761,13 +7145,6 @@ get-stream@^2.2.0: object-assign "^4.0.1" pinkie-promise "^2.0.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.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" @@ -7788,11 +7165,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - 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" @@ -7845,7 +7217,7 @@ 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@5.1.2, 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.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -7864,18 +7236,6 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - 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.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" @@ -7901,17 +7261,17 @@ glob@7.2.0: path-is-absolute "^1.0.0" glob@^10.2.2, glob@^10.3.3: - version "10.3.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" - integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" - jackspeak "^2.0.3" + jackspeak "^2.3.5" 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: +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== @@ -7962,9 +7322,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -8010,10 +7370,10 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -google-protobuf@3.12.4: - version "3.12.4" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.4.tgz#fd89b7e5052cdb35a80f9b455612851d542a5c9f" - integrity sha512-ItTn8YepDQMHEMHloUPH+FDaTPiHTnbsMvP50aXfbI65IK3AA5+wXlHSygJH8xz+h1g4gu7V+CK5X1/SaGITsA== +google-protobuf@3.15.8: + version "3.15.8" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.8.tgz#5f3948905e4951c867d6bc143f385a80e2a39efe" + integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== google-protobuf@^3.20.1: version "3.21.2" @@ -8071,98 +7431,34 @@ graphemer@^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" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -grpc-tools@^1.9.0: +grpc-tools@^1.12.4: 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" -grpc_tools_node_protoc_ts@^4.1.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-4.1.5.tgz#ad540a51867ff407196538d2d6370b27d6d3cfc8" - integrity sha512-/TgYNCpaw9MtY5L4KFlobjdlC13G++llmaIjEAxKRzNrpS4ZHdX/ENujiJgqjBLqSEujRA/YEV/x9T/v4ltcMQ== +grpc_tools_node_protoc_ts@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz#9a6c1c2f41563a1ab259c0177496d7dfed30dbfe" + integrity sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww== dependencies: - google-protobuf "3.12.4" - handlebars "4.7.4" - handlebars-helpers "0.10.0" + google-protobuf "3.15.8" + handlebars "4.7.7" -gulp-header@^1.7.1: - version "1.8.12" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84" - integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ== - dependencies: - concat-with-sourcemaps "*" - lodash.template "^4.4.0" - through2 "^2.0.0" - -handlebars-helper-create-frame@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz#8aa51d10aeb6408fcc6605d40d77356288487a03" - integrity sha512-yR99Rh8JYcWSsARw/unaOUUICqG0M+SV3U4vBl3Psn78r0qXjU+cT9+IGXglNuuI3RfahvFDyEQ0l1KWthavRQ== - dependencies: - create-frame "^1.0.0" - isobject "^3.0.0" - -handlebars-helpers@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz#663d49e718928eafbead1473419ed7bc24bcd45a" - integrity sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg== - dependencies: - arr-flatten "^1.1.0" - array-sort "^0.1.4" - create-frame "^1.0.0" - define-property "^1.0.0" - "falsey" "^0.3.2" - for-in "^1.0.2" - for-own "^1.0.0" - get-object "^0.2.0" - get-value "^2.0.6" - handlebars "^4.0.11" - handlebars-helper-create-frame "^0.1.0" - handlebars-utils "^1.0.6" - has-value "^1.0.0" - helper-date "^1.0.1" - helper-markdown "^1.0.0" - helper-md "^0.2.2" - html-tag "^2.0.0" - is-even "^1.0.0" - is-glob "^4.0.0" - is-number "^4.0.0" - kind-of "^6.0.0" - lazy-cache "^2.0.2" - logging-helpers "^1.0.0" - micromatch "^3.1.4" - relative "^3.0.2" - striptags "^3.1.0" - to-gfm-code-block "^0.1.1" - year "^0.2.1" - -handlebars-utils@^1.0.2, handlebars-utils@^1.0.4, handlebars-utils@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/handlebars-utils/-/handlebars-utils-1.0.6.tgz#cb9db43362479054782d86ffe10f47abc76357f9" - integrity sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw== - dependencies: - kind-of "^6.0.0" - typeof-article "^0.1.1" - -handlebars@4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.4.tgz#902c579cc97b350bb4bc12e6cabd85b57dcd9975" - integrity sha512-Is8+SzHv8K9STNadlBVpVhxXrSXxVgTyIvhdg2Qjak1SfSZ7iEozLHdwiX1jJ9lLFkcFJxqGK5s/cI7ZX+qGkQ== +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" - yargs "^15.3.1" + wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" -handlebars@^4.0.11, handlebars@^4.7.7: +handlebars@^4.7.7: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== @@ -8206,7 +7502,7 @@ has-proto@^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.2, has-symbols@^1.0.3: +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== @@ -8223,43 +7519,10 @@ has-unicode@2.0.1, has-unicode@^2.0.0, has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hash.js@^1.1.7: version "1.1.7" @@ -8287,44 +7550,11 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" -helper-date@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/helper-date/-/helper-date-1.0.1.tgz#12fedea3ad8e44a7ca4c4efb0ff4104a5120cffb" - integrity sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w== - dependencies: - date.js "^0.3.1" - handlebars-utils "^1.0.4" - moment "^2.18.1" - -helper-markdown@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/helper-markdown/-/helper-markdown-1.0.0.tgz#ee7e9fc554675007d37eb90f7853b13ce74f3e10" - integrity sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA== - dependencies: - handlebars-utils "^1.0.2" - highlight.js "^9.12.0" - remarkable "^1.7.1" - -helper-md@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/helper-md/-/helper-md-0.2.2.tgz#c1f59d7e55bbae23362fd8a0e971607aec69d41f" - integrity sha512-49TaQzK+Ic7ZVTq4i1UZxRUJEmAilTk8hz7q4I0WNUaTclLR8ArJV5B3A1fe1xF2HtsDTr2gYKLaVTof/Lt84Q== - dependencies: - ent "^2.2.0" - extend-shallow "^2.0.1" - 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" - integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== - hoist-non-react-statics@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -8365,14 +7595,6 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" -html-tag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tag/-/html-tag-2.0.0.tgz#36c3bc8d816fd30b570d5764a497a641640c2fed" - integrity sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g== - dependencies: - is-self-closing "^1.0.1" - kind-of "^6.0.0" - 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" @@ -8551,7 +7773,7 @@ image-size@~0.5.0: 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.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -8590,11 +7812,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -info-symbol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/info-symbol/-/info-symbol-0.1.0.tgz#27841d72867ddb4242cd612d79c10633881c6a78" - integrity 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.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" @@ -8660,11 +7877,6 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -8675,11 +7887,6 @@ inversify@^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" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip-regex@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" @@ -8695,20 +7902,6 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - 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" @@ -8760,12 +7953,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.0, is-buffer@~2.0.3: +is-buffer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== @@ -8796,20 +7984,6 @@ is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-mo dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -8817,24 +7991,6 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -8845,25 +8001,6 @@ is-electron@^2.1.0, is-electron@^2.2.0: 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" - resolved "https://registry.yarnpkg.com/is-even/-/is-even-1.0.0.tgz#76b5055fbad8d294a86b6a949015e1c97b717c06" - integrity sha512-LEhnkAdJqic4Dbqn58A0y52IXoHWlsueqQkKfMfdEnIYG8A1sm/GHidKkS6yvXlMoRrkM34csHnXQtOqcb+Jzg== - dependencies: - is-odd "^0.1.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -8883,11 +8020,6 @@ is-fullwidth-code-point@^1.0.0: 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 sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -8946,25 +8078,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -8980,13 +8093,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-odd@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-0.1.2.tgz#bc573b5ce371ef2aad6e6f49799b72bef13978a7" - integrity sha512-Ri7C2K7o5IrUU9UEI8losXJCCD/UtsaIrkR5sxIcFg4xQ9cRJXlWA5DQvTE0yDc0krvSNLsRGXN11UPS6KyfBw== - dependencies: - is-number "^3.0.0" - is-online@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/is-online/-/is-online-10.0.0.tgz#5e02cee9f822fd9c19b060f0ecbdc798d37295a3" @@ -9017,7 +8123,7 @@ is-plain-obj@^4.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -9052,13 +8158,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-self-closing@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-self-closing/-/is-self-closing-1.0.1.tgz#5f406b527c7b12610176320338af0fa3896416e4" - integrity sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg== - dependencies: - self-closing-tags "^1.0.1" - is-set@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" @@ -9119,7 +8218,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -9156,11 +8255,6 @@ is-what@^3.14.1: resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -9168,16 +8262,16 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -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== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isbinaryfile@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" @@ -9193,37 +8287,26 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-0.2.0.tgz#a3432192f39b910b5f02cc989487836ec70aa85e" - integrity sha512-VaWq6XYAsbvM0wf4dyBO7WH9D7GosB7ZZlqrawI9BBiTMINBeCyqSKBa35m870MY3O4aM31pYyZi9DfGrYMJrQ== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -iterator.prototype@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.1.tgz#ab5b790e23ec00658f5974e032a2b05188bd3a5c" - integrity sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: - define-properties "^1.2.0" + define-properties "^1.2.1" get-intrinsic "^1.2.1" has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" -jackspeak@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.1.tgz#ce2effa4c458e053640e61938865a5b5fae98456" - integrity sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A== +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -9239,15 +8322,15 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -"jest-diff@>=29.4.3 < 30": - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.4.tgz#85aaa6c92a79ae8cd9a54ebae8d5b6d9a513314a" - integrity sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw== +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" diff-sequences "^29.6.3" jest-get-type "^29.6.3" - pretty-format "^29.6.3" + pretty-format "^29.7.0" jest-get-type@^29.6.3: version "29.6.3" @@ -9273,14 +8356,6 @@ js-cookie@^2.2.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -9475,32 +8550,13 @@ keytar@7.2.0: prebuild-install "^6.0.0" keyv@^4.0.0, keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0, kind-of@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -9510,32 +8566,18 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -lazy-cache@^2.0.1, lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - integrity sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA== - dependencies: - set-getter "^0.1.0" - lazy-val@^1.0.4, lazy-val@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - lerna@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.2.0.tgz#55ab3de42032168a75fc7a2ce184a8acb7efc5ea" - integrity sha512-E13iAY4Tdo+86m4ClAe0j0bP7f8QG2neJReglILPOe+gAOoX17TGqEWanmkDELlUXOrTTwnte0ewc6I6/NOqpg== + version "7.3.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.3.0.tgz#efecafbdce15694e2f6841256e073a3a2061053e" + integrity sha512-Dt8TH+J+c9+3MhTYcm5OxnNzXb87WG7GPNj3kidjYJjJY7KxIMDNU37qBTYRWA1h3wAeNKBplXVQYUPkGcYgkQ== dependencies: - "@lerna/child-process" "7.2.0" - "@lerna/create" "7.2.0" + "@lerna/child-process" "7.3.0" + "@lerna/create" "7.3.0" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -9572,7 +8614,7 @@ lerna@^7.1.4: libnpmpublish "7.3.0" load-json-file "6.2.0" lodash "^4.17.21" - make-dir "3.1.0" + make-dir "4.0.0" minimatch "3.0.5" multimatch "5.0.0" node-fetch "2.6.7" @@ -9820,11 +8862,6 @@ locate-path@^6.0.0: 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" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -9860,21 +8897,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.template@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -9885,21 +8907,6 @@ lodash@^4.17.15, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-ok@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/log-ok/-/log-ok-0.1.1.tgz#bea3dd36acd0b8a7240d78736b5b97c65444a334" - integrity sha512-cc8VrkS6C+9TFuYAwuHpshrcrGRAv7d0tUJ0GdM72ZBlKXtlgjUZF84O+OhQUdiVHoF7U/nVxwpjOdwUJ8d3Vg== - dependencies: - ansi-green "^0.1.1" - success-symbol "^0.1.0" - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -9918,27 +8925,6 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -log-utils@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/log-utils/-/log-utils-0.2.1.tgz#a4c217a0dd9a50515d9b920206091ab3d4e031cf" - integrity sha512-udyegKoMz9eGfpKAX//Khy7sVAZ8b1F7oLDnepZv/1/y8xTvsyPgqQrM94eG8V0vcc2BieYI2kVW4+aa6m+8Qw== - dependencies: - ansi-colors "^0.2.0" - error-symbol "^0.1.0" - info-symbol "^0.1.0" - log-ok "^0.1.1" - success-symbol "^0.1.0" - time-stamp "^1.0.1" - warning-symbol "^0.1.0" - -logging-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/logging-helpers/-/logging-helpers-1.0.0.tgz#b5a37b32ad53eb0137c58c7898a47b175ddb7c36" - integrity sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA== - dependencies: - isobject "^3.0.0" - log-utils "^0.2.1" - long@^5.0.0: version "5.2.3" resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" @@ -9951,7 +8937,7 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.1: +loupe@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== @@ -10021,12 +9007,12 @@ macaddress@^0.5.3: resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.5.3.tgz#2b9d6832be934cb775749f30f57d6537184a2bda" integrity sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg== -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== +make-dir@4.0.0, make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: - semver "^6.0.0" + semver "^7.5.3" make-dir@^1.0.0: version "1.3.0" @@ -10043,12 +9029,12 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== +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 "^7.5.3" + semver "^6.0.0" 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" @@ -10071,18 +9057,6 @@ make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, socks-proxy-agent "^7.0.0" ssri "^10.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" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -10098,13 +9072,6 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - markdown-it@^12.3.2: version "12.3.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" @@ -10181,15 +9148,6 @@ media-typer@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" - "memoize-one@>=3.1.1 <6": version "5.2.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" @@ -10438,25 +9396,6 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.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" @@ -10487,7 +9426,7 @@ mime@2.6.0, mime@^2.4.4, mime@^2.5.2: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -10537,14 +9476,7 @@ mini-css-extract-plugin@^2.6.1: minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimatch@3.0.5: version "3.0.5" @@ -10667,9 +9599,9 @@ minipass@^5.0.0: integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -10684,26 +9616,11 @@ mitt@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" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - "mkdirp@>=0.5 0", mkdirp@^0.5.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" @@ -10716,7 +9633,7 @@ 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: +mocha@^10.1.0, mocha@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== @@ -10743,36 +9660,6 @@ mocha@^10.1.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" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - mockdate@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" @@ -10783,7 +9670,7 @@ modify-values@^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.25.3: +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== @@ -10814,11 +9701,6 @@ ms@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: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -10885,9 +9767,9 @@ mute-stream@~1.0.0: integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nan@^2.14.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== nano@^9.0.5: version "9.0.5" @@ -10910,23 +9792,6 @@ nanoid@^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" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" @@ -10979,11 +9844,6 @@ nice-grpc-common@^2.0.2: 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" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -10993,9 +9853,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-abi@*, node-abi@^3.0.0: - version "3.47.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.47.0.tgz#6cbfa2916805ae25c2b7156ca640131632eb05e8" - integrity sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A== + version "3.48.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.48.0.tgz#122d132ae1ac097b0d711144560b17922de026ab" + integrity sha512-uWR/uwQyVV2iN5+Wkf1/oQxOR9YjU7gBclJLg2qK7GDvVohcnY6LaBXKV89N79EQFyN4/e43O32yQYE5QdFYTA== dependencies: semver "^7.3.5" @@ -11033,14 +9893,6 @@ node-domexception@^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" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -11203,9 +10055,9 @@ npm-bundled@^3.0.0: npm-normalize-package-bin "^3.0.0" npm-install-checks@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.2.0.tgz#fae55b9967b03ac309695ec96629492d5cedf371" - integrity sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g== + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: semver "^7.1.1" @@ -11353,12 +10205,12 @@ nwsapi@^2.2.4: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@16.7.4, "nx@>=16.5.1 < 17": - version "16.7.4" - resolved "https://registry.yarnpkg.com/nx/-/nx-16.7.4.tgz#355cfe9187822fa29676b88da1673a09acab990e" - integrity sha512-L0Cbikk5kO+IBH0UQ2BOAut5ndeHXBlACKzjOPOCluY8WYh2sxWYt9/N/juFBN3XXRX7ionTr1PhWUzNE0Mzqw== +nx@16.10.0, "nx@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.10.0.tgz#b070461f7de0a3d7988bd78558ea84cda3543ace" + integrity sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg== dependencies: - "@nrwl/tao" "16.7.4" + "@nrwl/tao" "16.10.0" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" @@ -11367,15 +10219,16 @@ nx@16.7.4, "nx@>=16.5.1 < 17": chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" - cliui "^7.0.2" + cliui "^8.0.1" dotenv "~16.3.1" + dotenv-expand "~10.0.0" enquirer "~2.3.6" - fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" + jest-diff "^29.4.1" js-yaml "4.1.0" jsonc-parser "3.2.0" lines-and-columns "~2.0.3" @@ -11394,58 +10247,32 @@ nx@16.7.4, "nx@>=16.5.1 < 17": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "16.7.4" - "@nx/nx-darwin-x64" "16.7.4" - "@nx/nx-freebsd-x64" "16.7.4" - "@nx/nx-linux-arm-gnueabihf" "16.7.4" - "@nx/nx-linux-arm64-gnu" "16.7.4" - "@nx/nx-linux-arm64-musl" "16.7.4" - "@nx/nx-linux-x64-gnu" "16.7.4" - "@nx/nx-linux-x64-musl" "16.7.4" - "@nx/nx-win32-arm64-msvc" "16.7.4" - "@nx/nx-win32-x64-msvc" "16.7.4" + "@nx/nx-darwin-arm64" "16.10.0" + "@nx/nx-darwin-x64" "16.10.0" + "@nx/nx-freebsd-x64" "16.10.0" + "@nx/nx-linux-arm-gnueabihf" "16.10.0" + "@nx/nx-linux-arm64-gnu" "16.10.0" + "@nx/nx-linux-arm64-musl" "16.10.0" + "@nx/nx-linux-x64-gnu" "16.10.0" + "@nx/nx-linux-x64-musl" "16.10.0" + "@nx/nx-win32-arm64-msvc" "16.10.0" + "@nx/nx-win32-x64-msvc" "16.10.0" object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - 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: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -11474,17 +10301,6 @@ object.fromentries@^2.0.6: define-properties "^1.2.0" es-abstract "^1.22.1" -object.getownpropertydescriptors@^2.0.3: - version "2.1.7" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" - integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== - dependencies: - array.prototype.reduce "^1.0.6" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - safe-array-concat "^1.0.0" - object.hasown@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" @@ -11493,13 +10309,6 @@ object.hasown@^1.1.2: define-properties "^1.2.0" es-abstract "^1.22.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - object.values@^1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" @@ -11578,15 +10387,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -11615,11 +10415,6 @@ p-debounce@^2.1.0: resolved "https://registry.yarnpkg.com/p-debounce/-/p-debounce-2.1.0.tgz#e79f70c6e325cbb9bddbcbec0b81025084671ad3" integrity sha512-M9bMt62TTnozdZhqFgs+V7XD2MnuKCaz+7fZdlu2/T7xruI3uIE5CicQ0vx1hV7HIUYF0jF+4/R1AgfOkl74Qw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - p-event@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" @@ -11644,11 +10439,6 @@ p-finally@^2.0.0: 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" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -11829,7 +10619,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11873,11 +10663,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -11906,7 +10691,7 @@ 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@^2.0.0, path-key@^2.0.1: +path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== @@ -12062,11 +10847,6 @@ plist@^3.0.4, plist@^3.0.5: base64-js "^1.5.1" xmlbuilder "^15.1.1" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -12109,9 +10889,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.21: - version "8.4.29" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" - integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -12174,10 +10954,10 @@ prettier@^2.3.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-format@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" - integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" @@ -12238,9 +11018,9 @@ 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.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" + integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== protobufjs@^7.2.3, protobufjs@^7.2.4: version "7.2.5" @@ -12534,9 +11314,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.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== + version "5.7.7" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.7.tgz#dbade9dbf711ef2a181970c10f8ab319ac37fbd0" + integrity sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -12704,13 +11484,6 @@ readable-web-to-node-stream@^3.0.2: dependencies: readable-stream "^3.6.0" -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -12728,13 +11501,6 @@ recast@^0.11.17: private "~0.1.5" source-map "~0.5.0" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - rechoir@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -12755,7 +11521,7 @@ 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== -reflect.getprototypeof@^1.0.3: +reflect.getprototypeof@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== @@ -12768,9 +11534,9 @@ reflect.getprototypeof@^1.0.3: which-builtin-type "^1.1.3" 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== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -12791,22 +11557,14 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.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== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpu-core@^5.3.1: version "5.3.2" @@ -12827,13 +11585,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -relative@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/relative/-/relative-3.0.2.tgz#0dcd8ec54a5d35a3c15e104503d65375b5a5367f" - integrity sha512-Q5W2qeYtY9GbiR8z1yHNZ1DGhyjb4AnLEjt8iE6XfcC1QIu+FAtj3HQaO0wH28H1mX6cqNLvAqWhP402dxJGyA== - dependencies: - isobject "^2.0.0" - remark-parse@^10.0.0: version "10.0.2" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" @@ -12853,29 +11604,11 @@ remark-rehype@^10.0.0: mdast-util-to-hast "^12.1.0" unified "^10.0.0" -remarkable@^1.6.2, remarkable@^1.7.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00" - integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg== - dependencies: - argparse "^1.0.10" - autolinker "~0.28.0" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity 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" @@ -12891,11 +11624,6 @@ require-from-string@^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 sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - 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" @@ -12935,15 +11663,10 @@ resolve-package-path@^4.0.3: dependencies: path-root "^0.1.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - 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.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.9.0: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" @@ -12980,11 +11703,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -13076,13 +11794,13 @@ sade@^1.7.3: dependencies: mri "^1.1.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== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -13105,13 +11823,6 @@ safe-regex-test@^1.0.0: 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" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - 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" @@ -13130,9 +11841,9 @@ sanitize-filename@^1.6.3: truncate-utf8-bytes "^1.0.0" sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== saxes@^6.0.0: version "6.0.0" @@ -13183,17 +11894,12 @@ seek-bzip@^1.0.5, seek-bzip@^1.0.6: dependencies: commander "^2.8.1" -self-closing-tags@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/self-closing-tags/-/self-closing-tags-1.0.1.tgz#6c5fa497994bb826b484216916371accee490a5d" - integrity sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA== - semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity 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: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -13288,22 +11994,14 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-getter@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.1.tgz#a3110e1b461d31a9cfc8c5c9ee2e9737ad447102" - integrity sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw== - dependencies: - to-object-path "^0.3.0" - -set-value@^2.0.0, set-value@^2.0.1: +set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" @@ -13322,13 +12020,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -13336,11 +12027,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -13362,15 +12048,6 @@ shell-path@^2.1.0: dependencies: shell-env "^0.3.0" -shelljs@^0.8.3: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - 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" @@ -13468,36 +12145,6 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - socket.io-adapter@~2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" @@ -13602,17 +12249,6 @@ source-map-loader@^2.0.1: iconv-lite "^0.6.2" source-map-js "^0.6.2" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@^0.5.19, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -13621,12 +12257,7 @@ source-map-support@^0.5.19, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: +source-map@^0.5.7, source-map@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== @@ -13663,22 +12294,15 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - 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== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -13701,9 +12325,9 @@ split@^1.0.1: through "2" sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" @@ -13729,14 +12353,6 @@ stat-mode@^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" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -13808,23 +12424,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^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" @@ -13835,9 +12434,9 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string.prototype.matchall@^4.0.8: - version "4.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" - integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" @@ -13846,34 +12445,35 @@ string.prototype.matchall@^4.0.8: has-symbols "^1.0.3" internal-slot "^1.0.5" regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" -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== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -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== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -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== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -13912,20 +12512,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: 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 sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -13980,16 +12566,16 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - 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-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + strip-outer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -14002,11 +12588,6 @@ strip-outer@^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: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -14059,11 +12640,6 @@ stylis@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" - resolved "https://registry.yarnpkg.com/success-symbol/-/success-symbol-0.1.0.tgz#24022e486f3bf1cdca094283b769c472d3b72897" - integrity sha512-7S6uOTxPklNGxOSbDIg4KlVLBQw1UiGVyfCUYgYxrZUKRblUkmGj7r8xlfQoFudvqLv6Ap5gd76/IIFfI9JG2A== - sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" @@ -14088,13 +12664,6 @@ superagent@^7.1.5: readable-stream "^3.6.0" semver "^7.3.7" -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - supports-color@8.1.1, supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -14197,9 +12766,9 @@ tar@6.1.11: yallist "^4.0.0" tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, 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== + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -14246,9 +12815,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.16.8: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== + version "5.21.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" + integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -14278,11 +12847,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -time-stamp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== - tinycolor2@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" @@ -14326,26 +12890,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-gfm-code-block@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz#25d045a5fae553189e9637b590900da732d8aa82" - integrity sha512-LQRZWyn8d5amUKnfR9A9Uu7x9ss7Re8peuWR2gkh1E+ildOfv2aF26JpuDg8JtvCduu5+hOrMIH+XstZtnagqg== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -14353,16 +12897,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -14517,7 +13051,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@^4.0.0, 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== @@ -14614,13 +13148,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typeof-article@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/typeof-article/-/typeof-article-0.1.1.tgz#9f07e733c3fbb646ffa9e61c08debacd460e06af" - integrity sha512-Vn42zdX3FhmUrzEmitX3iYyLb+Umwpmv8fkZRIknYh84lmdrwqZA5xYaoKiIj2Rc5i/5wcDrpUmZcbk1U51vTw== - dependencies: - kind-of "^3.1.0" - "typescript@>=3 < 6": version "5.2.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" @@ -14673,6 +13200,11 @@ unbzip2-stream@1.4.3, unbzip2-stream@^1.0.9, unbzip2-stream@^1.4.3: buffer "^5.2.1" through "^2.3.8" +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -14714,16 +13246,6 @@ unified@^10.0.0: trough "^2.0.0" vfile "^5.0.0" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -14806,14 +13328,6 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - unzipper@^0.10.11: version "0.10.14" resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.14.tgz#d2b33c977714da0fbc0f82774ad35470a7c962b1" @@ -14850,10 +13364,10 @@ upath@2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -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== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -14879,11 +13393,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-join@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" @@ -14902,11 +13411,6 @@ use-isomorphic-layout-effect@^1.1.2: resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -14940,11 +13444,6 @@ utils-merge@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: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" @@ -14956,9 +13455,9 @@ uuid@^8.0.0, uuid@^8.3.2: 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== + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== uvu@^0.5.0: version "0.5.6" @@ -15072,28 +13571,28 @@ vscode-arduino-api@^0.1.2: 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-jsonrpc@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz#f43dfa35fb51e763d17cd94dcca0c9458f35abf9" + integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== vscode-languageserver-protocol@^3.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== + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz#864a8b8f390835572f4e13bd9f8313d0e3ac4bea" + integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== dependencies: - vscode-jsonrpc "8.1.0" - vscode-languageserver-types "3.17.3" + vscode-jsonrpc "8.2.0" + vscode-languageserver-types "3.17.5" vscode-languageserver-textdocument@^1.0.1: - version "1.0.8" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0" - integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== + version "1.0.11" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" + integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== -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-languageserver-types@3.17.5: + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== vscode-oniguruma@1.6.1: version "1.6.1" @@ -15117,11 +13616,6 @@ w3c-xmlserializer@^4.0.0: dependencies: 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.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -15291,7 +13785,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -15302,7 +13796,7 @@ which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2, gopd "^1.0.1" has-tostringtag "^1.0.0" -which@1.3.1, which@^1.2.9: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -15323,13 +13817,6 @@ which@^3.0.0: 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" - wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -15374,23 +13861,6 @@ workerpool@6.2.1: 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" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -15475,9 +13945,9 @@ ws@^7.1.2: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 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== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== xdg-basedir@^4.0.0: version "4.0.0" @@ -15539,11 +14009,6 @@ xterm@^4.16.0: resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -15574,14 +14039,6 @@ yaml@^1.10.0, yaml@^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@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -15605,22 +14062,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@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha512-CswCfdOgCr4MMsT1GzbEJ7Z2uYudWyrGX8Bgh/0eyCzj/DXWdKq6a/ADufkzI1WAOIW6jYaXJvRyLhDO0kfqBw== - dependencies: - camelcase "^4.1.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -15631,22 +14072,6 @@ yargs-unparser@2.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" - 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@16.2.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -15660,24 +14085,6 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^11.1.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -15716,11 +14123,6 @@ yauzl@^2.10.0, yauzl@^2.4.2: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -year@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/year/-/year-0.2.1.tgz#4083ae520a318b23ec86037f3000cb892bdf9bb0" - integrity sha512-9GnJUZ0QM4OgXuOzsKNzTJ5EOkums1Xc+3YQXp+Q+UxFjf7zLucp9dQ8QMIft0Szs1E1hUiXFim1OYfEKFq97w== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From a110c2b1f2b33a2db8df3af496c117f32196957d Mon Sep 17 00:00:00 2001 From: Lukas <142339568+lukasb1b@users.noreply.github.com> Date: Sun, 15 Oct 2023 09:17:28 +0200 Subject: [PATCH 265/384] adding a hyperlink to the README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4297eea3d..b0ae76131 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Arduino IDE](https://github.com/arduino/arduino-ide/workflows/Arduino%20IDE/badge.svg)](https://github.com/arduino/arduino-ide/actions?query=workflow%3A%22Arduino+IDE%22) -This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the repository of the 1.x version at https://github.com/arduino/Arduino. +This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the (repository of the 1.x version)[https://github.com/arduino/Arduino]. The Arduino IDE 2.x is a major rewrite, sharing no code with the IDE 1.x. It is based on the [Theia IDE](https://theia-ide.org/) framework and built with [Electron](https://www.electronjs.org/). The backend operations such as compilation and uploading are offloaded to an [arduino-cli](https://github.com/arduino/arduino-cli) instance running in daemon mode. This new IDE was developed with the goal of preserving the same interface and user experience of the previous major version in order to provide a frictionless upgrade. From ce01351bfee5b5f67e5cb83f8f2a03e69879e9a6 Mon Sep 17 00:00:00 2001 From: Lukas <142339568+lukasb1b@users.noreply.github.com> Date: Mon, 16 Oct 2023 10:04:58 +0200 Subject: [PATCH 266/384] Update README.md Co-authored-by: per1234 <accounts@perglass.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0ae76131..68d635a94 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Arduino IDE](https://github.com/arduino/arduino-ide/workflows/Arduino%20IDE/badge.svg)](https://github.com/arduino/arduino-ide/actions?query=workflow%3A%22Arduino+IDE%22) -This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the (repository of the 1.x version)[https://github.com/arduino/Arduino]. +This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the [repository of the 1.x version](https://github.com/arduino/Arduino). The Arduino IDE 2.x is a major rewrite, sharing no code with the IDE 1.x. It is based on the [Theia IDE](https://theia-ide.org/) framework and built with [Electron](https://www.electronjs.org/). The backend operations such as compilation and uploading are offloaded to an [arduino-cli](https://github.com/arduino/arduino-cli) instance running in daemon mode. This new IDE was developed with the goal of preserving the same interface and user experience of the previous major version in order to provide a frictionless upgrade. From e5ef564817e6679ecc7be92b3d70b204b7b9c532 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 18 Oct 2023 13:39:23 -0700 Subject: [PATCH 267/384] Correct conditional logic for publishing steps of build workflow The "Arduino IDE" GitHub Actions workflow is used to generate several distinct types of builds: - Tester builds of commits - Nightly builds - Release builds Different actions must be performed depending on which type of build is being produced. The workflow uses dedicated jobs for publishing the nightly builds and for publishing the release builds. Those jobs are configured to run only when certain criteria are met. One such criteria is that the merge-channel-files job ran as expected. There are four possible result types of a job, which should be handled as follows: | Result | Run dependent job? | | -------- | ------------------ | | success | Yes | | failure | No | | canceled | No | | skipped | Yes | GitHub Actions automatically takes the desired action regarding whether the dependent job should run for the first three result types, but that is not the case for the "skipped" result. The merge-channel-files job dependency is skipped when a channel file merge is not needed and so this is not cause to cancel the build publishing. The only way to make a dependent job run when the dependency was skipped is to add the `always()` expression to the job conditional. This goes too far in the other direction by causing the job to run even when the dependency failed or was canceled. So it is necessary to also add logic for each of the dependency job result types to the conditional, which makes it quite complex when combined with the logic for the other criteria of the job. In order to reduce the amount of complexity of the conditionals of the dependent jobs, a job was interposed in the dependency chain, which was intended to act simply as a container for the logic about the merge-channel-files job result. Unfortunately it turns out that even if the direct dependency job's result was success, if any ancestor in the dependency chain was skipped, GitHub Actions still skips all dependent jobs without an `always()` expression in their conditional, meaning the intermediate job was pointless. This caused the build publishing jobs to be skipped under the conditions where they should have ran. The pointless intermediate job is hereby removed, an `always()` expression added to the conditionals of the dependent jobs, and the full logic for how to handle each dependent job result type added there as well. --- .github/workflows/build.yml | 39 +++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 888298258..c23212fde 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -452,24 +452,6 @@ jobs: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.CHANNEL_FILES_PATH }} - # This job serves only as a container for the logic necessary to allow dependent jobs to run if the - # merge-channel-files job was skipped. - merge-channel-files-complete: - needs: - - merge-channel-files - if: > - always() && - ( - needs.merge-channel-files.result == 'skipped' || - needs.merge-channel-files.result == 'success' - ) - runs-on: ubuntu-latest - permissions: {} - steps: - # GitHub Actions requires every job to have >=1 step. - - name: Dummy step - run: '' - artifacts: name: ${{ matrix.artifact.name }} artifact needs: @@ -546,9 +528,16 @@ jobs: publish: needs: - build-type-determination - - merge-channel-files-complete + - merge-channel-files - changelog if: > + always() && + needs.build-type-determination.result == 'success' && + ( + needs.merge-channel-files.result == 'skipped' || + needs.merge-channel-files.result == 'success' + ) && + needs.changelog.result == 'success' && needs.build-type-determination.outputs.publish-to-s3 == 'true' && needs.build-type-determination.outputs.is-nightly == 'true' runs-on: ubuntu-latest @@ -572,9 +561,17 @@ jobs: release: needs: - build-type-determination - - merge-channel-files-complete + - merge-channel-files - changelog - if: needs.build-type-determination.outputs.is-release == 'true' + if: > + always() && + needs.build-type-determination.result == 'success' && + ( + needs.merge-channel-files.result == 'skipped' || + needs.merge-channel-files.result == 'success' + ) && + needs.changelog.result == 'success' && + needs.build-type-determination.outputs.is-release == 'true' runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] From d19778d0fb99323c0e9cc70ebc0b8b8ed67ae856 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 18 Oct 2023 14:20:13 -0700 Subject: [PATCH 268/384] Remove obviated build workflow step for removing Linux channel file In addition to the builds, when a nightly or production release is published, a "channel update info file" is also uploaded to Amazon S3 by the "Arduino IDE" GitHub Actions workflow. The IDE checks the channel file on the server to get information about available updates. Previously the Linux production release builds were being remade manually due to the ones produced by GitHub Actions not being compatible with older distro versions due to a dynamically linked dependency. For this reason, a step was temporarily added to the workflow to cause it to not upload the Linux channel file in order to avoid Linux users from receiving an update offer before the limited compatibility automated build had been replaced with the manually produced build. The automated build system has been adjusted to produce Linux builds with the intended range of compatibility, but the step that deleted the channel file was not removed at that time. The obviated step is hereby removed in order to allow complete releases to be published by the workflow. --- .github/workflows/build.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c23212fde..18266bbd2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -595,13 +595,6 @@ jobs: file_glob: true body: ${{ needs.changelog.outputs.BODY }} - # Temporary measure to prevent release update offers before the manually produced builds are uploaded. - # The step must be removed once fully automated builds are regained. - - name: Remove "channel update info files" related to manual builds - run: | - # See: https://github.com/arduino/arduino-ide/issues/2018 - rm "${{ env.JOB_TRANSFER_ARTIFACT }}/stable-linux.yml" - - name: Publish Release [S3] if: needs.build-type-determination.outputs.publish-to-s3 == 'true' uses: docker://plugins/s3 From 7e8f723df340a86373ed93189a3b871bf484ea19 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 18 Oct 2023 14:35:52 -0700 Subject: [PATCH 269/384] Pin Python version at 3.11 in build workflow Python 3.12.x is incompatible with the current version of node-gyp (9.4.0). For this reason, it is necessary to configure the "GitHub Actions" workflow to use the compatible Python 3.11.x until the next release of node-gyp (which should contain a fix for the breakage) is made. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 18266bbd2..206b18790 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -304,7 +304,7 @@ jobs: if: fromJSON(matrix.config.container).image == null uses: actions/setup-python@v4 with: - python-version: '3.x' + python-version: '3.11.x' - name: Install Go uses: actions/setup-go@v4 From 69b73657b61af3478e3225c4146760d041ff883b Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 18 Oct 2023 14:56:08 -0700 Subject: [PATCH 270/384] Simplify expression in container conditional steps of build workflow The "Arduino IDE" GitHub Actions workflow uses a Docker container for the build job of certain target, while running others directly in the runner environment. Due to differences between these two environments, some steps must run only when a container is used by the job, and others only when the job is running in the runner environment. This is done by a conditional on the job matrix data regarding the container. The container value is set to null for the jobs that run in the runner environment, while containing a full container configuration mapping for the jobs that run in a container. Previously the conditional unnecessarily used the value of the image key of the container object specifically. The comparison can be done against the container value itself. Doing this will make it a little easier to understand the workflow code, since the conditional more clearly reflects the matrix (where `container` is set to `null` instead of `container.image`). --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 206b18790..c499f9584 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -284,16 +284,16 @@ jobs: steps: - name: Checkout - if: fromJSON(matrix.config.container).image == null + if: fromJSON(matrix.config.container) == null uses: actions/checkout@v4 - name: Checkout # actions/checkout@v4 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container).image != null + if: fromJSON(matrix.config.container) != null uses: actions/checkout@v3 - name: Install Node.js - if: fromJSON(matrix.config.container).image == null + if: fromJSON(matrix.config.container) == null uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VERSION }} @@ -301,7 +301,7 @@ jobs: cache: 'yarn' - name: Install Python 3.x - if: fromJSON(matrix.config.container).image == null + if: fromJSON(matrix.config.container) == null uses: actions/setup-python@v4 with: python-version: '3.11.x' From 8687e2e044199e5e5b7a4eb9cd4d9318808e1fdf Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 13 Oct 2023 09:29:52 +0200 Subject: [PATCH 271/384] chore(doc): update main screenshot in the readme Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- static/screenshot.png | Bin 673358 -> 940628 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/screenshot.png b/static/screenshot.png index 254f4373fc68716902aba2ea1a2fe6a766b27095..a0c93a815cee5d31ec8d116251564a0cd97347aa 100644 GIT binary patch literal 940628 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ⅇlDK1H$L}Lu%bj?sp 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 pMx49Nj^y2YgE@>+4Ctw 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�wy5co`~q!$vu0+F)9;O4TycX%M;l1 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�H+yI#-O842AB#_K&GOs! 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 literal 673358 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�!>|6dTKsg#H) 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�wX(1HZy7{wKsEw}z` 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%0D{o8tj5k0WT?0FkXp0N(EacaA);#8ViEU86Dxz~- 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%0D;$y&<QGgLALY1coyyF2mWMatkG;0UOKUblU*z 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%0DF^aa22|%NE^i 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⁢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 v(KH<K5_3` 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 j|(x(n70nx7G zR^M-}qmpvFqL#|1TB=#E#CBXrI2^O95hCo<uqEnOo6{=#+xb8N+tM!^TLrM}9sCj* zqjD{Mf8D4c6KD;2iZCf|RB^9-rWjm_1osO2UV6PMWz|q%BIPQ0=cM@UyZ<oO`}<?S zd@A|(qGu71@K*hym50D}e`#Qk%2Im*TfvvKs8`moAN_D-jIi%aRlIdRs~gvvzZx)V zZ+fVPJYSGkF{(LBdg=xBXTN3*wDA{;ZW!Q=Dyk1{t&lYfvwC{hUr^&Hu=fk+%g!;9 zLcRB|#{437`2O_$Il`x}SHdKJH(uN(zQ+m?<K4@XmlxaFZ{;*NsxgB8T+#^J)+QN0 z+W{0wiqlRb|EP^E*{f!n`wcF=rlkeMq1z-EGyGP%?xFiwTR`2A9%(kb=7j5w+FFcm zTg(Y94L<zOGP{2p{kDhApPUxbKw$GHE$A-Bw4>t2(;q*`mhZB<Mw^Tq-FKNAC+}V~ zDAGE^!07o)-(sh&t`@7u3;O-+iO)UagC9Kxe{ojhn%j2#WG~cC!aXBiGB)iBLDel< zRU%n9a`ofu^Y6y^%k!EW;!jV=sCqYPg}Ga)p8n;&_wz2vK&g?xxrIYY+pnC?J8v1h zaSRIEkltIqIal^tUovX=Zg<vQY4tU9JAe3^JFp+L$hIw9;|_n`J!8q*ODBkN3?KWz zPF2C8w`-_+IcnwjWa{WT-O2PHGaLVN5`>e4^Fu40b)j(nkFM`k)$m0_@o>es`)bNN z9N;5~V!SW&N*7L?w+bjxGv(AI_y<4k*A5jdR5%m<Xo&4=k*E0Vig?dJ>91GiV3DR) z6$gAP5t&y)8#{n8<%GfA(e9_V%^Xx&Rru3t`d7$lf-S_*vY7+S#w(TJkqh^=|5)Vx zY77&oL9VZ>fbtB6v;1Te&6-xPn%B%{#I`9Y!@^GtN^7Far%ZRPsTB11oE20|aY>r& zw+wRm1m^-Y^05k7?BM^Or&iM0K5)hJLvBR(MawIA{NT?%IO}^?#$qf*@?CU_%<Oqk z7G?kZRweU>ABk8Bg!fYp?(yx1AN#;nqqe>-EZWo$xE%rleuCt5usU&epfs(lgtf;@ znb?u-LU(cy3WcZ~uw`IUcYA5>^S{eEzs(UYNE<!=<?hb!^X=zzeu84`+f#%o&`r_| zI(^)Io($+Q)U^7(BA}1YcbB2|Mplp>+{@!W-rc1LL(cO2f@J+?Z{bXXi@))m28U)M zD*Z5O?AFBhlHghL<(j#AU)o4%5(svUxy|L|KMef;{#b=pA3%a%V>K1&$9>vBE**2O zVaN>NPD_l=u!<Y4{gTDX6Ytx>vpo&1iU8wni8Bq+4^BhN_#3=%c~b3-$>Wyv<PLW% zf4KtoeL^LLSQ*_|_miq-ld8G>*<iPrhzNB>*XGZ6F2kmGrEA=z+mO+Y&R_FX8=FX7 z1tW^eFU3^-)nlfsV>fmiN=lYHwaHG|pPjZ1LHaixUIe5Z+nOb(r7;dF?LLzHa!u`H zC&?;O+12HK=rm+V$xm50AlZNYTJG2F|NNn)?>B$Sa4t22sMbbA;(=;D9sSDgY+0t7 zFAjVTtaz#2HGVdKYU##i%TSU1|7ZcUPp7KIZS}RDXj86*<o5TQgoaGAhMKIMBNfqk z<m%|=ZRXqqLB~*xq+WFk_He80tM&<g+iBScc@?py?-M38zlou)wu+TnD|+3pAb)w} z8ndOr6Vsg?ZG>KlS6}0_+kce|40*KM&3k9IT3+ncM<3kG>vzC|0~VVuhtC(O)tjgN z0Hy?fPKQ;+K30~>Uh9kszoj!&{nPxRewx3N>i^d-;mGagx`E-tWijNM0Pb6^@9LKy zrSZ#0yo5i9UD&ePsHwJ!e;136V45w0iam#26Ig3SP)`e5(78n0U1!|_GQxZ9(n)Xg z^~)H&b&Gxjk~M|h<+rWfw;ITrcF8i3{PCjqPgU&AVT-OCsjG!%!H9J~I5K9<x4k#} zo}TFi6@p8L+eAaB+Q;h&L)GR}4+iLH?fjUS;Y_tJ68S^)vi8--zqBa^%)h$dB7V|p zmw$`i?d{DeGd>4`#pJ;;nWoz{PB;y9ZHwX92sJ(>?cngHD>RcU%x&pMp^)LErXHg5 z{&eJQk~XNpBI>@&yz4xL)cGy(yfqA4RB7$SrRh{58&`eW7Gu{R-TS|}Oz&Scm=6*r zuGWn6jr=~&;<CIhMj=G#wpsa^f7MQ($L%uQU}i*vFI{mDtzD~K5tSouwq-k(bzHs$ z-9ZNimsG%|#f;&)`Kj+^wDmn9P@H<br$K_xhFsj%;6~!(s>O>1=*=<m%XMiguf=ll z1U1`auyYDP2C%i2c`{*-ZJ4?<&9+O*>Xqj?rogW1GqJz|ysTqaYPv?~xGPah-7CuY z#QVN&_O0H({AL9@<f;pLE9=$^&;bKAm1>$Znxn2{T>Rc>pcFkKYu+RcD#vlH>t}+} z0TX1osu4-rP2_WmOftEnk5_A@?z`wB9=j>lLwB`(e63%~9Zf5w{_0c{+PFHkF~$*d zfA!x>#?6B#CW|-KubSpJ^*(=C8@k+3DQJ>R|EAscuiI%@E$2Ny^)fH&Frd>};o*ZD zL&lpU+7vsTk?i#kPV>i$T;o|ooeU9mz0=W@@`*nH?f;?*1*YQ?Xmg5QmmsSpE6;*L zb4`S|{Zb84%oY{!^800AHL8z%+BUI(jl3yMG4JDd)C~c-JyJzhd88)c%J-)6t;pQ| z94bH-1l-bH2#@yOmSgH=%??D{p~39M61@gN;PlCkMQ5DF%x6D%LdOArD@n^iGU!hU z{=jYVI^gZRPB@YAn|@1y;!*IPY|yS<w|8o;`&heGu@_ryms19l)vR|o=!SC%FJ)1& z!Kzo@2d~gt{QOFCr!=E7tDkf^jZUNxu<k-b7f=()mcE&aiFr8^mE8%y07o3xGJ}ZO z|M$Q}Qfs?CbkQeZAhIy4UdYCU{}@6YLE*DRtrpx*-IqW*LBm0nFzT%cbHSuQavvf_ z*n(#Jj)jeQJQd0Lb#uzmkWZ?@7tWE-!OU+CnEovxogcNayDTBHc4oQ0D-p{(TU*#P z(ATO}zP8qtWg9(y!)3ovT`xV_Lif6?jkol!2Iij*hbi#t0Pb+@Tn5<vrq3MrNukw; zVBA+a;WdBq4)t=*I{I7Y;M8a&X)38~w6XrjE4&0GwqoR$!rvq`)pu?5;~FZgHdoyo zItmb*e5p=~1CMmK)$>9hHwk2UCC4?g+TbBdxgYx$#+XJ0e?nMCS$hW$^)oVX=roXV zZ`-W&ha|gX^}rDGoDmPV#k4dvZbjnzE~JSmPpP292^y8j)uCw3?7slLDx#`F9O5(0 zU<NH3(l!c`uBo@<4w*K<Hmt<F*&vmd1lcvs>M30%vN!syVfE_i+8l5^qdAlGq$xKI z)4gry?9Vn-p1}n$kz8IiNU#kF_McA7t08g4cfnOR1B!wPOA{5M8&z}TcaabFhzf+a z)x0i>G&et&ro+^3-mF~@P0so6PWY_Eb|RI&>ao7o0QIQpOKvf?*K<PNY?Z95%y-UN z!cBz1+ELXLmkmSSX0%;iwx_NO$%|kf{MptLbA|R+#Cvv+hfSC|P4mEV$4)LO_?P#z zVRR)|_?@B6lbRx{4Xh^@{zTCO8EgKjEk9DQxU<&a%6M{+b%W{_-RxF%gP;|YVePf{ zB~bz_%V|Yr5En)1;asmW9VWhUy3=Tgd(Rg1dr(=;)$A}frt254Evyk&*0-D3zf&9R zEM#xuv-Bp)=QK2vxqb6i3o>O({_(1jXSrX&!sBP5PO@GxBZ&b^L(T^A>ZnWHp6)J1 zmtju>q|Yc<*}(uNoXuV9FGGYR*4Y2WWjZ<QL3zxnd(@hyrQTPGDic2(CxpERoi43O zB!0m=c&_v3GX3y~D_oLU(~#y`uX983;wQm?CGrE>`jf5`x(p)hfoJ(OZ44buC*h&2 zBQ)_yxnP?Ow5xN*I0H&i7-15w7L|}?upte-7PM*Cs!j&R9BK1Iv1mCOd;9}uW#a3; z&k}yj!1WP)Kp5KNdczH!GWT9{`XBF_OFyOn`h&!`X#15+<k4Bkt$p7Keua8S-QZPL zuvI*vB;goibc*nDyQL{9CkvR24fON&E8C|w_ezwwfgugv?!KDpSNd^Zrb9gTD}q$j zXWOQQHxAld3`O>aAbZJ|qZa+kE8>L&!t}EXkBp}Y;u7KNH9M6Pq%JTDRiTTB3o!~m z|0+)&Dyh(yBafOr|LIfMH%c3AtVx<k`c%VHN~r=4{%8%i_Rl+W(J!~fBOd(t7~HP2 z8Ej3~bKc7c!4Z)xM@2Kgs@CgIEzSw1c+fMVfF-+)KoYM9UX%oi-t6`Hua5A!%MMRo znS(wW&mN*>RlD*R$S$sOdbo}6H2zZvIok@b%Jav3dP{p8gankm$i1wbzAxy->&@XI z2O?QC`31J`<>qoz(CF$9N?Ksi$|fqoW^`-TAx3rme9{l=V~S?7d|{_6?KK(U`EG(= z&MFYT4Q4XYSvjHgC5E?|T|AYVr#44X`Ml>nodY#7XSvhnP(8bbPz-Q-qo8Z^m0MNV z(MAH;W24?^Jcjw%PH1n=dMT)D7cj<ZX|7vpR?}Nob7ORuThLBdT$)t3-kCk4tTYuZ zI-(%Ub+ABT`1ode3@W>+ZC}8qR=WP2C$Dhl$vRQGfkC|0ia9NUD)Qk@rkW^TuYdDQ z7UJ%NzLy{0_safbs!uEz*6WZCdHvLSDNpj2=&bU!M}#+;H@|qoe|HP{baAv^C?Vu# z31Yvmr61+=9iq<E67{$6YkM7inLY!oVLdP8re;WN!P*#~`B4jM{1JI^ue4>;ic>v1 zG>bD%bAF~aA$oN>5{w%^h_wh9GgA1?dtjvLhRwn+{l}6(Re{?>5iiZUL`)x?Lzis- z%-gxM)GSX!(U;fg6m_+=OdhSxXA|W<YDOQ!muofEFzGnaINc0l<eFR31?1h|Mj!u4 zziGD|v7eCX-f_Qc-BGGO?iQ)`nVVgF={0Lh#u?LVfneY6-gPyyk^<)87u^?)JKggC z1s>JN$^Zcv^U<;AST(N`v;aa?#G!nnNlihCb8TeRW_t_fIPZmuR}7+?vdjTK^WE9A zmissdta`sa4Wtr`BMM>1&v_7^{>2AjoUP}w1F%{6;+&5&3(95Hz|6**riTZl{!3WT zdUtOX1WDa76BIZQg(o)%q8k4~U>zYwPyTeEPZHXNb8a+JS?<tNgY(H$rr>LsT~+{t z*@iwZI>}w!MD|G$#lE1HYa+}LtL;Ul`eSD*4$K$FMYOdIj3_$>Cfn6eH=B*PpW1wh z+Q!ZFYCF^?elb!fVgHRV5ag_XNs3971Xw})g;u-o<iaM_s@4%gkA&wlHS-@A-T!R| z1l8O`TV*BZSwr06KDGX9p*~#vQ4TXn3+e(-bPaio@;+Z|ww8Ny*c-QI_?c7c;pysG zvxLvAXUyG3dWy_N8+y3Iz|g-x$L?6J=tGLy$Ce?WHtk)e2#%}WfVm#!{*a_Z(}T;L z)x8uUY{b+mA%8r-VzsY;pdRi#Oh=Cpg`cXkDM}&2VT`aUaxz7&_G%!J69{q;(1U|) zw7JsrC0%o?+;Nujb-0w;;bw$(3WFLe_6@z(ot`S`qo^8fV{*t;PopiAMp`ISb%iR+ zyGi__5i{c`5A&=Mww1j09A6vub?0kF`<2%NniI&F3MN`QuW12D0ZJ}xMluTZdtEMJ z>tfcWye>?zD;2ZcmOmFX0JpVFq{Rb`i>6*SOG9p-{BP0ES@rFp%og;LDYY1Zz~VBx zN^9RW%=c}MgS;VKTPZV;OPQr+CxY=SHZ0SJwVPG0W83##G@vejxJN$!!4|wC#CS*m z5z$OVyJBhhoY@^Be^r#3qqyqEluqKW7}-Ucd8@Ly%Hxp?uPv@Y*ETGFV;VW=vuex% zc0MNyPUyDT0<T%?`HXZ%3wo#c=fl{~^O)vB{rt%0`Z$~(i=lW+xX~1!r46t9Gdp(4 ztIHC~{#H5h=?1MJzR4&FB(*(ccjUSx7|2vJ0B%MRSa?m4O9+aq={Uez)L*Q4JEDUD z8}q&al*5n5eqDjF{6{v6^l0Z^SyxaE-Rw~84_lKr&7r|8-V1D1EU5(Ou<U_l&MK?K z&M4)0xaQ!~{2GjwcBmP+s)EMal3>;0;QL>;jY(dE+myDaKT>g=Kq&2!s5HgY_LLF- z;6AVoUPzqOL`<<lBGL}nQt4llhlFD0q}wIppp2#ae7b*DcYt22ci0SJ1DFoawqIyN zCq<E81vgDe1mH2KkM0pOxs~6;yE44gp|`Aw!*FDfU~ng{?(TngA<{e4b(26MPgEC6 zJbux$iB+`TX&E>GJHX@lh+Nfc+2nxsxTQ@vgGH4;hj9t1UhZ5CF+-i*e316<FoiAp z8Kx|Y(nFb3jabW)pkTefmfT~J-8o)fO|C}f96ZDg8Mk=xUfXKT)}mKvnc0cdQ<I!G z=hQtQ&hYNfp%dq5UmapEjhu}?CAh}7pGa`oOp6o<BdgAJ$vRMKibc$0^<H;p2KI|s zODh?c3v=lP$GM-^aClK;@M^O4F#|@adC4McS~0T-M!k>@WiYH`yHqRJ(*xepvJB8z z<hAT*9l_i0GDQu5{m!UgsV!8!iW)tCwL*x4AqiYEkNT?i&%4AptC<S7%y#I)<8ioE zM16ZZo|_jw(^G&_h+Aik=r|M;w_4AcE{C=r-vnhv9T(MkjynkaUVROlu}u-tMm(rf zqPuBeCsP;36s<E(=qXT@UWqt*wbplYmZxhqkf{=SLBF0&UMsTK*Mrv2g8bCkuE5rx zL-MHP7}<Ch>K3Mlc%W4dG`qDTo5E}l)G2j=qeg42rutO?6{f2nx*O=^wR)XWU8=cg zgl1qic0BNIg|PUhNy|Q#yv@o76l}!h#@Dqw+QE)BAIzPvhK{byk#iwSlCUi5ki*)> zz)NIX?5#$pYlTbLE2gDbt-=o*MLZKh3Qx%8cT!j0${aJct`;UBZwTDwP}r3ZW)gh% znoifwERQQ;wcgJOZeDAzjT6ZG0w_FX?9f6)SW>slI<&F3D!l%zebOLdE+i_RZt}Y) z=69VD{G78VD#4rq!ykruaVTpjS{u4zf~|2)V5V@yi`1)qjI&9eVzp^O%tg8F)-|fQ zxf}~+QE!fJoHug8_icEuk=>HJQLd{ZbP^yw)=vV%7_pQQn%4o{xX=8Z{-cxtyFxt5 zCPTh(Nk*mqp(Qlx4^*(=lZ0{Hw^r@a#_O~BI+T>8+<+xgvpgU)F1Rrrn4+HlHqCgt zd_FoSCofLp))THdkV7>6tN>ji0gaG~81PxSLD%ElzUuH8{<Bw-yS#$kw8O~m<Qn6c zS-oc7<D`4)%7b)TYP#Z#eGrTHQX82=&AK7{xZHRlhS7q4{selrvzrK#ue_2DiVH<N z_k<%jU!K&h`c(0HUPC<vSrhmZCY<J?Uv?(`=Y;)WQgc!OGw~YToE4SCnCsCYj;&0F zQxk;R6wR?4Zv-18Q1m%wA%4Ai>xcHt(ph$){&^%NKVYk*=5V}v^d&AZJD34#1Y*L2 ztO0FF)It?a2MUbkV7hN_BS=doESLmfc;-*p1FF(S$EC{|COCr?a)#G!wf#)GNeAF= z+b_01GZ;GLE}A6xnUTx8kI&v-+afO}eBFY)XOs)H!RD`-){zra)e-btb$c^C-sQ%B zsTemHTJ4Jb{-UVZ9f{c3P5aKH7GRFgq|p50SDe&&kI=VPGOxb;896Q@Tl;C>@$Lm~ zaOxb@>(T@hE-H&=E6e2ya#A|o9IW1MQfuSSNO>!?PbP8jGtV5JIS+0&-~7`}@duvy zRHP^3juNS5drAkfVN78_kJFVOw@RoUfRI@NeU=aPh=St#cSxxqo}cB{TK|lMEqp&T zppwHC?hStww<-i9PQ-FPZnodYW;8koIrp(4O0zH;1&r`AJH`Bdm2!jyizsn&R%7cc zpNttP6xAcDO*h>34PulWsNw73({9vDoCZ)U)kb*!1eHUp4ZvHR`bs<vHR@(&DvI13 z#)ON8*CRR#p_Hw+!v?~+7Mf9{_w@sDYm|vmL7t=8AJ)=?h$#=rDAMl2l7O~R=(2>) z|0kCU_&Cwj9)a~>qi8w{eFL~IBQIW{10=iqXW_32)ha3RS8QnGC~Q*;jm(bG-Bv@o zndBp$;ON7g5--fV2=S6cwAt2MGn8qMEG7?y@W^K0&XXY}LK9XlMzsac1c2c=e(OdQ zH{}d5bLS|YW}qC`Yb!GTc=n(_Z<IloUR7i**L|`(uj==zUGj^BIk&<DU%{G6Eip=K zS5~{5YEn`Bp)zkw&22p>1#BFiV`sU3xE*~@H9Jzr4?d$)Htng#6qn!DZm$rq+FEeE zLy-y+gLJ%%YQ9}{jJuumpy$pGDa$oEN!PCUob3bpOkgkoX0IDafPbiqY2oA)RjRqB zaLxS+JaQaSsyz<wF^g&sfzr)s!c*+k4Q=NfoVullj$MtrhsrP@V50j$1$_AR!9!=c zHR{hCJU(^Y1^t)cR37v5a&0?+i5*~ctz(&-<zcifWW9C*u3lEL_7{!A%PGSMveG&q zuz=e&xbogXVO6C+2M}NxSp-gLQvyk&<@Mmr@v&GB$LJ!9qs<1ndJEbX9a~Q=e!CeY zIACOE)hEV^(7^Kv;I1OZ%`boW&*W`Ob_>N9AYaeq(C$Eqx|_p?miDsRw!L`d@DX1v z{18`S(c|<Yg$mi^8#8#Lv?Ht+tdYjaSlU$epQn;yD*=@`b#>n5#*pcpx%`oFvGN;& zosFAIK;rgh8Q<^*vVulKSM-T7apt#hdG$IpjBwhy(;UB*Ac(E4w_+LPD1_2UlT)BF z>|XQ2hAq5<+Ar^R2c$$W6DiN&rD+^3fZgNvU=0kq^s6t&evNX_+iKvy9l!kzrMfy5 zKJhk-wcuSoHz>ZTqhjq_vNpbs^ti^KZy$nR8;!|}?3Bvq++F)P2PsndYZPGrJFyHI z$&`~RfRLao#{l1LJf3zCZ{aiV0SPNh=xk)oJsv`JHUB}hvlV<wVlRaznAgj0PY`aw z6hqmhK!ObL`!?>zNwr3ezwE*{GOWj!_O$^^I=^m{n4s-EMuau3H->+6a#jqzGiBX0 z`G9f@_rhxPr7b#v?0o@>Ji>~QT&9da`ckruT4LtH+~llc5dNFlYN75^E9-XnwPWBC zN_4Tf=}L*X!`Sxq$Gqrm!JPW7)RG!qX{BOkLDN;qx3V9_9s4RHciqeJgH#aRx`tVq z893Ew-^PP9hrDzp*(=hQK%%qew59lr5XM}h(sgq#gQ^QHG5f37NtC^|7?;!n)RHgO zHVI80qnggrTF^F-i2iNIMVPPsW2ohs8qaAU_@0!86uV1;)BSnVAL~9pybmd}4v6pB zKq$MvEDHjwW+%XZlG}iUIL>{v)T>wx!cLlUZMAK?gF|(Po&{JGr2imVS{=F;@eZ1% z78jYZv`Ts|Wj<#Lh3Kv~ub-6*n*#O;-{1BCWIm{w1%t;^b03)L?;nl%^8(oyu}l5o zNe}v^Wl#!$Zu2T^Ij$z$4L`|0_?l6Oa`a?{^GerbuxiZoC)j%34D5UWAn{Yy^e_%8 z#v~PK$-)+b)?G11MRj(hb=!yO$GZlrf$IHK_rb^++a72t0Juu0tNxeBv-!<_!wd;< z)2&{It{*J3D7%8kr3v7kr~~GBn#0qzys{Wq*99MtPSy~04Mu(GIgXs^!3`c_&vk(q z@HGbo>yOAQGbUS010IqhwmfwB*dRsaH-)#d5@7z|PArnN&UspQZRrcbi<Jw@5NE(1 zQ0Ug@PA6+#@d&%ORxAMh7=Pc_7S2rcDyB@86BsYQHe4BBrCRgLm#g+-1<RmLbT8+N zp|u$t@nc*v8b1zkO#=OP(>;Wq@19eqXS9O}MK{*VTQBRu8G<$otl8wXUxZ0Kw}lWT zXx%)n#Ldj=<~2cD#J;8Y!Ndn%gDnqEzxry<5fd6DY;JYsx`ird^5)H&N`s!G*4(H^ zq=WxJ4^zydV(IL0Vq4JyJS8c?9zE1%YW7F27y4jSk*)mS7wSauw=dY_trci&xU<mD zbCVuA?{hJKrwSycGDxr#1_`PNQWLAKNA|vYJHtl!39OojX#<fbraDaUgCE+~tER;W z4k%Pu>`aBWbiMVg4=CZf4N*@Gew@w;Wwu?FU~MhLgY*zr?oh7s;E#chfIaJ7^4=_u z8X%2JY{ZZ76KE^jMZu)4H<<C2DuuDdn`Z>|%}c*gMsmXG6LCcWnM80oJeJ>vQDv=k zXt0>dPqjR8cF{qtIup?`wY+4NIIi~u=gwSKBcpHE(F{p2`y;_IzKL_sBQJ@+y0RiT zQR_eKl=PX6Fy{0n`Ho5B<c3t<MinOly_$6HHnjtWO@eDtnIgHGm9A{m(kId64=5uA zvkFMpG;~JIDyx~2C|<*!Ub7?$t~7X#5bD9?RNVg>3XFwXD;v4;d`9Ru{4P7$4WG8k zrz(Z0`b`?#XwQBj@pGs=wcqR6&h?v3JNy;K?(Dj*r!;t1O?>;K3X&_ivPcVRq`5?T zV1w{u&9yr;Mqa+CC=TABU#9`!i|Pc-STfvq1DaA@2XvS7zvW6>oXAI?w-uL@h6Mk+ zm9Wd6{huQ~4d&!&@84x0x{G?jS5&fvHOw!;cHh_CRxBYQ^=k`r*7e18Uw$Q=E&XV= z2eCk*>cIqj#YPE^VbU)a#a?Lr8VcWt){Yl=nEMdTWNyt6bfC;vrJ7xP=f`;Ehg&x% zYFW1ramqeoTj!2&&VIdq&Q=mkPW&ZdRB+ntMH>dyMOhi~Zf~P%V7pt;bLyPZ@S(-2 zbC&|S{b=Z5!tmrl5w~e#PX99!OZ{CGD>%0{qH4W1ColWnnTD_P%qBW<#{w%3e>yG+ zZep){Wr{<%Kepb|Ob#>@tmLC?V&g+D+avaQugjPnt{+Mka#>M{$ms}8yoK=j7j1)@ z(TEkFa~z}_(GLK{bouQj9E~#qls3XM^e!nTuev@56l{T+`{@86u+_IBLH3Qft&3%- zbFouTu`ZCC3qNS<Q2s>+$bB$&yZL6TA45+QmsPmjxN=`yQ+t_3U+XTxEhHDJimh`w zupOUMPvs2yJftz2TLW0{<RFs!^{z90`r>3qW7{h!Ran>a#~BP-Ygq!}a%0|94OpGk z5?UVk36*^Ao`VN}Q@C>2;l0_6^j~o6sb^~fDWu8!__?eWbXbd7cPs#G$U4PDdhick z-)baT>`2VbH-yCxZ^UWx+S!r)LBMc`=TWN^7k%GX?F!iyzgu=In45+G>KZ{v)^MV% zE5!sS5rsXCTAZ?Wds@?0DSW(`px}Gr?_mtGY@P&X;DGpNwmW%0;^s`<dNUJfk=+JH zG4j~k@9WtIhRpW+*y@J#S9BzGD_$90UX*IFb6f0Sc#fverOND}4hJ`OyfRg2SnYu8 z2lsf5_DW_0!fe*aj<l}WA9cgjP^_RgH({VB!((k$B=_zKfFFFrV=n(^C12*`$)BgT zyMbNiu^#-%tj{!@D?=k}#tdD5N9%$LT)E)`XZ`1=q|oY@-<4II8JUO9*g=orOYozO z!GO0gVmZnq?j)*+_114Vu*{xe)GB<Sft6q194``{VQZK{m?~sHO<+qrwMO`}V4MvU zjDw%ghOq*9jv#WGyKscjDJ2`bDfnW+VG7Bq*3~!K0y(qiz#fps6$lN)!aer7g3^gS zK=w^yb!D?W&JIr!N}|VH^UFsjv@$L=xuCl8s8^}9B)cf=V)Jz(5WbHx4jTNfHSXdg zSN3rQY<L0sy$Lwh>F>>MAl^;9?{^@Q0#m}jQ`ov=`<ZnZ)sYWiAhmh6?!de5`f*~v znCzs{9>HV>D9TLwldXo<=n=O;Kpd?V)z=~!>T(<}D^b4wAk}R_+gst@zwB`rgZebZ zj<X~XL?dEHXJUy*+J~oJV2%-vC2>L=;hr4##>7N?7FM{tX@@u(S~VH5TYK0+0F)>D z=8)`<xIN4pSvv(DN=7bw_5VJ{skI}&XlDVPz^VHm9AdZfX+PXTjTV^0mz5CA74m&h z`K~W)HN89B`-cEYyxp0JcLx^cDuJHLVIbN7mrG0c72ca?{ngn=see0Hq?+HP59uto zm93yy(o<!Ms%=WGt=RL`es-8t_n!?~dS}$#JfgQpN9u#eru05fbIaLKb=JZ&dAn@W z<q||k;Nj3M)lS7&T>0rJmmRjZ?;^G_@93Q9=;#p-!bpEtnBXyOOF^KXqYrO8)!0ez zJW+x%a*Ov<9*MBby`37MJ985dIst}i5@uJEIxy$m{K<!BbX{|fSBG6GKEoJx@IYu{ z>*Puo{|jU?*^<(Hc^`s95+RCIw=${}egp(pE^n-5Y&Ha4raWDMi-WyTIxZGX6Yowq zuBhOxa9ihMORvEn=uALY({ULkrsQ&@nNWrHxlBmFRlDU{jdb8?rwtBMLMmd-7uQWX zk=6a?0M<-7Z}nD{l{}K^C7i<0-dx@Cn(OxP&NjU)3MZt|fW*|aJ5w~thqG|qH#Al@ z616(-nHYfIMKcrQ98{*N4u~$IRJJC0ZljY8EA7x@-6Mob7LJJWP+5I?jMF@)kzcoo zd<U*Ek*<nWYrQTB=D%r)7j6xPw_%9N*H)$~Sabeunv&04S??arsoi=%y>l4|@qLc+ zab+^pr$I9~HN?%ndu}hW>~!%nC9CpV4JE<#+-u{7j!nW8ue88I-;0vqL-HaUNwC6R zE$n!L6;wyouz}gPnF$@C?BRXG7Z%7sQoq7+yk9W33x!q+_nP7-%DN~H!WdZHVWQd9 zv*_Q>@Kn2BviNHp%(IMz9u?8bWOSBJX?<wxp!HbOzgmTn(3}s3oSWYY&)0f+`0Ylp zV9+wGE_czzeHoSmsD0WPm;Vm~xdYY0QKYLyu0jpx`^nnL(WF<EjYz|Upj)NGo+x2; zaZ{xl1}pGE93RlWhAu~^N;)97h8E{t1Qls+PS&W9;+@c?zQ<WY9MFl|Z4o~>KU?B= zAbw^Ku+ZWU0Fbg1JQ@;1?TZl`$(J%hocMM6>?^tO7JBfM=~jXUAED&;O5QzSdwRMO zuc+*`Cz7#WKS~agyR}}BH2Cc)*lUJh$@E6v(p|HGXw`FzpPHPKzK>{I-oXNe^sRo7 zLS(dTaix~wIiAqS)q4O9wSV`21A#!{JMwWoGo2N1r0vM5*V&&m$Tv&SS#acJ<G9Q= zOu~Sh6xKv3&C?O(n0-cwBU<AZBRaLum@sBn#uG*=X9jROfCHVxjf?=>VlU40)-Mek zuUrYuEfu}`gv1J+wN)KIdkXfhY<Y798C7RCB6iJ2vku)?leI*g%K3W4eNPg|JB*D6 z8MyZ}8oszFsWRa#se1J)X)+1wAnnt@d+&F3M4cF-_A^R8V#z5lXKchig24r(aK0ye zArz#%Brnz|nNLIr%0;>u_xPnsFST7<tc6mgh6OLJOvfN*+H@Rtl#`qM$&hci55XL! z#V=5uLp_$kJR`O<L!-Zdaiae^Hm<KX;k5*~ElKn;34~~y&T3a1PuRXawK?$Ob*t+0 z^vR@i%U&bI+}xugQ*?hmytf3W0HuXZ>O>zdi(9Ue*eBrzNYuS#aiXvP-7_4f#GZMr z<%P40?RU&S8URPcToSZ?g)J27x7kXUSa037ZIge^kwr#x_XeOhQP<ro+NQ^36A+W1 zOgiUKH`y*@D=-T5RMn3l>Mdx_0|kJ!q5-qIv*(WyyX!u$ZhP%zk5YK;(37ohXcbOm zZXnDH2ol*TCU?`D%EW&o5wuK_EfOBtE|Q)W_7GjEKk=TL;wxxyLSVRyL4);bjp>G* zkp{yM3tMP?w*>nMWnoWSE*L_M{d_GAvwuq0SESkaT-ds;kbYLIe03XXsM<JqWA6_C z3tM-R57?r7?R3|-rb!txuChe9r{^CkN&HTPYg-Gz=T*2VT1*?hnFOU6FImewH;t#k zJfr+|eN8y!o@$8q*t*XjD(&<6V2{gB96WTnn~#6}&pDgA`>x>HDG6F?v>M5J!*O%8 zth<(*d2t(Q>IOw&UzyniB4RWOE3m7!HR=c2D`zJP-Gi!~x<>8PCS-!Gki^C=wdnC7 zn9;2<Um(fP-kY)$*y#Cs#&^&8w!(i!urpf?)$Xz5ESg?B_NXt7ao(*Uca7cHc@8&z zrKZSi$ES0X_l`}B6xqs9KiJAh@$^J<gE?mDMP@fQsGRax!ECGILZLS2-16h(n@aBH zIAr>5x+!-4b5w6`sqla5l(gRZl@FpcE&w%Otuih6S*w&P4tS#i_Pmty4*aoaU?n#i z33S09qoXGHUlgC=8W+FP2B=(5^R;dRR=ECsE=L4gIon+FXD4qWsn_uM2?-_5+uH*# z$R+JL-Fk5O;{Lmj<!mnBd?4qaar$!VOWn?wNslI<$o;nCxBdDKulMiQpZxXL&nLWh zB-&h7u(|7_pmYhpyv0}twn2~m+$h*9%|u}f@gL)GA~(3RvlDf>jF_|nMUKzRQKSw+ z`x-BNrwDp6eCEw0My@r#nFxV#xa=z3?>=0wxYcbGMIqBqvX@a;wu5=H8!KpaOdg;R zeaC79gM=-8_Gn&5VWu`~nh>^zUrGUO^eXON{*H|MA}K0l$3f?gS3JZm=XQJPyR17Z z+Evu|vq~+Q>%Sso==NZt^_FGW3C4Nc*4R`-Jc_}bW>@V2boUIxezTbWiVm5HoyMUU zH{02#UqpIYX+n@~XoDC&$!Q}61l<VP+}A7MQ@{r^QtIrK3+-jsrU{p>)XXe3a+(#v z6QuMMa?84lY`&sB#ImW_D5g|u72)DRp68q$iDONr$dF!1`oMGcd@l^SwMvM9GZT`F z;T!$^4ke6&2Xmah&C#QXTi2aExX*a&T+6z(N47ObN*GT~{Sng+V~$}oxcjf=6)kss zWv-y2?tXvzT3vrONACQt$Uo!vpsjzIoV|#C7DN=YDFq4Kd~yCDkQx(684#CR(7!`? zyqy?Amddjh@qs56O-yl+^#b$LroC*(q-IuOS=+vl2dwU>v7=rHjf1cJHI)C5c#`;^ zeoQ86gItL>@D~&MR+6!?Z9fPDVBX}Esc6A5*(>e`Sem*uK(sQ9b$+V|-ZdzR-;D3X zfDDjBSc5hs79|=YB#CBf32-xR^wCD0JE3t&3{XQVvmUjYML@v~#Djr%79BqZ0(o)a zp(YKB)nzK4TbX!k!$t57=!4Z`xca5UxqXsC;)0|#t1wwnII43Ei?)t|mNY(NR<a}0 zs(P&=IP7(-al=NLr#0nj?1Es$5-}PAS$_uXQTin{3#X`}-?%7FSORZ6T0Jchau`23 z05`W<dIj3&s?D7yXj7S9vUncJ4zv;|S{L+EMbBS}9PT1QW@|Bs)|)9gh-qdYHjc~; zLanVCy(0*@Z3bIUrXEvoZcc$GSj&kKXKGJ*v0ZWM`MldJN_Yr!rD<zRLKuy^<suwu z<S^fe)|Lp)RCd(}(upQ}E($piOP~q_%wyEe>r=A24hvt=Gqc#$&4t2qpm~Y|612i8 z+*Bo@e@FPnH>29wFGc1C!n`RXqLBOhK1MY64h6)2)&;IE%eI=T#T%}r%QN<Jr^Q=@ zQ%_O1j&Hqyl?WDk3diP?3HV^_q9}(w-S0*<Z@k>fKb6}c9hC)+S-d$#p&GF%sL$6> z{B4_Ry%0t*I{;g_w8eb@t0~(zR+BJ3>9e$tJ9IC|KPSfBS-262vL0hRn8U8I_IP@3 z)vgFiS9PGyUx8INqx4iS#NcYvp!c%qP0wZyGUQCoRr*)-i?o>`?w#-U`L`xKa<Zf- zEe;;;WZC@DD{BYE^JjR791BTeOzgGdG=t+uhxw@#*mtrYA;MdBfd?NN&9dk`QazU) zR^5+hcdY7ZZe|~YAP%Lu<A)Q3o~ujR2PK6^G?$j}bx&^{G&?jqzYoh^0N1v*g#7|O z_Tkw3eY(e|vv-m6Z#{9RrhllJ*P8QhZa=U3*D9?*o0|CDWor>orrvfR#o*m2R<=Vd z-6zN=r&=7qS|I*FWwzc0-%1-Qv%M@jXSIjtt1-v<9L020#P`96_lf>`g;<^X>(BTT zPygeM`FWen#iN6uCad%DNCJtzIg4fAQCyCHd8;JI-7jV>dMy5PLOhe7pQ68SdDYgz zoqvuu>QltIz3>LP@Y*-zl4zn#RJZ!-AZU4c>sev`9w=xCdy5JOb7lnv`K!fKvG~pJ z=f>3S=jcl?5RyJcH3xRvkL-(SnM6i6&0H~nSWTlK3H)0Y(4{aud#@w}hChW+o;o-O z4Vyfu(Dc4JYwvJ>LK9t<khBs$H-+;W_1u2MEBW|hi=|LKZlp|2xUSX|$p7#-p5F(Y zRleXZ!QPaU&|Dk6&u7a3(mY#une%6cXf?<{X~DsYS$zka&`M}4(|8&E!~nt^x{VF= zf^ojEPySllu=!L-;qSaVK(Pm5gzw^|qq$#*V6Q!&w`Pbc!degc9J!I*Ue2#ja3qC- zhHv$2gW$34LdkCknIvqj*jy|gxM~-P2sUH{O+$?XOVd3?D9CIgp}oey0x{>n$4r?C zZ?TNK3UTNPBBIr{J<CaboS9F#Y4+-A-0IY4uBdSxYbbnXFRD%@@HSkr{67f}P`>62 zYc*l%YpEAs09D2BNgCH9EAGf2SAV}g^jMO=iB<L7c<7wI{PSuFrjxvmOcjArDX5r{ zdipcOgdQY>^Uak00|ZEl-w`)>Vz{~PI}~Jq=wkLj*WPfo?<y5gsh+d7L0fy|DkH!G z(kOVZS0!)g|6%Oi<C*^Z|M7R1vUgWy#Z{8Sk|Zfg<!noOr&5+wOAf0j3CS^s%@SF1 z7$M}aB*}5fDPl{`DkFz6YUbP+n{CWaukXwIx;~%3KA+F;_eZsx_J`Y^dpsWZ)9dkE zuGD7?Ouzezm^|8b)+Z}O7)Irdpl%8?UwJfeYGZU{i!)TOfi0x)pG;E*kF!pFws?8G zIe}XDi(|_!fDC51^cnz7Fa-vWl3S7XsX_Su3VlZcoZM(4dah%cYyfY_Q^)AzXX-7? zgL@qCm>rwZDh1SpUS_6o%TX7W@Dk0V3%;`K=m+lDD{|A@=fmf$gBQrI2kn(cYQGiI zcS34fH0Ax>)oxtc(_HATPR5>y(O-{5w0-CKNb{n~{TyBs)G>*y+T(=N^8Uw4r1bUc zRh~v}I~ZgebsAijcJ*iB%vmdfS!YSa^?>tR{e|ORI`A<1?>I%AB^(pNiaq<SpXpH8 zqN8(0J#@Tpx(8jdz>8CN2fSeKm6YH?@}~qkKxx}d95fXC^6yFAyjQOCgkjSE_K$-+ zS!PQK5t7)NJD~MK-KPj#vuZp3L+w2T;sI~DhkzfHVAess0Cadq&`y^DSIijB3>d;L zT8@@mj(vJ3SR|l%bfy7A_?F3HYyTk<hSoN;4%ukzwPdMKHT0#AaN&s3!uAy2k7kci z{@Z4B<L~e6xLr^>*s;wKtRu}HHTW6~I}iSCUhC7GGPa46;VXN)ZLS<46uLH$q#I|l zk4mPMG|VH?n2Z|Yr?ELm&rRsB-Xds}rxGoTv0QUxg?1k*)c^vhsv7+f`^H&?M7U%w zoB>VCT<C|p0ny7xmExNz5pz!M%9ro^OXmooq0Fy<H^%dk!J+KQIOzIjxdo3ZphBi% z{ONZ_6pAd{()^b)`iBf6{tl6)n*$Y`1w!~231VVKLG2O~!<+gSycNn#(GrrE9bv|p z!9vW^gB&l{fJsEHv|$4R&&^x7$pul_%D9}};t-kd=PEAx!~ZL7pX;iKR@)HqCBtD- z`gI>i;Wb!Z>%L7)0u4qH3xVR1ggo8}*%ay1jga|(-0+L2J1Pd?`n-pu9%{{)L*qz; zk2i!>NJ%vFj`7E)cf2|F*9}l#C>If8O1Qa?ZZxPTYK6SUN@{<33F*sI|8zAA8<+#` zeB`M6`tleTAmruGLE=fYD2=HDERq%l-UnE;h}jiAK(wV<Y|!W~%tkhbhM%2`=j!-{ zs7&5IL`}=~9Xs;N_2;ySKMHsHc2)?ywy}lB2cbhYX;rb6SY_~F^i|{h=S>z3@41iD z8!;arhBvXmf|E0VNzZ3F1fRuB&E(GHP}07Zd;$B;&1v6H>6AozrfO~VGXv6@T1gFX zOYl!U1R1M41$Nd*u>6YDB`<a;oub4(_%UW`Flmh?GL{-L>iq>%UK6}qLPY~T;rX4g zBw>xfs|Zaz5~Tw#@DYsJ+n_^B64$>FrX~gV(^mgNnRB1|o<*PMmpPoAzIV@uOG>Oc zoO6NGbQAJtSNHdG1>>=t*2tHK`}t2sQ(_UFW?(cSrbfte*t59NMFFYr&+oq?&uFqy zj~FQO+g+JZF6$?0*Q>Ral*2zCGoCK4m{!&=?`2IOT^jOzzMVhtPt=a7I4J7sbX3;= zR%(Bj;XL&Z=xLa+`k{u9AxH}miaeAXB7`yzxR(UIaHXa^;z~F-(j+uAinJ|zL_@Or zXjll4rHkMOqcLMV5!)Mg+l4trs$#rlfY%n1CvP$u?Mo3OG86);M-5*v*o=^VQC7dl z<AJD4c(QeZZav{49rPuLz$2sS0wtNimIypmntf!E6DnLyUA~b9oTVbKA8Zsp(l7wO z*%a|J<~|w_@^ZrZj_Z083N|4c&Z!foL~z$RyIvZbLEfjiK3nZqW!%Nwd;}@MNnQfR zi77NG+sWSCkh|3GwjfBDpkg^2V$L<(SSnSPE^{V;8I)dlIqU@x<%;>d5#iZHHRb#R zGBZ1FYoLmLB>ag0;+P(E;1%MZIbboiRQSkNcYW4c^s9{|Ze})F82ri}aaEwFcJxXY zF@>u)51<c(xQXv|^3Y4-=04nnvGPxErMWcjxZDIAj^+(CE041J@J_Yq1sO`A8^<3T zy&wu3W}vvCwq-@`_|QWJ8<9XeiV*yRD<Gn((}RVMTPa)ZeL|DRBWGlI<{Wu4ZhCb& z7#h-XxA0dD7c=0&c>8_op$gp3H*ri&+V)izXhOoS8&@FmhMOP$WS67rlwlu#!5bS- zRoaG8#SBEl^mpa^Q%hao=-iIrGTKPR-rM<_r@wjB)-B2@^wP^R@KrPOV1RUmt;tbS zUdlY=qw!UAcd#Bq+>j5|#S;{?4NN|-WFE%MiJm|PjA}$BhM}p#$aqvZH<>4CWIZF~ zh*HO!P=#Gg+a)eReP`-(a#EJ+)X=V4>EObd0tJG5)vIsM>@Lb%f0DoOzQZ#0Xvyos zhAT5EcHW`^JImWcdzuMmEuX2UcgEFsW!>d}ePx!fF5Fsp#RjntMOo@?Ht=`PKK7@D z)ZrP_s9xkXko<l-3@1!`Zv%7U?-jP4?F85DNnS%N=N%U@i{Vrj;?NuWuK$hw{D&C{ zXTSXcs7iLQncou1AO4I)@+dsZMNfbyTf|eu?Z1r~h)W;7c=WFRXx0W72uG}oBsn?{ zPsVMuiH(B10GMJNXa7FbJAJf`uqB|}Skm{`B7)=fFIy|_;nn%d?p?5A*WeA<NH<-D zkcR!uG%I1|BbRN^l)AxkhOGAR1jmQnnnbya)?`}o&niI+d<P@^Cl0ayO7x-J_aBOb zewuHtS)I{Ni8E*nEP=Z&(rNb*nSN~M1-8do;Xk|IR{4}>i5O|W96fSPWr3R!pFaG~ zn7FMyD9=xK4ZfzVif(-*q<5Q{-LojY;%x3wODbq6!rI5+e`WR5R;3q*92tLyHW_YN z@e2&ei#uLhNUI{f@D>G_HL|Z%NI&}4%?KT=bheEckoizB=}auD+Y_6PFAo@OZ(J-u z%6fh8f5i1EM2MfxR9m#)HZ0^1AEtV1=1zSnybvoZV4r|y9jHwxkEnJa#hzB761g)0 z%x6e-bMLDBGPM3~ZmVZ$FHAccJu#^4BhhSzU?iVc##W7min7+XEiZ<?r!2MY671I$ z7nJ!uhWdJaX)6B{Ez(+t_1OHPJL6w-tb0hO4^hI>*mq{LxAaJ?Jy9(y?h~~7h~A=z z_fccaKBdjjtaCTw2)<L}2b7eYq*q+{UaDx(35F3uBQT%(X+;|GrqQ2Ygj&8+(W-dv z|KQ61`L^6u8JjsEywrBQyc=jV&(^O4*=OZQ`cBz9EXy)=vvaS?$319p^P_l217UQt z^A$8knCJV6_F!R#0p4?tYt_;ij!+oSDdZrWRT@T{sING@OYEO%ITyua?Hn7nmo}w` z+_gky>+MAC&G|)s<Ui=yJSUqi%oV+l`ReiL&qp53id2tK@^_xAuqw>~zqo1B;DFC- zdqz#o3(nl8Ewgd<m2rvG_=>4V`$KCs!-J%;g;1ZYE;Vx#*3FV~a&KCpz9AI**cVo+ z*QcQ-9lRvj2iMpbsAgahuahkA`vA-77|1)?(MrOk$dd*y><(7T9n~PZ-?H)i;T;Dd znnmnBCw2I-1BReiv#u%2k%f&0fqOZ<)<o;ge#JO<`gPhvrGyI2cE*<byr30fH`HY% z4BeWQ`2VFv{I^b#_<S82^Ug@(@zsejBTGvQGkj3sF&4fcBgTYBOr<ZzO%yM;;zzLb zLIniR1v;!e@zqsa&s-blg!Hy6dUBHNZcjki%?N4b<u=ELg`0;gvuA8Vy1!OB6EF0| z^l(-5Epq41^;hSWA6mL@^A>?w{gz`U6mDfGs$yT`6C>W)(w7aTmrVuFsFinbMZUL* zQP=jtUd4n6neWTX+52AJX6ZI7*A2gX5aRrLLa?4m{iBGcFc^Kq<5tDWhJOf?>I0v* zbkU5pqg`4dNT&*Rp~+C#t$t;q;t$Bjv1U{){TUQ`5&{g_&s^LW;g;ZkWWUtnsmbhk zl(ji_0xAo-FDpRHV5EQ&Cj<wpjJA-$uTMPr-({Tt{^<UG%g}x~+C798_x+~`HvA{l zHDZ+$MHSUy8;(7X)H9cR_>t{FK<|9#*Dz@yyBE@{=j!N)3X|&H=Q%cmldPS2nmrR4 zQPR3BB#Id@dqjX=flf&KI%oF1!Ywol-md0Pu2K{txG4@TwEb>LdD2q(OEg9_qIzMk z+HT~=D_iFNyo5(?T*Wwr3L-TOjQTw~=%Q>D^N=c2KBHKxXz}RnN#Rku)p55sn;W}m zwH0E_F4eO@O~M7WTgRZYuShVlZld2Z2IGBUebuHt@93G=+bJfwf0#So?iWO9;B!i3 zAxA#HX|_R{+X~h+wMpLdbvjC4<bM!?xQAj@&@X1K2JA4x>clPU2}9UUD-F0we`P|p z*&Bq&R}J=X`NDnwuUWWN6mI6WM>aQ8xt5`@N&EjKBmV<YQOjLNUVb3bR;I8XD>sgH zE|NK4P{wg9HO<QFF&B}Z>MB9RpEWGWb8GCixqy4Qf=l@Q6;Jqu23-eeiHhgl`+NIN zYfu|QV-AvQ5{@H?F_4>^JZ-Z)`cpY3yNO;-UuyN?VQmmHmBF-~K8ul}aNE(Jw9@~f zHvE3)Sibz}5jzL}J^MBJCV%FBpci{wI;#+!yK&{s@B%i&o!itDbLn7U2=|eq#v8ac z+_c4az@C=!S8SQTH0&hjX3q17qLJc!UvBS{er1@3k;q5`+uH^)qcyIk<EC<e)<gFN zpKTEjh97u}4}HA&zmv58;d235-DlC}Y;Fb2+_@3d#};UkDF=OF8Dr853iK!1jx<%? zAZqh4JI3qEEGUCx0k;D&`tkZ0e&~Y|@Ro&5rxUmM1ny6BV4+6Zb_G?fgINg1c%vDL zs@#FXXp~P2&#~TzzZ?6x-6O#sBj{O&cEQFXRlh)@eHE~~j(#ZHsMD?uqmP8jl{7up zq~r#s#C=OFDQr})Ii=9s*0%TM3E|L>tAoY)aES&?1s)#GWfKd8HM*_&`fv-5uBLFS z1;jMy42I3z2KA9Tz5aSre7!89yKK>)=4&z$V@x(TfIHJ8!u9?S{z`pvY{P%;0{EXl zJ8-RP$ZsY;*m-%d)?$T<TV18z+vV%k-pb|_$md!I2)#2rYT?wk3rBAdkMJJt(4a;$ zZ_XTLURA#>vVN-oUcltd*Ua^&TWAfQhKt6<n^hcr4c^KU<XoQC?3}#^B?`x`U{*Pw z@$cf?iZtNw;(Uj%X=yTEK4{qVg#c0Cz2E%8=d}5YR0l@)9^*`5KXRaw*U^H<!wt4y zHlN(;&#!)hRL62#igk84pTPvZf8sG()g&lUpsS#j66#-UXM|Mr5`vEGPf&tYk%9(I zXGZ5!$eg(D#<m1sQBXRT6UF`tP2ZA^`&0S<ch~>#?nYS6AgI_;=mRl*NCfud<RRaP zg*mk76J?3~uwml+p`(kQ5bBLk*SVu3SJgL?sR`I4k&p_FS>CtwOB&kL6s+bWGk-cu zlzq)|bvrEAZ#8?T#(Me7T%GO~2bjjrSyhTr*XKv^FzmawNnRjVC!te5mpf~XaUYM1 zON>a0WfYGjch^+rmj0RXd9$K^geOWxa;{<LnCj6sEBw2FF{SXQHHP$Hjk>cZ?Oeh+ zXUP@Sta)Wi_lOv4)gwt>jN+rY*T(3G(3$}V3d7oJvejsr0pHyWF=Wvl@E*YRpl@+p z&F1z@wotfSsf_kpz5xFnhcurnr8Y#T!}KW_%(}<vyWy$In%AG5{GTiAf6+}iy-AUM zcIG}GceM}Lsluo4u?z5^#`K`~FH+b_)-O)Da)a<M18-AddvHUox<$C4;L+8b5jf+? z4DWiN<(LCL<jz-~hfm0_xP)j8YA`mq^gLWBd^Dy>OSb?oiGi5br;g`q#pdN2(#g@0 zFyXjX6pEK;xpU0#sqb&z!$8yBU}av#h;_*IDXrUp?VP7~#Qht)yTQ;IbKCxcbt1(_ zX0y5u#8bnb?)wygeqC+)UMGsESs8Dr6r)iUO)%j1G(p`*cJ@Zj>($@-Ea%`T@X!e9 zT~}9MR*z)J#v!k_#0c96@jLa%?4!E?Ixv3PxPDmR>sLbkIBiM;s!E91WgTKf!ckv~ z?BMFk(<Q+-3Gc%4CZ9a*+cl4mzGs%NA+c<=mnR12V~q~?{#3fE5|Qjep3xJ!nVn(! z>#wZu1b*!t`D)X~ICjHddSv%<TTH;!X`<hyPDwaxs6*7;`dnZvCU{bkrL+*!c%|0y z>(Ab7`~c9M+*X#rpZ)r{8<xPb?EaWcl_D2_<$bAUMjwE&Tb(j3F<~B&q45Fel9gP* zYuyG+r}E0v_kpXB<|*xdO^@y>pIbn@wK&+VayS4;784qq>}UE$ap!4mV7&4xf)g1B z58-P2)=d%_Jkg4*nc>1&rbPTK`GsXZ@%6UTzt=7vX*!D5NL{*-VpagP3mx3#w<p#9 zq=nL*DOBO$z>3OI8Rq`^v#Kfu*DT@io`Qau+4$-~NAbR0*lqZ*)S+FfKKy~a$wx`O z#^Mc7m-&*->LFupC3c{Uw}mo3@-{l@iX^#?jR1$Tq2qdw_CJ55Y>+qWx~oTfVdVZh z_GEWwz{OW`(BiXs`ni4?-hr*XHRD=^E<qM~9DdoT(q*o|Mwe`0exugi7BhQGE>F(> z8Ob29#2GhRvPmO|3|>|f>|Cin6uQ&NEg=Jx6gR4f#tsT#mXm5XUPo=YouFd6m!Now z5%IKuOil`rd0Mj^3(I_YH@=BZpw!(jGIab7Rd0teF1EJY5TL#r(ZAjbr;iE6Bw!ME z9O^Ea5`C3az8sm$?yP32{VL{VXRoGvtC3{`&Vy3aG~*jZu&YawvfADllylS&xFhWp znU__T)_%+UrTXJ-x8NT{(^R<+rL;?f3|-W;&K%X`a@&zqf$^O0AY%Z-Qp=LsEW?Iz z?m&~pAGd)tX`z?gM5M^3S(X(Jx!cEG6#QV|-nTy*@~sEj9#Vj4ogF;iR@C5-n~WQ) z4{xasL`F5hZ`hy|(H1^Q;SsIrC?79kPrLCowIS|@=GJg+f5KJupx#J4jP;_-tmb>( z5!$tW<6v&@R8P9p_$q%a&&@(~0-|xsk=whjlD-GuQWafj!2gcG1QtW-Z3i^`Ibt3Z zs^X66*V7Mrw{jb3ZIAFWd|IY{%=#aOJ0;g@Q}*TU`(bCYwHV5-n47E7y--Y^-((n~ zaFEq<=}6T!;$ANgaEdTdjPTNm2M$+!(&7l`CB-^q(+@t5N0@$FmE8|EOx~c3<>%*I zBmWuctP$3)X%KxNijWvhrN8h6(j51+w+)RsK=PMnp+0Av=I_bMzQWR00uR8$X3z9n z0{wb$AI^KOWJM_YVc^43+gdO|9TgZ^l0&cI4PF$O%)+95(T|aBZv(9Lp97xRDVs>< z=je%<W-|4MFE03~&CCXTo_Vxi9T1&_{D7|_Wh$!iaq$$-gOlLVHw(tHGgoW1^Cz2w z-lA<MJ*1gSX=|lCPq`Y7S;=-*AFKqv$&QMt^ORxpNtxCP?AwMqpi8REvs$3M#a>!K zjNI5i(Ih^9uA}h{hQ9UoGGiDQPGFk&c^`I7wMWECA=I1}lYhdGXdDCTPQNZhi%+P& zc9-x@IHLu-^2+1u{l-;)$g4lC`S{|-Qxun(=fEx567=W!`4&=vtfz^{zN(Imv%>V7 z_O#X-a!bnUFZj$O3_FCJb;D@s$mzG`CIfhxt|>4b()o4~u`>-11+}OBn&%Gdg3j>h zTLo7H(1fpQGLF#Xv$e>r)(}O~3ywgWxNP?){?jYEm1NlHhM9imAF!QYZ6F#({lCF0 z42PnR_r_Z-nQTmwTW8)O%d^grgVASE=jY>*lD3z~N8HcWP;+ckemS&avV?@YB`;^G zz~ZEW&7h|OT~(H%H=opp6RK5lH{@x-KkPahmJ|YE&Ox!#-zDREea2?=XGq<=nN=G? zy>yShLSRxRR2s`T#al&P<(6qRza4keBUcQ$e!=UU7EB2pVhjR%9lz8XT)^yyn+cC= z9C=JJOYa1ZomNv-!PUtO0e9JVQ3`ly(BO-GqS;(sF-ccPG8d8Vck*YA_(I?Z@Bl}+ zV;X&4vD{?o!(~SNruNed2>-QqI*R-IOzVIf_*5};S$;t!064A?%Y`l0`U7cV>clAS zXoS&ET$Gkzg5;X-S|}_?EZ;fnI3pvC*G@|$ac0r_VHUU&;rQ|8j@kr;47DMU1LuOz z>OL&<EFD%33QY3M_jO+?9oa!@S8fh>olLKmBO79F5)95r?#U6F;dzA#(kl?kmGpYQ zTRQOIjvgASB=ItjgkC?6QteI-nVm(sgluO-<Uy{W`!(H%W>tZ$+J-*f4#iqz_C9*z z<~!zdo&SW%dyVDZJ+`@~>(9|hWGp#i{<4n){!B=9{ubs)%FTlu=4yb_?1M)I#9jE1 z3l^7roZ1u9H*=VAoA$>cy>H!!!tr;zb2yr4T<VY}zNND4{HJH6a_o^ELSX^WqewQ& z8k@*(Z&y$|qIY_rFi`<g5$ClLszM&KKZ)I#y9%+z@aLm;CLCX~K(@*6sHZzD3lolC zf)Rpey$E)#g^6k>(HL>90vf?bKSuE?q6zmos2Rj6Rrpn4{C#&OZmqRu4)&B%`rw*k z!ju%fjP4V5$O5jL|3rBJmI<4dz{C1YCYbh%5$zl6io7;U<|%7KQ%`I#m}F*bLbz^7 zbO(~95Vzf8(u-(ILs;s?M%NEAyVczWllakoQ+aqpDZ&x=K{ih@%C<R(P@|#CgU0cR z{!-opdW6%UY|er53%GPussV!q$?S=%5cAvHVXD)9A>G^|zcbaYf>xVEAGVxqOw~Z! zOs#`&9SaND>K|A!VBqt#MpS(ns<GU&PuNCLz%3nXjY4z3D{E(LhoO@&Vv<5clHXll z&-vMt^r4tSgb1HgXD?6Qxzy8allB|02<P5tx9560oTTUB4*p<PWFK>rJQzx5k%FVm z!uH8wpLUmc%#1ZpTttW87GARZsdNq-%V(c$-T_`n9{BN^pbY2U?^QaeYsx2-L5$k+ z4Rqvg51pK4Hm7eN%bS>fQd8eAu$7GGZ;JKJxr7nxk$t#qgwb@A+1`CMH&`iVt0ZBW zX$rY%{Ifw#lCVGAf_^0tHh%y<G=THcS0wkaxopVkYUqupg!tgrT7B{a)McY;QG4MQ zpT`8^m=2IwXSTyo_SP?X&iCa=+u7TT#BYcaZ+F>GitM&Dv+eXC!_(KwXpoKj0CdPo z7EJG1u7RGR^gG}{R9+cO`v5rK)&e^$!ck8uc35WgRsUV4<w|wHHR+a|?87#~mBsp* za=|>M66lthgFQIs+lI7k6jLBZ^79G=%I1k?z(o=jc0C|M0m6Wcb2PEnlwlUE?L?z! zDDmMfLZVokzO{Z(w`m7uc|&GIQ5G!lUBG8!ji78_kT7EH{U3P_7Y6{`%D_kXEi#Z8 z4<lRg1YiEVlFu1NKT{LmUy!J9*{8pnGHYE^)LgPkJAGb!KC50k$oseIUb40Yb^x=d z7B@Rob3g03_4!FBCA(lNdAEP~Ok~yj*qWV~(bZHktlmd9<IEop!kifk{m{FOamkxL z013%`1@gDq6K!W))UnMa<O7MK<yJ*?pZ%Kdf(`2?j<|AmLv{ywC(p^{%AL_DsJMPr zm9^E7>obB18vB~BfJP5F=>+@SvsgxddTTT{jFVn=;g6~22Z{IZ2;;oyMwp3qfT{GS zX=Zz6{nwc#QLe2tI}G>kL|o03BHR#L%Q`I-Mz*}xko=ZprGS`d0X#`BZ5rcVH^;0K zL_WrI)ZRf{xq64!)38BCDP<m^uCxYdnB=d|E11If-$Yq|!yPn`_!;w=uGuv6ApWAq z!lP{KcOGCpg7BxrYmb;TPZ@paXoxoRxPAwyzV39*=7Y>#`dt>Kck?xLMw%{;%>Rai zTRX835hAIMMTb-;DA4;Twb)?>ElA4q%Js~LboRjt{8>q6!m+<Lau4<%f%a=+FYa;k zy`YZ1g0eU#$#1qlYtDK9WK6)ef8S1nXyeJP%`eO@2fdi&n22P3H3lydstpiBnw3CD zlN|bWLhcIeN}`6(84Ffhez|aV#Mm~FpP&vgj5Ue|T+5+Br(5%74o!*oO2|#a`*w#4 zjZHbf4{nTvXd2st)3`)3m_0IBUHCKQ>=Obkkm<*H&q%qSJ)Vz;U!HhhmJ6r-9;Yeq z;CK?5JZ%W$?!5sONaHi)PvJesilXpW4s(`dDFjsdSx<{_*ycig%8QQpG_$a@yICGW zQK@hlO_?5$H7hd|Rl<_O9J~s=oG{W?Na7R<Gf}|rDK}_EAuY}YYV#Z3^&Ve-hMwXG z&gzy+==aAR)9V9wMlgUe;!6*z)%S-uct>s6bgtnl`nH>=#6!X+;{2skqPZEBnY3K= zi1Te$S^39rh)f(RUz4|3Bqpu3$&dOU4Q>I%wUc#0xj5*CNB9`~4Kf<lk~Znikuo!; zhs`JlrP92vM(V@OgWN%a&BcBv%{xFkw|3W-VStTh1W0p4E7Wg@!g5}BNhYrFcw11> zwALJQ5KT%Mc$Ok<FJFO82BT=OnYs5A+@qP$GMc%C__W2vfh?00y8*ZF14shSF{Ms+ z11<eg9`XK)T@jN1s@N-s{EUz&<TOpmV0979e61@8&b<*cQGa@(Hs&ysw*nCvkSmT4 zs>%6XA!iKPj`y9uk1p*)N@q*PS5|Ex#Szt{0<(PoRU6DT5Lse3sLFmY&`FVVR<L(* zP9q7Hb63s_ZT9?;Xgh#!nn?M)`Q?XP?-YCFA4aoQ9Yqt(d!HYB?(RfPIKHp>M@Ui$ zXjzPmJDeNJ14+!z)G=BJUst1`rp&CJ<dQ&XdtAQ8b@b(L3ntF$*!diqy6M(HAHfCe zPpp}>Pe+c_3+YC^89IDTY=(n(Q(yTqOx<l;Wks9p(lbv<s>mv)3=|R0x9o-+-MWiZ ztrLQ#+WTsKm^o{JJPt01Ei;>W6h<Ja8>zMJ*=IDE?7&zL18;sfVJ;L?aZ8k40V=o> z=aBDy->*>x>8m<C-$7z21;2>PFfN!!TopI1P0->Mke-w;JA;4uGjmf+`@@!r!?-&@ zrqpBY#fKe-6<7@9FzPU3cS-6Rc#>I~t-$Jl4rx38V5}EYi!J-Q#z}G0_^1VnGfE^a zT&+B{;M~`KBCBFXSfV{N)Rf->J@uRU(gxQ1n+mI0MrXC{I!l}t64l;~cucB|PuRd- z4B+dRRS`lqx8g}L+e+Bczn%6&M%$?e$8aj}EpN+_ljEu-vU$0Jnp-Py4j%gxH>Ql8 z*TlZ^I^T8|eNV!P|7(QR{xNA7#y-@`c)8i%3lbh9PfOn?UrleKUu{pZ_MF*&;jzE8 zgVY&WsIgOIq#u&x6S(@%f51(uR`xo)-lT$R#gkmnd$c0Xzy@2}-;U=)35pHR3@8;I z>Z~N$_p^ei^A>aY_Trht7)ge8pqI;LOsuUVFWL^-_D=@<It?1^ymJ}m&Gk|@r!ONh z(u>dVuG;jmEF6m-hb;1)+Kwi&E?%{ioMjCf)$@C=)ikvm2}}HvB#RV{xsXb`-x*(p zPE&ip&MUhk`{^$G`gik14uUtgl~NpWjy5XLVW4L3{I=D1r_9B`DBup{NNWSE){tz| z%Ll0x#F5|+;CLMIOIkapVcd)?YIXMt`q0MkQ}6@5vIk_q|NFyVwWEPDo5fc$agVcF zU|H0Z>lJ5P+5LG*6gj#vS|4JuY}Q}RTkNjkM!L45i@!G8sZQK2?R9k?xfP3M&mxwW ziqZV3INOayg$mly*<n8UU!^cZ)|lY7+xOLVO5yz80S{0bDACZq?577`9!C+|n(883 z`VD*n!zdl$h=k+MKOQS~5#-~<r*)B(f#AS~?+6o1eU)q-XPj{Q9mf0=M<GP%*7M)5 zqBpDl376gd8j$o<i&7MC#+m!$bRtY5g5a;JkBsFTD1eU!yC2*Ra~WxStZ&58WsVq& z<JF;~nqs8IcC_<31^#|+ulTLcC`%QU^LdPkZ-&Uq%oK%5CJtU-{)Hx{_Uw}?!?3s7 z<>RB47%gJa`H_$D>vB!;HaRBRERH3>@r<I{i{pH$+YHa1rw?*96NOdj940K9fFv|? zV!y&SP_*;ymnb;>2hK^VEHxFJLt@8SoHU$mKP}R-?i)23xEhd)X>*vSd;_|Vf*qCy z?&2Q^YQiK7bmn~5gn`>&q3ML5-Y;I1;&2^O8<~u`vqL&_%%)T<c9O}CvvmT1#(HXp z)MEkBsNoO3*3UQ_09a0q<+Ei`()CrHs~#6D?*h!1afrEvDW)lK9a7o8QmEczl?YQ< zHorwP3c~g)!Y^~@>a=&9A>Oc>-KktN>-Us^R*>#dLY=2`xcQ7OuX(IVM}IyrsM|WT znm;rfh1^K^k$=Sl9yIZWTn==!Q~^uipIi07UiijLcm2;a<N7wYi2lM;q_(FEig1(h zxV~#{lvcwXT(9g|jo84jz4;q%KRyy-9^)I*wOK8|y{jb0;+*2mACty|vr4M+iJd$0 z750U+jBmU@P_c!WFS?xmBO_e0@8wyHWCCJ-1~Vzb+o=997TszxKJ5)s6SZrs12zy- zA#0bCwoR+=_hbmn+<oY*h@|ZYnl_>qh0p|OuJo{e7ad0*A5p%=lJ=dZ#$63{OK?XV zAX^+hKt7_GPC$tFz`<<7kSQ7bJ;)XZjN#rb?J=S?AfyrP3k>+&X<~e}vP6LFQr}SK zFTE|xY&$W{Seu9-YLIzVdrXEsSe(l>6jOC|Cfl+v8s7f^<oe%oy?)Lgs7Q|*#g#4) z0zl$uFqk}wo0c72A=Uwb27hHrSME_y!9M`MD23moHVcT4`?8Pjgw_G{?@}FVp;0ET zbERHl+>1e<&*4oRcOv3UX%1Z^3-6Xckl%i#o5gQjplAjaX_1ULNnfoM;HQ38JQ@Ai zgHI~S-x9VpSWvKm4>Ak~0KS`W37r~*j6XkrH3ut@=Kq{Pd9#Ga5zE^&GR97%j=M!| zc5&+|6jqnYm?d7iSCtar%(#IGFKgXkfv03?Ke))6a;4p5KjAME3w@Q;rU}9;O(pim z!|R4J)RdlLFPtx1(b?pL=|AN_LqJC~<>iC;*gpsgvZo1VX!zmot2xN?W%*Q1CQ<{= z2hG0Y5KfVvjj|$9q{2Qy&Ay_>8rq$|u&T&_qk!d&E@CJZ1VFQ!RE1+S87!J{*+!8e zj8A^vEIaCVP(U2|9Gw(LIAo|WS7x^20tZQT;RXHunpA`^7Z>mZJ^%UG)ulHEl5^vl zDTE8Hg|6J>6(Q#UoUG8?eg`FN!y~2gz!=XrcRwLqmIA~B&Oo1FIw%dCgiyCg0nSqz zl>Kk%U?pUYeXOw)EirWP5^Z2@GTu7q4)PO^Wk#V)N)3Gu9{D_iz*}MbhlGfI2Nh{) zQOk@giy!Bp6ASNG@iXqFer<!r0WO%3tv(W~p^G#McF8fH${3?@880Vz2J@phQRya? z=<^x{K^!h55~=<Z{-SM{z7JlCO0;ar#hX<q7RsE0CQCfjx;z6;a1M}z4(DlOq>;!R z*$T+0-L^tZF14a*z)PIi*OT%ztzIa+B>y7locl7d2K&gvVt^v#+rzbMM6C*skq1S! zq}fg-O2z4LA5Y)E9(&(z@Q8*c?uuVW>!#oQc0NX@JMpH6B0rM6u~`AWULy!P&yn+- z+t}mkG;#e4&A`yD=3i*whRUblwy5(MmJqz}56k-lhB%)4jBzU8GI(4iC3rj9iLX6L zrvn;9lj7W(TTCjPA95VnjvgsCfQO|Skav!`Eo#CgzseI;=PS0^gbS0T@@Vq_HzydK zg@lb+SD99&6vDOL8~W2Z;fN}|8rhh&&Dv<}3*GY&tV0c!kSZL(sn39FUCQc1VCRir z-$c#-{I}k&#-H2gOj9UVo=E})y8xSI^f1oP(jBO)_nn{FHnVjG+Eq#^G2J_dRNa~& z^3$Sn$Az7u%3bDbLV!Cc=KihE%6^j3HkH8jpP%aSpyp7GH|dmm{A|t)UkQk}y$j;* zQYRqf8oT;pMeiaN;U83&xR<0pjlzcH<VC^g9j#siz3CC0b^DfI%+5K1gu>kIq&_@| zn;b{*0Xx+&6tu)l-$!vYe|6ji#tNT{=$B4fMhM(2X6<P^RHd3x#W_CSJp(U7Dvr7e zw}wWdd4%|8%&eRfl*hPMiDrK@F!X7n?XVDDY^9a2SUZjMzLVxF_(*&%$bYDgy7P_z z-~Tvf{>|CLW3DjMvnOCDsgR%hKL1cEM)J8RpH>>lVBJ$fc}24WLGcT@9o(8aW;O2c zY#j_&)oQHI9RM$1>`iYUG3nQ2zst8CxyEE7iMB%Fml!!B>)GvW(W$i>-2;ce`31vZ zdkn-#?;C^75n6pZLAPQ!a`yg1xWKgG!nR$!vhvV^Xpj3XHVol@J@S#cuRolN;s`8g zd~pd7#o^X%fy490kfytpJ8^C3a*F3>6Ox({P&AX>cD$-nlD>*p`8PyG#IM`Grk}5& z9u>I-y$?V}n_Pg_Wt#1R_?yEr+AXZ@_+GF9D|Z*Xh~M6}&259m<#va)_Xm|uE+YFH z51MvL%<YuL({cZ4+zbX!!knez%1fo`Gpu*QA*&$D$74YA+zMksZ%$T;M!L8i%0Y3S zl#9yD+D>#f2lMwg0^48+(T9GW`T?|8V)P*lzqbN6-i+^97v$HQg4Z|cFs(`>>9ccN zP&646qN2TbhsF3Y1?~$@@-U9gv`>%U9>JzW4A3+%m}dl-TVY~E^<T<$%VlPR33=nH zUX1`rIP`k4t{-AHbaLF`B+IVskZimAroQ1f@;CSJy*!_XxtNz8<(u{wM!)Y<W*57; zL>#J!QoELWIHbdZS*3|l$uH3PLk05YysM>Vf3kJz>{Bhcg*zw5`Fhag?<__1_?&H{ zM&Gqmr!U6TF_gJbL7&}P@N>d=a0qt0DnZ$`dH_}c_8oN$x2Z_fW*Zy7Guigmj~HKK zX^Cy;I=E4zORMj=sl0F~mXHH?3VLC`h@~qF_S2YI>ANT&UvwyZK_MH)NZn~O2UpP= zfC{c}^!XfN*scD4HuB)nzg5}F>kbWeL#hV{DrM#VX@ZBlwEp%&)aVSowdRUy)bSt( zGHz!|QEQc3w)`*K@bY@)uQIQ+lC>7RNAAC<2%`?j$o>5hF9cESo?vkWTUH29qNT5> zSJ5niOK&eEJdvhH8_<KKMfKY$3nTMTZM+yA*x!eA`|dY5#IzmT-3$#DajYm2S$F&U z9uE8^pSP)~kCuSFd=Gd<&=<C$u>D>iisIi8o)OA|_vcxwMkExl?rM>*4Jf$!M)^wj zSQjdOc;?$MKA>pM;r33rp|}-&wYS|8Ea-{?y2mQG`EI!FG=Bffy(#$moTF9)8;<P6 zpItuHVQf{E-0R8M?KzN{w7Ms<v+XoS+ASY$=$Ax8oElOV4nVnlp@^etDI65I+4cJz z5W8BuD$_U9*bd79oiJN5K|z>wyVZsvdz~*;1n>1SeP0C1bt9K*smrijcq?8<_o&85 zM?$A;WLYu+eU28pee3WVt<t+<F+cE^4W-TJQ#%daYGcC?9s5;GQfRoq>D?#`lpdPu ztH=fAfKZ<)k<<5)Zp$EYa{B5FXBF{pp6G}h_V56hT}RTsB@E*()OGxAf*=aLG}o+2 zN7WaDwxn&RL37d{U^+L2a29>yK?uBNji44NYuY(!N^ooi?UQ_$-y00H)_3@&@~HJ; zL$Xaosp#t_IjI1}Euu+2-JgJDUglP#Q0nI}P52%q82k;DMI!gVLh=XL+<U4BMG5_F zB5cW-I}nA$Dq$wJXZ^TVWIHy5<96a&ZIm;G12F;d@p3<m*<mstRb*>R_YlX0n`|}o z8>&8++7Sji7UI8L!q2?}uV+E8zN`9<F#FYZRTVR2^^ey+5T=9iMY)ynQ+GDcKA7E< z*_r0?C7Ed*K1FZFk2P1aUu}hD9;s%%E7`0XaW60TM2IWrxX}Z?wYnv}?N5a_zUKtG z+Wgd5q$hBIH0~AEh;7rsgv@bD7G3c**a4`BlbWn5b`(2cZ@P^{>@+Y0PZMIsX?b0R z9P_gqV>Somqvxv&q6zwtH!yEaLF*2fiqY|Q&gT--3cyx43yXou``v#`umiWr#Z#m- z3N7@L#q?aA>terG)?CLNf`*<ZegpgD2U&UBqi~h!wt8UAQzp$L{%u<!2jv$*(KL5~ z=L90uUjNS_?^c}pz06n8b-*|2!%zE{%i~6I<qMV>s{X(cg#-tgEL%((#ZAfdR?zsL zxVrL-8q1Q-8PvB!8d8Z93`8>c+~xl2hk%U}hQAw(V6Hrwy+msZZft*qhlRdKIKE)2 z%UuT#6TL3?rCpzx<$CIsTw5+$>dD{YnNN9Uqi#8|P0pOnCK-<KdnI#_+%S3+v<ZJO zAuG7G9TMGWy3GOI!D0X$O+tOeP0|+lZZ6Y-<TG)RG~S%QB@ZH>A<Qc)lkM^{S9AxB zk7Cj8!yVoIpP2)XeEM{i+>5AmPvj06*UhlM41*0Hf1g$eFNiG-0^@TS?_MP|0=$dD zN6>B^Ca>?;;lLn|7Y;U^#9QOa>Y<E}%sIj(vf!D4ydhLvKsGIi9%ME%-T+uxQ%XDp zF&6hk!ROsH47+MuKih1BmqU!D0MB|~RwhRD)Rsf}Mk=`3vviiPI$XpWA~ka?b%u(a zc)Bo(NI|x=s)L%|zsewPYCmjRJb{=X#Gg-{^R1S>R65t5NCTq;-w?KQ25zlKp07T{ z={Ll5*iSPCEK&scZAa_}i31-G>!iAxcOUvUY%vwc(!E-}_RcNJoK5ga`5?pzHJUTf zy7d}-<#*F=e`9dA(+Ald>32|@tp&v90Z#%>EyKhCOto`~AAoCRM~88T_v|yf3q;1y z2H(yZ7>VZFVdRkR{uwm9MsZ?093ptec&Q~{uy==O@K94fEGTd{>k8gzFYew2vv205 zh_=KW(QGJoz|3N!(}RkNf3;`yKG7i>t=}O`XQ!3z<nHf%G7llo>sb`F;|=T*3YUuJ zs1lm#RqvqG%uQ}5ks3k#f?_SgkD=ZI{Rjjw2UX{mIXt_qj-}o#={D)F-LtO7@Ym5j zyXE?c>V<pn%Gp4lBa7~{cUnBR8-L%L2tEc|mDf^!zdVVSan}ny(Sm@}hU3ue*7le% z0u)y4PapfC%uSvnnsK$-VQ;dPm3O}%vzmR-kza0bd-id`miptkE;gmEC-+B&Q&4HX zo+m*gh}|0H8}YtZS-XFPKLZWN{J=^2$yL)sxX{_F;dHeQ-D(|~w&Wh;^64MsM8vH& z<u}<M!01jfW+SZ5v}8G-n`^lQPDAt(k(&-0A(|}7r5PyeVw#66b6RQ!q=0qWm-{La zTm?CwK>RO8*(_KqR&dn4yxLJuDW1~_de_w$0iMxMTncgR=i@Km(V#SiNze=fxyj6b zXo}l$glL6rh6B@sY2nf}-wRJgIHN0N5tEAulNmLL3m{-(99%|mNA8GLQ7%MEZ%j7s z9c>kFiHLSqWo?IHr{;lpqJY62DV~tZh0V=3oxI9!^_^EC)(e+OUCiHc^=8L+h)!bC zT7Kk8n)7{t_eUbwC8IJol$ekJwnQ}qhMl$|oQ*@1aNLqnX)VY^%7I_$!pZiKcVL%* z3VQ67;d`N~{3IoGE57#ly7!y*Snd6X;a%48YqwK_*Sjb^h04Fu`6E;PFZAZgj;aFo zt9t`j;XVbIGoONlL4T;4gC75p&o=kH2XJl#%(*j}vZq@Rx0aF^o8DiUvAC!My>%B~ zCa0KN(P6Cbt+#B?sV?}J9H1uJ*3R1x>P1GWTQN``0VX0r1A4D%$$z{^1Xv)$GL_9E zf;j>!Rh7N)n(dTCL|`@e3kb(YJZ@h&))ij>x}5a&u%Bau-@ACX6W98#Gp-~w#yQ02 zL3K~J#Co4y4$!$Jb@gF&49N-TxH3re`{*w9^n8#A(g{I&T~koZkBX*&J>Y|-Gh68$ zuf9<-aXFyfah}$C69;g19rbnfSaYpSj53_mmHUtW9V+>ncG!Ly=J0n8=qvWr8X7uc za0dwG@N8DDxf(B2?oT`NsjD#J$`I}d&9+6pEDJF3F%&`a=6+dWW#!J|#Zh}P!AB|% zXtk05O$ZY-@r>P0?SsocpQvpsJY*5r)2;yz@@_$$_C#C{!c0HgQa@f2cPMCLJ9Q^p zN7%7<j#Jx2Bh+LqgWSwsOo~^e@SB_mWJ;CN!swR5Q?6ptA;V5Hq3Fa_Ha}mVM_9dr zayl0f3tgS{`Ahyon%@z_{nv!YK3;$69k_8cxFj*>F+Spge$aE2v}&5X=?_!TCRe+4 z*T#v`pQkNxg{s>98PP+#ioSKccOI&)fPA5C)B^5qq=+se)!fz*>oI(l-P0Q~xnN+x zn0pZKOFjSxZ~5eJ*%u_$oY_jbVv`x%HBft5A3n4Ufput}3y3Q>jq+_MGb7@JvsUz` z5)nPt<9t<bR53XsOj3*lTB}>^=2=JyYfWe%Y|aYP?}tV#Eq<*023pYVk}+n3Tjr|A z%cCD%4T17yy+i78bLcg>d=0Orfr1?34uF`76zo~kzB%M(!xdObqj9*-%Fh?WI1k`^ z_4BnX!PJ`I6NGT2ZKB1Fg8HjDxE~gPFGy>7@w~2^V(23K#WZX|x;yAvyGV*yG9wCv zU1PSK{yt+179Vy=;f@sAHET6{y)Z$;-BJ2Q3pNYxCl0$%1*Nd!2xS>VRy6_-Pt4>d zR{?&D#TmGT_dEr2I3c-yM#(ffM|Q8MQP_5TS2b=vE^O!$m_Qy;_J*1R0|xcB!W%_8 zi52<2If{lT2d_9>P}P&)uVZswztOVY%TP#mW+@)YlOwFRW_96hehRDe_UdLI^t&E3 zm|va)561{+$E-2P2)7(Xy#}}f=0uwBr}2Cg@|YR@lG&d{b0vdQj(gVJh>`uZr%n^^ z<`dLUWreXR7Uxz$xz*y`i`iM<f9<IAITvU$?<UA=pi;;Q1qNIXTu<2>-0JKXB`~Zz z$Rp_QB?kq0)hXZt-_JzVucGnLw^GDLNwWwhnFI%>UeIwOdr3qUJmg5SKnVxAHZwDE zm9qCcPB`LL2v5QoR`>7vhW*=fj87lM*-gAExV4v5^lvN_P`?jM1B9-%Q9{_Ek5~H* z#U#)82W1D7CI5K?-7Oi?S?7)tBT2^65!Z*(JbbqzIUvid?fS^<WwPP9KTV@?9b)Lj zm#b>a=(dxck!p&C23)+aAHSqgJHq7it5OU%v}s)gVfdPu13H#hFrlK;_nk$j(26DP zpzYtIpw4=6OW?Cw{U#APuNUFf4Nv|AY<Do{A5idj7aeuwhn++sSaUEJEVFqi)vZ?P z2h%QlyN*SFnN`-G=4GRoOt~2sM>T0N&ujcyt~({?*Mkr4R_SVD#$i9wYi73<ny@mI z$u*C*^iPOA72NwZ5BHV`Z=gV@5}_A(x+D$?`=WsXeX^;J_uENVJTOxFN)#v7(G<=n z912Yy>$}QO+XDigA!`wH^w1O<m|dQEVgd%b5WG|BbrDWM>{X9T4p7R_5080WO>Q!n z@4T;u8+ZE@%@F4`Ml*(V9{U3GHh*JP2NK|n%f#8;l2Ik*Wkg5ZRWUdKGjU?62Uu31 zo*Ik;z@XI}DID503QWt4|1$<<G4rB~e|t}NfV#OEShvAK(+9vT1ZcI`oU9XY`m9DH zJlRJi>6EyI56RL!p3QY5B-)sXQ*F%3PB1HVleW?<RmL8M2l9QhtETcjF#T+bu%pFh zU!Ifn6_pycvru{xRJC>~*QkwyyECAg8n?lK3iMrj;ROKNtYat9=*Mxvz)_(un7TPM zMJei*g3@BO9Q5QJ8CK>=WGjb_k3i0O_g3$P3zM{iCh5JuRJQe>wP&cjzgO5Kh~A&S zMNq>z^D*`_p}xOj<?aBszG`5Rd!Zphph@=oZEY$2oZeG*#F2)F&%OE#lU|}-QuEe6 zTmkNRRne}YtHKK42U}a(>Vsz=T*hD@IdLnjP^LlB{(vh%FS};5te}w-8+ycfE=8hK z`>s~YZ91u3_u=}pjnsN_6|JTy9uA7QEo&ix8ahg1|52wTqgp?Axu#+O@Z)eJ7oR!K zjc*{vliCynlf;8+z90o$%Rr{A)|Q)A=L$S_sXF2ctJ}CI^yU^*Q|5uUQjrnJ_z?eA zM+x;a?}BJqYtl^Tqlw6{Wth9>3b5v5v@+r<f$Zs1(`PzXldJm#DQbd%yK8f7z!Ftv zepL-oGba??eTi$lYWEtL9E9`>R+VS+r->MASH^L`m2m}3O;6flIoaaRY8aLPQ#(Dh zgYsgwce+QOczk(KO<bt&gM9@d%9@oZZS*0xdHTg$Hbp+I4)+-Y1uod3L5LwYVZg+D z;;Xep0~!C;Y^H(rr5$og_fA=q&8Km%eB3#2T>+!G(w8-4-6hEL#R?^~h-W2@+*z-{ z`meb4^a3PyV2u4yz0`+4<zVbtU9M&>@lUc4W^bPBx^UR%Pg5ux6eu-q!5F-6V^>k! zS+&7|3P$Slh}0$<qESK37#IS7otQ|zr%L3s7M7QVB^+0*Uxvl_OYg;fyOz!`Ru5}A zM8@`{YfIpOFa{09gzrqRc!j#%VL7uM+zT|v?JbFDxj&zbjBTu`Dq9J*gs0S+byPLO zPKgg=#D!(SLNGhmPk4qbe~i1Q(W!lzmn9)hs|MKfQb5RQz@y3pGw=V4zl&*(gWD9| zl^c|sa>`Jqg0*JJk|B7DtX<=DPCZw)=EZ}RSmM<po-IX`eh~A<N7pgHjK=_jxOUij zYl1g;q=Q?Qw-4h;gFW*UlsIM-_df3BbXWd7<!5?s3rOa(=5f7_c+l^Z(5~g9+bQ9v zg|pz@+8^H&XFpF|tR2_W(eO5DX*b|OqZ14#9ucx7)}rlBs=U|ez=S9D{;XRU8UJE{ z4+Ia{w%vv?QJAS4D2%9;raCr29=bmd4%?Q(@<i?B?S0pZoy~cZ62^HO49_kW@h5l` zA#Je+??fnhbU4dgJMtkbkeW%>WoK-BWxelD6^!B;L-kj=fAB?-C6s-;1eR7+no|2k zF4us3Rz8lJ8yl4%%)NHbP4MPN4C#JJw;4w>us5n_V#E4(qTQ~-D+*9`X`Ju33&)-Z zZ-?Yu;8w`dWZ+YiItEM7FTVG*z+f%EahcMl9V0C_;mlKJHq3x3p0Js)lf$?DY0}fK zBWf#jVN<xV1Z*n}w39z6z~FF&W*y3Qk91+nR!J1-(f>^qs_(ml6oKvX4OkmzU@AuR zHM{;kXbk=*I_#&oLR^C(e}`%QgGZ`%JU}lp{Ok1B9AEP_MTYcGvG2;gZ}y*LVl5d5 zHzaAVey>1@Jq=5pj9aaI&O2bSU}-WoAjMmpd!LPKithRAbQVM`Xt+Bvl;1GkR|}>p zM6*n&ddRJipCdE-cDbEYw&YqGh^#?wmTWD`xvq!tdx|v2bfWR-RgrvLRKxCeg0LDS z>h42y;2D%C8KGXy3G%{lxLabY7bFv~FTaMuFcWY33Bg@0O|<TgH}l_a`kjKDe{Pam zo$?p9^hc;!F*)aLKTPKgrR%~AGnT`3-+|Egp~;b2JG7T)zk;OtoSXN6W9@i;ey-mh znvMlWWqndjhv1O!<smU7vqngY-u%TbGsw-poS=>IJ5-U(_lW0keSY07k)x1Sq${_c z82tXUlyn6*Z3Qm~zVQPgD6-~gO2U$(ps{~>ep}+mUBTH3>4%tZaa#hn!u_T5yI_=y z92ya~lp-OOdoER!aEV+SqX5td?37gA2V*lGAoxf>t|Nw($E<<F(zbO0S}R9KM#1wr zK6PX**9MX|X>w-Cm+BW`YwhngPz@pv;KtRA^4PWi>;iSPMKHk6d&JvQAl^4~W-x)A z`0MQoZ1$v1g^V-$b%uDObOeZORA6}EyVwXai)YO5vC<!q8XIy4nq4)5&REiqlQ^3E zlEkoaRGoB26Q|7<#Gc2T!(66Z`SrCpH=-A>@TJzbEw0R_^)vY3NHHlfV^$?DY}}z3 zzqvT#uG^+O5APRCx>Jr<v2(LlLU#qf%}puqNk{BwhD>{VQ}$r`wwayTIJ`{<sZ^GW z;lHy6wbA~(W4fuwJ^QPf>*q?Y*pLm7Lx46Wa5pAkEQ<V;pccW7@(J3neiwv%e%zo9 z=N@SOKc?OV8p=HWAKzA+_De?ELN1e4*;Xall-o>YOINnqO@*c!HMK}WZZn=lO>!Bc zkjqpmTP{Pngv^lJR5Ii;E-{R|!OR$A?$7i8Ontw<^FPjEdUB3)p6B_zKd;;S{TX@w z3ks1JNt*^oqRV3ZTe{N9x##mu1NI1B9qqEtITpaD_Gzk)cf)LYFBCfY4^b6Ix!PEf zkYms7C_k&RT}(&&em?J?pDpcLMr=Ob=<d>Q%HSjRL^+M(HL}VfhBIVEMF2LmVsrk$ zf;H5gX-_aE0Kjp0<F|G6O$cK=oCA0LdxRT%8m(S0)eHiNuPj0kFEB$K@`%9WfI9aL z7^)x8+j$8tD?0LXUzeQa$oL>{_WVJ%Gv5?#xBc#YTRKl<HI1?H=@RyyP$@JW{n`WJ zm#Vzhs3W)`T@>*^rF7{1DzwLP)8_kyQt7shhjfIYr{5cFdT`=aSq$I(m(G1;<%zvD zehDRgx^L)hQ^G62vMjyQRf%v{*%)-K;RtG1ak8d9*<Qc<dfXUlnzVDK$zKeP_>i{- zFR#g7Rcmpu%>2gvnD8&j>}TyKSq)S5_e0yCB%n2|<(>I8`k{ChF*HkiIcd2OaX6)Z z)!F_|r_+TXa7~G9baC|{Dg$?yA<UA-3VH*Zs(RCzCalHX(;wU@J?a;~!jX8--;;Z0 zQKicXO*W#uZaUM#P&Mx-&VtF830gQ^zw4LKX)_O=&~O)CO;As<hog@P>yjFFS{;^t z6hH>_5jQ8*?2puRadi<=M{O+&I|Szuy_JRIFZ{lv!7TUf$X41nxw5!BH2Yhr3;ix^ z+?rwZ9CU36u6s1)^uq3yC~y1bQFVT>`3vXUqOnxax*Vs7kJLpm@is`09z2o?K7$38 z(*kFPHQ5o^JQQp@fCR9Lb<n3FcsPuDUfG&4Z;1(}GFGng6HiC}jT5Y+9(@)4wd#7` zSKeiF9Fg?b-bq6&yzAdgd&h;c4VSDR3hLhPf0~G~(%rpCmD>}87LNWLYlUWXC!E;q zS1N*0=*~?gQzD8JQE|=~WLf+a6hOlSn}C7oIbH9JBMM8?+$sZq9DT;r`BHi4u*oel zJ$t8F&Jn5n$=@gkozR7ShSyEQ@f1$Zk*j0uP+>GKV3XMVPNmI_KKVW>&Hitq*eIei zH>TA3tTOr^p%2<8OJL^fSbK->3`v2xY%VVO&!1ir70*~?G&ip?#gybr`*toKSS)+E z{C9ffkP!-;qqBiXDxKaOP2NhDRagNOa;j_1xE|)6DSE&Z?S#*liiz*jx`#8}gM<}_ zi6xt&8ALb*<We4dM-g-5NDCuhTWycNDMda4QG-n)eeYrc&!cFL;a*Moim1c8z_sac z9C}x~Bl$aGcMZg=gGU5}G&aldqPkr`KE1J4`M-vr@IVpEFuJRCA^sZZ9hjG8vKXUo zUk+}?l<RKbS)n+|!zk<`=lEvvWp+>TKK-*^ERVp3$A8{2-4KIP^;wOGF5bLnb*Fqa z+SG4him`a%kM8|o?`b;pGe~ou8#c-yt7y`rjuJG9`Ncl6q|vRh!Zr42SMFys+YQzM zp>TWJD@<@~xD)Qe@Wh{Yce~x6)XqLLebb`p*-Fju@|Sp2o#<KTdNY@0D7&9MUN`I8 zPe0Yf_z(Uyaq|_*w=JsJru-holgf-B&Nk|68hLA<Q~W^V#%WNUk@@!3jDHA~@@cc& z)+p^?b%ZaC(n!ya4oI&UWkz0E<*+@pi4By_@(GH){j{E@)yB<Z(5A>x>Eli}ia+t_ z#cmBw&u?XU&-}q`q*}6gE%ZPvWe$m@edeOS(q1?F7p$t^sa{O`zGDRh_@ovh{=q^B zFe;u-M3kCJsjcjn67bT$0h+H<#&@)S4cKbm`;eymUw@_iKlrds|C&^JD=exUA1&^f z*n_FQMK;F#J)3+H2`*LX+c~~ej--j+Ou@~n;}Fby^C=we+8KFBN0yo-ZFs*#wwr1j ziopV9iEcmuZItsTO%6KYSF!b!hx>=q|6!eKAfs440v}?}ahi16htlHgbx6Ju<2Tdr zIH9Jb{p1}h>Br<)6pkpq>`v@UlId%hVuTiSkU;N=<BM^^%+S`KuL~RZ=|uTc1*l=o zr&|)=9V^a<mVSM}7)1TN{hIy1dJX@)Fn#{o{#vn3Y-jtEqukN@dNgKNs@?A2G1m_e ziFe7`+Wno4{#_+!g<>rlWyR^n=0Ss(xu{qQCUV`(WwycaVdkXyhRC}fobhG7_C(RX zms@U>0lVcesX!{_35SJGHNqPXWach@Cf2*7u#;`&)XpdOmbgKw3wxkcL8(5Y<dU)v z5|)98`L%GO%n9BDBJoU^9qRTYno1UP;AN0~^Eh7r|2iDJ+<D_TT7?>dpTe7<KpIv! zgu#RC!FMYB8r~M-t;(L$^!WWcvQKaA7|0-S{?~5<kumj>3UnHU@oP0Jk+l`tA`Zty zzaVpNORrle1E@^jLPlSea0+ko84TaX6}c=oo_wsr$`6a6nx^Ck6_3TEzGlGfQC~g& zCQ79m`WSoTR+}A{tcRk`bN(~$u=1PjTB6~A*GG9t%U=c#9nJ&+y9>4Cg@F-sypk7Z z8-t0V16L~+9Z_<Z;Dsa$k6YL_c_Tuz)B3=q#96Beb~sUa9*2KJA$uV`7sxeXFZ|*Q zs~mnDUH_pW>ipiuXMtt88#}*5-NJmR*MDXbeE&kGy?trpE6nIW#08(~9fSzH#eQLX z7XvO9E{!E*l2tjo!cui3Yabu2$s0^7dFnx$)HL?JY?L?K^ax*2p2_WihzEBNn()Tl zRjlJk$&Qf4pBX)S`poM!t5)N}@RX|3sZ~{7%jkB#U4|V!U3m#b-Zk=hWp4C4`Qw@x z3gGw?#aNKkwWPm&Slys$B?Ykr4(yZWvl&D%O)us!mCkDxX&aie5n-Bar^sL34A`Qf zi#G$jiK7Mz=U8L(PunF>zG^S1gJ<fh>ZJeqET651;hSEI)O;bxd%>5$7WU2C1_XKS zH28I}jfH2Z*sH6N3)(rIQaoS7uL{`{G9V+n6$B$cvua+j7;VWDL=WN1h=F6|Ne2D5 zx|>NO8m~ZKhLK?Su>3_KCb;;)={}3m$uIj^yF7xMD*S6c2MBy{#Jb(eN6y^UY&|<` z|NF>`a<ES?jG#EW*F~suzv-?!H)a`jU)DGfzpQ!lPqY1VdeUr`_JxT=i7}U&n`7J; zl&(`p9%?TdJ3g@fukhpI+w?yN>RzE2YIBd8?A3f-xb<RTob~S&Q0>GMx`CiQ4WxGi zoRUk$V4L0}FHQxy_duYi3%bBGxDvDawCl5FFQxyu;O669A`S_G6}|b8!r$abXlbLx z{yyn{bnzyX$z9t&E9aCx9U~(rh(aBEgnRRI6vvb!vbt1u?8WSPsl2#=zEHA-Ub*W( zgnI_8Do*t-<O33vppLQgr<EhYgbbb)n~FCRA;NC(fB=J1YehUyd<KYEQocPbbkmQT ze@>yx-lbiN-<_Bdj(l%e0C|y0gr&mrVtn?)u=UoAK+IPH7}BLIV4R?<2{6w*46#d? z?>ZZv#>Ubq+mWXX9Y&<E*6z~|`W#Yd8E7@Bq(O&*YlG=061AT$C@qbCiU9R~zZdaP zU*BVm-WOXpiq~oddz(7ecjEjz{(J*YXnzvZu!=+MYiRv{vjG0~3IHQOY{hg${>K_c z0o|aKCv)MHW7?vU>TI@>PTcZO?D8q-y<~!+H}FJem<{U(JNt$iKhCs`&D?A4UFmRF z7vtxELOo6CTbDPhaedX}qg@;7Cimnl@8_~pZc_fWSz8X(j(T6{0MU;FJ$nyJd!kU~ z;Z1SaQDebnBYb{qI(LK<I^z)D)6;~4C$(-QsX9X%^K{HQmf@r~8*)honCsRHw^71` zLb;v`@uMl)w7lU$Vq5YI%F(*^k2NgDc47NUbcSu$&S2$Z_DDW^WM@~ezWAOSz?&v_ z{2{j=p%hpX8EsV)UMi1j81Sef4J;>64qg9MeFlu`+wxLxW$Xdu;&-Ckfr;{|<3%w@ z#u7eSO{2cSjqe}W(-~2`-`Tf$elW~XOjx0>Dp1^D$C+@XQTiSmF>tgA9q=C;i`=5o zPG(b~%I*`dqK)U}Y<7c}%o?M>3B{VI2qvMZQx>Kv1t%t>P5dH=ij#`-aKcK*188pl zPJHh#oOE#<nslpu#C+lhO($Mz)6szm$|6;d6cj%I2g2$NMhA6^HEaMzRc;=}TO`VK zaS=f?(e$A`^3J9kW!Zm(2&~pw9KDgG=Xn2w!@lcB4X%6Z2KT2XS!j^l{)afqY}j@> z_1!Nw-4@#GPh#gAcXq$H{y%gB>C46GJ`3?sz36$&+RT8{w`j%=%dy5u;#U-0-^Ye# zifT`5n&FH^m0$rMrb~~^?48kc5Ury-_N|7z5GN>g8t)N%qfuXjG~4ci%CPH1JF=h$ zQ_Xs$v7v)pBloTfWOD0pJ?=d@4}ExKHOhmzxK&uE$KDQ_qI0cf>Ts5kMvG=8{KE2S ztA2kgr0&kMPu#4gROb_e88)A7^KYn&q4(of{nOA3Vv>Fl>iUS2wrJB*{|*HexMi|S zN6spmWxt77smY#D2gl?sUEQTQ9DehA3$;3RhwJc6S51^|1u1p~<tU%=)g@~|WMP_E zO{s94<oiz+R3k!rz65)2cQ9z}i8|VN5$&aFg90Dp4lQ>QXZQ%s4K1pGkBQu&X?x9X zvZQ0m+QCNF#y;y5cJvSV2?WHv)NOmh&(Yx@FZZKExvQ*Vj)1vGNk%%}db6fD(&3;o zjp!<A&-*ujU#f13iqGY?7YR$puP$%4*tf9?^xmbfPtfVzl+tlZaX*Is;Ym?V@a%6w zUaW6d$<f%NKTQU}T(ihF4Hj8k-cD}d^SDO5<7bCA>2rE6^D;4l*SEYKr>8T^1MoOi zzVl0*@`^Je$ae!v#myrq$+^ZV;BIui@>BDRFI8|qDhMpN9KUI<hk6W*&?8u=9MSTU zgT~ui7Q^)-E4pk-__<w=4i_hb*wy#FDyVT(o;m(s3%27cRTgrF&2;{}ubX;;4Y57v z*I!h5F%WCF@48X*ANXrWw-LVaty4pS99p*;Db6Br+ntXG;#Y0@HiN+OAq<c1`T%r4 zU`W3(O!?Ne1&DDgoLPC(T){ul{QlS+mdOD=<%~<W7j*QGoD@?|P5kvwkw~2X@(AxF z1)5c1Ti*Uehf}iqL(~@fI(!?=me~kW7n8NQ4Bhh8xFcXj)IFA#{`jkZTuer%*WxJt zMn=S9*ry_f(sJs*I2r<4L(qSeE{QW}Z`54s<|PeA_Vi<7pI=>-aHA&^3M6amMOQ6O z*1CgMy3#`Yo4{XtQZ~BX%eK8jBKT~+QSP>@<Y}HUdcE6O&YJ3vC5`(z%*&a+!R?~; z$N6BGO;g<+9lzi$!&4{h)U9vEsNmq2`MLg~a$OEAc?~$et*-4^PoU;q4=Q#i{ERl? z<|2J7GwJa@FA?U9M}DiVd<n(bWcuT8ej^^lP_DblbXfxE_BHE2;WJOsCLRLrnEYv^ zE?vd>1&zC(UgrjzXn|l{7if*F+Q{5LP8Exwan6;(kMcKX-efy?@-sZl`c6a5f5#(l z$G`dbc+mekCBLTgMD337tG)-5ukpvS&S$8ar~NHka@933L$%ZW{hxD{-x@wjYWtQ{ z-ua95J)z~!UdoPETs>T*Pc!^P83$en_7Kv3QRml?B)ey>^sv9IXycrK*dt*6B)uUo z=C_icG@t(6Y>!zl9*WJS^zFwv_$^rE%)YXqi1itLT-4Lg#}u3qBTcz<|J8$DoWd%; z;r7{Rff)3MH19WjF733$aTXb|`XWk>^|X-}u^sT3UFAO5_S>Z;f2Zj^{hMvO0TxyS zzB*TZBhg<c#d+eu`q=GL%%iFDje8<b7^>2L5Q7--(RF?cwNXj2D5|Dx$egxo@^1!6 z1b3DA{%bxJw=7sSlBR)kio|~|8DSZW=AuxLTsO`3&uTrtfYOeWbXBts3Gd<t$)obn zGiKt>?6>()J70m?xJdl)l)n0+uav9nMzr?b`QS9AYUzumt$QXITwdCj$PARSmNwgM z944^bGVDXfDOgeuGKFPI^N)UM8oWt*>B3q<BKG=&Z#IcXp;iW<U8_XVqIaTKqH<;5 zrH98TRjD%e5pOsc8Gic#^r2e-e25;uJ%a=yDQfH|hC4|w6o(`$=6y1~9){<euorgz zPk%2og9hTo|8HB%P<QR1XTemDzWu`A6mF6yscm226NcBPrEEaDhuF%B@d7gLKMud| z(h72C<{5BasIl(bbA4;j5k(*lP6Qo*FHNrhSN<};|C29uDJFdporPJ3f3_6bge+2( znP_D?=$ujYxyZ`?)^xBQ?o#U;cjI<F6bN5(*6PDITz|;=rOUPLioK7XN&LoIgCmcX z|299~aAl+0=~<27{&QU^k4-L8XbIBEznTY6HB|hWn6thdT<~htcOjBKR8XYc=SwuL zHvH+^cTWrT{-o-W=BRXM+T>Jy6-Ey8^0+%iz4WH&B6%ukbkhk<J-4_X`jFEzj0cTU zfxBZ9Nu4M^-(3Z9lmvhsOd>{hhG-7&6q}FWR}o(quhk!Q`qnT0jR61agrEH=w<%mv zpnso-^&5}REkJs_RU5Pb2}UxDZmXj+E#HN4bp?wkqk?~_y?ZdZAtLusCF1F%#RN?m zHS6>-JI}RTTVSCLTx1H3(@YN903Clj<t=h4(SBNrFEA}d0>5_4P)0gb_Az-|4Y$MP zXRPre$7iXDfOO^7>*=!bBMmpTGyla|x9@qeRi0Gx_;9v{$;WWj1uZo^Z}`)F@6~sc zY>?mY(TyfYCQ!d9LAkfg@eA#&)312g6KCa$|J>6#7DurHdzH!s_nu~b-secFv|*WD zFv&cnAkN=I)_N%VYes$RN|PkHYfn-3dQ++3NWt}fX4e$2$KA>GeoWDNovN(A4mcc| z+59>Ax(YP;$nyj0^9r4AbaypdSpBh}Iz>h?z{~===UtlVMYpCO!0;B_M|<Y1#oO+Z z!eE6tkg)8^TvhG`ebC6z`*k{`dRlsS$v@4<PdD!LKT2BPM;=bWf;m3Ejg!LsL6Ek| zU77}Ks(bh|$9K_CMHOnlcRS+B-U9+_YwJ8uPsA25wwOgU?0WfUre{g>Yu9h6T5T&a z)T3-b%CKm0O)#zw@FCD^7_XtjZ&!yFt6M?e_htQN(}3*1p8{;~JyyYK{Yj>%|A43( z!+Ns(!&P0HT|M0@E0O)XNW|IW)muTsglWA!I8Ljypla?-!_(25qlS6B;@7XVP<CW# zU#w3*=7}Ypz6rSQiI^@Mm-$Uy%@3oM9{O?V#4At#aWM*7@WJ^|NB^n0XH^7W2EnF! z4aOqQOZ5cr<$3tx!=u6LM<4iF$*grg{acY@AM3d3*UQS3-2pSpvv1TMs~C8N=Yla| zJ-gTIVdb|cK18_(B!Rz&`3(qsR-wWx&P+4k<YRlgg-@{Crd%i;rvkHrf5?r4ba0`U zyX;J-nGMg5W;@eEFZ7)(+Oi>F?ng#thQiA99Z(sDozJauZX}ZjH_CwR)QeV)L~8&V zJ0f$Z-q#?C8=KkZCm1hVNH5L`8&AD=(YOB{6Lz~c**LH?8atL6n67j)Uq9l%gB7ZB z%lH8LKnZI#GFuU#L0AHUWOJY!0llCR31G|j^hV0og5K_n$e1`uH8EXv?x)Xi;Kx0S z)J&CXgW6;Iup7)G3aDkM?ZDI-MxN(e&N-qt*o^W<%oMCH&pOb!Kam<8iG0{~ek<rR zHYrE06YU0>B_c{N^;26p{b!8uZ(_F-^L~|xF|j&BDyV(Z`GN}?*cB+#D(Ul?e$e6q zLyLnqJ|&yFSBX&6K!oiu!nO^0U9r8PwbSLn-~SAloH~3|Z>jEjy`{;=Kiez}V9Og0 z=17?r+*(Glas0EzAMDLktSkkYf2K1aTZxN!tg#^ygLEOx3uKC-4e8svpXl8{wkjkB zxkGU&EF4L~m0m2&49}?3aQ5x~Y`0=7T4w*J>6S!68xvg+rz5iOfBd|$1hc+Ryd?T| zjc1y4zJZOwf7pR%%Nhu0iSm{`^M-i0%#V*#q&+wZMQ1)K;&w<3Kj$mf{=&A97%R8T zIacs_jgLFbKRJ#*N++XC9hVQ@L;06I-x|)vYtf%2ii+H@H&dic(MqbF-+OnQ>6Y>% zXXZ71-UMo)<0(V=(X(7OlEBDej8ikTG9ihAqIe=<y+bF?frhd|Y{B!(g+JTb#J?0X zEyjP53Odh!mFJ7yd9-d^A)_d8>_7quQH^QLJM$=p=t$_6+gq2K!&f4ZIl?li6n@*f zsgQ97Du)LHFLAJPxJ$yKLv)_1gOABk!O?v`{fZTy=HYyt&R}}-Fql`!GR3q)-@B{M zHdR5`jJ6Y!up)RjIgB^oKxS#4K5)dhm$k-j#(93qoRaN{774sGMM<G8!t+ipQh}$< zb=^f-?oYnd;arU;6jOUa?LIQ*-D+H>z$@2Ykly?PzNn2p?y~vfaDBZFdU=k|33Mda z@(mY%7|9hKzpw<iPxeD?m)+Fvtf5CU9lxd!vtv$7i4H21J*bttU;$Oc#b+Y(Kk78C zN!^9{<BXKpwghF07S=tXeQqC^`50o-lI!x<7lb2R!Vz0*ZgSzl6hVfjyK&RZ&+m)g z_K_(j?BD5cTMlvu-m`VKFE%zK3&S+&95qZn^k&hVIDVhv)Fhblp{}{WN@8)sX5s=+ zIJ>?ELVS%4ah%$?6K*ixxRtj#QpJ(>vmh2u<R<dxQwJH%VmBTIJP+*4$7mYj0kJ&4 zNGLq}6o(gl90{3Lu*H>^RRi*BaR`r}%f~6;b_s<J`O?rRfYQ|;lMXYcRdJIo9ENEu z!>~Ot!9`3Bse6Q|yxPF&CFGMtPT6HM>xEci)8rYb&1H?E?-@#{z=8gAr^O>w&wW_o zuqX-~k77hzw@B1Nuy|7iQ$d`<A0|d3-r22`x&0D>|13wDDV5i$CM_ja^vJ&wA6AZ5 zYf2Yn&qylNo$Z3+=UzeUq|7Uvhm{p8*KzjP|D5;sO80w<X8Vsj<Ubhj-ge?mZ;^{y z?~omd2b4ioH&Q#6%@;+lYv2E|PGn|I(_S=NNDd(t#Rc@8FUVdE9r5FJHzk|eN2ca^ z2}Rrf)vTTztY>4wb@A+3<3iYFKXF2g4d*&chzL40%Ey}ML&Tu2jzsBnT=bl|v<I|L zIZ4|LF@e*+(&h}|syX9)9}lIRA#DDcC-Z?b0&2sC@Pje^N(X-SAhrf7G&uv!lxa-- z2pM-3j;{>73+MW&$`r*C*7Cc1YM>V=$DQ&95m$Bv?q#|D--9c}E=tP9rr;MD)uH5a z_$$Ayo9ZF!m5bb049WwsM&qvYw<~kSk~wNON5LoNWJXA=gn>L*NYP{-0-5lY(LTzk zOfk#gYIqU3q$Hm%P3(H|55-R4MSIP)X>#RKhF>`6o5-j8ilhQ@rXnpQhH~^bVD;(* z-Jy6XpBpbW-XiBT>=Gs)2B!&tz~wU&`Q#X(5#5od@@d}Dek(=JbmmToaKgONO!%jn z`~wz4*O&=k$mCT-13^$0$wM~1?M^Xy#a%lSovo<bjDo0U<Mo&=qL1x+nKH6YpPrVX zF!?qZW6QLR+cLYY;v-GUd}<zBc=U`UPMhSrw`CK}OJaqXVieAr$6cyr<W(oQ64ig^ z^oWB<HN3z8MV0GAIZ6H15*k1eFP6{{bRC+THsOZzC<n7F(DA8G_3n`a*mM_#TV@MQ z!9FYGA@L8II6|4^-GXvfLba=u5g3ru;quQ&geux?UF-dcml8KV)zPvB3P+5)IOB1H zj2ejK=Bq04$|E60R|O6le7$~keUqzP7|4_aCvu850t<(Pl;+GSLO6^!C#TgvD1(fN z%qB6PS~19Iu_TBq7E{faC66_$Tm;F7i9u%g)7665D|~3Y2AQ;U$=~ePnqjG_xS*9e z-*xe9#I(;U;`lo8Bwq70hPf^B7mm|;cj}c-!Rs-B_kDI>eQ;Fy&!D(af#Wc~Y$UPo zITg!_O~>|!q?~`pwWP$CUuMJvb-Le-DqD8XXmNN-Te=V&Q&kk0eb~-Bo$O002ICE) z4~GSvq8KcMUG7^ukWVVG&2WEcce#;}<Hr4zyPEnCb))oo7Up>5UC(O|p4?8_M<q>K zHpOD^WNO=g>?l&OZ3BDJ^+!2n4w}#a)-k|Qcm7mbc_TS(vGX5IyXAI5Lvzh2R#y4& z6?|iwe?C(7pvpx>5Qw$x`}El5Qc-0W!no!AN7Ef^yt3Y3IXf|!Zs!0*q=-EiHXC}B zf5v{s4l){+d;1!TGoeRNOLh5YP|66PqG3r$`i}gN*pN6sP}tC5nLK(Qc%M(~^#@Dp zl~}X=I;?X4{y%4+YlPjShk0ASJ+L#-?2g+L>wSu5kb`1<=(6Al%yLYQD5v<hF1le( zLy*J!=4Fd5*o6efYTRb;8B3c}nJbzik!MH8*U9pAh!-0<zi_Dyo{GthGEI{ijeb3n zl7e|=ikG*%v0b>I6<x8&u348Ny-=r*%U;bPnGE}AW|z@SJjSQ+ga^0N!072k1@m?d z>U>33=3u3w{?3H6t4pn0vvu<>jb(;+?T|ya$<rDgm3{lxTxiLPymmy(4HNp&n(PPr zEXS-LOUHY~H|9Yx;Pk5Ynxxk)q9{*FU@WaA)v=iX`_{Bnnr>UqzG<p5SEhbeP1=l? zZNj`WcNAYS^IqrovK|g=by*Z(pCMD#bE#xhrLBDE_fNZoQ=IoMgW?WoDb8`!thw|r zVIDg4su&ufP56)B%~duZyaH!P(Dcjj0N<8hDuzY$I$YAoAhrWt1LdK^k#hL5s_WaP zZ}o3<H<bY)wMS$9b7XK`xRw{wdP}DqFMlF-`M>8;3J+cNRkh3UDi!%qRL^DAZ3|Nc zoKiL2%VD%t2E(Nlk;pw$>iV3t9b1XbrAabVCqC%uJw2Ksk}2?5WofSC7Bs_XUt-DY z#o;&lQe9%x(9PykdN@PB{-+jZ^)A(dc6Zx}h7iA*&r%oHrxZ*~V!3Y#>SfBjU=_8* z=Y$(LeiCiBY1S+kzDIK`+`izYuc|nHi@tg?Ex?3uZQ9s&=7rZP{OJ6Wj~&8gF{sQi z>-`}S0_J>Fao&n1ZU>oV;kVM0OPTB5Ih3V=G6}d+R*kvlR}HZp{@yBWJs*uN`hgSN zAwg{gqDCT*jM}7uKBV-t2xJP{Pjd4$F^ZFk);Bt%Xz2YCE+kEYcVmPZZie1<>}E?$ zV9&1l5M;8QWxdOV7rf%alN4!7H8ie=Gx7e)o;<q<-9h1?)lkz-dI4etIYBlP*ET)^ zt0Mww$?8#5fZI%~fy*xatLl|k^U-X6#Mjltb-dreNFIsGr~4rZnNe6+4|%=som9AU z7@-r}{1;WZeDvtj>&`rWH)m91+JYZXhZfWq*?gnXLzpDVq+1vwP@Yj>&md1i9wNPj zxt$Vz^~pK3Y&F$7yqh|G8Y+;sI8W~38pXvAWcq!KoyfvVn1S_8_gLt4H-`iFQLL}G zIT1&bR=N>`8s|~F(xaOnor?1@8pv0E>QTMf8gxC&K+qVnVsdv&Axs9LE5;mFIEgpX z(=yTxoKNlDIH*EB#_h8|;#l0f%k>kzb$4qdrXbZT`?;g-lxS$VadB7fZR0qrJGMzr z_|E@ql`W(cM|oiu8uM0D)?A<I(?f4&?hbMFYA&5m3W=vH*vqcB9R7Hh@{YCqG-k4D zO@CeA%(gWs(`Sq}r}t#dE7-A;F@Tm^1zmyIkM(Z-a;)U;K<bi|65Fz<ENRgS(`N<J z6bIQAg*IB&&=M)k^A{XbLD`Vt=T2$AYP-{RL_8Ck6Ani*kcBkNzkpXZHt9zG3-)%y zfM0hYGm-5UrA>*1d|951Kti^ijZYrujC10D3S1uWML}S_sexLI3jtD_nYci?2NWGw z(Ut#2)C|NH7rI{!nOjb6BkNfdVkHsf;=GJp@dW22H19poVLpKsy*FJQp?X=9EC0l4 z**@_b%WxGqtZdKOLx!P!sVE9YikP4wr2g#v`JxT|4K9ggg}V~{N+>HZ3j@$#$;ZU0 zIM#y@q-9T^GocZ8@x&mhm|q63#2K=eJ+#e;zTccxD%Zf==&&UT%FG7O`Hh|;`u&RB zxE}4Vx%LP9)tj#cXcy`*%b4{6%&Am!6Yq{nd}!STSCa2}%?n#5Yn?Yn<F$91ik5B- z(n5Q@q&Q(-I-@;Yr1`LJ^<-|nT(&Mv!HS$4TaG?0;lBedrSbvZ<XL5)7PaPaCNB?F zhm$}tG{g&ep*+kH*B$nVFJo|R?p)8Q$+g0W3QipHCPlXF5j42t5C=Ydf(qNyBDp>s zl|F=_;^y)ZviVxb#v&{-9L&1Gi4KccIgCt*u&fa^=#~TamJSQ>9bvE;HsNQGQ`FPQ z;45q<lnE7bB9H}G7&)bK;3s#ZL75v;eUTuB=HskxbOb!3fH>fZwelU$Kzt5D6Yo<K znqgJ1grb6dRjN?cELzj?1ayq5>raq1%W~!DEU{uI<lwE7*_zLCWc_j-lmWu#F%f9D zpLt2snXnL+JV}&JwxyM_PN~d^qtd^4_*HwivV7%OHo0{rotM}3Fv76l6P$hmY7Bvx z>m#Q<pmlL1379yS#{xz2w~6-QXpFtCNYL57Ch$TVWK`K!u_WgF&Y$BF<d3zNWgXe} zcH^1sq{L`yRXoM?712+-B+hTv%>0G4=T5qF;zRMhIwH3t<Z4ibon$HYV1FOzkd+$V zY&poZ@&6%bICmtxU9}mmLWoxj>TYV1?UpM?^MLeNsTuT@v0boUH3nylXi#lcECajc zbm??0i!>@~Mq&YAj+{HuVonTAnspy>TL1*pMsF<?p@ZBLaYQ?v+C*#-SyNrr3c#=l zg4d0|5&A1Q>vWzNr{4V4xJ<q0fGwn3Lrou#>6gJ-90p@V!Rh97fJ=GkGiq}A4<s05 zot7m^Al9V0v|ES3V3fE>c8~gGO7mDQMqjarA$14xl=9ACx?P@`87N<YQ7Kid%DTaY z1uR2$-lx$;$7Fd#&xOM2gt;ac{T!cUH!YkIwQeWwCZJx7n`sJkz19`f>BXhl14z$7 zB+ja}3Tk3HS3*rKdtzyv+K?@oZ4O9)8NcB`zx_eNJvX0oL%%c;zwDXUj2Ov}3p6wS zFDJ0HZ^vb#!F>DC%7#D5LwhWQWjlKMjSEFRdd}7HUDgJTd-Uz@o@|+kbJJS6t|w|} z(_vn^sy&3ty<*Oe%b5qG3O(a)EK|JJmvhbHOt39i(rkq#W1$Zm>O*RnGzBQ9)n`3~ z3kUl?1>XaUKk|mER97l*UtELP-lx(bN`AZ{BoshnA{t_ZI3YHYKaf9=P$Yu-CEP8- zwIzf07Aosf&?FFGC2k<+O}9VJ?}|7h;<qFZ8rDD<1kSgLKo;RyRllM_;?L(qBDVal zZ*-F)S2f2+)1f2SQ#O!TL1y?l-J=*c1m^OaLv2|K&o{6$YOf0zi5@myW>eLV>^8<c za}o|ecM@k|@4HMa=Wq;5@-VM?$nLeKBHh<Xi<iyD2ecf!H;lmzD^n&=m8c-`N@Xw> zko(SKm|1Incwly~yXg`30qm@G)5*S$BKanYaq2v?CVOe5Lz~qPJDIwg+gvT)yWa^L zU&oGJ)z$IDCvGIDD7+^riJY|3e5~{NhEwb0l|>1L05vtbH=Q(O=O5MBTiFnTe0-Wo z^7~>>cG8Jc7!SlDlZShTbCHfU+gmCj6x#L;)xO1=PUcsgR6eOnwp~TV#B3#bH+Xoc ztP&UReB3`@HUej}7q<|-8=up3X790xU-E@sWIrJxesW^Li6o<i!}5W0n1;k|87UBk z%q~%V5$)tBum-W?CjH~oZ(lgkOz`4>3aGfsPl`i)s-b4iD$dw0G#&Xu-gTna-L_xN zRbrFJajq@=XE?#J|7DWc(Ip?MQ<ZIsknjyYi8H)>Uk|WA*6n{saB?r7Pd2;y2trzv zpX^wHtiX%PS0YNGi-@l~z@63Rq@PIacD(TmG`EL1v$yA%{{REuZ+^sg8|sP+aV!vJ ziK&_{+%=gS=j3hR6BuMg3S<7xBI<4L`GJEGEr6-%6ZWMRaB3FvE2_5&CBYK%NZ#oa zD93dd$Le!YIg7?Ta~X5vhvpZ&&rU#tlmAFxG1RaPn=^9FBkQrV@3D(HCFoIN8=PmI zp6m803qRvLc^T)>Gxh}LOT8Z_4sQr(19&c$-`Ch->m#KKtse_Yq`B3FD6d;*>;keR zm9=SPQj?3KSw}R7tL|9|1?@DPC9a{C6}!w#LF{#Ky8QxnUW%*i!d61Q@?(i%f}`5p zH;~Frs}k~Sdm3?vGPs2}(FjPT%BH!QWG%T$TnsFQMi^3s%x2kHnUaSz;aK3M{{z{9 zNZ`z}V|=6=t1e5j!7uW_?w<=8I0+1Pf&T?nqfwDaC!ZsS2PAwtBvDm!5Yg->jzXou zPX)*~yh}8J5!S3e(nQP~=Huwlsferr>=l3#>P>H~o3+{R>U(B1i@l7<!!2&c(4&;_ z24OFmftXDw?B;uRYu-mKlh0A@Bq-z`Dc5)y`x@$gFJ~($P7A6@hwg-T>Q@&^_EPcT zk_q^P4)Lzt%wFcdSO7rnyczL9g0v-DcTXM2;)VzP0w$TB88bBh)Ew5_V)(4D<s_j# zm+|o_D)AX<bono5LO0pmNfQ?*c3t8c`3h!y)L5SsT=F5@P_$>GgdbXLC1M`@c<)0N zDX1(~2`W#R>LL!~$E}8>y7MklOq@9}=&|oA&JKGD3CneGv81O9X5uK?qv?@-p-a)( zAwvq~mD3%)a2yWV2}fe<sZM|#vSkbz`A9VfHRvP=hr{9SwNGV)oYg)>1Rk&!$H4|5 zx_U*$kx;vFf1fF2C?lVWCzOfg^zQ<fB**B(N)j@uaG?iY<h<DnGC5Nbj0IJ`n!L+p zd|Vbgq!SDOmEgCnbr5@XIMccKb{6NS^Kq3s5O7|?nczk;>NHX$?K=lEm-(C)Ca-o^ znR`v#k?t?TWwv(wyK1w<AMC~P$AZj)=9RHy@9^HIEo~D8;;=cF(|*RomTqxg!Fo7V z1Nv#EV<7V$3L9Vm8CJGgX=tx2Ze(x5{3eTk@X5~j(zW3O@V_ob_8powFSahB9qGGx z_Oul9hcrIpuu~JUmdrw<3Z&ERdzY=4*ConjQ4^X9UA)jFR|A!~uwuQOY18TyKRnj< zIL%;k_lJ-|L0O8(a{L~@Zz%ewu*>ca1SxY5LE6HDt}S5gxp6<a5lIbIlW|m{_3%X; zqYhi|GX9UW{%;{9v!S{HIguxGXoUbF2gPMEB1QBAX%u#$Nf1Z38c0%A`G4FlaS-bP zmBIh2%GgH>8UOw20Z?iV=TlMeANb#7^uXE*s%Sx7cP^_+5O`REs252Y+{a(hszG%h z04WU0SL~3`xOEykdroUUGMb;Qi5>f@^_sXH5#s#Y?u6jEDQIc-Um0Cj=T~t^+fdXU zZ4>60T^Ug7ZHi9njjx(SZ?oX^KtDm?mT9xhbQq3x+|KO-=XU!dE%*}(7pa{U#@0;u zU}f5xOkE&Cjh;fANiH_*rN>=McYSfu_h#|NiEBeEad~pw7G}-kIMbyZ^0^-#Yq@Ek zL2gC`@4g^EHwIL`;DO0sa~-8cTZ9?lPQluo$0bhhL!kN=e+7ZsTCHFF6}x5hjPS%p z9d`VR<ze0f=8m%+*nS49q2?Zq)4Isu=ArANzv`2Or&A)XllpG4Ak!vN;#?zA2}!5l zLMo~PSq_62A5wWvBZeIbSl5wA{{`hyNZ>DGiB)dCUq2zA!90#`u;H@GaNz)#T2qsJ zJP_4cP=cmZ^)*WZPC8lv*(n@3%dx3}CJg^o1(@gqp@g^>0N8#-n&$@-^Rn+CD(6l& zPC;sy2M(sWFu>!X7rlYI<(coKy%TPiDkX|&iLg*PQghTtnNiV!D9>vIn|iAbYh6@L zJbH&1#-UJ|%unoxL<qsd+Gvbz@~}BPdG<i{wuNY0Ah?$5+OifYbl&lk#HJqnS>sSk z`uv=YFyk;$r9mOo0kkvQHvn<pxHp#)hhh(-tK+92yUMp#nwTXGhEsoJ-%s3rZQGNA z@TrzEz6O&Vzk;+o-z2OL``%?4CdRb%!ggAbD3-FK<nk))Z2sZL2I+$0?C|NhFfD5E zZpskeh0#AQZwPiJqBKRi_H$4p;j9DmxvJD++5G+RQqvb@6kl%U=Anaq$(mb(?(pA* zTV5*q$-$EDc;<jZBNc9Ah>;wR?XZ{<&>@YOQ?9z0vqLUFmIM1KcfgJwPLL=*;H)D$ z$B2|V(TJI^K^Em?xyE*O8=Eq}K*N;6Z;Gy;t&uZiSfADzBcE<g0@m@1h)`6gKfW?- zJZ+rXjUC)l2%SN|ZtPJGiz5Yt+gwIT=h09AtrYHoM%ye(lOktS4yyA+L+8<NQgS%r zNkxhFi~PaPk&RXS*%FT2cdzkD-<dc%@QIP*EKcO245e-Nu$2l%-yWTr)zrT8pAqJN zE^+aW#qLD9L_pErFS*wcjLe}T1O{;^3hJ4uG&X}YriZHrq|fd>yL`)h(GpYAM5z{C z39JhX_3a>mvzbZ*$`Ny--xHeC89zZ5J;AdrWb+Tc82i;O&)!Trw^&AZ9M_CY%x3Fs zK|MP6AjwSdpzDU|@1fIeAq89fYRQ-Do?di{r47^#jwc@^N|`{|klo}D*5V5afxR)1 zLXx0NW4yejG^5`fs`8{QW8q&JJV5MyI#h3Tf>WJsB`m2gGJS5RU#yE3P!)ktvX^O= zqHuRdY*7AP2Z`)x<7WvjLVpkn{w842WCT{>xCdXa`7@)M@-C1qcczB94Ob6hBUB>; z0}6=dp(b@xsy7oS`9^^+fvQza2}fo^?$LKeATz3J#VZM442A_iRO2e(T7|?({P>)( ztqVZTa@zkcPyrfxn#*9RN}}27s;1}-Q4CsuD?G-B1oebPiWPqhH}^Y+FhQyIGU{f$ z9O3(a+;++IjIfvD=yRvE5opgCBp8{zq`Ez0NWYO_=3BX6P8l+1%%M$VNbC_v_P(U2 zH1_AYDx|J2RKS|2hWC6@#id#QXnMWv9{<ecu4AtKJ-<*Ytv1|bqy**YJRXY<l(xB9 za5o>!3;!WKI**PzY$9_Ex}|+Q%?_R9^99(I|7s09pw1U$m)Q4!v$jqpNqh9rc9+X6 zazxVx4f&4viQ+udbYMHFv@wB29pbpdaRotltP<s=NlJi&Tg=Fx8wf4UmF7g>ZL}lP zKF|@|OwMo~LW;D+80ZDcXV%c|i}IxrN*PgbR0Uz-gbf#pg=`U9`G!-HwW2j9?4h-+ z(Z-x1tB|qfc@kEzsv-y7M0E7Xd0scIvLUu9t0zw38yr8ql~qV6cJ*&3zflXTos%sT znd&f~!;{yjg|2RDA)|0h;Ra@Q!#*Crrm5Sd`*geqQ~@ux80Z%=JRt0GND<LuBeAl+ zl$AY(p2;4j$(fHPyqeGX#mqcHC<`{Q7cfp+<Plwj&09%+33KJF1~%?v>^{q7TP7&j zb2lgJqZ1eEF!f{>rbReZ8(o|sH4^C~GfKP`shftuWBOj)PA5|pWO9-G<A3I8Fqg=W z)vgbJx<F59Xg+Aa)Kn*m+!2)i+TIh^?e!k2cP68-(?&;fBlf-g^d}eZLKK(ek<Li3 z)Y}P5D!4Y9)&vNz<ZfaaFFtN)#wJNid$`V2mSH4!lUrsgoX2`6on8ms;a5?VK=W9` ziR4yScu1!!ZPlP44_oq}A**VBc;LN6X3mGp0%9mcuDK;ilipL>h{z{!2;cNFC|oVs z`+u?)wkj=k{6=U(wzQvT#rl)QIm@PrCkQ;?^bTlzW_<q|UGh?l<8jm?yYg(AnEei| zgx>&2HTXcmHRmwGS#9M&-RPBrYi>o@1Qzu^;-x7QB`f2IpdTQ|8y<5_>6U{Hm{}+t zOqdh^cY?+Wzw0acVM~l_H`Ou{fYqjtKt8MsM3@__^R^PZ9|FqSjg95Q$tU!4cJ;Uc z7lgDsQ`&kZ%}&mYjdPmaMg_e4vndh7e43B#GAc;Wqrw%sTB@I)1zua*P<8Ddv1!Uz ziqXDkLV5W~qgK`<JpWr9Ch7xju#Jq0eL`9=6Ao8z_0Dkf8aE3#Nfc*jVv&!_oVq_4 zqvg!q@pUJt53NNlB^%i`RqpaiNZcN_l%tAu(~9N4GZ2`KdNKk_1%5I{<}ML5jVd`x zQN2WdgQp?!m0rY&xM0T4g;&y97Gt<r$RBBBwCXqDR8SUz(E~PmzbtP8=;}2<*LVcA zPE!dy$~V+XwV{^6gB(eGtolx$fdq>+3|a+%QeASMgpXCgh*AQnUuh4YGH|~SVjk1C zZ9D^Bb@*p-1%p<@lb~iWkC3ElcPJoIx_huBzA=i`V<+RuL=~N>I36^<fZ{Mz1mdY& zY0qQm4)%pDNkZFd>xJI_lByug84}qPr`deQ94BmBgFDqu>?=~Z1g-OXh9L^4a#?he zPD>sB2>K9dV!Q<<W8aRHTyHhrL>0F;#}e0>{*F3CM}afp_7rG4nwFxXtkI@xVjRnp z$TVZTw?T(~L{LSEfuLl#ULSoV`XJG}?&k5c#GvGWnYE4XR6y4vdQs(pIu1R*pd;d+ zlx`X9g}XG-dd`^exn{dFGu!jBc<2Hx3~wcJ8JRp6XDjS#2MSf&PD}cB=h6Q`V+`hS z{Q{PtG4v;TXd~hT^N<lK@RK4xC`HLYP+}|DN)8Y({Q0=)75wOKs1Wji=7QJIZ@#qz zA0n@)Dj7%xJjhxmSza<MK@&LGP>vd<w##!tX63P%z+-h&BeJ{XfxoPZ2I}69HP-EN zMTxvWJk@}EHR?ZhjepKdtPHKQicA4a@{ODw@&S;WPKk2DVLunu?uYHmZM@XYVeX!z z%D!TW%?s{C!MxI%vcf~o<@vK|+P0I<mHI&$&M3@w?sHc#>9I6>F>w*K?3v%_fIm0- z$&tnOi!*EMT&#rI(VEW@FMgKn4isFwb2n}eH#GZves1t@+ml>h&`yv}^&QhB<i(@* zdyRLkX0IWZX#dZ`Q01B#yBAhxxjt^Dg`{nhmNr#sk$pc>tz&%qbg4JQhR8p+zcQ+# zYlM_VmT_s{1?^ZD5QLATuqNN!xJy?M;=P!*!VZM_Yy~^l$@;SRiGAx6nj^{gu1~}r zmXaVO$8u3<shSB>CtAxV{8?!k-(K(t<XUvAs4lFyoS7BCgWUmIbv!I>d*_o$_k}ac z{wE+B3Wo)Mve0&SLNCL;90IZVU)Tvk7G~6Yat9xMNvCYC*iY3i!Se5eYLES(`4<nc z<^`2c&TaJ%-fBLzDOvVlu~+`dq0b?6aYnMUyG7ZqKoKXGqib@NZkV<ld8yj7JTk5` z*bjg$=Jn7Ui}8W}N%)dR77=lGAvPuXWaW}-=IieGmSsqbP~d1jN55yR^gzcd{ftg8 z2_;Jkj*;HH-juX$o%hhhBSRm25KYi{6WQ`?75yj2-NByaM|j?{scl(@{u=fL7OeSb zb}mcfBl&6Kp6OG@XO>sDe9)&p#Qv^3VoJYpO0&H9=O?IGf8g~jtm0tEYe`DMX1YDs zq5H;#OVDn=r8&~MpX``rZ*8RnSTZz9?{f2KwXwhoDM6-nAxIyg(4`!tjVJ>i3M+VV zmz9u4y<$eat&~HOPv$~3SM!1G7@)imFjJ}u&W=I58t4Xf0nVnY-{|^xZE~Je#a4b8 z=mSOj+pA6B0Qi|BxdQgk?gdzovjHkq*BDQ5QT8KN{rO4)Db*(1M_r9_#romsO6bFJ zN&_0%@#ACxY*$Z)QjvG&r{1VDNd8Vy+M_);u1g**#n{fnz*9XNT%3?oHFGRSaWVdA zGi#_C3chR>xP;z#mCJLJE({>|7=2&vDA2Fcu-XT`q};gYMd|S!I`%l%tAbBa`n$8E z0)u{OZGUP1d-H;saTY0b>4s-s8ak%0<3-JpprOQqjvsFoBzLX3zN~*G-RB*d<=DfG zOCXIK`?wLif5imG%hvH>Lz}!-Kua9Q`NQ}V@ueH!cDU|N`ibV6T79&gyv6KrzHxfu zlyl!}6sIy6VQ$MyyaB>DiH*+7yqYguj+418BCDlEv(<|@;?rS?NR!4wR1-9z%d;Ku zBV?S^XmZ=?G0^DHJ`Y2>08thd>;Q_;wI;PQ2kyOH$#;^h2=Ng8{ccf_r;ZN@cB>0Z zA=U%PKqIV3WT@h|yAi5n4s|dX$gjoAtP93Y0Xx->?C1lnhf8x^VfaQl6qw1_d5^M! zDZb!w!S8~4Q*0>&XHrC^hs>CkTtp0sL8T5=X&}uTJ;J9hm<2B&z3_uiD&DGbPti)a z3i56hoL&{!6LUPVL^?lgmWdC=x!R9>igNpbbk3Exiyd1(PYyI;I+7NqMCZD8gkE=b z=>3(}I(c=}!0Uj_ao4oTaQ%o?p!VP1!&fXkX4f4?KMgLp3bt{kUH1pFcu&s+<4Cf! z#kwg`Dp;V{YWj>=-*93o()LfAPuQ0wOXtvGqv@;Ii`uwqu*a9gVHzA&9#T7tqAeh# z>K{aFa*^_2TmpaXNu(O#G9)rKq6oXJT(u%%@K@Y|QmjlCnYFrz5Fb8H)u-@p(ubMh z&w-JaCnKL|SN1FNB>rlvS!SXcmYgn7q-DKHEOwH^8l?F{YJg5cCjKaeTZ!K?PP(YS z)Q_NHZ?{3iPw#-KgTR+e%SZ&(zML1}XlwJLS%RPtRr0_9A1YPKMt%tJTZPUE`Ww0x zr3^=EJ%q!B!jKpgYO`>^<hY~?+vjN|?ICYRtRGU|F;0y4rH82UO|Gq<{jxWf;zW9$ zWiX?uht6z`BE<l&jl!*lpIk44eBVOjwX3nR7Lrj3llrH<DPhm9BYC~<msUx|C`XLr z<zPeS$%CzmHf`hJq>*9W0^KU+I+XPqtfHlU=VMT9E}F#g&%Y&8a->5->!b#kWoNk^ zX-UyT;O=I3Y`o5Nd;<l6giX;N?NG`P)PT51hxWKgU10Y)ZE6^1#%C4_dLM+Esjw9s zpe)3&2*(f{6*2rrgj23B1h4o`rw&oY#0RwiovQ$#T>=eO_VU#tLREToeFzYgyV2oX ziCS{&*s0cZGAz{oq_4_O^ef?(!!3sg7-}T4P;K@7>NjIr9Xp%&P48Ag{`qVY;(s)% zg~0Ql<396{p4(F~h&XomsOryph72ME=_E~oeLq22)-CT4pLcEn$t~5QitKYq=Qu&7 za?4~sLy{-nbVGvcTPQQoe_7mW>_tcCDI3XspM9pcn#sZ0GLZH1d7-*-p#&T2iE_O| zT!--vWsW*V{fY|9;-`00Y%klSHworzlWr#szggzlw^zqeXcFfiryXvIA#0h&6kLyY z2lwyunn5R`-$qP053X}QsmIx|eGPj}Z-YydMnXI=+${VGq;t?+znIOXa&%7lBuyIM zXje~wR}x1tx2%e0tB`L&N|kQ{{>BGr!L0QFi!*0V++!LwH-;4@`iWR`HYB#FqIr$= zZLB(72}Nw3mYE-4eDf#rAH1F4V~fmSK(cJ&rJ6TY-*)`+?Nvv)zJEqX7F0AoLt)Y@ z;hc89Z&F}31@H_5ve+*m^G(W0NDscL=ZdOkVomF@?<L3X=aj^0w}}?Bcu>oePBbt6 zhHSGi0b}{&3Zx5^c`R|Xt7L3vzgU%GcaS*KkDEw#swd1%!cml(uME8J!Ff;f5fABH z+(}Q5&{jNDwgT0=8eN&I%G)BbqLjRybdI(1ZzYZ}Hcwk5qaFo6*D!f=(j<fDN*>p6 zUX!`heo<;hWlY+=KUmFezrYesUahO$b&xprg<f|phHo4m>4{V!4Z56eyY4>`8);81 zh}<!YV!(^dn1GZ?;Du=3`Yemo_Z7KEnT?S4J!|aFl{yEds9cHNe-Ynpo64tR{}Urt z6O<P)qZQ(}V!tO?$I(u0z&ptlhw!PAZbVJ#7h&-t5RAWDS78<cr!(s6!B@g%|CeH2 zsAU|7F18R55KJuE!Wvph{P)M8`4C$<aWs%HYEZ5F?tvb_8geaIuCTgMY*`-qfhDeW ze@K5@E=Ux}J{xAShI095PNHi=Rxq8apc&&?G`s~t52GF=oN~e7z$9JC;hBicU=2?7 zBNMOY;mzF#KGpy6-{mL4s`#;skDp=6Ne0|=T6%66+sO{SQm#*C<@(|=vy}M)Tm*BQ zi{<#_*;_mPfDgis%DFygCt)e?@eOJsz<f+lZR;z|ZkP$LP!_FTL_BRw^v2QQrz)y2 zKvh~HC<#H~JT5%NBg=6NBQmX4U(@$LX$MNafeNV*xs=W7;HmFh4%Ts~@-m!3uSKaz zVfPW*D~2P%hNlK;Hs*D2FT;NDhBe_}p94@0VCH7n=`sWAV<4rG3ksK}uZB%pBu2#u zX1G2pxM}igr`$)rhfxa1&A!d*?_F{qh8z5lk9})ZBVsBSu_;K2hEq85t3~$z*WR1| zHFfR(!YUT*L5+$Eh!8obXdMtKlR)CsrjBT>B2b8m8ZA;3L<l6=Dk>^Sq^N)l5mB+q zpo}7rh>QXf1_`5tIm}5&LWZ5a_gw*d?s>ki=P$VTx_?nOBzs)z^LbCJr%&iEPVEZD zV4|OnnGovd!FZ$gPl#FJAaU&9;R$6y<@$Y#X=6j-WvMLHgqhewzL+pM<W(s<P5x?0 zZzEpmmb?Y;UhI1{?;svPvd~`jeaLmld9BI)NO_NPdu(=QZTr8qKCx1ineQEcQMIRj z-t{5_EFt4{=G;T0ul$ADj;B{ymNc#%{fXcGG=K$kS%0w<BMzkap!iej&;#No(1F`t z%n9LfkqvqmT|5R^C0yD0_(x3doPflfC4PG%n4%uzaqO`A!3K0f42rbxiUD6lmT-mg zZ}MDtU!L^=-m*?(o}Khz@__;#zSNZSQWlmJ`%T^E2BitH8L<2hq&%j->{{*_-ou%? z!3*o^vTBrPvZ1p{W3U{pYm*DV>PyiaKt%jV`HC;V?Dh9h;QWa<*7<`4)r2b#l0OFw zDjiBwD=uxSGSlG_AJ^N^;8C>l%h^zB%h{ThHx@qFw3Q7N{2Am5y-snG>fza=dueCB z=*L(-OH4sVb=-VdJzk`^+~$Qr#Jk6boS$F*x3{!Jxux51V^t#;sdpyO@pEwvS8HY& zjBUDjK1!av)#k$z{)t~!o;DTRZ6Dg+>m{FuH@>j9x29$7rpvd0m>gKNLF<%KI3BGv zYYm~VtnpT!uaZo>!vw<#p~wnz2)vO=^zA9Ea95maG8rdh*~@uAX0JmC7IAxpUlpnX zMMzp?rPy6v>fR?@#^s>CYPs4LFmg87UplK*v|tSL#N03$iX2D06QcYz`hZm?nn%{s zBI4o@%(cKv0fSv*{Jji;7)<a;VrbI}X$l|H@EIC)8$~0JBD+HVzQ_YP^v7#v88M)$ z7}oEoZxi||)Elv<fyXd^e)xe=giBbhXno=Iv1RIRrU~uL&w<%DjR`3F%10a*U3U5c zKUga%&xJPFEmjH@jz=()aVWNx1`rNr8M%EIMp_i9{CoEa(Fyw1x${ofXl?mrsMI{D z+i<lg;fQlcj_AQ2<H0xOyN-C$0}?9PV3{hLmRY1@@hKs<ne+2_0F(#If2Mht#|R#~ zGDi=%ixPGni@!r`H9EgR+yJE77d{>dTkblB@2Szl7Gq}N2QKhS1DP2m0hVX~EaxI- zx_@U+fFkl@+0IN2hU!by1CX5ymoL3jaO&MNr630P7?P{{+dxCjP4fQV>c5sGJq`JD z0r{$-I%UWP{xTJyJ%tRc0BRYNH_@>!`c7k?O$YWFpRC<d;SzV`8wDz)+>(fzh2(DP zS@Ioc25nG{6K`_qY$uMMz6Uy!>%*Ss^jHNcYX3Y4J$KcfaAIdpyN85xsi@cLn1y)Y zwfVwLMeZ_N$p%75`3ps@0Cf$87waZzNZ@FDDQFD#8LL`d#XZO`r$V7QJ;z(_TG8KZ zgXlqyv#Pd}x@KKvZW>&LefSs_V>bnQ1H3~{+D$@Pi5Q2Uc35Bzgt@JY*}x`XBr2&z zoI;7eVVOWU0s!md=2ORLqV9A>0d)B*_MY8IR1nPN*2iPCf^IPvh@-^y4FLJU0n{R6 zU@>i6fL3lb>4L<9>@NaE9RnfKcNOhYgxb{rutEkN)<ixh30D_Mz3C8!wjrr2#~Tn( z4)8gunB|ZRH9lw{J%=>G968axB4O89t1o&UJh4`z9^CKb`-S{24jX_NL$EU+0t*h# z+=FZ(A3?9}E#MQSa7>(T8uQaVMy4oENNhlAVg0wtb&EC|56_xK`1hXOJANa0b7W|^ zu{`iH=C0qE0h7Ro@gJmEuxV01EN#ci)3roQ*&Ik8NvR2BM6fh6Ykr6x8P4f#y593X za*FsOKlk5ZPM6P_!Z{OU&}f|L-gTlU8o%$)$;!<aT@6M9K5uhP^7^e?yk+vF)uVa) z`>9VHSNYTr8W_uR!sf3|dOvg$cRjVp=3KM2fgZoxP5d@>fi!0}ZZA#nrkpmxlKlYB zXWO;wd41(f>D1oR$Up@R#E*eKqi8e!kN7S_c5s!cKL8|B6jgUKi!;ld$9f@TTGnEy z)qgJu%IXy(slJ{Mp(gof=ra&cekKma=AtwbXos6%qSuq@E&`~G0N#nE6VIBg!cU$@ za{2cZrShYrIvlLbo5{dlW`JS&Yo!ykyHQG-HdzRhj2=S*q)&LY6HgAnuF4i;@ih@% zK0)#ZKWtC_Bynr?Yau#dRmUecd~$rOsCos^Ef!<M{%n$r09rW$x_Ayfzz4Y(wBJM2 z+~ixkBg4gm7rHTrhZh}lxWjdPHlHrH;J)?iMvtFrASP}Ny1aJw)fA`Ju@ar_tb(J* z90*V5|NHtas+(ewA36}3cTRb_+s>SjuBbkx?>@quXbvtX30-LycJwysv)J$wmi-V9 z{km&{pWE~?Fg+p}L>u{26zf6mgdX+?D+yq7d-=gAw|4`u#Dzm9n5u~qY=J(=#3-Kb zT&zLq4KU=o2|V`*mp=~kVG^Y2b?>_X6`j*LA0ABM)%NT5mO3`5!%1fsKvU?oOgHSa z+szQ|YRL_dlIw_}ZK`~kuSEFhAn>uO9q1=F=Z=GCTO(h^P2A;?tw_M^z!$iI#@NjJ zCQ%9F<x%6LQGDHZ_;r%<bRls`3kt~d@pJ&vueF2G1z)Xb7gt^K>47um;g+z(cZCv8 zE;O;k=M=6jjpGs@!JJ^Z18FYgVFAz={LZO!Snc|d8{8uA=a|{2187zGrtpuSmW);u z)VB++6<E0AU*a~(g5C{nukz+TvX>?peGRWYOr{FXEjTC6{SGR3Hq`os=JVdBasmg4 z+PBF*vNFp2g3aT1xGUnKkEx~n#f%B!nR4f(JfAp!EThDpmkkD&Z1Z`=6tQhN`Tcow zIA0|8s%BWDZ4&4U#`+40VYLw^SxP6N!vMC`Y^7SCiDdHhBxVC9G8<5<YPj2cKBh(y zbHR0oMjH+mZ(B*An0$7S@#Mam8sSWurbkZaaAE^5#6wej@?$7fC*qz9pLpImg18<% zj**09S!ez@z&}1YCei!XT-e@EonQ!|w{??5wG}NuFPcpQg4hf7e>l?wWzO!s?SF8K zU&e2niaX+I?{?7-tNTPECB4i0#QL?+H$e{sSgeQ5IxY_~e?PJDZtlqOg!mmxPZ_Z+ zaixf9cqH!JWs9<eXCC+@RlDE*526;k*G|%RznBi@Ad6{l%J$K=d=OwpgY)rDp~08) z1D>QB2Q6}J84B7oxBImq*fSSfhTlm4iChGjC%GEXVj(2dO^$7*A>3`x0<g&Q$u1Kd z1s%PIQ8UynlDx<e^abfL^aAgB2|SaUi}v_Dr9%ye0E3f1M4bRnnGOyBGQ#T#I(~y@ zfJ=g>;evEx)mn#XLR^S3h`0pZm$DWqFs<?M2{$!bHbCrl7(gUckhpp{N~Ie|nzZnv zsgVFWR#K6!ashH_@|%DwXhU?QsOP+YIfa&qZpRl`sV#FC`;ip;O?u39Pr6)B-RLMd zMjPNE=LD7ce~wjJ{J6X-w4`V5yV>VOqV28GxZQ2EDyh>-LVZd5^$MNpSbN6r@>!PV zf7V?KyoFnsMO)Q>j7AkPMGZ%9<tjosdBjkhiRx6QLVf8cz-<RkT);#v2#)8A5=+U5 z1!0owh`FPjT+E6#whR+XTrfQuY`^x(Ds`j6flG9P<Pu@J8hQYIPW;v&@iqF&B)~KP ziKS38nFQf|5h{u}j|%y~>jGB_IM~QE9S4+t8Uvt4!Vx?u&ky`UE?afONA<<L-b!Y% zZKzPcBA<<sCOlF9O$AAv9F<7DnjN^&aWIN<pw%l9)4i8133CjtGU>6x;puOi4bybB zV}T}RM}{F?z7cdJKo)2$HNB7y2hxY^W8griA?%!AG%+};rg#3@P}5ZEmPN1|ex;*H zY`=lS`KA-wH-|1X{621_Ili!c@V)}GFmraTY)xkEC^y(kn{!|ZANkl~l8$7SQ5L8U zLU+0C9(sQFz2wZze(l@W%2_C(oj5u22MjQgGfVgZRyxJH_>OWG_ch9i{Lbs$41cLl z&#c9O^1|L+_;ipp9IxSSz($@h=6|mGz8)|KZ=&pNVNI7*ru9YLG`)4e0u{{b;)Hl6 z*p{nX+Dn3a$6)7Y4~ONxE$sR*#Y?%+go2<qZ^wR7XII`NB+JHP-5*1PLWqf?<%UgR z3d!q9-0=#j17M9$M>zUn?`#5$1z@G?lCT{5QfOqI{|#dLN*Ip_%P2r!MQ*8yr5EI< zAZ9ft5A55C{`aTulMXH+lRt9Ve#E?hP~w$qI=Wt;2{|c*AMCkW;u6DkwWWp6xu$C_ z-gn1eZZ}`0=+lk{2>C50Sds$|kE|SK_2AR(Wi3<?Px{-{+QsMz-?F4S(c<ky1bAAq zT?U3inF}xD_)04*n=oz$uS1=%Y?~nyf~1_qcr|TQ2-$24#o~GDQFS`#!2L0_fdd3Z z(;KgG&_%LKB1}7)j>&-a3aO1HiWYnUExE85n5*__-oioLso77h37U%C6ttRkb|RXF zqB;5bPjt1-6AhZ`202Z^M>O!pAXoT`h&lM>6?CeRC{-Xr7mdj|X_+O3`H=Sl-drl@ z-C3z5j4sf_duDKv5*HR>_b82rrD>h&vi_UvwyHl70LL+kA+ywt5~*o>h@$t|*o&2_ zv`?~3MY{|6EAeUbVW{ksR}|qio`72ydN*v&K<TM5Mx3)z?c&qgTf9y$__4qI5R)oy zI6#B7>teg+858c{);eCezr7LNMC%9Ul+fI^y=<F=6tK=aNm2cDG`PG<wkDF^KfH?s zhglG^dL_{79yID?T`ph3@jfD4OuM{<h-4-P_KuR|WOXJT1=Tq~L%7qIkxZQ)>ontC z9-2sfqS4`YabW%Xp#JuqZpy#;Z>pvh)0(E{Cy#l^2AR1f_E5>>e~DyZA*(Sz7x(<^ zvyi`|3c)3WaEJ?|YJ^ORBEuyD9A;fZpvPo`K+96ccpPuU9K>I^y(<KVr}6+~<NJJ! z?*^n!9=4m{vtLEX5HwKng|%Z_FZcMk_=f|(IWDaV>kZA5C7a^7Z?~<dT$G&n{)Y=M zif}8xmg&bI3&|T=RalMVorNCiN#^nAUfnFY@9nps-D{y|uT>0u(qykaynz7J2SkeE zgsDG{FZ%(Qn|axa_MI$l1Bx%HT=<*XDU!Z6KM5cgkEaW2O--ViF#C$VJK#WGW@i*F zO>iN7gF9&Hd=LzV`N0R%+FInC8OAjSeKSopsY=^5{$=OU?>m5&untHCH9CHP7R%)M z*3Rf1A-TxNP3s-LgEGmnsi#Vj=)fhibLF|q_yr*-er+CqBUkiR>+35hjx1(QVo@un zm{UwA1+%-*Wvq~IMjJTyFq>IKcbjK;N4c^FYe+XzHiQ?wwZs1#-tr-6-X!z4s8HGy z!`-6XpFa4<t~zacIXiQ#9h8Zkz--!^y?kgn@Hq7GP!IF0RtoKgut-t06AYVH0Ln4S z84}rl)E6A4$z}5ht&3VIFl0{1OP<CZGl`g{;MGX@g28pssI}#<`C$0|hw1!}L95nr z%j@fHLV2cyL93MWH8_I?%`E^g)^~sWm08Ux>jA5X@+vEH&xT0h)DSH$DE0+8<?6%e z8I$)nGw-dZBEG#=k|DIAuk`&BcSY50ufp};fi|e>-IYOCqX!`e)y-26P%SiI7xdv* z-_23P`Q4_981o28vf;cc(WNe)(lX$C1C?4p{F40B!ujf3n{~9<ezlf^SYD3_0dv*s z=Y_sPEOSq;CdAf3K+IcM*U6dEW1%VFZqbv&GINBU#|z;~XJ9Qp14*Mozl4-wy~GhL zL~)7;NChrM-Uh@Fw&=ZUNthEcX#gAKAf9Ggz?ma|Ef|V}U5wi`u-9nmAgd3Ew*cNM zf2EliHR?qXyukZ!9+?SYDO?SrJu&lyT!Q6c8cGuQrkEJY<3m%b1o=_P2KvYs;Jrp0 zK2Z43ai({W6cxx@Nf6|f$P=W5yoY#~aQIrFwuWw{38W@$!n?4{1h~?df>P2Q`POJd zlnE8BMh|Z~sC2(w{0<-bCG6a+dexh@K<&S_0-xyolX@PZx*oq2n5oxWo{4o<k9pU~ ztauseiU{S)J~c(OKtvL`>PY9Yy;A}(>N@)J3Hf0)X-b%M+`BjYdoJoA%5_x(-*P?+ z_`*Ru!+d)pgLVdOIV<s<-ZEvW_Nl-Si}xxid@9G~576@aXxsDH5J7^z-s}T_f#;TC z&SSRd)QX$2O?c_O<O+U7OcKXX4_G&8_sO+<#kqUQV6xocukkf!zU_7utL^F}&0rST zSEPXuOTRY2F=GmO3qB!m=&KSB<BOr&q|42fyx=fP%I7}p1kwef!|_91XcToWD?nVS zov{WJZKt=O^MU$&bYIKCn%_@F_6(*xI7+6SZq%mrV?ll?koxBeZQ2_`f~?0fGvZn| z8ZBH&c$=BNQt!>sr69Xs+K-ES%)%44wx688hGl<Y`&>gLA=N?~2~q6o_X8T)h~$3a zUCso{`tQ;AhP#BV*j=HC^xi0SIX^drLhcv~Bjkk>>Ed71P7<|DdGQj0ZQuc8QNC3D z&&bmOuuzv#i;3$zRz9EjcM1?Bp+NS{bR{pcRXr8r=~(yIY31<<47_-n^aB9n$!5gJ zG$|7A;6-Pin7@V}xKJ_WZ-SC0SQL>*%VL869cPRu<fO&?uAEQE`qIwq#w*E=7q;`p zhe@glD`j<8W7FoX(CPv)(NA3S)ZaoW>V{7&SUvdt=8D>eCEK-Yhdc-Ghl0K`5=SmB z)7POYw6m@pqbbxei|n@F2{mCo6f!EltQ9^s*ag&@y^hzJ8(Y%^CWI_7H3@X~_rH<P zN7E567~n_ph3b=eic%d47mpQ5lwO=^?9Euf*91lk@(s0$F)|sz7aC;vTQ0;G!^U(W z-cyO<Ji!AovoYJ`Q*ux>Wx{9yc-W@(MrgAtRQRRK5bGQU!uZ06P`b`JWhaa>>HWe4 z$0Ki;BAt+IQiv~B<#?UN!QS(%Xye8`DK$EVw~tZzHL;a>9HXZ9IK_Sc2-!_qJMr=5 zI(+e+<Bm9{&LiBT^YT6MxVVDVCVtur=<CK8KWV+1;KIC8?xIf(ty&c(Xip#!sG{7S zcCLsymAU!Kn|+JIxpr?m!yGT0`do$M5Oc!l)v~A9Ja)+LF4^CtkQ(fc^IxHLq8@Le z9Ek7J(iK5H+t3k=DPU20$()Yhyb(-=jiHu5ZzZ>zN3MWc<e7xzn?;pH(T}lIa)fDb z#x(vwA?izOjliXNjfuS_7M?)44pRnW|EaZsx|$y@b%Q)w=26M*mCkfb2tz1(Vt@V4 zq!b2b3B(f2uQ+x`9vYN^c4t%s);rg7{Le`E+yqFzXEZUIzKDmIQ8G@VCWL~~IK{56 z+!IiF3`y6L<^2?QJ`_plVU6SI@?TyrfS@y;@AIL{*uNT0q4Ki~pX*NISqtWxZ1K81 ztJh1k%KOlIL8(VT&fg1d>Tl*;o4Ct@e!8&|j|FXaZ#_sm{RY=inE|DBw+nkx!oGsV zdNYpNS4@cK;T?TU;}u>(4aNDGl^P(*cyXP`9|sC^a_eT4)&&%|4qH(pNNE56nX!tG z0wiG^87<s5ia9M$qGArg*bFrLEp5aN7%;Imm4Bu^uz3TqLoO>WZ4Ge}CIMz`pU`VE zk}(c*)0!SbjDu*8t0F$?(%vz~lv<LZYT%RW>Dnw=a93w|Uy8)G%z|^109c4|!-~yt z=umi!aHs$pZ1(6Q8~dC$GCpmX@_Hp$0KUwT#kt$6;QylBPQO1n&%k7BS?NIXR?4b% z=KQN!#!rpThb{LYRK4W37Bm!#dKULrHRxA<*he3`<6YxeW?*btCtBb(ewTUAT`>e6 zTpg$DzSno4t~7Zc+vn|fi9My1ak(1og|T&Pcq3{OuW;iyu7G5ifQx5WFb^R_$<99C zE@IhkpmLI1FhVt$jH?6!+jQ=S75TBghTs}N^#1^_UtgP$c(z}|xF}oYWFQK^1JDFH z<mWSEEj@ein~qQI)7>RxegTV7CnROQB$mw8`Msmz>(F5uG)m7y8}PmDNj)1Z7J9Gc z3|T2hks3#TlIp}=Z-?VXmdA9AD&E>f93c_FN?5h81=}7(ThzS}<*Q5AV#g+DOS=D} zJ;?!Kkm5VDPi}b`T6FEi)he%A9b<xe$oE9##Lb*F>?@I?=E@{^5#Rb$7;2_C)%Jef zh0aon$r7>=pwXC)@AojfLv@S)h2Q_TLJoK;V#;%|t)!g-0#8_Nl)<tPWj;{Y;cyxk z+aY}$tgh&j)5o|Ecp7MG!>W%(+h7xde?h%1?n3-MP6ghw5$MC3{v#Uzojw?)<p{Pe zS%q5C>NO*>viN5{5lfW&@=eJB=$&K=1NscKPOFeOg(Sa?GD?=NrisSThM#atI#e6R z-^Q#SyniI7-~pu$$*wrMTuDr7{lecrR}W_$T8m7EeXsqVai}iLr+$mgdM_LyD`!Nt zrssr@<DeeiX}s||h=*zT`Bc3NFe()Td-YU9<y5u;v%0(lnr{(8Tgq};1p~_);Kf@7 z{&`qnUv|a}t(+F^UrTg?gaFz6R^(~s);<q_7iqMzN^}%lgaqArNkVQ>d?QDWI_=&p zjQtzOx&)^A%(px+9c#84dFJ4anNsJ_rd+gI^;W}tKw_j+HIyiJW+P)rI00W3SmekN z89G!lJ`CjdfkgJQIa4MG0#Z$G2~~br`_ZIJC^{dkphaR}6?J5ioyd3XoKl_2(5Xf5 zeFYEPwe}DQz?hG}{UodPX4nDu(@q8^u_218lSfuorY$bizSJ9TnlVlimCP=s)8^uh z0Hc@dREW8BXG1NRhk{=WYB;+w35zn>pax-hEedb-CET<&<j7;_tTE-@kH7o<eIVQO zJetVJVuZXvoAdF1L*=irQK%~=BCLWBq%lCdpW%xtQ91UlY}05GKnD-cuom?~d{Cyu z_&J~BIECoR%^4|=o(^aYfT+8wx2maTA+eRdj4k`HMJbj0ruC)3frx5onPTiaGG58I z7d;74;_NRdk(l5iG@xuP_T4EKbxWI7$zQnkt9fe<E%-HbrxSAa;ufAs`tiB$)#q>y z(vm|izq<#-nct4Ond6K%if9X)I%n+d^=7m8N0Vo22hrO*2nbn)(~(qw7Gj13@8HWA zz$X?#%@{Y4qe(Oo0_E3v)cE^=`eM*KgOW{hM$-lMYn@9^W{zN*KBvlf6pm5eup2@A zVWdzaiR1!3wMN`tV6ABd-lGeFlN_ao@aAheYT)0oUM;^Re1@PnUm&*|LZS<A;2so6 ztz@?E>nXil;?s({Y&o_;^tQzJeLXOF6_>~Z$(5=@hJ1>_hRls#RaYX>MyO57*=e{` zO8qc*PJbyE7*9q0ltYVt(|+a`8qiQ;V>i@pD=L#8vRfXu{9}gAP`Go=^I%=Ry_6Wr zb@OxbdY9gJn0A>}QpxDOgEb(;aNI#L^<N<y`<N=s3n*0No!`#=YoqXyzxbz_;SU%g zXWyRk09^m{3Fdq8;J|m9Ad1Wx(baTQ)AC(92M;6H3j5-O*tg`PG3uc2-<;1{K#{Ag z60*1xeEx9+Ir2NCLtn}d7P!(R`q0K6-+b05X!jiNi%t>ABnEV4oT3n!j&~fKAge8m zkd`W~?jC<^?lJ9Gee>-C5_Yvb$#M=~`OGow5V_QAfA=ZU$AymlLk`RF?5QPWcduZW z6SMsm?#9BbJHl&J5UaR>FvS9Eif-eMVe>%f@w%O+(Vx>1juxK0vz%r5E5;47+Xmg^ zw6HKxYx`<|lzxzFJV<t|hXr!gv=P@u<K~G~=FLdYX6~nEj4#xbp2s0*Is!t4%G5%r zGd01uP7m+Bk#2vS3}6&=P-(1~;CD{mmHWy|5(A|029#a~jB^(VA=sKOLk2-tRo!sc zf^Q!nVm+W!A)jzB)OxGIydUOV-L<Q}6nMsM{r2lVcMR5ED$&-XkL@v;<0i=Q0t^mx zUNw&}6=i!kO(EjHg)SzCDDZ8ZQF=Mb`4^sCG@``rz{GG)<|HK61YBemK#!p*eV0l7 z%U3WfXcTA-LY$G4$WhR~1*3JNm_~Fb^q<&5_)`6sm)p9&0cTBJz*li(&?q!%kef`c zor)9kYhyk`P0UVR#WM1sVJI$BqweV9v`|WmygJlY{<mdo3$!#x%y|sF{&#eSd<!9( zj<=f3VX{@~=)iP=C>LG(VpU~M{U+LlbQzAj80L0Cz_hCs?A~-&XeSRHBkm&9LuX4l zHhV4Wb_ui=ztN80F`LEqf=#ps*96htgr%>RuJ)mx$M=+ane6Nm-_6|QE^?|G+FQFX zLpYyoq|n(ZUk)(a-cULaXy-W<>9GVy)XLwfd50>9mcL=Xe^U3UHD|36k5?6c=2&s3 z(71r5UBDj!T8)-kU11RRPZkT1x@qRJe6&JKV|WbXN6TkA3lN}YG6W0K7E{R|^=azQ z7H}sEy>k1)62B!fUK^aB+v*^($m5DU1XhYM-C~z9yaVHn&Oj?0Wi64AgJ@FUx@7YP z(w}rJ0A-!O^pUf7Zp@C8+lO?O)%}iy8tTHkj{V;gDpLw&#!Wk`V)w5!8jE<#CB>0M z4f|*<v(NT=jUJ}`YgS8dd#?2ho1$z4T8;;~jI01Qh|tE^0<I(t8^wgx#BYc+kewN7 zkv;y42C>1GXca@Z^cc$7&~_SMoFOFt18Gb@_cNuk&zhEj{2b7zH?tI<`15`62qMmw zg|+s!GqmyX!j~M^_y<!&@T_PRPINr7?=sHWG(l{7k&VS2z+d>%y=BWeq$jESV#KQ~ z>6*}pOWMn_*a;s6t0YhVsBgHN^0h29rq7Z#kAEXd(Jcy_ug2aCs;v|mQ8st1_qOhX zCxBY?#5-;AIUxVw1Y_-Ly(!;LS_~Gh5$JYEFc$#_APm!67nVKvCyLO(Gb<O%L1@&B zEJ=gV#0b@zQCTr2&(yrWhmVN%Jmo#8vLg1tavlfh*fCTovryg;{GyBWt9R8=UC@+U zp`HcM*f4qgvF(6B0n}$y!6B|3SJA19qGOVkX%O?`mGjzGj8%54v?{wlJ+TbB?+#*_ zwvtXfC)g}F8yaPEzMSOgbocD_W3<yQ2#C4v_gSDS)AzrP<Y6SStn{uhn17Gkp4=<6 zyu%&EGVfrU6f3}+$~kp4XlQy0@<EZis&JZCE_xpE+SCPfY5>*M6ct?<QdvX~0T|_U ze8bt$8Q^wCV-a3>)ovAD)Y0)8f{fPMs$51a(8>;`8dbKbM?o|iT`G4;k~K&uxZ1BO z<e`1i`gF0E!*LLmkVC+}1RA#=5wI>?+Ie1nb;rs3_0?uU3x1pP16-Z9Y3q`0dm@__ zB95!)7TDm+oeP%X-Ipk;{GN<+w8;DAaI@kLg~fB?gkYzxV8N&IWLQfAvA9doqzBx3 znlK9aGC3zTLrHS3%>%V%ra*`Y@k#H2n5;n^3UVqm=^*hCjBt~5`C^2Xe^5wvvh2{D zuLiCLLUy>a@Ck@A(NlbF!nPtCfY;vWI7^_^3Qrir>ldlyE~50%3)DfW@|{cH)ng{3 zd)vk~Wam}=(%V*znY*t%`hIG=s_ew>k5?@XdX)M*hU%R?R2%Rfa}3;9{@_N8FdfV- zO`t2ey>QG=t;_N5m=)nv(^}NvPw7FL-oowtJDE7PH&!l`_^KiDf7r!Qgy>E9W7i#j zafYf%l?gzunJw__*Fmx`D-N^{W0$U3cmltvkZ%YElYgK>FAk;Xn!SE86v&xTe0g)f z2X~1&1)C{(?V}Dta#w!WJ>P{gxr;cdjhI!REfxqHN1Qic3J&2u)VYA;gXdh_VxJ>b z8rbD&i-9<6&BARU7H(u!SY&WY$QeC$-k0R^M>{q^Z#L)oc}6T_1$@wBEq7=1zqVMo zDVPG2gl38~oisDGw9QF<ve#V<ZXGy1tZupzv__}kHdv2!kx7kd_}Et@I;p-3Yi^rn z<H|!pkR>@D(#WzkpoBN0vJnX31OF30DTl)tSfh}oLOL8kWf)jW>_IyCCLUJQ#VkeL z2L<SjssKJ7&;R_ytUx=6mQ-FDxoyfr53VYHwleE^&uo+J!<||t3$K&Ni%)1j+VQX? z+<M`6{p8)IEQ?jG*L4PFe>~W`nsB^+F?;HKoFG$aie8)z1BJh~cj$dtW>!L|Gk$-^ z@A^{)h0u5=i0awe8ffBv>Z&sfn=AvtDOhSZa{!%Ef8}%DKuLzM+Jyzl`2xN|sPsi) zTOl_1UmGag^W|hArwb~^f`R;L6tNY~nM~$q`x8|N%vT_RLaYlb#-J|5ck`cUK^<rC zj2o>qtbHJgPmJ1S!fy;S;D<wRp17cBh%VncYx6p>c`D{f-A?hebg+}nLK`XCagLSi zO3e%;Z!8~mn{lu8UOX3SQ#tg^L;|E<f4?^I7agPZ_w3^K7HYrY=<*SOZ~_$!rSl8c zu~;=ZeaoWqL%_5q+Aic6>Lln8gc)Fh)4WsD+Ii}9Eeq<J=|)Cl`jfZcmUP2&HnD(c z{#7y1%f)fjdo;@LZ^H~a4p(B^iUY692VPH*$0j=j>9D@xytrkox6(0T<_NXL(v#0I zwlXImjn{N&w{?!3*<@06qIcG!b2-}56%QsKu4(NteDb=;kDzzD;o1;<GA+%fCw=Mx z>DIn$oSh(Hm0RT3dh5Q#!X@`i_}F_$`n!YwdU)A%V<K1DqLn51FA_fR9TB}ggvh>v zI{RC0&CE0R4G1d(`hU=vz1HMz^7tBeS3dgZbP%UJWW=|Q*C1r_4@1{J`QHMhawexa zi*fFu%R<8G@jv-Nr_wfp3=!Y-=ME<Ip90IaAvIcaSKQ!ly_)U3YQzQP%^AH(33+>I zX;F2mhtKmrr{V<uH@GKfQObeEmRAZw#gYSY(CyALb62`K8YrBh&_|1u52p=knm5J5 z`_&*zxkR~4M*ao``${Z)t0f*9fDX^rA4Up|?~KD{Y)WvY-1)zT2X5{^|BywGIA=9E zXJDd-)<1ZAz;zC!Q3elWM-{oFB>a3r<K5xJL0X4{$uE?y#pBZ6Yx8>(uHy{Hqzfie zW__l7n0;uu6Cf503<n~|l9?-iy64?6_(Nu*>H8=zx1srX2ei3)tzr}}?cRkiCtI8X zTydohrrVx^(3X?Q*Fy4U6xRTW#Ao#%%&fuyb9-}3*Eo0wPK~nu_dHw3FO~*l3>3-M zRLUWIFyqdczosdX;cJ>nN(GlXF8=b%m&W_nvcv4(wC(GdSrIU->#1;HV|{I$5v5m{ z|CQ51V*&H{+T{q^VCNwYt6DP{XT`WTY(_m(-@JKKe?p!~3F|Q;f1z`E>_GCtF6k`7 zk5s)k5eqIVq*nKbL+lou)1+#27}#4ZI+HWpX{9jvU`5-~sq5W0uvy%b?CrhtkPZTf zT^xN4n=u<csu*k0@1m&5v?Npjun<jc0khQ|V9L^LB&Q}7g;&9g`(g{;sF_*npSNlp z+2>TR^1|w}WGx{a$Y<KZIqe3*4kAh{Vnr!`oHmh1_JD4C!<%U%^9a0F;7LX(;)c+d z%{es&4wJv$vL9&e1A#XCoP%ej#t;P8q$jn7E8bNt9{S7c`ZiGY_K$h#+JDau+hH=E zqUc_8cB;J0)8su#)ZA?H(~>*UbN}rNx&#`Sn)ob##J9iJ|I$+I9*0_|G1mWsV&tKs zgQDdDohonU0@}$1*I1gaG^g&_!`q9MljrUkbC1oyS2Ix($0g70|8jgx_h08%49P=Y z$eB@1LI^~!P6w%xr-Rf0Lp;N2b$ag?>iRzmco_J~eyKg2i6YB7?y%^V!X7KK>WR+9 zpkZs14>78y?JoxEgD%ed;}?QY^`FrtW+#)wJsAy;ws}LhJ=<tY`E#ETEE1O<WOl>X ztKFXb9<3T%BNry!KZ^JG1;mX)eS%|ZBT&sE>Wgeq7^?ASokxoa`2MBB$6Zj9t@<_S zSSFO&a<23ykSU%@3wp#;b`d3A(_$aFMcc_P3&qETlL-3&`Z%lw40B95Nz>Do&Ds4K zgkXVi#TFDXWnbM&sKsl_#9Z_}0sQ4`#yP~^TWn}t=<EhYmMK&nKjPb)KtF7LI(-)Y zFVbgG6`H;L0DbHUR|gwFB!_9zy)5Z0+zY82?(|hk)~uf(|5>qKwa;}geG;`$tLs<v zQ!jSIJ7Nerzd1xWonVzXdyL)bd0%2*8n|g~r0M&`+YU|eow6}35;tXf8Yr58A&@WA zWz2}=#7GNFDcqUw(BbgK;bER!=m`!qmhuubVq6|y)1$N$IcUHaU++`~2H+PJvWo+C z7iaOII{8gaXbzZ?k8q%W<AQ8|wU5^y0*;g7TRhtw1oh#N_y}Ueesuf5Iz$*)P8^rJ z@J8UU@jL}8q2dhYvGRY@eXS!(FWFafGUfTjwfBvg6UhnNmbb5WCQpX{Kphg#HglH& zQ{4gGq=sU3^7SH+s9eGZRGi)KNm37NXgL<+EV>D}4c4VbMIk{xIGcMEh~Lz&SpaWJ z@&UN?jCw6IPUmGoTCV0ETtGgrZ{_aR4DDrCfeVAztT{&=%P86IittNwm<&zDv18-u zq8zl{yMc!{v(pBg+1|lu5J86@Y@QjOJo)Bv7LMkkp?p-~Kf)Bh%j;xuo7BF@MGI_w z*aB5mN9xV)eO;W%`#okE=~r0g`l;i(PTirj<WG;?9N(y7LuXN+Y;0W{Nc^$ZO6R<m z2kx=XA3jcLy%)55@k-%`%E1j{rT3O~@&qJ%ZfFGDIlqiJ8MOnb0K<vKF$69HfoLVx zU~aCpiVDulP-{4y8FX+=w(0xE$Jf=ZD(}LrZrDNF3)b{e?(qDPdEC9gaq?Ig&U5AL z6f{=(PRpmiVf0m6e+8bOx!<v=|Ms333ptjh8GE7)-qzV<wpWvGz0*APF?RQB*OXO0 zhCXkqT0*Km`#R#%tqXstNxjV08^7b<5A6_E1SaaGW9%<lg!-5j>2HtVg0?F+Y+d+p zQ`o2N`Q`H@5y+~_l8S}?YqbYrLv!}wUB|sEsqTU($ecY@a%NmDI3wECTgWM4oWs)e z9dd@Y)jfMoA5<*WD92_0Veq`^TlR+TqyNO(R`U4Ta{Ey|?|BN%<hEExGlIn907ks9 z><M^t|Ht&57XQwI&UwPu$Z!uktA=3#1FS;f#3_~2L-T|zI`*RpS_bt0D+BS;DkR3Q zjMEnaQ%qoQ<kO00nHA0#TI#13m~`*E(<rB|(lxx^C5W<^W1{Ug;QBVJ&gv0q&T*eD zVQFFX%NA1!N1*1PrX0ks`XQ&rJtxu@tA@}f{Rug5CO1g~7EBdB0j@1j#i!42`@>>X z$M1&qP0EdeH2bW~G*x8t^BLF1H~#;f!#lGlU7RLdXJQvi!+57z|E59AT>UBh<Cc(J zow|J{Dg2*PW+Uh&Y2{pRr2K2OQw`N`f``23Muk1NiL-nZRvR2<6%&XWpawMFud1Cm zgLUM2t}n~ARvyBw(TQeq%Ncb|q_F;-tWyz~EMn{0=#)?pc4YiY|7))ht#nyi-|Wj( zVYLgdB<Eyqq`~&i90j)=i^GpXPt(LPf|}zc7E}IgP(-JK?nNG_8r{eQ0->5I^b=e@ zv+tjpFc_;1>5CE)>n6_$$$!Rmaj2XX8x-LC<<nY-Z@@w4cj?3l4844X*-Km}bUD-0 z!KJD`bC?3Y`hc&@4CEN0HuL!4pdlVcxq_adsoh`cpj6z&YdcpjBP_bp6T$hu%rT1* zo6X#G;av2w!kkI~V05d^32r|*vJYM61G;qLSomFv9d^ED|ey8h1=^e%?#z1N4 z7YRH0=E@Whl>sk>hFsj}>3A0+OB^=xbKR(~Th*oMDZYd23Wii%L6p@FkT0IFr7Gl^ zoNJ<2@jdE_%)vGKcID^X_mVz_Ktv!8*;`}K$b8M>Dvo%!H1Tup13d%KvgNa~HD!^X z8RdGOGSKd1eVdbi1<S24NxooH|GSxM7LufCUBfyR9&+xZ1lZZ>5KcWY`>*Wp+jriw z?7#L9=j<xzZ`kQN*Yf9y+c~?u$tx@F8%*}BA5Cy{12!U^;nLx_QAlQ%PDc{ntB&}b z8O4Sv>ZhEcQ48ulsA$r`kd!lJ1T{GuI#fiPd~tCC7{Vyk^yi3}2vaX}_rBXa^bf8< zG?SfG_bKJ(T_XJ|>&YNC93~@!UF=Jb*j7njT=K+VZJG*Q%Tq<C=Nme-tpFeC5>gRM zlRgYMXtL=y^&s)oRl93|V8!zwC$Q6rGVH*OR#i`dcRW+PGs3{aa972_yo$x?NOO|q zT0H$sVl+v28Ar)7SatB**Krr8)48syI>|G37AQ<G@1jL!75gggzl~16wA&lXr9^xp zk*BXkxi4z2eOvFP5>lN+TKso=^Zg&OC60e*Uf}XCp)Jlnqt}AF_uyiKwk|$1r<$sF z|NA8SXuUUeHT&#iazRr1T_W;C*oaq=uovWqqzWo^y=^*IFyQE@I@BvulHpz05MS!8 zY6Ls-?WyY01c_*9mkg7JviCqkcqE>2)WlFQ@Vqm}6YDbqY34(_hJ{I(H`v#=q3;L! za8c2Njs!>aWF0j~nyi9UJNVCtQYLzU^8+(NGWqMDZomk74=pj5CQAdkST5Knet792 z`?9BJwa-BlY>Pm1BnUW2-~VxtEtukGtXofYNL47n+VQGNMfJPA<ZTuf12*PNDAwP^ zg#Hp`G3srHaYzc(lv!=o2aYA4Hww{GKx!_19r9HIjpGn6+L_;<TO`KB_{B$85^L>2 zUgd9?GjS+h8U_S|!!83+m%y<c7?ly(4MfEa!UJ?d$(ag6E!kT$8e_n9EcpDX4?ma? zM#8@W_gs2FHGRomPgdE1V|gJ{;rT;&+D`mlNUqjgP6M)`%kVzUB^&G)<NWJDCSfxM z9B^xqWJv0(I!ZmA0FI?e#Ttj?^?4>Qbv*lLTR24D+%s2F8@Jz}DQ5qnkrJ0<1xHzL zr+j)oRo<ehUbC+xrfed3#{Py0Ekj8>g=JmVbD=?E1z)Pe{$NqDv@eNRwB>vL_Rqv7 zoZ36hz}#CMH2ot+nm3?KYq$4)OPh?L4Na0T+qJ_RkQ^2Bt)OOk5-qJNl{4bqV&AU9 zTkL;@$zw~*ywwJjw#LASgMGd#EpoTM*WF88yl3nUU*JU_)<Lb0MMPUO9H)Qeo<`Bs z3q+JJ42)c)4~LbdM$yuT3^$~*RdNQzj34W7BFl0|SNb4K{k6?lNNsnNH6tSX!mz{7 zsbX8?nuRFbvizL@XR-gI?I8(Qs)eoCQ1NL6F-h|y6+d&yT)cQz!-^vj_co}irRtu0 zdsKUg>8RJ3GV7)}e#7K&rm8(4aw-w6WDMg(v#$NBk~p2%`UHV0f&Lr6PyswOj%u%W zpH0Ie9!%CIYvJ6h8+X>8bRjsZ7<b7S#nBqIGj-^RcXX(I#)+M&qBUh#AopSaPcLU^ z9k`%-|M8HfJdk0Q>IN+_1&Zz>f<w>?nH;6>_z%J}g=A~y;7)IlAyKy?O9+b330R(_ zZ?{ZiQW9m-ur1jqv2>l0YxthooOdTI)#6fBIV)VvfdU>l7i^sDhFyOBMEYtU5Z7WN zDbK|2E$B7<TWnk0L)}9hu$M%bCekYE{;nySiWLGGzm?7HuxCk};RW1%s`cDB%KYJe zt1AaR26HQE;G(hK?r>Z!1G7tzXQMM{eY}1#XT9|w*_!DzsKG=cG#@SS4K9`Z#i;fl zG~BgK8IgD-hB|Huf=wip3yW}joS-J7q!{UuBrC2#<0r~k!uwiprc!gay+VV28BxY} ziHe@FCKIR?_YV@h1Yf|~0=05b<QN*2?fMnyw{8j6AP)q!R<|xs8akwImb80;301&t zU1joDF#5vQ(PB8&k&<NjEE)vLOrJ5-q4aWo9{j{a5$d@8srll#*!{;Yl%S8R`Zsv> zdPQuSXXvx_1<POb<Qp@cMhUk9S*G0E?6=LfpNT=IejRKb<Rc5gIxny-_m<%KH-d^- zw4tT_x}!!Yq;LPR^^LWS8`OJe54AG*MeKP{MQ-rwb9pC)Sv|KkRA%kN(XSuv&jScA z1^m8+e`tC^vdlaw_JQ>+`-gFw9?!~#akD0D#5tgYrzQJ9?!UG%r(g>&+}dL4X=PQ- zK36AdB)#E?PD?|e301ea-z+u5=DhOUK0?-ci^}#xl?4wh&<PjhI!l_!$iM=L!@BCZ z!?yH+<M^$0_JSU3^a^K0pY}>9HQI!yugAN}`t5nQwpDLq(hv@Ol+$faPjx=89NMR> zdS%XiYxCtWkJ>+qea%#TM;vyb@2w$`t4YVeG2|vkX4RR2Y$istg<=nX_=p=p^(!H3 z<dc8ef`A7BCQ4u$ea$FwRvlzDPBz3$Mjdrd^746^k|wEY!3xQs!D<XtJ$S@qKVYT> zPp<UdWqc-)#76nZE3zn>-ISU`lRl@NZjKflHyT+t>NqLGzMU1}`9O-rfZ6LLM{v3% zS3y)J76?vB{Y)rb|9|``Wjd;V)l@WnCaWxCSMFaC8L(i_cW%*9leK5~tF^eNne(5G zU&ywoc#woG*G!c4XIZYadAO{bE|?JgU~A|d8J$Xwi(UaW>8Wnnz_m6Yi>1`|&`ht( z*zBn1-2v=RQ!8H)*9In;s^a{!xxY(*(El@M_ilg&a;D?ts0|5k^15uhOe3R0Rj3tm zKM){w&4JPoto!D)u7}GoiMW$%%@4Y@(oDx1+fO`Q_lc0LieyM|p65_g5dA+TIk7)2 zU0Gq(Z(#pYNl}^lADsS(cu2HUg0mDGD=GdA>~Aob1$VpRg5D;R_%$10`~0<bf(v`D zGy1_mySFGHA-2tBp{H0*xj|l~p3^V_O9MfvSrhbzW$8uq`oyS{fwFZ0XS?d}=~_FG zIh*^l2Gi`aAFSGR39U}Fk16=VzEt*3&SmhQ;bfZNVW#DY{Td6-*~na9n%!E?WB=^T z-)E?K*s$mK?bNd<HZ^h1I@0*|(;*DIyu{a5=ab$Xs=>uoueTrGbJUQ$-02T{i$IDH zN%TXvK|;YvWm00g&`Ms{B2Wi_|KU<Q<WDc6CSi4d-D?ZNg0N0u>_7-1kIlCaWV3}d zOv+z1Z_z4|&m7~c#*c~*!Po`9j-YbVpHqOy9s%pmiE;nC#ZOvVx)yd!mJ^z|0-;iZ zj25lirhhll+=2Ai_R5tXIa3Z0d)t|~21j>&tIOb96FGHcfzV#R=89)9mJoPTF7!V* z_O-2Z-Bi(!{DaLSuEhawx##%GQE-e5#wG?#u!p#=mslJ8FQJay&vh;WV4X#rhKEIH z0M@D$B`g>055WAe%h(lcBJprhSLzjRyTgEI3*3$ozY+;0>K)x4bKoWHQ3-9~wZM5} z_c5jT<UL+Z$k`fUYfW!u<sdpS66i}UF8*=EXDO_n44yI^aJP_4l=6+8J<1Ta3mX!Q zwMs4#Hw@I_!M8KzAQl{sfd!IBmoY-%$izGb7L*jeaqw-YkSuVeK1gynvw4CqD71=C zivOtq&i}7XE;+0DomXFNquUbw35CQT`3;F5ks724fw^*Fi?9|!qV!g6zxsi=v3|`t z{Y1vK&2IXzPEC5p20p*76P=XV`2J?WJHl?Ca)XthL_*hf!8Ui(V}x=4V`m8Zmwi{; z(zcD&l)QrW|Nb?J^I#C=$m#5LthT{FYFavq4i_JHR{qi9{h1iomv|uR^HbW{_}81r zzLKA1r<?{}`(#>Ury~PxezFOljPuFJqZNNPY7Un@$jmF|siXhjm;C=-E_N`{0bRZQ t>a5vw=7M+V|NZ6v+KX_Fvq<qBloaaKO<cWb7WlL0r-QpQcAmKYzW~F8Wi0>z From 503533d712888f9846e23e9f80b34db55af9fef3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 19:20:28 +0000 Subject: [PATCH 272/384] build(deps): Bump actions/setup-node from 3 to 4 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 4 ++-- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/compose-full-changelog.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c499f9584..44e0b2f04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -294,7 +294,7 @@ jobs: - name: Install Node.js if: fromJSON(matrix.config.container) == null - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' @@ -418,7 +418,7 @@ jobs: name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 8def1faf4..1154414c1 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -59,7 +59,7 @@ jobs: uses: actions/checkout@v4 - name: Install Node.js 18.17 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '18.17' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 4b0fe4914..d126f37f4 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 402449d29..031a65924 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v4 - name: Install Node.js 18.17 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '18.17' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 088031e77..949b039e9 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v4 - name: Install Node.js 18.17 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '18.17' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 78261389a..91c4ef8bf 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' From 22a69f7488febfa66f3c4d5672d72910c91d1681 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 2 Nov 2023 09:34:32 +0100 Subject: [PATCH 273/384] chore(deps): update vulnerable dependencies - Forced the resolution of `@babel/traverse@7.23.2` brought in by `@theia/cli`. (eclipse-theia/theia#13024) - Updated to `auth0-js@9.21.3` to transitively pull `crypto-js@4.2.0` in with the security fixes. GitHub Advisory Database refs: - https://github.com/advisories/GHSA-67hx-6x53-jw92 - https://github.com/advisories/GHSA-xwcq-pm8m-c4vf Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 4 ++-- package.json | 3 +++ yarn.lock | 30 +++++++++++++++--------------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 866844ab8..9c4dd44c6 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -46,7 +46,7 @@ "@theia/typehierarchy": "1.41.0", "@theia/workspace": "1.41.0", "@tippyjs/react": "^4.2.5", - "@types/auth0-js": "^9.14.0", + "@types/auth0-js": "^9.21.3", "@types/btoa": "^1.2.3", "@types/dateformat": "^3.0.1", "@types/google-protobuf": "^3.7.2", @@ -60,7 +60,7 @@ "@types/temp": "^0.8.34", "arduino-serial-plotter-webapp": "0.2.0", "async-mutex": "^0.3.0", - "auth0-js": "^9.14.0", + "auth0-js": "^9.23.2", "btoa": "^1.2.1", "classnames": "^2.3.1", "cpy": "^10.0.0", diff --git a/package.json b/package.json index 70e9c0ac7..efcbfe936 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,9 @@ "engines": { "node": ">=18.17.0 <21" }, + "resolutions": { + "@theia/cli/@babel/traverse": "^7.23.2" + }, "devDependencies": { "@theia/cli": "1.41.0", "@typescript-eslint/eslint-plugin": "^5.59.0", diff --git a/yarn.lock b/yarn.lock index 1c38ab984..9a1dda971 100644 --- a/yarn.lock +++ b/yarn.lock @@ -938,10 +938,10 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== +"@babel/traverse@^7.23.0", "@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" "@babel/generator" "^7.23.0" @@ -2697,10 +2697,10 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" -"@types/auth0-js@^9.14.0": - version "9.21.1" - resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.1.tgz#3883693ae84746153507ea6e9bfa8c68811c1906" - integrity sha512-K8X2aBZynfeqjRI15P6fcpzcjAPXfppAVwaUNXxXnXmXMx66pz5IwQ5ZpzaDg8Q1P6aVF8+N2RZMTcBoOME9HA== +"@types/auth0-js@^9.21.3": + version "9.21.3" + resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.3.tgz#de88abd4df6bbc3b8ad2fe5e299c65304f8ed691" + integrity sha512-5IZHQSljfOREU1fngFcwUXjHUlCq/CM4K1zmVytX0EvH3QnX3cYwK6HCxRuxK7seYMm8yeviWUUkWV1kqK2+sg== "@types/bent@^7.0.1": version "7.3.5" @@ -4107,10 +4107,10 @@ atomically@^1.7.0: resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== -auth0-js@^9.14.0: - version "9.23.0" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.23.0.tgz#e0f825b12a43ab6696464790470944a59df9c28a" - integrity sha512-AtvbseCU+9/hwCPTGbV9UI7iYc2EmT7rN1dPiRxNUyT4RXIFAnJRkuCSEwa0mhS20jlMPD4b28l5354vxBbYzw== +auth0-js@^9.23.2: + version "9.23.2" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.23.2.tgz#9760dc207c074995efd6fbc4d7b585e05709c85b" + integrity sha512-RiUBalXymeGjF0Ap/IyjKnsILO44eaFrSJDqchox6wUUWnJATGjEQLMTLzjWn8R1wZVKBGu1Fv7PPSViWhcYVQ== dependencies: base64-js "^1.5.1" idtoken-verifier "^2.2.2" @@ -5350,9 +5350,9 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: which "^2.0.1" crypto-js@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== css-loader@^6.2.0: version "6.8.1" From 59a3c4faf0052a0ab6a4b34ddf8399265fd1dbd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 19:58:26 +0000 Subject: [PATCH 274/384] build(deps): Bump actions/setup-python from 4 to 5 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44e0b2f04..3448fd654 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -302,7 +302,7 @@ jobs: - name: Install Python 3.x if: fromJSON(matrix.config.container) == null - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11.x' From 3d2511194a0e6ab14ee7cbfc1d246ebba07b9d48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 04:36:23 +0000 Subject: [PATCH 275/384] build(deps): Bump actions/setup-go from 4 to 5 Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 4 ++-- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3448fd654..18cc87a2a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -307,7 +307,7 @@ jobs: python-version: '3.11.x' - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} @@ -425,7 +425,7 @@ jobs: cache: 'yarn' - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 1154414c1..b3179b101 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -66,7 +66,7 @@ jobs: cache: 'yarn' - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 031a65924..77ac9ca3b 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -24,7 +24,7 @@ jobs: cache: 'yarn' - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 949b039e9..49910a5ad 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -24,7 +24,7 @@ jobs: cache: 'yarn' - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 91c4ef8bf..8357fbb74 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -26,7 +26,7 @@ jobs: cache: 'yarn' - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} From e7754b7c3bdb827ff8ce089eea384deccf50ae65 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 6 Dec 2023 21:10:22 -0800 Subject: [PATCH 276/384] Use actions/setup-go@v4 for Linux build job Unfortunately the latest v5 version of the actions/setup-go action used to set up the Go programming language in the runner machine has a dependency on a higher version of glibc than is provided by the Linux container. For this reason, the workflow is configured to use actions/setup-go@v4 for the Linux build job. We will receive pull requests from Dependabot offering to update this outdated action dependency for at each subsequent major version release of the action (which are not terribly frequent). We must decline the bump of the action in that specific step, but accept the bumps of all other usages of the action in the workflows. Dependabot remembers when you decline a bump so this should not be too bothersome. --- .github/workflows/build.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 18cc87a2a..a73935c71 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -307,10 +307,18 @@ jobs: python-version: '3.11.x' - name: Install Go + if: fromJSON(matrix.config.container) == null uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} + - name: Install Go + # actions/setup-go@v5 has dependency on a higher version of glibc than available in the Linux container. + if: fromJSON(matrix.config.container) != null + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + - name: Install Taskfile uses: arduino/setup-task@v1 with: From 2dae4c8258706b096a41e08af086b56f82b7efb1 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 28 Nov 2023 20:01:14 -0800 Subject: [PATCH 277/384] Remove version pin of Git dependency in Linux build container Dockerfile A Docker container is used to produce the Linux build of Arduino IDE. The dependencies of the build are pinned to a specific version in the Dockerfile in order to ensure a stable environment in the images. One such dependency is Git. The version of Git available from the package repository of the Ubuntu 18.04 distro used for the image is too outdated to be used for this purpose. For this reason, a PPA is used as the source for the Git package. Unfortunately the maintainers of the PPA remove the previous package every time they add a package for a newer version of Git. This breaks the version pinned installation of the Git package: 5.515 E: Version '1:2.42.0-0ppa1~ubuntu18.04.1' for 'git' was not found For this reason it is necessary to unpin Git in the Dockerfile. This will cause whichever version is available from the PPA to be installed each time the image is built. Although not ideal for this application, that shouldn't cause any problems in practice since Git has quite a stable and carefully maintained interface. --- .github/workflows/assets/linux.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/assets/linux.Dockerfile b/.github/workflows/assets/linux.Dockerfile index 6f7dde117..35d546ca0 100644 --- a/.github/workflows/assets/linux.Dockerfile +++ b/.github/workflows/assets/linux.Dockerfile @@ -32,7 +32,7 @@ RUN \ apt-get \ --yes \ install \ - "git=1:2.42.0-0ppa1~ubuntu18.04.1" && \ + "git" && \ \ apt-get \ --yes \ From 64ce35edbb6e3c5cb1067700b2e77f6ef2ccedfd Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 9 Nov 2023 16:15:49 +0100 Subject: [PATCH 278/384] feat: show in tooltip if core is from sketchbook Closes #2270 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../boards/boards-config-component.tsx | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/boards/boards-config-component.tsx b/arduino-ide-extension/src/browser/boards/boards-config-component.tsx index acf2c7d4e..f14b8f390 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config-component.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config-component.tsx @@ -48,16 +48,17 @@ namespace BoardsConfigComponent { } } -export abstract class Item<T> extends React.Component<{ +class Item<T> extends React.Component<{ item: T; label: string; selected: boolean; onClick: (item: T) => void; missing?: boolean; details?: string; + title?: string | ((item: T) => string); }> { override render(): React.ReactNode { - const { selected, label, missing, details } = this.props; + const { selected, label, missing, details, item } = this.props; const classNames = ['item']; if (selected) { classNames.push('selected'); @@ -65,11 +66,15 @@ export abstract class Item<T> extends React.Component<{ if (missing === true) { classNames.push('missing'); } + let title = this.props.title ?? `${label}${!details ? '' : details}`; + if (typeof title === 'function') { + title = title(item); + } return ( <div onClick={this.onClick} className={classNames.join(' ')} - title={`${label}${!details ? '' : details}`} + title={title} > <div className="label">{label}</div> {!details ? '' : <div className="details">{details}</div>} @@ -234,9 +239,20 @@ export class BoardsConfigComponent extends React.Component< distinctBoards.set(key, board); } } + const title = (board: Board.Detailed): string => { + const { details, manuallyInstalled } = board; + let label = board.name; + if (details) { + label += details; + } + if (manuallyInstalled) { + label += nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)'); + } + return label; + }; const boardsList = Array.from(distinctBoards.values()).map((board) => ( - <Item<BoardWithPackage> + <Item<Board.Detailed> key={toKey(board)} item={board} label={board.name} @@ -244,6 +260,7 @@ export class BoardsConfigComponent extends React.Component< selected={board.selected} onClick={this.selectBoard} missing={board.missing} + title={title} /> )); From 101ba650f312e70881a2631dede323f4c3d57878 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 24 Oct 2023 16:21:59 +0200 Subject: [PATCH 279/384] feat: handle `v` prefix in CLI GH release name Ref: arduino/arduino-cli#2374 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/scripts/generate-protocol.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index 5b5301575..ec15850b3 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -6,6 +6,7 @@ const { mkdirSync, promises: fs } = require('node:fs'); const { exec } = require('./utils'); const glob = require('glob'); + const { SemVer, gte, valid: validSemVer } = require('semver'); const protoc = path.dirname(require('protoc/protoc')); const repository = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); @@ -94,13 +95,12 @@ } */ const versionObject = JSON.parse(versionJson); - const version = versionObject.VersionString; - if ( - version && - !version.startsWith('nightly-') && - version !== '0.0.0-git' && - version !== 'git-snapshot' - ) { + let version = versionObject.VersionString; + if (validSemVer(version)) { + // https://github.com/arduino/arduino-cli/pull/2374 + if (gte(new SemVer(version, { loose: true }), new SemVer('0.35.0-rc.1'))) { + version = `v${version}`; + } console.log(`>>> Checking out tagged version: '${version}'...`); exec('git', ['-C', repository, 'fetch', '--all', '--tags'], { logStdout: true, From a0bd5d022f48c34b9848918304cb2b38ef0c1dd0 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 26 Oct 2023 16:20:50 +0200 Subject: [PATCH 280/384] chore: use `0.7.5` Arduino LS Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 9c4dd44c6..9b9079617 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -175,7 +175,7 @@ "version": "2.4.1" }, "arduino-language-server": { - "version": "0.7.4" + "version": "0.7.5" }, "clangd": { "version": "14.0.0" From 0f83a486490be2f959c32b74c7a54cd8742fdc0a Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 6 Nov 2023 17:11:13 +0100 Subject: [PATCH 281/384] chore(deps): update to `electron@27.0.3` - Related change: https://github.com/arduino/arduino-ide/commit/153e34f11b9c16801eecba9d9f6f931c12b231b8 - Reported at: https://github.com/arduino/arduino-ide/pull/2267#issuecomment-1795180432 - External: https://forum.arduino.cc/t/ide-2-2-1-main-window-randomly-goes-blank/1166219 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- electron-app/package.json | 4 ++-- yarn.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/electron-app/package.json b/electron-app/package.json index 3254dd07e..9778a4128 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -28,8 +28,8 @@ "compression-webpack-plugin": "^9.0.0", "copy-webpack-plugin": "^8.1.1", "dateformat": "^5.0.3", - "electron": "^26.2.4", - "electron-builder": "^24.6.3", + "electron": "^27.0.3", + "electron-builder": "^24.6.4", "electron-notarize": "^1.1.1", "execa": "^7.1.1", "file-type": "^18.5.0", diff --git a/yarn.lock b/yarn.lock index 9a1dda971..c75cfaf75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5873,7 +5873,7 @@ ejs@^3.1.7, ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.6.3: +electron-builder@^24.6.4: version "24.6.4" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.4.tgz#c51271e49b9a02c9a3ec444f866b6008c4d98a1d" integrity sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA== @@ -5958,10 +5958,10 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -electron@^26.2.4: - version "26.3.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-26.3.0.tgz#3267773d170310384db76819cf6375bd98b3cc76" - integrity sha512-7ZpvSHu+jmqialSvywTZnOQZZGLqlyj+yV5HGDrEzFnMiFaXBRpbByHgoUhaExJ/8t/0xKQjKlMRAY65w+zNZQ== +electron@^27.0.3: + version "27.0.3" + resolved "https://registry.yarnpkg.com/electron/-/electron-27.0.3.tgz#dc843d95700b33d88e71b458082b66f37ca901c5" + integrity sha512-VaB9cI1se+mUtz366NP+zxFVnkHLbCBNO4wwouw3FuGyX/m7/Bv1I89JhWOBv78tC+n11ZYMrVD23Jf6EZgVcg== dependencies: "@electron/get" "^2.0.0" "@types/node" "^18.11.18" From 633346a3b05141125080f7dac0447c166f26bc9a Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 21 Nov 2023 11:27:30 +0100 Subject: [PATCH 282/384] feat: new window inherits the custom board options A new startup task ensures setting any custom board menu selection in a new sketch window. Closes #2271 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/arduino-ide-frontend-module.ts | 3 + .../src/browser/boards/boards-data-store.ts | 237 +++++++-- .../contributions/boards-data-menu-updater.ts | 2 +- .../src/browser/contributions/ino-language.ts | 10 +- .../contributions/update-arduino-state.ts | 7 +- .../test/browser/boards-data-store.test.ts | 501 ++++++++++++++++++ 6 files changed, 700 insertions(+), 60 deletions(-) create mode 100644 arduino-ide-extension/src/test/browser/boards-data-store.test.ts 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 436dd8e86..5efc092c3 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -454,6 +454,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // To be able to track, and update the menu based on the core settings (aka. board details) of the currently selected board. bind(BoardsDataStore).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(BoardsDataStore); + bind(CommandContribution).toService(BoardsDataStore); + bind(StartupTaskProvider).toService(BoardsDataStore); // to inherit the boards config options, programmer, etc in a new window + // Logger for the Arduino daemon bind(ILogger) .toDynamicValue((ctx) => { 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 579f30b7a..e6e34abf0 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -1,21 +1,38 @@ 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 type { + Command, + CommandContribution, + CommandRegistry, +} from '@theia/core/lib/common/command'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; import { ILogger } from '@theia/core/lib/common/logger'; -import { deepClone } from '@theia/core/lib/common/objects'; +import { deepClone, deepFreeze } from '@theia/core/lib/common/objects'; import { inject, injectable, named } from '@theia/core/shared/inversify'; import { BoardDetails, BoardsService, ConfigOption, Programmer, + isBoardIdentifierChangeEvent, } from '../../common/protocol'; import { notEmpty } from '../../common/utils'; +import type { + StartupTask, + StartupTaskProvider, +} from '../../electron-common/startup-task'; import { NotificationCenter } from '../notification-center'; +import { BoardsServiceProvider } from './boards-service-provider'; @injectable() -export class BoardsDataStore implements FrontendApplicationContribution { +export class BoardsDataStore + implements + FrontendApplicationContribution, + StartupTaskProvider, + CommandContribution +{ @inject(ILogger) @named('store') private readonly logger: ILogger; @@ -28,44 +45,110 @@ export class BoardsDataStore implements FrontendApplicationContribution { // In other words, store the data (such as the board configs) per sketch, not per IDE2 installation. https://github.com/arduino/arduino-ide/issues/2240 @inject(StorageService) private readonly storageService: StorageService; + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(FrontendApplicationStateService) + private readonly appStateService: FrontendApplicationStateService; - private readonly onChangedEmitter = new Emitter<string[]>(); - private readonly toDispose = new DisposableCollection(this.onChangedEmitter); + private readonly onDidChangeEmitter = + new Emitter<BoardsDataStoreChangeEvent>(); + private readonly toDispose = new DisposableCollection( + this.onDidChangeEmitter + ); + private _selectedBoardData: BoardsDataStoreChange | undefined; onStart(): void { - this.toDispose.push( + this.toDispose.pushAll([ + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.updateSelectedBoardData(event.selectedBoard?.fqbn); + } + }), this.notificationCenter.onPlatformDidInstall(async ({ item }) => { - const dataDidChangePerFqbn: string[] = []; - for (const fqbn of item.boards + const boardsWithFqbn = item.boards .map(({ fqbn }) => fqbn) - .filter(notEmpty) - .filter((fqbn) => !!fqbn)) { + .filter(notEmpty); + const changes: BoardsDataStoreChange[] = []; + for (const fqbn of boardsWithFqbn) { const key = this.getStorageKey(fqbn); - let data = await this.storageService.getData<ConfigOption[]>(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); - } - } + const storedData = + await this.storageService.getData<BoardsDataStore.Data>(key); + if (!storedData) { + // if not previously value is available for the board, do not update the cache + continue; + } + const details = await this.loadBoardDetails(fqbn); + if (details) { + const data = createDataStoreEntry(details); + await this.storageService.setData(key, data); + changes.push({ fqbn, data }); } } - if (dataDidChangePerFqbn.length) { - this.fireChanged(...dataDidChangePerFqbn); + if (changes.length) { + this.fireChanged(...changes); } - }) + }), + ]); + + Promise.all([ + this.boardsServiceProvider.ready, + this.appStateService.reachedState('ready'), + ]).then(() => + this.updateSelectedBoardData( + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn + ) ); } + private async getSelectedBoardData( + fqbn: string | undefined + ): Promise<BoardsDataStoreChange | undefined> { + if (!fqbn) { + return undefined; + } else { + const data = await this.getData(fqbn); + if (data === BoardsDataStore.Data.EMPTY) { + return undefined; + } + return { fqbn, data }; + } + } + + private async updateSelectedBoardData( + fqbn: string | undefined + ): Promise<void> { + this._selectedBoardData = await this.getSelectedBoardData(fqbn); + } + onStop(): void { this.toDispose.dispose(); } - get onChanged(): Event<string[]> { - return this.onChangedEmitter.event; + registerCommands(registry: CommandRegistry): void { + registry.registerCommand(USE_INHERITED_DATA, { + execute: async (arg: unknown) => { + if (isBoardsDataStoreChange(arg)) { + await this.setData(arg); + this.fireChanged(arg); + } + }, + }); + } + + tasks(): StartupTask[] { + if (!this._selectedBoardData) { + return []; + } + return [ + { + command: USE_INHERITED_DATA.id, + args: [this._selectedBoardData], + }, + ]; + } + + get onDidChange(): Event<BoardsDataStoreChangeEvent> { + return this.onDidChangeEmitter.event; } async appendConfigToFqbn( @@ -84,11 +167,11 @@ export class BoardsDataStore implements FrontendApplicationContribution { } const key = this.getStorageKey(fqbn); - let data = await this.storageService.getData< + const storedData = await this.storageService.getData< BoardsDataStore.Data | undefined >(key, undefined); - if (BoardsDataStore.Data.is(data)) { - return data; + if (BoardsDataStore.Data.is(storedData)) { + return storedData; } const boardDetails = await this.getBoardDetailsSafe(fqbn); @@ -96,10 +179,7 @@ export class BoardsDataStore implements FrontendApplicationContribution { return BoardsDataStore.Data.EMPTY; } - data = { - configOptions: boardDetails.configOptions, - programmers: boardDetails.programmers, - }; + const data = createDataStoreEntry(boardDetails); await this.storageService.setData(key, data); return data; } @@ -111,17 +191,15 @@ export class BoardsDataStore implements FrontendApplicationContribution { fqbn: string; selectedProgrammer: Programmer; }): Promise<boolean> { - const data = deepClone(await this.getData(fqbn)); - const { programmers } = data; + const storedData = deepClone(await this.getData(fqbn)); + const { programmers } = storedData; if (!programmers.find((p) => Programmer.equals(selectedProgrammer, p))) { return false; } - await this.setData({ - fqbn, - data: { ...data, selectedProgrammer }, - }); - this.fireChanged(fqbn); + const data = { ...storedData, selectedProgrammer }; + await this.setData({ fqbn, data }); + this.fireChanged({ fqbn, data }); return true; } @@ -153,17 +231,12 @@ export class BoardsDataStore implements FrontendApplicationContribution { return false; } await this.setData({ fqbn, data }); - this.fireChanged(fqbn); + this.fireChanged({ fqbn, data }); return true; } - protected async setData({ - fqbn, - data, - }: { - fqbn: string; - data: BoardsDataStore.Data; - }): Promise<void> { + protected async setData(change: BoardsDataStoreChange): Promise<void> { + const { fqbn, data } = change; const key = this.getStorageKey(fqbn); return this.storageService.setData(key, data); } @@ -176,7 +249,7 @@ export class BoardsDataStore implements FrontendApplicationContribution { fqbn: string ): Promise<BoardDetails | undefined> { try { - const details = this.boardsService.getBoardDetails({ fqbn }); + const details = await this.boardsService.getBoardDetails({ fqbn }); return details; } catch (err) { if ( @@ -197,8 +270,8 @@ export class BoardsDataStore implements FrontendApplicationContribution { } } - protected fireChanged(...fqbn: string[]): void { - this.onChangedEmitter.fire(fqbn); + protected fireChanged(...changes: BoardsDataStoreChange[]): void { + this.onDidChangeEmitter.fire({ changes }); } } @@ -209,11 +282,13 @@ export namespace BoardsDataStore { readonly selectedProgrammer?: Programmer; } export namespace Data { - export const EMPTY: Data = { + export const EMPTY: Data = deepFreeze({ configOptions: [], programmers: [], - }; - export function is(arg: any): arg is Data { + defaultProgrammerId: undefined, + }); + + export function is(arg: unknown): arg is Data { return ( !!arg && 'configOptions' in arg && @@ -224,3 +299,61 @@ export namespace BoardsDataStore { } } } + +export function isEmptyData(data: BoardsDataStore.Data): boolean { + return ( + Boolean(!data.configOptions.length) && + Boolean(!data.programmers.length) && + Boolean(!data.selectedProgrammer) + ); +} + +export function findDefaultProgrammer( + programmers: readonly Programmer[], + defaultProgrammerId: string | undefined | BoardsDataStore.Data +): Programmer | undefined { + if (!defaultProgrammerId) { + return undefined; + } + const id = + typeof defaultProgrammerId === 'string' + ? defaultProgrammerId + : defaultProgrammerId.defaultProgrammerId; + return programmers.find((p) => p.id === id); +} +function createDataStoreEntry(details: BoardDetails): BoardsDataStore.Data { + const configOptions = details.configOptions.slice(); + const programmers = details.programmers.slice(); + const selectedProgrammer = findDefaultProgrammer( + programmers, + details.defaultProgrammerId + ); + return { + configOptions, + programmers, + defaultProgrammerId: details.defaultProgrammerId, + selectedProgrammer, + }; +} + +export interface BoardsDataStoreChange { + readonly fqbn: string; + readonly data: BoardsDataStore.Data; +} + +function isBoardsDataStoreChange(arg: unknown): arg is BoardsDataStoreChange { + return ( + typeof arg === 'object' && + arg !== null && + typeof (<BoardsDataStoreChange>arg).fqbn === 'string' && + BoardsDataStore.Data.is((<BoardsDataStoreChange>arg).data) + ); +} + +export interface BoardsDataStoreChangeEvent { + readonly changes: readonly BoardsDataStoreChange[]; +} + +const USE_INHERITED_DATA: Command = { + id: 'arduino-use-inherited-boards-data', +}; diff --git a/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts b/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts index d9fe0ae7e..ea085f5ba 100644 --- a/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts +++ b/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts @@ -35,7 +35,7 @@ export class BoardsDataMenuUpdater extends Contribution { private readonly toDisposeOnBoardChange = new DisposableCollection(); override onStart(): void { - this.boardsDataStore.onChanged(() => + this.boardsDataStore.onDidChange(() => this.updateMenuActions( this.boardsServiceProvider.boardsConfig.selectedBoard ) diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index 096c27ed8..26c7487d1 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -90,7 +90,7 @@ export class InoLanguage extends SketchContribution { this.notificationCenter.onPlatformDidInstall(() => forceRestart()), this.notificationCenter.onPlatformDidUninstall(() => forceRestart()), this.notificationCenter.onDidReinitialize(() => forceRestart()), - this.boardDataStore.onChanged((dataChangePerFqbn) => { + this.boardDataStore.onDidChange((event) => { if (this.languageServerFqbn) { const sanitizedFqbn = sanitizeFqbn(this.languageServerFqbn); if (!sanitizeFqbn) { @@ -98,13 +98,13 @@ export class InoLanguage extends SketchContribution { `Failed to sanitize the FQBN of the running language server. FQBN with the board settings was: ${this.languageServerFqbn}` ); } - const matchingFqbn = dataChangePerFqbn.find( - (fqbn) => sanitizedFqbn === fqbn + const matchingChange = event.changes.find( + (change) => change.fqbn === sanitizedFqbn ); const { boardsConfig } = this.boardsServiceProvider; if ( - matchingFqbn && - boardsConfig.selectedBoard?.fqbn === matchingFqbn + matchingChange && + boardsConfig.selectedBoard?.fqbn === matchingChange.fqbn ) { start(boardsConfig.selectedBoard); } diff --git a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts index e83e46f51..ab4cdafb0 100644 --- a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -65,10 +65,13 @@ export class UpdateArduinoState extends SketchContribution { this.updateCompileSummary(args[0]); } }), - this.boardsDataStore.onChanged((fqbn) => { + this.boardsDataStore.onDidChange((event) => { const selectedFqbn = this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; - if (selectedFqbn && fqbn.includes(selectedFqbn)) { + if ( + selectedFqbn && + event.changes.find((change) => change.fqbn === selectedFqbn) + ) { this.updateBoardDetails(selectedFqbn); } }), diff --git a/arduino-ide-extension/src/test/browser/boards-data-store.test.ts b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts new file mode 100644 index 000000000..4f52c207d --- /dev/null +++ b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts @@ -0,0 +1,501 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { + LocalStorageService, + StorageService, +} from '@theia/core/lib/browser/storage-service'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { wait } from '@theia/core/lib/common/promise-util'; +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 { + BoardDetails, + BoardsPackage, + BoardsService, + ConfigOption, + Programmer, +} from '../../common/protocol/boards-service'; +import { NotificationServiceServer } from '../../common/protocol/notification-service'; +import { ConsoleLogger, bindCommon } from '../common/common-test-bindings'; + +disableJSDOM(); + +describe('boards-data-store', function () { + this.slow(250); + + let toDisposeAfterEach: DisposableCollection; + let boardsServiceProvider: BoardsServiceProvider; + let boardsDataStore: BoardsDataStore; + let notificationCenter: NotificationCenter; + + beforeEach(async () => { + const container = createContainer(); + container.get<FrontendApplicationStateService>( + FrontendApplicationStateService + ).state = 'ready'; + notificationCenter = container.get<NotificationCenter>(NotificationCenter); + boardsServiceProvider = container.get<BoardsServiceProvider>( + BoardsServiceProvider + ); + toDisposeAfterEach = new DisposableCollection( + Disposable.create(() => boardsServiceProvider.onStop()) + ); + boardsServiceProvider.onStart(); + await boardsServiceProvider.ready; + boardsDataStore = container.get<BoardsDataStore>(BoardsDataStore); + boardsDataStore.onStart(); + }); + + afterEach(() => toDisposeAfterEach.dispose()); + + it('should load the board details when absent in local storage', async () => { + const storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should load from local storage if present', async () => { + const storedData: BoardsDataStore.Data = { + configOptions: [], + programmers: [edbg], + selectedProgrammer: edbg, + }; + await setStorageData(fqbn, storedData); + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal(storedData); + }); + + it('should update board details of selected board (selected with FQBN)', async () => { + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.ok; + await wait(50); + + const selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.deep.equal({ + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }); + }); + + it('should not update the board details of selected board when FQBN is missing', async () => { + const fqbn = undefined; + const name = 'ABC'; + const board = { name, fqbn }; + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.ok; + await wait(50); + + const selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.undefined; + }); + + it('should unset the the board details of selected board when no board was selected', async () => { + let updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.ok; + await wait(50); + + let selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.deep.equal({ + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }); + + updated = boardsServiceProvider.updateConfig('unset-board'); + expect(updated).to.be.true; + await wait(50); + + selectedBoardData = boardsDataStore['_selectedBoardData']; + expect(selectedBoardData).to.be.undefined; + }); + + it('should provide startup tasks when the data is available for the selected board', async () => { + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.true; + await wait(50); + + const tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + }); + + it('should not provide any startup tasks when no data is available for the selected board', async () => { + const tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + }); + + it('should select a programmer', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectProgrammer({ + fqbn, + selectedProgrammer: edbg, + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + selectedProgrammer: edbg, + }); + }); + + it('should not select a programmer if it is absent', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectProgrammer({ + fqbn, + selectedProgrammer: { id: 'p1', name: 'P1', platform: 'missing' }, + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should select a config option', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + }); + + it('should not select a config option if the option is absent', async () => { + const fqbn = 'a:b:c'; + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + option: 'missing', + selectedValue: configOption1.values[1].value, + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should not select a config option if the selected value is absent', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + option: configOption1.option, + selectedValue: 'missing', + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should not update the board data on platform install if it was not cached', async () => { + let storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); + await wait(50); + expect(didChangeCounter).to.be.equal(0); + + storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + }); + + it('should update the board data on platform install if the default empty value was cached', async () => { + let storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + await setStorageData(fqbn, BoardsDataStore.Data.EMPTY); + storedData = await getStoredData(fqbn); + expect(storedData).to.be.deep.equal(BoardsDataStore.Data.EMPTY); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); + await wait(50); + expect(didChangeCounter).to.be.equal(1); + + storedData = await getStoredData(fqbn); + expect(storedData).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it('should update the cached board data on platform install', async () => { + let storedData = await boardsDataStore.getData(fqbn); // caches the value + expect(storedData).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + // before the platform install event mock a different CLI `board details` output + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption2], + }, + ]) + ); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); + await wait(50); + expect(didChangeCounter).to.be.equal(1); + + storedData = await boardsDataStore.getData(fqbn); + expect(storedData).to.be.deep.equal({ + configOptions: [configOption2], + programmers: [edbg, jlink], + }); + }); + + function storageKey(fqbn: string): string { + return boardsDataStore['getStorageKey'](fqbn); + } + + function getStoredData(fqbn: string): Promise<unknown> { + const key = storageKey(fqbn); + return boardsDataStore['storageService'].getData(key); + } + + function setStorageData( + fqbn: string, + data: BoardsDataStore.Data + ): Promise<void> { + const key = storageKey(fqbn); + return boardsDataStore['storageService'].setData(key, data); + } + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bindCommon(bind); + bind(MessageService).toConstantValue(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{ + getDetectedPorts() { + return {}; + }, + async getBoardDetails({ fqbn }) { + return boardDetailsMock().find((mock) => mock.fqbn === fqbn); + }, + }); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(< + NotificationServiceServer + >{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toSelf().inSingletonScope(); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + // 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; + } + + // Mocks the CLI's `board details` response + const jlink: Programmer = { + platform: 'Arduino SAMD (32-bits ARM Cortex-M0+) Boards', + id: 'jlink', + name: 'Segger J-Link', + }; + const edbg: Programmer = { + platform: 'Arduino SAMD (32-bits ARM Cortex-M0+) Boards', + id: 'edbg', + name: 'Atmel EDBG', + }; + + const configOption1: ConfigOption = { + label: 'C1', + option: 'c1', + values: [ + { label: 'C1V1', selected: true, value: 'v1' }, + { label: 'C1V2', selected: false, value: 'v2' }, + ], + }; + + const configOption2: ConfigOption = { + label: 'C2', + option: 'c2', + values: [ + { label: 'C2V1', selected: true, value: 'v1' }, + { label: 'C2V2', selected: false, value: 'v2' }, + ], + }; + + const baseDetails: Omit<BoardDetails, 'fqbn'> = { + VID: '1', + PID: '1', + buildProperties: [], + configOptions: [configOption1], + debuggingSupported: false, + programmers: [edbg, jlink], + requiredTools: [], + }; + + const fqbn = 'a:b:c'; + const name = 'ABC'; + const board = { fqbn, name }; + + const boardsPackage: BoardsPackage = { + id: 'a:b', + name: 'AB', + availableVersions: ['1.0.0'], + boards: [board], + description: 'boy', + summary: ':heart:', + author: 'mano', + types: [], + }; + + const defaultDetailsMocks: readonly BoardDetails[] = [ + { + fqbn, + ...baseDetails, + }, + ]; + let _currentDetailsMock = defaultDetailsMocks; + + function boardDetailsMock(): readonly BoardDetails[] { + return _currentDetailsMock; + } + function mockBoardDetails(newDetails: BoardDetails[]): Disposable { + _currentDetailsMock = newDetails; + return Disposable.create(resetDetailsMock); + } + function resetDetailsMock(): void { + _currentDetailsMock = defaultDetailsMocks; + } +}); From 5abdc18fcc2635e5b6e8378af4dd7aa512376333 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 23 Nov 2023 10:22:33 +0100 Subject: [PATCH 283/384] fix: make hosted plugin support testable Hide the concrete implementation behind an interface so that tests can `require` it. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/arduino-ide-frontend-module.ts | 9 ++++--- .../src/browser/contributions/debug.ts | 25 ++++++++++++++++--- .../src/browser/contributions/ino-language.ts | 2 +- .../contributions/update-arduino-state.ts | 2 +- .../{ => hosted}/hosted-plugin-events.ts | 2 +- .../browser/hosted/hosted-plugin-support.ts | 14 +++++++++++ .../theia/monaco/monaco-theming-service.ts | 2 +- .../browser/theia/plugin-ext/hosted-plugin.ts | 6 ++++- .../browser/board-service-provider.test.ts | 7 ------ 9 files changed, 49 insertions(+), 20 deletions(-) rename arduino-ide-extension/src/browser/{ => hosted}/hosted-plugin-events.ts (97%) create mode 100644 arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts 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 5efc092c3..fa92aeafe 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -271,8 +271,8 @@ import { MonitorModel } from './monitor-model'; import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl'; import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager'; import { EditorManager } from './theia/editor/editor-manager'; -import { HostedPluginEvents } from './hosted-plugin-events'; -import { HostedPluginSupport } from './theia/plugin-ext/hosted-plugin'; +import { HostedPluginEvents } from './hosted/hosted-plugin-events'; +import { HostedPluginSupportImpl } from './theia/plugin-ext/hosted-plugin'; import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; import { Formatter, FormatterPath } from '../common/protocol/formatter'; import { Format } from './contributions/format'; @@ -985,8 +985,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { }) .inSingletonScope(); - bind(HostedPluginSupport).toSelf().inSingletonScope(); - rebind(TheiaHostedPluginSupport).toService(HostedPluginSupport); + bind(HostedPluginSupportImpl).toSelf().inSingletonScope(); + bind(HostedPluginSupport).toService(HostedPluginSupportImpl); + rebind(TheiaHostedPluginSupport).toService(HostedPluginSupportImpl); bind(HostedPluginEvents).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(HostedPluginEvents); diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index 5dec4655c..8aebd0d82 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -1,8 +1,4 @@ import { inject, injectable } from '@theia/core/shared/inversify'; -import { Event, Emitter } from '@theia/core/lib/common/event'; -import { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; -import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; -import { NotificationCenter } from '../notification-center'; import { Board, BoardIdentifier, @@ -12,6 +8,11 @@ import { Sketch, } from '../../common/protocol'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { HostedPluginSupport } from '../hosted/hosted-plugin-support'; +import { ArduinoMenus } from '../menu/arduino-menus'; +import { NotificationCenter } from '../notification-center'; +import { CurrentSketch } from '../sketches-service-client-impl'; +import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { URI, Command, @@ -97,6 +98,22 @@ export class Debug extends SketchContribution { }); this.notificationCenter.onPlatformDidInstall(() => this.refreshState()); this.notificationCenter.onPlatformDidUninstall(() => this.refreshState()); + this.boardsDataStore.onDidChange((event) => { + const selectedFqbn = + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; + if (event.changes.find((change) => change.fqbn === selectedFqbn)) { + this.refreshState(); + } + }); + this.commandService.onDidExecuteCommand((event) => { + const { commandId, args } = event; + if ( + commandId === 'arduino.languageserver.notifyBuildDidComplete' && + isCompileSummary(args[0]) + ) { + this.refreshState(); + } + }); } override onReady(): void { diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index 26c7487d1..5f9a3f127 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -15,7 +15,7 @@ import { } from '../../common/protocol'; import { CurrentSketch } from '../sketches-service-client-impl'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; -import { HostedPluginEvents } from '../hosted-plugin-events'; +import { HostedPluginEvents } from '../hosted/hosted-plugin-events'; import { NotificationCenter } from '../notification-center'; import { SketchContribution, URI } from './contribution'; import { BoardsDataStore } from '../boards/boards-data-store'; diff --git a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts index ab4cdafb0..7f4cd71f1 100644 --- a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -1,7 +1,7 @@ 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 { HostedPluginSupport } from '../hosted/hosted-plugin-support'; import type { ArduinoState } from 'vscode-arduino-api'; import { BoardsService, diff --git a/arduino-ide-extension/src/browser/hosted-plugin-events.ts b/arduino-ide-extension/src/browser/hosted/hosted-plugin-events.ts similarity index 97% rename from arduino-ide-extension/src/browser/hosted-plugin-events.ts rename to arduino-ide-extension/src/browser/hosted/hosted-plugin-events.ts index ac7b1fe0d..35dbdbe4c 100644 --- a/arduino-ide-extension/src/browser/hosted-plugin-events.ts +++ b/arduino-ide-extension/src/browser/hosted/hosted-plugin-events.ts @@ -1,7 +1,7 @@ import { DisposableCollection, Emitter, Event } from '@theia/core'; import { FrontendApplicationContribution } from '@theia/core/lib/browser'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { HostedPluginSupport } from './theia/plugin-ext/hosted-plugin'; +import { HostedPluginSupport } from './hosted-plugin-support'; /** * Frontend contribution to watch VS Code extension start/stop events from Theia. diff --git a/arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts b/arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts new file mode 100644 index 000000000..b0d11c86a --- /dev/null +++ b/arduino-ide-extension/src/browser/hosted/hosted-plugin-support.ts @@ -0,0 +1,14 @@ +import type { Event } from '@theia/core/lib/common/event'; + +/* +This implementation hides the default HostedPluginSupport implementation from Theia to be able to test it. +Otherwise, the default implementation fails at require time due to the `import.meta` in the Theia plugin worker code. +https://github.com/eclipse-theia/theia/blob/964f69ca3b3a5fb87ffa0177fb300b74ba0ca39f/packages/plugin-ext/src/hosted/browser/plugin-worker.ts#L30-L32 +*/ + +export const HostedPluginSupport = Symbol('HostedPluginSupport'); +export interface HostedPluginSupport { + readonly didStart: Promise<void>; + readonly onDidLoad: Event<void>; + readonly onDidCloseConnection: Event<void>; +} diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts index 40d703423..2604c3caf 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts @@ -20,7 +20,7 @@ import { } from '@theia/monaco/lib/browser/monaco-theming-service'; import { MonacoThemeRegistry as TheiaMonacoThemeRegistry } from '@theia/monaco/lib/browser/textmate/monaco-theme-registry'; import type { ThemeMix } from '@theia/monaco/lib/browser/textmate/monaco-theme-types'; -import { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +import { HostedPluginSupport } from '../../hosted/hosted-plugin-support'; import { ArduinoThemes, compatibleBuiltInTheme } from '../core/theming'; import { WindowServiceExt } from '../core/window-service-ext'; diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts index 8491357a4..8edf46383 100644 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts +++ b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts @@ -5,9 +5,13 @@ import { PluginContributions, HostedPluginSupport as TheiaHostedPluginSupport, } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +import { HostedPluginSupport } from '../../hosted/hosted-plugin-support'; @injectable() -export class HostedPluginSupport extends TheiaHostedPluginSupport { +export class HostedPluginSupportImpl + extends TheiaHostedPluginSupport + implements HostedPluginSupport +{ private readonly onDidLoadEmitter = new Emitter<void>(); private readonly onDidCloseConnectionEmitter = new Emitter<void>(); 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 index 039111474..00d3eca5e 100644 --- a/arduino-ide-extension/src/test/browser/board-service-provider.test.ts +++ b/arduino-ide-extension/src/test/browser/board-service-provider.test.ts @@ -15,7 +15,6 @@ import { 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'; @@ -31,7 +30,6 @@ import { PortIdentifierChangeEvent, } from '../../common/protocol/boards-service'; import { NotificationServiceServer } from '../../common/protocol/notification-service'; -import { bindCommon, ConsoleLogger } from '../common/common-test-bindings'; import { detectedPort, esp32S3DevModule, @@ -414,11 +412,6 @@ describe('board-service-provider', () => { bind(WindowService).toConstantValue(<WindowService>{}); 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; From 42bf1a0e993b9fb74fe9c37d0d5f9797488a89db Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 23 Nov 2023 10:56:09 +0100 Subject: [PATCH 284/384] test: test Arduino state update for extensions Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../contributions/update-arduino-state.ts | 5 +- .../browser/board-service-provider.test.ts | 3 +- .../src/test/browser/browser-test-bindings.ts | 23 +- .../test/browser/update-arduino-state.test.ts | 670 ++++++++++++++++++ .../src/test/common/common-test-bindings.ts | 17 +- .../src/test/node/node-test-bindings.ts | 2 +- arduino-ide-extension/src/test/utils.ts | 7 +- 7 files changed, 716 insertions(+), 11 deletions(-) create mode 100644 arduino-ide-extension/src/test/browser/update-arduino-state.test.ts diff --git a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts index 7f4cd71f1..767fbbf8c 100644 --- a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -21,7 +21,10 @@ import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { CurrentSketch } from '../sketches-service-client-impl'; import { SketchContribution } from './contribution'; -interface UpdateStateParams<T extends ArduinoState> { +/** + * (non-API) exported for tests + */ +export interface UpdateStateParams<T extends ArduinoState = ArduinoState> { readonly key: keyof T; readonly value: T[keyof T]; } 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 index 00d3eca5e..54d3aa8ba 100644 --- a/arduino-ide-extension/src/test/browser/board-service-provider.test.ts +++ b/arduino-ide-extension/src/test/browser/board-service-provider.test.ts @@ -39,6 +39,7 @@ import { uno, unoSerialPort, } from '../common/fixtures'; +import { bindBrowser } from './browser-test-bindings'; disableJSDOM(); @@ -390,7 +391,7 @@ describe('board-service-provider', () => { const container = new Container({ defaultScope: 'Singleton' }); container.load( new ContainerModule((bind, unbind, isBound, rebind) => { - bindCommon(bind); + bindBrowser(bind, unbind, isBound, rebind); bind(MessageService).toConstantValue(<MessageService>{}); bind(BoardsService).toConstantValue(<BoardsService>{ getDetectedPorts() { diff --git a/arduino-ide-extension/src/test/browser/browser-test-bindings.ts b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts index 9165765f7..7b950833b 100644 --- a/arduino-ide-extension/src/test/browser/browser-test-bindings.ts +++ b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts @@ -1,8 +1,25 @@ +import { MockLogger } from '@theia/core/lib/common/test/mock-logger'; import { Container, ContainerModule } from '@theia/core/shared/inversify'; -import { bindCommon } from '../common/common-test-bindings'; +import { + Bind, + ConsoleLogger, + bindCommon, +} from '../common/common-test-bindings'; -export function createBaseContainer(): Container { +export function createBaseContainer(bind: Bind = bindBrowser): Container { const container = new Container({ defaultScope: 'Singleton' }); - container.load(new ContainerModule((bind) => bindCommon(bind))); + container.load(new ContainerModule(bind)); return container; } + +export const bindBrowser: Bind = function ( + ...args: Parameters<Bind> +): ReturnType<Bind> { + bindCommon(...args); + const [bind, , , rebind] = args; + // IDE2's test console logger does not support `Loggable` arg. + // Rebind logger to suppress `[Function (anonymous)]` messages in tests when the storage service is initialized without `window.localStorage`. + // https://github.com/eclipse-theia/theia/blob/04c8cf07843ea67402131132e033cdd54900c010/packages/core/src/browser/storage-service.ts#L60 + bind(MockLogger).toSelf().inSingletonScope(); + rebind(ConsoleLogger).toService(MockLogger); +}; diff --git a/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts new file mode 100644 index 000000000..c3ad66ce9 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts @@ -0,0 +1,670 @@ +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 { LabelProvider } from '@theia/core/lib/browser/label-provider'; +import { OpenerService } from '@theia/core/lib/browser/opener-service'; +import { + LocalStorageService, + StorageService, +} from '@theia/core/lib/browser/storage-service'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { Emitter } from '@theia/core/lib/common/event'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { wait } from '@theia/core/lib/common/promise-util'; +import URI from '@theia/core/lib/common/uri'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { expect } from 'chai'; +import type { + BoardDetails as ApiBoardDetails, + CompileSummary as ApiCompileSummary, + Port as ApiPort, +} from 'vscode-arduino-api'; +import { URI as CodeURI } from 'vscode-uri'; +import { ArduinoPreferences } from '../../browser/arduino-preferences'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { ConfigServiceClient } from '../../browser/config/config-service-client'; +import { CommandRegistry } from '../../browser/contributions/contribution'; +import { + UpdateArduinoState, + UpdateStateParams, +} from '../../browser/contributions/update-arduino-state'; +import { DialogService } from '../../browser/dialog-service'; +import { SettingsService } from '../../browser/dialogs/settings/settings'; +import { HostedPluginSupport } from '../../browser/hosted/hosted-plugin-support'; +import { NotificationCenter } from '../../browser/notification-center'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../../browser/sketches-service-client-impl'; +import { ApplicationConnectionStatusContribution } from '../../browser/theia/core/connection-status-service'; +import { OutputChannelManager } from '../../browser/theia/output/output-channel'; +import { WorkspaceService } from '../../browser/theia/workspace/workspace-service'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import { + CompileSummary, + FileSystemExt, + SketchesService, +} from '../../common/protocol'; +import { + BoardDetails, + BoardsService, + Port, +} from '../../common/protocol/boards-service'; +import { NotificationServiceServer } from '../../common/protocol/notification-service'; +import { never } from '../utils'; +import { bindBrowser } from './browser-test-bindings'; + +disableJSDOM(); + +describe('update-arduino-state', function () { + this.slow(250); + + let toDisposeAfterEach: DisposableCollection; + let boardsServiceProvider: BoardsServiceProvider; + let notificationCenter: NotificationCenter; + let commandRegistry: CommandRegistry; + let updateArduinoState: UpdateArduinoState; + let stateUpdateParams: UpdateStateParams[]; + + let boardDetailsMocks: Record<string, BoardDetails>; + let dataStoreMocks: Record<string, BoardsDataStore.Data>; + let currentSketchMock: CurrentSketch | undefined; + let sketchDirUriMock: URI | undefined; + let dataDirUriMock: URI | undefined; + let onCurrentSketchDidChangeEmitter: Emitter<CurrentSketch>; + let onDataDirDidChangeEmitter: Emitter<URI | undefined>; + let onSketchDirDidChangeEmitter: Emitter<URI | undefined>; + let onDataStoreDidChangeEmitter: Emitter<string[]>; + + beforeEach(async () => { + toDisposeAfterEach = new DisposableCollection(); + stateUpdateParams = []; + + // reset mocks + boardDetailsMocks = {}; + dataStoreMocks = {}; + currentSketchMock = undefined; + sketchDirUriMock = undefined; + dataDirUriMock = undefined; + onCurrentSketchDidChangeEmitter = new Emitter(); + onDataDirDidChangeEmitter = new Emitter(); + onSketchDirDidChangeEmitter = new Emitter(); + onDataStoreDidChangeEmitter = new Emitter(); + toDisposeAfterEach.pushAll([ + onCurrentSketchDidChangeEmitter, + onDataDirDidChangeEmitter, + onSketchDirDidChangeEmitter, + onDataStoreDidChangeEmitter, + ]); + + const container = createContainer(); + commandRegistry = container.get<CommandRegistry>(CommandRegistry); + // This command is registered by vscode-arduino-api + commandRegistry.registerCommand( + { id: 'arduinoAPI.updateState' }, + { + execute: (params: UpdateStateParams) => stateUpdateParams.push(params), + } + ); + // This command is contributed by the vscode-arduino-tools VSIX + commandRegistry.registerCommand( + { id: 'arduino.languageserver.notifyBuildDidComplete' }, + { + execute: () => { + /* NOOP */ + }, + } + ); + container.get<FrontendApplicationStateService>( + FrontendApplicationStateService + ).state = 'ready'; + boardsServiceProvider = container.get<BoardsServiceProvider>( + BoardsServiceProvider + ); + notificationCenter = container.get<NotificationCenter>(NotificationCenter); + updateArduinoState = container.get<UpdateArduinoState>(UpdateArduinoState); + toDisposeAfterEach.push( + Disposable.create(() => boardsServiceProvider.onStop()) + ); + boardsServiceProvider.onStart(); + await boardsServiceProvider.ready; + updateArduinoState.onStart(); + + await wait(50); + stateUpdateParams = []; + }); + + afterEach(() => { + toDisposeAfterEach.dispose(); + }); + + it('should automatically update the boards config (board+port) on ready', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + debuggingSupported: false, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + const port = { address: 'COM1', protocol: 'serial' }; + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: board, + selectedPort: port, + }; + boardsServiceProvider['_detectedPorts'] = { + [Port.keyOf(port)]: { + port: { + address: 'COM1', + addressLabel: 'COM1 Port', + protocol: 'serial', + protocolLabel: 'Serial', + }, + boards: [], + }, + }; + + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: 'a:b:c' }, + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + { + key: 'port', + value: { + address: 'COM1', + protocol: 'serial', + protocolLabel: 'Serial', + hardwareId: '', + label: 'COM1 Port', + properties: {}, + } as ApiPort, + }, + ]); + }); + + it('should automatically update the sketch path on ready', async () => { + const uri = 'file:///path/to/my_sketch'; + currentSketchMock = { + name: 'my_sketch', + uri, + mainFileUri: 'file:///path/to/my_sketch/my_sketch.ino', + additionalFileUris: [], + otherSketchFileUris: [], + rootFolderFileUris: [], + }; + + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'sketchPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'sketchPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it("should automatically update the 'directories.data' path on ready", async () => { + const uri = 'file:///path/to/data/dir'; + dataDirUriMock = new URI(uri); + + stateUpdateParams = []; + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'dataDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'dataDirPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it("should automatically update the 'directories.user' path on ready", async () => { + const uri = 'file:///path/to/sketchbook'; + sketchDirUriMock = new URI(uri); + + updateArduinoState.onReady(); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'userDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'userDirPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it('should update the boards config (board only) when did change', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + debuggingSupported: false, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + boardsServiceProvider.updateConfig(board); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: 'a:b:c' }, + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + { key: 'port', value: undefined }, + ]); + }); + + it('should update the boards config (port only) when did change', async () => { + const port = { address: 'COM1', protocol: 'serial' }; + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: { + [Port.keyOf(port)]: { + port: { + address: 'COM1', + addressLabel: 'COM1 Port', + protocol: 'serial', + protocolLabel: 'Serial', + }, + boards: [], + }, + }, + }); + boardsServiceProvider.updateConfig(port); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: undefined }, + { key: 'boardDetails', value: undefined }, + { + key: 'port', + value: { + address: 'COM1', + protocol: 'serial', + protocolLabel: 'Serial', + hardwareId: '', + label: 'COM1 Port', + properties: {}, + } as ApiPort, + }, + ]); + }); + + it('should update the boards config (board+port) when did change', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + debuggingSupported: false, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + const port = { address: 'COM1', protocol: 'serial' }; + boardsServiceProvider.updateConfig({ + selectedBoard: board, + selectedPort: port, + }); + notificationCenter.notifyDetectedPortsDidChange({ + detectedPorts: { + [Port.keyOf(port)]: { + port: { + address: 'COM1', + addressLabel: 'COM1 Port', + protocol: 'serial', + protocolLabel: 'Serial', + }, + boards: [], + }, + }, + }); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { key: 'fqbn', value: 'a:b:c' }, + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + { + key: 'port', + value: { + address: 'COM1', + protocol: 'serial', + protocolLabel: 'Serial', + hardwareId: '', + label: 'COM1 Port', + properties: {}, + } as ApiPort, + }, + ]); + }); + + it('should update the compile summary after a verify', async () => { + const summary: CompileSummary = { + buildPath: '/path/to/build', + buildProperties: [], + executableSectionsSize: [], + usedLibraries: [], + boardPlatform: undefined, + buildPlatform: undefined, + buildOutputUri: 'file:///path/to/build', + }; + await commandRegistry.executeCommand( + 'arduino.languageserver.notifyBuildDidComplete', + summary + ); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'compileSummary' + ); + expect(params).to.be.deep.equal([ + { + key: 'compileSummary', + value: { + buildPath: '/path/to/build', + buildProperties: {}, + executableSectionsSize: [], + usedLibraries: [], + boardPlatform: undefined, + buildPlatform: undefined, + } as ApiCompileSummary, + }, + ]); + }); + + it('should update the current sketch when did change', async () => { + const uri = 'file:///path/to/my_sketch'; + const sketch = { + name: 'my_sketch', + uri, + mainFileUri: 'file:///path/to/my_sketch/my_sketch.ino', + additionalFileUris: [], + otherSketchFileUris: [], + rootFolderFileUris: [], + }; + onCurrentSketchDidChangeEmitter.fire(sketch); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'sketchPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'sketchPath', + value: CodeURI.parse(uri).fsPath, + }, + ]); + }); + + it("should update the 'directories.data' when did change", async () => { + const uri = new URI('file:///path/to/data/dir'); + onDataDirDidChangeEmitter.fire(uri); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'dataDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'dataDirPath', + value: CodeURI.parse(uri.toString()).fsPath, + }, + ]); + }); + + it("should update the 'directories.user' when did change", async () => { + const uri = new URI('file:///path/to/sketchbook'); + onSketchDirDidChangeEmitter.fire(uri); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => param.key === 'userDirPath' + ); + expect(params).to.be.deep.equal([ + { + key: 'userDirPath', + value: CodeURI.parse(uri.toString()).fsPath, + }, + ]); + }); + + it('should not update the board details when data store did change but the selected board does not match', async () => { + onDataStoreDidChangeEmitter.fire(['a:b:c']); + await wait(50); + + expect(stateUpdateParams).to.be.empty; + }); + + it('should update the board details when the data store did change and the selected board matches', async () => { + const fqbn = 'a:b:c'; + const board = { fqbn, name: 'ABC' }; + const boardDetails = { + buildProperties: [], + configOptions: [], + debuggingSupported: false, + fqbn, + PID: '0', + VID: '0', + programmers: [], + requiredTools: [], + }; + boardDetailsMocks = { + 'a:b:c': boardDetails, + }; + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: board, + selectedPort: undefined, + }; + + onDataStoreDidChangeEmitter.fire(['a:b:c']); + await wait(50); + + const params = stateUpdateParams.filter( + (param) => + param.key === 'fqbn' || + param.key === 'boardDetails' || + param.key === 'port' + ); + expect(params).to.be.deep.equal([ + { + key: 'boardDetails', + value: { + buildProperties: {}, + configOptions: [], + fqbn: 'a:b:c', + programmers: [], + toolsDependencies: [], + } as ApiBoardDetails, + }, + ]); + }); + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bindBrowser(bind, unbind, isBound, rebind); + bind(MessageService).toConstantValue(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{ + getDetectedPorts() { + return {}; + }, + async getBoardDetails({ fqbn }) { + return boardDetailsMocks[fqbn]; + }, + }); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(< + NotificationServiceServer + >{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toConstantValue(<BoardsDataStore>{ + async getData(fqbn) { + if (!fqbn) { + return BoardsDataStore.Data.EMPTY; + } + const data = dataStoreMocks[fqbn] ?? BoardsDataStore.Data.EMPTY; + return data; + }, + get onChanged() { + return onDataStoreDidChangeEmitter.event; + }, + }); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + bind(NoopHostedPluginSupport).toSelf().inSingletonScope(); + bind(HostedPluginSupport).toService(NoopHostedPluginSupport); + bind(UpdateArduinoState).toSelf().inSingletonScope(); + bind(FileService).toConstantValue(<FileService>{}); + bind(FileSystemExt).toConstantValue(<FileSystemExt>{}); + bind(ConfigServiceClient).toConstantValue(<ConfigServiceClient>{ + tryGetSketchDirUri() { + return sketchDirUriMock; + }, + tryGetDataDirUri() { + return dataDirUriMock; + }, + get onDidChangeSketchDirUri() { + return onSketchDirDidChangeEmitter.event; + }, + get onDidChangeDataDirUri() { + return onDataDirDidChangeEmitter.event; + }, + }); + bind(SketchesService).toConstantValue(<SketchesService>{}); + bind(OpenerService).toConstantValue(<OpenerService>{}); + bind(SketchesServiceClientImpl).toConstantValue(< + SketchesServiceClientImpl + >{ + tryGetCurrentSketch() { + return currentSketchMock; + }, + onCurrentSketchDidChange: onCurrentSketchDidChangeEmitter.event, + }); + bind(EditorManager).toConstantValue(<EditorManager>{}); + bind(OutputChannelManager).toConstantValue(<OutputChannelManager>{}); + bind(EnvVariablesServer).toConstantValue(<EnvVariablesServer>{}); + bind(ApplicationConnectionStatusContribution).toConstantValue( + <ApplicationConnectionStatusContribution>{} + ); + bind(WorkspaceService).toConstantValue(<WorkspaceService>{}); + bind(LabelProvider).toConstantValue(<LabelProvider>{}); + bind(SettingsService).toConstantValue(<SettingsService>{}); + bind(ArduinoPreferences).toConstantValue(<ArduinoPreferences>{}); + bind(DialogService).toConstantValue(<DialogService>{}); + bind(MainMenuManager).toConstantValue(<MainMenuManager>{}); + }) + ); + return container; + } +}); + +@injectable() +class NoopHostedPluginSupport implements HostedPluginSupport { + readonly didStart = Promise.resolve(); + readonly onDidCloseConnection = never(); + readonly onDidLoad = never(); +} diff --git a/arduino-ide-extension/src/test/common/common-test-bindings.ts b/arduino-ide-extension/src/test/common/common-test-bindings.ts index 1c1892dc2..f3e3f4373 100644 --- a/arduino-ide-extension/src/test/common/common-test-bindings.ts +++ b/arduino-ide-extension/src/test/common/common-test-bindings.ts @@ -9,14 +9,25 @@ 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 { +export interface Bind { + ( + bind: interfaces.Bind, + unbind: interfaces.Unbind, + isBound: interfaces.IsBound, + rebind: interfaces.Rebind + ): void; +} + +export const bindCommon: Bind = function ( + ...args: Parameters<Bind> +): ReturnType<Bind> { + const [bind] = args; bind(ConsoleLogger).toSelf().inSingletonScope(); bind(ILogger).toService(ConsoleLogger); bind(CommandRegistry).toSelf().inSingletonScope(); bind(CommandService).toService(CommandRegistry); bindContributionProvider(bind, CommandContribution); - return bind; -} +}; @injectable() export class ConsoleLogger extends MockLogger { diff --git a/arduino-ide-extension/src/test/node/node-test-bindings.ts b/arduino-ide-extension/src/test/node/node-test-bindings.ts index 2b4c651f7..29ff09f52 100644 --- a/arduino-ide-extension/src/test/node/node-test-bindings.ts +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -222,7 +222,7 @@ export async function createBaseContainer( } const container = new Container({ defaultScope: 'Singleton' }); const module = new ContainerModule((bind, unbind, isBound, rebind) => { - bindCommon(bind); + bindCommon(bind, unbind, isBound, rebind); bind(CoreClientProvider).toSelf().inSingletonScope(); bind(CoreServiceImpl).toSelf().inSingletonScope(); bind(CoreService).toService(CoreServiceImpl); diff --git a/arduino-ide-extension/src/test/utils.ts b/arduino-ide-extension/src/test/utils.ts index 799081227..148649126 100644 --- a/arduino-ide-extension/src/test/utils.ts +++ b/arduino-ide-extension/src/test/utils.ts @@ -1,3 +1,6 @@ -export function tick(): Promise<void> { - return new Promise((res) => setTimeout(res, 1)); +import { Emitter, Event } from '@theia/core/lib/common/event'; + +const neverEmitter = new Emitter<unknown>(); +export function never<T = void>(): Event<T> { + return neverEmitter.event as Event<T>; } From 73b6dc4774297e53f7ea0affdbc3f7e963b8e980 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 8 Nov 2023 12:04:44 +0100 Subject: [PATCH 285/384] feat: use new `debug -I -P` CLI output - Can pick a programmer if missing, - Can auto-select a programmer on app start, - Can edit the `launch.json`, - Adjust board discovery to new gRPC API. From now on, it's a client read stream, not a duplex. - Allow `.cxx` and `.cc` file extensions. (Closes #2265) - Drop `debuggingSupported` from `BoardDetails`. - Dedicated service endpoint for checking the debugger. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .eslintrc.js | 2 +- arduino-ide-extension/package.json | 3 +- .../browser/arduino-ide-frontend-module.ts | 35 +- .../src/browser/boards/boards-data-store.ts | 53 +- .../contributions/auto-select-programmer.ts | 123 + .../src/browser/contributions/debug.ts | 358 ++- .../src/browser/contributions/ino-language.ts | 114 +- .../browser/sketches-service-client-impl.ts | 31 +- .../debug/debug-configuration-manager.ts | 53 +- .../debug/debug-configuration-widget.tsx | 57 + .../theia/debug/debug-session-manager.ts | 39 + .../theia/monaco/monaco-editor-provider.ts | 38 +- .../theia/monaco/monaco-text-model-service.ts | 2 +- arduino-ide-extension/src/common/nls.ts | 14 + .../src/common/protocol/boards-service.ts | 30 +- .../src/common/protocol/sketches-service.ts | 4 +- .../src/node/board-discovery.ts | 42 +- .../src/node/boards-service-impl.ts | 81 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 9 +- .../cc/arduino/cli/commands/v1/board_pb.js | 94 +- .../cli/commands/v1/commands_grpc_pb.d.ts | 64 +- .../cli/commands/v1/commands_grpc_pb.js | 105 +- .../arduino/cli/commands/v1/commands_pb.d.ts | 1 + .../cc/arduino/cli/commands/v1/commands_pb.js | 2 + .../cc/arduino/cli/commands/v1/common_pb.d.ts | 17 + .../cc/arduino/cli/commands/v1/common_pb.js | 123 + .../cc/arduino/cli/commands/v1/core_pb.d.ts | 9 + .../cc/arduino/cli/commands/v1/core_pb.js | 96 +- .../arduino/cli/commands/v1/debug_grpc_pb.js | 1 + .../cc/arduino/cli/commands/v1/debug_pb.d.ts | 274 ++ .../cc/arduino/cli/commands/v1/debug_pb.js | 2221 +++++++++++++++++ .../arduino/cli/debug/v1/debug_grpc_pb.d.ts | 59 - .../cc/arduino/cli/debug/v1/debug_grpc_pb.js | 95 - .../cc/arduino/cli/debug/v1/debug_pb.d.ts | 154 -- .../cc/arduino/cli/debug/v1/debug_pb.js | 1233 --------- .../cli/monitor/v1/monitor_grpc_pb.d.ts | 42 - .../arduino/cli/monitor/v1/monitor_grpc_pb.js | 65 - .../cc/arduino/cli/monitor/v1/monitor_pb.d.ts | 131 - .../cc/arduino/cli/monitor/v1/monitor_pb.js | 819 ------ .../src/node/sketches-service-impl.ts | 4 +- .../node/theia/plugin-ext/plugin-reader.ts | 31 +- .../browser/auto-select-programmer.test.ts | 176 ++ .../test/browser/boards-data-store.test.ts | 220 +- .../src/test/browser/browser-test-bindings.ts | 89 +- .../src/test/browser/debug.test.ts | 379 +++ .../test/browser/update-arduino-state.test.ts | 140 +- electron-app/package.json | 2 +- i18n/en.json | 4 + 48 files changed, 4697 insertions(+), 3041 deletions(-) create mode 100644 arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts create mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx create mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts create mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js create mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts create mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js create mode 100644 arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts create mode 100644 arduino-ide-extension/src/test/browser/debug.test.ts diff --git a/.eslintrc.js b/.eslintrc.js index da16cbb76..4bb67da9e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,7 +18,7 @@ module.exports = { 'electron-app/src-gen/*', 'electron-app/gen-webpack*.js', '!electron-app/webpack.config.js', - 'plugins/*', + 'electron-app/plugins/*', 'arduino-ide-extension/src/node/cli-protocol', '**/lib/*', ], diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 9b9079617..ba340a0f7 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -69,6 +69,7 @@ "deepmerge": "^4.2.2", "drivelist": "^9.2.4", "electron-updater": "^4.6.5", + "fast-deep-equal": "^3.1.3", "fast-json-stable-stringify": "^2.1.0", "fast-safe-stringify": "^2.1.1", "filename-reserved-regex": "^2.0.0", @@ -169,7 +170,7 @@ ], "arduino": { "arduino-cli": { - "version": "0.34.0" + "version": "0.35.0-rc.7" }, "arduino-fwuploader": { "version": "2.4.1" 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 fa92aeafe..f481dfc21 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 { ContainerModule } from '@theia/core/shared/inversify'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; import { WidgetFactory } from '@theia/core/lib/browser/widget-manager'; import { CommandContribution } from '@theia/core/lib/common/command'; import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; @@ -361,6 +361,16 @@ import { TerminalFrontendContribution as TheiaTerminalFrontendContribution } fro import { SelectionService } from '@theia/core/lib/common/selection-service'; import { CommandService } from '@theia/core/lib/common/command'; import { CorePreferences } from '@theia/core/lib/browser/core-preferences'; +import { AutoSelectProgrammer } from './contributions/auto-select-programmer'; +import { HostedPluginSupport } from './hosted/hosted-plugin-support'; +import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; +import { DebugSessionManager } from './theia/debug/debug-session-manager'; +import { DebugWidget } 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/debug-configuration-widget'; +import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget'; +import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -756,6 +766,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, CreateCloudCopy); Contribution.configure(bind, UpdateArduinoState); Contribution.configure(bind, BoardsDataMenuUpdater); + Contribution.configure(bind, AutoSelectProgrammer); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window @@ -857,6 +868,28 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // To be able to use a `launch.json` from outside of the workspace. bind(DebugConfigurationManager).toSelf().inSingletonScope(); rebind(TheiaDebugConfigurationManager).toService(DebugConfigurationManager); + // To update the currently selected debug config <select> option when starting a debug session. + bind(DebugSessionManager).toSelf().inSingletonScope(); + rebind(TheiaDebugSessionManager).toService(DebugSessionManager); + // Customized debug widget with its customized config <select> to update it programmatically. + 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(); + child.bind(DebugSessionWidget).toSelf(); + child.bind(DebugConfigurationWidget).toSelf(); // with the patched select + child // use the customized one in the Theia DI + .bind(TheiaDebugConfigurationWidget) + .toService(DebugConfigurationWidget); + child.bind(DebugWidget).toSelf(); + return child.get(DebugWidget); + }, + })) + .inSingletonScope(); // To avoid duplicate tabs use deepEqual instead of string equal: https://github.com/eclipse-theia/theia/issues/11309 bind(WidgetManager).toSelf().inSingletonScope(); 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 e6e34abf0..e78f5b74b 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -10,13 +10,16 @@ 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, deepFreeze } from '@theia/core/lib/common/objects'; +import type { Mutable } from '@theia/core/lib/common/types'; import { inject, injectable, named } from '@theia/core/shared/inversify'; import { BoardDetails, BoardsService, ConfigOption, + ConfigValue, Programmer, isBoardIdentifierChangeEvent, + isProgrammer, } from '../../common/protocol'; import { notEmpty } from '../../common/utils'; import type { @@ -74,7 +77,7 @@ export class BoardsDataStore const storedData = await this.storageService.getData<BoardsDataStore.Data>(key); if (!storedData) { - // if not previously value is available for the board, do not update the cache + // if no previously value is available for the board, do not update the cache continue; } const details = await this.loadBoardDetails(fqbn); @@ -88,6 +91,13 @@ export class BoardsDataStore this.fireChanged(...changes); } }), + this.onDidChange((event) => { + const selectedFqbn = + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; + if (event.changes.find((change) => change.fqbn === selectedFqbn)) { + this.updateSelectedBoardData(selectedFqbn); + } + }), ]); Promise.all([ @@ -174,7 +184,7 @@ export class BoardsDataStore return storedData; } - const boardDetails = await this.getBoardDetailsSafe(fqbn); + const boardDetails = await this.loadBoardDetails(fqbn); if (!boardDetails) { return BoardsDataStore.Data.EMPTY; } @@ -220,11 +230,12 @@ export class BoardsDataStore } let updated = false; for (const value of configOption.values) { - if (value.value === selectedValue) { - (value as any).selected = true; + const mutable: Mutable<ConfigValue> = value; + if (mutable.value === selectedValue) { + mutable.selected = true; updated = true; } else { - (value as any).selected = false; + mutable.selected = false; } } if (!updated) { @@ -245,9 +256,7 @@ export class BoardsDataStore return `.arduinoIDE-configOptions-${fqbn}`; } - protected async getBoardDetailsSafe( - fqbn: string - ): Promise<BoardDetails | undefined> { + async loadBoardDetails(fqbn: string): Promise<BoardDetails | undefined> { try { const details = await this.boardsService.getBoardDetails({ fqbn }); return details; @@ -280,21 +289,24 @@ export namespace BoardsDataStore { readonly configOptions: ConfigOption[]; readonly programmers: Programmer[]; readonly selectedProgrammer?: Programmer; + readonly defaultProgrammerId?: string; } export namespace Data { export const EMPTY: Data = deepFreeze({ configOptions: [], programmers: [], - defaultProgrammerId: undefined, }); export function is(arg: unknown): arg is Data { return ( - !!arg && - 'configOptions' in arg && - Array.isArray(arg['configOptions']) && - 'programmers' in arg && - Array.isArray(arg['programmers']) + typeof arg === 'object' && + arg !== null && + Array.isArray((<Data>arg).configOptions) && + Array.isArray((<Data>arg).programmers) && + ((<Data>arg).selectedProgrammer === undefined || + isProgrammer((<Data>arg).selectedProgrammer)) && + ((<Data>arg).defaultProgrammerId === undefined || + typeof (<Data>arg).defaultProgrammerId === 'string') ); } } @@ -304,7 +316,8 @@ export function isEmptyData(data: BoardsDataStore.Data): boolean { return ( Boolean(!data.configOptions.length) && Boolean(!data.programmers.length) && - Boolean(!data.selectedProgrammer) + Boolean(!data.selectedProgrammer) && + Boolean(!data.defaultProgrammerId) ); } @@ -324,16 +337,18 @@ export function findDefaultProgrammer( function createDataStoreEntry(details: BoardDetails): BoardsDataStore.Data { const configOptions = details.configOptions.slice(); const programmers = details.programmers.slice(); + const { defaultProgrammerId } = details; const selectedProgrammer = findDefaultProgrammer( programmers, - details.defaultProgrammerId + defaultProgrammerId ); - return { + const data = { configOptions, programmers, - defaultProgrammerId: details.defaultProgrammerId, - selectedProgrammer, + ...(selectedProgrammer ? { selectedProgrammer } : {}), + ...(defaultProgrammerId ? { defaultProgrammerId } : {}), }; + return data; } export interface BoardsDataStoreChange { diff --git a/arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts b/arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts new file mode 100644 index 000000000..0bf8e277e --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/auto-select-programmer.ts @@ -0,0 +1,123 @@ +import type { MaybePromise } from '@theia/core/lib/common/types'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { + BoardDetails, + Programmer, + isBoardIdentifierChangeEvent, +} from '../../common/protocol'; +import { + BoardsDataStore, + findDefaultProgrammer, + isEmptyData, +} from '../boards/boards-data-store'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { Contribution } from './contribution'; + +/** + * Before CLI 0.35.0-rc.3, there was no `programmer#default` property in the `board details` response. + * This method does the programmer migration in the data store. If there is a programmer selected, it's a noop. + * If no programmer is selected, it forcefully reloads the details from the CLI and updates it in the local storage. + */ +@injectable() +export class AutoSelectProgrammer extends Contribution { + @inject(BoardsServiceProvider) + private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; + + override onStart(): void { + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.ensureProgrammerIsSelected(); + } + }); + } + + override onReady(): void { + this.boardsServiceProvider.ready.then(() => + this.ensureProgrammerIsSelected() + ); + } + + private async ensureProgrammerIsSelected(): Promise<boolean> { + return ensureProgrammerIsSelected({ + fqbn: this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn, + getData: (fqbn) => this.boardsDataStore.getData(fqbn), + loadBoardDetails: (fqbn) => this.boardsDataStore.loadBoardDetails(fqbn), + selectProgrammer: (arg) => this.boardsDataStore.selectProgrammer(arg), + }); + } +} + +interface EnsureProgrammerIsSelectedParams { + fqbn: string | undefined; + getData: (fqbn: string | undefined) => MaybePromise<BoardsDataStore.Data>; + loadBoardDetails: (fqbn: string) => MaybePromise<BoardDetails | undefined>; + selectProgrammer(options: { + fqbn: string; + selectedProgrammer: Programmer; + }): MaybePromise<boolean>; +} + +export async function ensureProgrammerIsSelected( + params: EnsureProgrammerIsSelectedParams +): Promise<boolean> { + const { fqbn, getData, loadBoardDetails, selectProgrammer } = params; + if (!fqbn) { + return false; + } + console.debug(`Ensuring a programmer is selected for ${fqbn}...`); + const data = await getData(fqbn); + if (isEmptyData(data)) { + // For example, the platform is not installed. + console.debug(`Skipping. No boards data is available for ${fqbn}.`); + return false; + } + if (data.selectedProgrammer) { + console.debug( + `A programmer is already selected for ${fqbn}: '${data.selectedProgrammer.id}'.` + ); + return true; + } + let programmer = findDefaultProgrammer(data.programmers, data); + if (programmer) { + // select the programmer if the default info is available + const result = await selectProgrammer({ + fqbn, + selectedProgrammer: programmer, + }); + if (result) { + console.debug(`Selected '${programmer.id}' programmer for ${fqbn}.`); + return result; + } + } + console.debug(`Reloading board details for ${fqbn}...`); + const reloadedData = await loadBoardDetails(fqbn); + if (!reloadedData) { + console.debug(`Skipping. No board details found for ${fqbn}.`); + return false; + } + if (!reloadedData.programmers.length) { + console.debug(`Skipping. ${fqbn} does not have programmers.`); + return false; + } + programmer = findDefaultProgrammer(reloadedData.programmers, reloadedData); + if (!programmer) { + console.debug( + `Skipping. Could not find a default programmer for ${fqbn}. Programmers were: ` + ); + return false; + } + const result = await selectProgrammer({ + fqbn, + selectedProgrammer: programmer, + }); + if (result) { + console.debug(`Selected '${programmer.id}' programmer for ${fqbn}.`); + } else { + console.debug( + `Could not select '${programmer.id}' programmer for ${fqbn}.` + ); + } + return result; +} diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index 8aebd0d82..d1f205051 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -1,12 +1,20 @@ +import { Emitter, Event } from '@theia/core/lib/common/event'; +import { MenuModelRegistry } from '@theia/core/lib/common/menu/menu-model-registry'; +import { nls } from '@theia/core/lib/common/nls'; +import { MaybePromise } from '@theia/core/lib/common/types'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { noBoardSelected } from '../../common/nls'; import { - Board, + BoardDetails, BoardIdentifier, BoardsService, + CheckDebugEnabledParams, ExecutableService, + SketchRef, isBoardIdentifierChangeEvent, - Sketch, + isCompileSummary, } from '../../common/protocol'; +import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { HostedPluginSupport } from '../hosted/hosted-plugin-support'; import { ArduinoMenus } from '../menu/arduino-menus'; @@ -14,95 +22,119 @@ import { NotificationCenter } from '../notification-center'; import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { - URI, Command, CommandRegistry, SketchContribution, TabBarToolbarRegistry, + URI, } from './contribution'; -import { MenuModelRegistry, nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../sketches-service-client-impl'; -import { ArduinoMenus } from '../menu/arduino-menus'; const COMPILE_FOR_DEBUG_KEY = 'arduino-compile-for-debug'; +interface StartDebugParams { + /** + * Absolute filesystem path to the Arduino CLI executable. + */ + readonly cliPath: string; + /** + * The the board to debug. + */ + readonly board: Readonly<{ fqbn: string; name?: string }>; + /** + * Absolute filesystem path of the sketch to debug. + */ + readonly sketchPath: string; + /** + * Location where the `launch.json` will be created on the fly before starting every debug session. + * If not defined, it falls back to `sketchPath/.vscode/launch.json`. + */ + readonly launchConfigsDirPath?: string; + /** + * Absolute path to the `arduino-cli.yaml` file. If not specified, it falls back to `~/.arduinoIDE/arduino-cli.yaml`. + */ + readonly cliConfigPath?: string; + /** + * Programmer for the debugging. + */ + readonly programmer?: string; + /** + * Custom progress title to use when getting the debug information from the CLI. + */ + readonly title?: string; +} +type StartDebugResult = boolean; + @injectable() export class Debug extends SketchContribution { @inject(HostedPluginSupport) private readonly hostedPluginSupport: HostedPluginSupport; - @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; - @inject(ExecutableService) private readonly executableService: ExecutableService; - @inject(BoardsService) private readonly boardService: BoardsService; - @inject(BoardsServiceProvider) private readonly boardsServiceProvider: BoardsServiceProvider; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; /** - * If `undefined`, debugging is enabled. Otherwise, the reason why it's disabled. + * If `undefined`, debugging is enabled. Otherwise, the human-readable reason why it's disabled. */ - private _disabledMessages?: string = nls.localize( - 'arduino/common/noBoardSelected', - 'No board selected' - ); // Initial pessimism. - private disabledMessageDidChangeEmitter = new Emitter<string | undefined>(); - private onDisabledMessageDidChange = - this.disabledMessageDidChangeEmitter.event; + private _message?: string = noBoardSelected; // Initial pessimism. + private didChangeMessageEmitter = new Emitter<string | undefined>(); + private onDidChangeMessage = this.didChangeMessageEmitter.event; - private get disabledMessage(): string | undefined { - return this._disabledMessages; + private get message(): string | undefined { + return this._message; } - private set disabledMessage(message: string | undefined) { - this._disabledMessages = message; - this.disabledMessageDidChangeEmitter.fire(this._disabledMessages); + private set message(message: string | undefined) { + this._message = message; + this.didChangeMessageEmitter.fire(this._message); } private readonly debugToolbarItem = { id: Debug.Commands.START_DEBUGGING.id, command: Debug.Commands.START_DEBUGGING.id, tooltip: `${ - this.disabledMessage + this.message ? nls.localize( 'arduino/debug/debugWithMessage', 'Debug - {0}', - this.disabledMessage + this.message ) : Debug.Commands.START_DEBUGGING.label }`, priority: 3, - onDidChange: this.onDisabledMessageDidChange as Event<void>, + onDidChange: this.onDidChangeMessage as Event<void>, }; override onStart(): void { - this.onDisabledMessageDidChange( + this.onDidChangeMessage( () => (this.debugToolbarItem.tooltip = `${ - this.disabledMessage + this.message ? nls.localize( 'arduino/debug/debugWithMessage', 'Debug - {0}', - this.disabledMessage + this.message ) : Debug.Commands.START_DEBUGGING.label }`) ); this.boardsServiceProvider.onBoardsConfigDidChange((event) => { if (isBoardIdentifierChangeEvent(event)) { - this.refreshState(event.selectedBoard); + this.updateMessage(); } }); - this.notificationCenter.onPlatformDidInstall(() => this.refreshState()); - this.notificationCenter.onPlatformDidUninstall(() => this.refreshState()); + this.notificationCenter.onPlatformDidInstall(() => this.updateMessage()); + this.notificationCenter.onPlatformDidUninstall(() => this.updateMessage()); this.boardsDataStore.onDidChange((event) => { const selectedFqbn = this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; if (event.changes.find((change) => change.fqbn === selectedFqbn)) { - this.refreshState(); + this.updateMessage(); } }); this.commandService.onDidExecuteCommand((event) => { @@ -111,13 +143,13 @@ export class Debug extends SketchContribution { commandId === 'arduino.languageserver.notifyBuildDidComplete' && isCompileSummary(args[0]) ) { - this.refreshState(); + this.updateMessage(); } }); } override onReady(): void { - this.boardsServiceProvider.ready.then(() => this.refreshState()); + this.boardsServiceProvider.ready.then(() => this.updateMessage()); } override registerCommands(registry: CommandRegistry): void { @@ -125,7 +157,7 @@ export class Debug extends SketchContribution { execute: () => this.startDebug(), isVisible: (widget) => ArduinoToolbar.is(widget) && widget.side === 'left', - isEnabled: () => !this.disabledMessage, + isEnabled: () => !this.message, }); registry.registerCommand(Debug.Commands.TOGGLE_OPTIMIZE_FOR_DEBUG, { execute: () => this.toggleCompileForDebug(), @@ -148,94 +180,56 @@ export class Debug extends SketchContribution { }); } - private async refreshState( - board: Board | undefined = this.boardsServiceProvider.boardsConfig - .selectedBoard - ): Promise<void> { - if (!board) { - this.disabledMessage = nls.localize( - 'arduino/common/noBoardSelected', - 'No board selected' - ); - return; - } - const fqbn = board.fqbn; - if (!fqbn) { - this.disabledMessage = nls.localize( - 'arduino/debug/noPlatformInstalledFor', - "Platform is not installed for '{0}'", - board.name - ); - return; - } - const details = await this.boardService.getBoardDetails({ fqbn }); - if (!details) { - this.disabledMessage = nls.localize( - 'arduino/debug/noPlatformInstalledFor', - "Platform is not installed for '{0}'", - board.name - ); - return; - } - const { debuggingSupported } = details; - if (!debuggingSupported) { - this.disabledMessage = nls.localize( - 'arduino/debug/debuggingNotSupported', - "Debugging is not supported by '{0}'", - board.name - ); - } else { - this.disabledMessage = undefined; + private async updateMessage(): Promise<void> { + try { + await this.isDebugEnabled(); + this.message = undefined; + } catch (err) { + let message = String(err); + if (err instanceof Error) { + message = err.message; + } + this.message = message; } } - private async startDebug( + private async isDebugEnabled( board: BoardIdentifier | undefined = this.boardsServiceProvider.boardsConfig .selectedBoard - ): Promise<void> { - if (!board) { - return; + ): Promise<string> { + const debugFqbn = await isDebugEnabled( + board, + (fqbn) => this.boardService.getBoardDetails({ fqbn }), + (fqbn) => this.boardsDataStore.getData(fqbn), + (fqbn) => this.boardsDataStore.appendConfigToFqbn(fqbn), + (params) => this.boardService.checkDebugEnabled(params) + ); + return debugFqbn; + } + + private async startDebug( + board: BoardIdentifier | undefined = this.boardsServiceProvider.boardsConfig + .selectedBoard, + sketch: + | CurrentSketch + | undefined = this.sketchServiceClient.tryGetCurrentSketch() + ): Promise<StartDebugResult> { + if (!CurrentSketch.isValid(sketch)) { + return false; } - const { name, fqbn } = board; - if (!fqbn) { - return; + const params = await this.createStartDebugParams(board); + if (!params) { + return false; } await this.hostedPluginSupport.didStart; - const [sketch, executables] = await Promise.all([ - this.sketchServiceClient.currentSketch(), - this.executableService.list(), - ]); - if (!CurrentSketch.isValid(sketch)) { - return; - } - const ideTempFolderUri = await this.sketchesService.getIdeTempFolderUri( - sketch - ); - const [cliPath, sketchPath, configPath] = await Promise.all([ - this.fileService.fsPath(new URI(executables.cliUri)), - this.fileService.fsPath(new URI(sketch.uri)), - this.fileService.fsPath(new URI(ideTempFolderUri)), - ]); - const config = { - cliPath, - board: { - fqbn, - name, - }, - sketchPath, - configPath, - }; try { - await this.commandService.executeCommand('arduino.debug.start', config); + const result = await this.debug(params); + return Boolean(result); } catch (err) { if (await this.isSketchNotVerifiedError(err, sketch)) { const yes = nls.localize('vscode/extensionsUtils/yes', 'Yes'); const answer = await this.messageService.error( - nls.localize( - 'arduino/debug/sketchIsNotCompiled', - "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?", - sketch.name - ), + sketchIsNotCompiled(sketch.name), yes ); if (answer === yes) { @@ -247,6 +241,16 @@ export class Debug extends SketchContribution { ); } } + return false; + } + + private async debug( + params: StartDebugParams + ): Promise<StartDebugResult | undefined> { + return this.commandService.executeCommand<StartDebugResult>( + 'arduino.debug.start', + params + ); } get compileForDebug(): boolean { @@ -254,7 +258,7 @@ export class Debug extends SketchContribution { return value === 'true'; } - async toggleCompileForDebug(): Promise<void> { + private toggleCompileForDebug(): void { const oldState = this.compileForDebug; const newState = !oldState; window.localStorage.setItem(COMPILE_FOR_DEBUG_KEY, String(newState)); @@ -263,7 +267,7 @@ export class Debug extends SketchContribution { private async isSketchNotVerifiedError( err: unknown, - sketch: Sketch + sketch: SketchRef ): Promise<boolean> { if (err instanceof Error) { try { @@ -277,6 +281,48 @@ export class Debug extends SketchContribution { } return false; } + + private async createStartDebugParams( + board: BoardIdentifier | undefined + ): Promise<StartDebugParams | undefined> { + if (!board || !board.fqbn) { + return undefined; + } + let debugFqbn: string | undefined = undefined; + try { + debugFqbn = await this.isDebugEnabled(board); + } catch {} + if (!debugFqbn) { + return undefined; + } + const [sketch, executables, boardsData] = await Promise.all([ + this.sketchServiceClient.currentSketch(), + this.executableService.list(), + this.boardsDataStore.getData(board.fqbn), + ]); + if (!CurrentSketch.isValid(sketch)) { + return undefined; + } + const ideTempFolderUri = await this.sketchesService.getIdeTempFolderUri( + sketch + ); + const [cliPath, sketchPath, launchConfigsDirPath] = await Promise.all([ + this.fileService.fsPath(new URI(executables.cliUri)), + this.fileService.fsPath(new URI(sketch.uri)), + this.fileService.fsPath(new URI(ideTempFolderUri)), + ]); + return { + board: { fqbn: debugFqbn, name: board.name }, + cliPath, + sketchPath, + launchConfigsDirPath, + programmer: boardsData.selectedProgrammer?.id, + title: nls.localize( + 'arduino/debug/getDebugInfo', + 'Getting debug info...' + ), + }; + } } export namespace Debug { export namespace Commands { @@ -301,3 +347,89 @@ export namespace Debug { }; } } + +/** + * (non-API) + */ +export async function isDebugEnabled( + board: BoardIdentifier | undefined, + getDetails: (fqbn: string) => MaybePromise<BoardDetails | undefined>, + getData: (fqbn: string) => MaybePromise<BoardsDataStore.Data>, + appendConfigToFqbn: (fqbn: string) => MaybePromise<string | undefined>, + checkDebugEnabled: (params: CheckDebugEnabledParams) => MaybePromise<string> +): Promise<string> { + if (!board) { + throw new Error(noBoardSelected); + } + const { fqbn } = board; + if (!fqbn) { + throw new Error(noPlatformInstalledFor(board.name)); + } + const [details, data, fqbnWithConfig] = await Promise.all([ + getDetails(fqbn), + getData(fqbn), + appendConfigToFqbn(fqbn), + ]); + if (!details) { + throw new Error(noPlatformInstalledFor(board.name)); + } + if (!fqbnWithConfig) { + throw new Error( + `Failed to append boards config to the FQBN. Original FQBN was: ${fqbn}` + ); + } + if (!data.selectedProgrammer) { + throw new Error(noProgrammerSelectedFor(board.name)); + } + const params = { + fqbn: fqbnWithConfig, + programmer: data.selectedProgrammer.id, + }; + try { + const debugFqbn = await checkDebugEnabled(params); + return debugFqbn; + } catch (err) { + throw new Error(debuggingNotSupported(board.name)); + } +} + +/** + * (non-API) + */ +export function sketchIsNotCompiled(sketchName: string): string { + return nls.localize( + 'arduino/debug/sketchIsNotCompiled', + "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?", + sketchName + ); +} +/** + * (non-API) + */ +export function noPlatformInstalledFor(boardName: string): string { + return nls.localize( + 'arduino/debug/noPlatformInstalledFor', + "Platform is not installed for '{0}'", + boardName + ); +} +/** + * (non-API) + */ +export function debuggingNotSupported(boardName: string): string { + return nls.localize( + 'arduino/debug/debuggingNotSupported', + "Debugging is not supported by '{0}'", + boardName + ); +} +/** + * (non-API) + */ +export function noProgrammerSelectedFor(boardName: string): string { + return nls.localize( + 'arduino/debug/noProgrammerSelectedFor', + "No programmer selected for '{0}'", + boardName + ); +} diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index 5f9a3f127..5d1fe4638 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -20,26 +20,83 @@ import { NotificationCenter } from '../notification-center'; import { SketchContribution, URI } from './contribution'; import { BoardsDataStore } from '../boards/boards-data-store'; +interface DaemonAddress { + /** + * The host where the Arduino CLI daemon is available. + */ + readonly hostname: string; + /** + * The port where the Arduino CLI daemon is listening. + */ + readonly port: number; + /** + * The [id](https://arduino.github.io/arduino-cli/latest/rpc/commands/#instance) of the initialized core Arduino client instance. + */ + readonly instance: number; +} + +interface StartLanguageServerParams { + /** + * Absolute filesystem path to the Arduino Language Server executable. + */ + readonly lsPath: string; + /** + * The hostname and the port for the gRPC channel connecting to the Arduino CLI daemon. + * The `instance` number is for the initialized core Arduino client. + */ + readonly daemonAddress: DaemonAddress; + /** + * Absolute filesystem path to [`clangd`](https://clangd.llvm.org/). + */ + readonly clangdPath: string; + /** + * The board is relevant to start a specific "flavor" of the language. + */ + readonly board: { fqbn: string; name?: string }; + /** + * `true` if the LS should generate the log files into the default location. The default location is the `cwd` of the process. + * It's very often the same as the workspace root of the IDE, aka the sketch folder. + * When it is a string, it is the absolute filesystem path to the folder to generate the log files. + * If `string`, but the path is inaccessible, the log files will be generated into the default location. + */ + readonly log?: boolean | string; + /** + * Optional `env` for the language server process. + */ + readonly env?: NodeJS.ProcessEnv; + /** + * Additional flags for the Arduino Language server process. + */ + readonly flags?: readonly string[]; + /** + * Set to `true`, to enable `Diagnostics`. + */ + readonly realTimeDiagnostics?: boolean; + /** + * If `true`, the logging is not forwarded to the _Output_ view via the language client. + */ + readonly silentOutput?: boolean; +} + +/** + * The FQBN the language server runs with or `undefined` if it could not start. + */ +type StartLanguageServerResult = string | undefined; + @injectable() export class InoLanguage extends SketchContribution { @inject(HostedPluginEvents) private readonly hostedPluginEvents: HostedPluginEvents; - @inject(ExecutableService) private readonly executableService: ExecutableService; - @inject(ArduinoDaemon) private readonly daemon: ArduinoDaemon; - @inject(BoardsService) private readonly boardsService: BoardsService; - @inject(BoardsServiceProvider) private readonly boardsServiceProvider: BoardsServiceProvider; - @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; - @inject(BoardsDataStore) private readonly boardDataStore: BoardsDataStore; @@ -129,6 +186,10 @@ export class InoLanguage extends SketchContribution { if (!port) { return; } + const portNumber = Number.parseInt(port, 10); // TODO: IDE2 APIs should provide a number and not string + if (Number.isNaN(portNumber)) { + return; + } const release = await this.languageServerStartMutex.acquire(); const toDisposeOnRelease = new DisposableCollection(); try { @@ -197,22 +258,22 @@ export class InoLanguage extends SketchContribution { ); toDisposeOnRelease.push(Disposable.create(() => clearTimeout(timer))); }), - this.commandService.executeCommand<string>( - 'arduino.languageserver.start', - { - lsPath, - cliDaemonAddr: `localhost:${port}`, - clangdPath, - log: currentSketchPath ? currentSketchPath : log, - cliDaemonInstance: '1', - board: { - fqbn: fqbnWithConfig, - name: name ? `"${name}"` : undefined, - }, - realTimeDiagnostics, - silentOutput: true, - } - ), + this.start({ + lsPath, + daemonAddress: { + hostname: 'localhost', + port: portNumber, + instance: 1, // TODO: get it from the backend + }, + clangdPath, + log: currentSketchPath ? currentSketchPath : log, + board: { + fqbn: fqbnWithConfig, + name, + }, + realTimeDiagnostics, + silentOutput: true, + }), ]); } catch (e) { console.log(`Failed to start language server. Original FQBN: ${fqbn}`, e); @@ -222,4 +283,13 @@ export class InoLanguage extends SketchContribution { release(); } } + + private async start( + params: StartLanguageServerParams + ): Promise<StartLanguageServerResult | undefined> { + return this.commandService.executeCommand<StartLanguageServerResult>( + 'arduino.languageserver.start', + params + ); + } } diff --git a/arduino-ide-extension/src/browser/sketches-service-client-impl.ts b/arduino-ide-extension/src/browser/sketches-service-client-impl.ts index f0186454c..9b3cdac94 100644 --- a/arduino-ide-extension/src/browser/sketches-service-client-impl.ts +++ b/arduino-ide-extension/src/browser/sketches-service-client-impl.ts @@ -67,6 +67,7 @@ export class SketchesServiceClientImpl ); private _currentSketch: CurrentSketch | undefined; + private _currentIdeTempFolderUri: URI | undefined; private currentSketchLoaded = new Deferred<CurrentSketch>(); onStart(): void { @@ -74,7 +75,10 @@ export class SketchesServiceClientImpl this.watchSketchbookDir(sketchDirUri); const refreshCurrentSketch = async () => { const currentSketch = await this.loadCurrentSketch(); - this.useCurrentSketch(currentSketch); + const ideTempFolderUri = await this.getIdeTempFolderUriForSketch( + currentSketch + ); + this.useCurrentSketch(currentSketch, ideTempFolderUri); }; this.toDispose.push( this.configService.onDidChangeSketchDirUri((sketchDirUri) => { @@ -141,7 +145,10 @@ export class SketchesServiceClientImpl } if (!Sketch.sameAs(this._currentSketch, reloadedSketch)) { - this.useCurrentSketch(reloadedSketch, true); + const ideTempFolderUri = await this.getIdeTempFolderUriForSketch( + reloadedSketch + ); + this.useCurrentSketch(reloadedSketch, ideTempFolderUri, true); } return; } @@ -179,11 +186,23 @@ export class SketchesServiceClientImpl ]); } + private async getIdeTempFolderUriForSketch( + sketch: CurrentSketch + ): Promise<URI | undefined> { + if (CurrentSketch.isValid(sketch)) { + const uri = await this.sketchesService.getIdeTempFolderUri(sketch); + return new URI(uri); + } + return undefined; + } + private useCurrentSketch( currentSketch: CurrentSketch, + ideTempFolderUri: URI | undefined, reassignPromise = false ) { this._currentSketch = currentSketch; + this._currentIdeTempFolderUri = ideTempFolderUri; if (reassignPromise) { this.currentSketchLoaded = new Deferred(); } @@ -273,6 +292,14 @@ export class SketchesServiceClientImpl return false; } + if ( + this._currentIdeTempFolderUri && + this._currentIdeTempFolderUri.resolve('launch.json').toString() === + toCheck.toString() + ) { + return false; + } + const isCloudSketch = toCheck .toString() .includes(`${REMOTE_SKETCHBOOK_FOLDER}/${ARDUINO_CLOUD_FOLDER}`); diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts index f877e0e12..6e0210a41 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-manager.ts @@ -1,44 +1,44 @@ -import debounce from 'p-debounce'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; -import { Event, Emitter } from '@theia/core/lib/common/event'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { DebugConfiguration } from '@theia/debug/lib/common/debug-common'; -import { DebugConfigurationModel as TheiaDebugConfigurationModel } from '@theia/debug/lib/browser/debug-configuration-model'; +import { Disposable } from '@theia/core/lib/common/disposable'; +import { Emitter, Event } from '@theia/core/lib/common/event'; +import URI from '@theia/core/lib/common/uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { DebugConfigurationManager as TheiaDebugConfigurationManager } from '@theia/debug/lib/browser/debug-configuration-manager'; +import { DebugConfigurationModel as TheiaDebugConfigurationModel } from '@theia/debug/lib/browser/debug-configuration-model'; +import { DebugConfiguration } from '@theia/debug/lib/common/debug-common'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { + FileOperationError, + FileOperationResult, +} from '@theia/filesystem/lib/common/files'; +import debounce from 'p-debounce'; import { SketchesService } from '../../../common/protocol'; import { CurrentSketch, SketchesServiceClientImpl, } from '../../sketches-service-client-impl'; +import { maybeUpdateReadOnlyState } from '../monaco/monaco-editor-provider'; import { DebugConfigurationModel } from './debug-configuration-model'; -import { - FileOperationError, - FileOperationResult, -} from '@theia/filesystem/lib/common/files'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; @injectable() export class DebugConfigurationManager extends TheiaDebugConfigurationManager { @inject(SketchesService) - protected readonly sketchesService: SketchesService; - + private readonly sketchesService: SketchesService; @inject(SketchesServiceClientImpl) - protected readonly sketchesServiceClient: SketchesServiceClientImpl; - + private readonly sketchesServiceClient: SketchesServiceClientImpl; @inject(FrontendApplicationStateService) - protected readonly appStateService: FrontendApplicationStateService; - + private readonly appStateService: FrontendApplicationStateService; @inject(FileService) - protected readonly fileService: FileService; + private readonly fileService: FileService; - protected onTempContentDidChangeEmitter = + private onTempContentDidChangeEmitter = new Emitter<TheiaDebugConfigurationModel.JsonContent>(); get onTempContentDidChange(): Event<TheiaDebugConfigurationModel.JsonContent> { return this.onTempContentDidChangeEmitter.event; } protected override async doInit(): Promise<void> { + this.watchLaunchConfigEditor(); this.appStateService.reachedState('ready').then(async () => { const tempContent = await this.getTempLaunchJsonContent(); if (!tempContent) { @@ -75,6 +75,19 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { return super.doInit(); } + /** + * Sets a listener on current sketch change, and maybe updates the readonly state of the editor showing the debug configuration. aka the `launch.json`. + */ + private watchLaunchConfigEditor(): Disposable { + return this.sketchesServiceClient.onCurrentSketchDidChange(() => { + for (const widget of this.editorManager.all) { + maybeUpdateReadOnlyState(widget, (uri) => + this.sketchesServiceClient.isReadOnly(uri) + ); + } + }); + } + protected override updateModels = debounce(async () => { await this.appStateService.reachedState('ready'); const roots = await this.workspaceService.roots; @@ -111,7 +124,7 @@ export class DebugConfigurationManager extends TheiaDebugConfigurationManager { this.updateCurrent(); }, 500); - protected async getTempLaunchJsonContent(): Promise< + private async getTempLaunchJsonContent(): Promise< (TheiaDebugConfigurationModel.JsonContent & { uri: URI }) | URI | undefined > { const sketch = await this.sketchesServiceClient.currentSketch(); diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx new file mode 100644 index 000000000..7d05a4b68 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx @@ -0,0 +1,57 @@ +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { injectable } from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import { DebugAction } from '@theia/debug/lib/browser/view/debug-action'; +import { DebugConfigurationSelect as TheiaDebugConfigurationSelect } from '@theia/debug/lib/browser/view/debug-configuration-select'; +import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget'; + +/** + * Patched to programmatically update the debug config <select> in the widget. + */ +@injectable() +export class DebugConfigurationWidget extends TheiaDebugConfigurationWidget { + override render(): React.ReactNode { + return ( + <React.Fragment> + <DebugAction + run={this.start} + label={nls.localizeByDefault('Start Debugging')} + iconClass="debug-start" + ref={this.setStepRef} + /> + {/* The customized select component that will refresh when the config manager did change */} + <DebugConfigurationSelect + manager={this.manager} + quickInputService={this.quickInputService} + isMultiRoot={this.workspaceService.isMultiRootWorkspaceOpened} + /> + <DebugAction + run={this.openConfiguration} + label={nls.localizeByDefault('Open {0}', '"launch.json"')} + iconClass="settings-gear" + /> + <DebugAction + run={this.openConsole} + label={nls.localizeByDefault('Debug Console')} + iconClass="terminal" + /> + </React.Fragment> + ); + } +} + +class DebugConfigurationSelect extends TheiaDebugConfigurationSelect { + private readonly toDisposeOnUnmount = new DisposableCollection(); + + override componentDidMount(): void { + super.componentDidMount(); + this.toDisposeOnUnmount.push( + this['manager'].onDidChange(() => this.refreshDebugConfigurations()) + ); + } + + override componentWillUnmount(): void { + this.toDisposeOnUnmount.dispose(); + } +} diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts b/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts new file mode 100644 index 000000000..9c73da72e --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/debug/debug-session-manager.ts @@ -0,0 +1,39 @@ +import { inject, injectable } from '@theia/core/shared/inversify'; +import { DebugSession } from '@theia/debug/lib/browser/debug-session'; +import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; +import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; +import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; +import deepEqual from 'fast-deep-equal'; + +@injectable() +export class DebugSessionManager extends TheiaDebugSessionManager { + @inject(WorkspaceService) + private readonly workspaceService: WorkspaceService; + + protected override doStart( + sessionId: string, + options: DebugConfigurationSessionOptions + ): Promise<DebugSession> { + this.syncCurrentOptions(options); + return super.doStart(sessionId, options); + } + + /** + * If the debug config manager knows about the currently started options, and it's not the currently selected one, select it. + */ + private syncCurrentOptions(options: DebugConfigurationSessionOptions): void { + const knownConfigOptions = this.debugConfigurationManager.find( + options.configuration, + options.workspaceFolderUri ?? + this.workspaceService + .tryGetRoots() + .map((stat) => stat.resource.toString())[0] + ); + if ( + knownConfigOptions && + !deepEqual(knownConfigOptions, this.debugConfigurationManager.current) + ) { + this.debugConfigurationManager.current = knownConfigOptions; + } + } +} diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts index 524461b53..871cf8504 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts @@ -1,17 +1,20 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; +import { LOCKED_CLASS, lock } from '@theia/core/lib/browser/widgets/widget'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import URI from '@theia/core/lib/common/uri'; +import { Title, Widget } from '@theia/core/shared/@phosphor/widgets'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; +import * as monaco from '@theia/monaco-editor-core'; +import type { ReferencesModel } from '@theia/monaco-editor-core/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel'; import { EditorServiceOverrides, MonacoEditor, } from '@theia/monaco/lib/browser/monaco-editor'; import { MonacoEditorProvider as TheiaMonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider'; import { SketchesServiceClientImpl } from '../../sketches-service-client-impl'; -import * as monaco from '@theia/monaco-editor-core'; -import type { ReferencesModel } from '@theia/monaco-editor-core/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel'; type CancelablePromise = Promise<ReferencesModel> & { cancel: () => void; @@ -101,3 +104,30 @@ export class MonacoEditorProvider extends TheiaMonacoEditorProvider { editor.updateOptions({ readOnly }); } } + +// Theia cannot dynamically set an editor to writable once it was readonly. +export function maybeUpdateReadOnlyState( + widget: EditorWidget, + isReadOnly: (uri: string | URI | monaco.Uri) => boolean +): void { + const editor = widget.editor; + if (!(editor instanceof MonacoEditor)) { + return; + } + const model = editor.document; + const oldReadOnly = model.readOnly; + const resource = model['resource']; + const newReadOnly = Boolean(resource.isReadonly) || isReadOnly(resource.uri); + if (oldReadOnly !== newReadOnly) { + editor.getControl().updateOptions({ readOnly: newReadOnly }); + if (newReadOnly) { + lock(widget.title); + } else { + unlock(widget.title); + } + } +} + +function unlock(title: Title<Widget>): void { + title.className = title.className.replace(LOCKED_CLASS, '').trim(); +} diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts index a7d530095..2943d4580 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts @@ -77,7 +77,7 @@ class MaybeReadonlyMonacoEditorModel extends SilentMonacoEditorModel { } this._dirty = dirty; if (dirty === false) { - (this as any).updateSavedVersionId(); + this['updateSavedVersionId'](); } this.onDirtyChangedEmitter.fire(undefined); } diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index 06c8baee7..d824f1751 100644 --- a/arduino-ide-extension/src/common/nls.ts +++ b/arduino-ide-extension/src/common/nls.ts @@ -20,8 +20,22 @@ export const InstallManually = nls.localize( 'arduino/common/installManually', 'Install Manually' ); +export const SelectManually = nls.localize( + 'arduino/common/selectManually', + 'Select Manually' +); export const serialMonitorWidgetLabel = nls.localize( 'arduino/common/serialMonitor', 'Serial Monitor' ); + +export const noBoardSelected = nls.localize( + 'arduino/common/noBoardSelected', + 'No board selected' +); + +export const noSketchOpened = nls.localize( + 'arduino/common/noSketchOpened', + 'No sketch opened' +); diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index c485e6704..a06dffd33 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -80,6 +80,22 @@ export interface BoardsService fqbn: string; protocol: string; }): Promise<BoardUserField[]>; + /** + * Checks whether the debugging is enabled with the FQBN, programmer, current sketch, and custom board options. + * + * When the debugging is enabled, the promise resolves with the FQBN to use with the debugger. This is the same + * FQBN given in the `CheckDebugEnabledParams#fqbn` but cleaned up of the board options that do not affect the debugger configuration. + * It may be used by clients/IDE to group slightly different boards option selections under the same debug configuration. + */ + checkDebugEnabled(params: CheckDebugEnabledParams): Promise<string>; +} + +export interface CheckDebugEnabledParams { + /** + * The FQBN might contain custom board config options. For example, `arduino:esp32:nano_nora:USBMode=hwcdc,option2=value2`. + */ + readonly fqbn: string; + readonly programmer: string; } export interface BoardSearch extends Searchable.Options { @@ -330,10 +346,10 @@ export interface BoardDetails { readonly requiredTools: Tool[]; readonly configOptions: ConfigOption[]; readonly programmers: Programmer[]; - readonly debuggingSupported: boolean; readonly VID: string; readonly PID: string; readonly buildProperties: string[]; + readonly defaultProgrammerId?: string; } export interface Tool { @@ -425,6 +441,18 @@ export namespace Programmer { ); } } +export function isProgrammer(arg: unknown): arg is Programmer { + return ( + typeof arg === 'object' && + arg !== null && + (<Programmer>arg).id !== undefined && + typeof (<Programmer>arg).id === 'string' && + (<Programmer>arg).name !== undefined && + typeof (<Programmer>arg).name === 'string' && + (<Programmer>arg).platform !== undefined && + typeof (<Programmer>arg).platform === 'string' + ); +} export namespace Board { export function is(board: any): board is Board { diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index fd3d5c6a1..3c98252c1 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -121,7 +121,7 @@ export interface SketchesService { * Hence, IDE2 has to provide multiple build paths on Windows. This hack will be obsolete when the CLI can provide error codes: * https://github.com/arduino/arduino-cli/issues/1762. */ - tempBuildPath(sketch: Sketch): Promise<string[]>; + tempBuildPath(sketch: SketchRef): Promise<string[]>; } export interface SketchRef { @@ -308,7 +308,7 @@ export namespace Sketch { export namespace Extensions { export const DEFAULT = '.ino'; export const MAIN = [DEFAULT, '.pde']; - export const SOURCE = ['.c', '.cpp', '.S']; + export const SOURCE = ['.c', '.cpp', '.S', '.cxx', '.cc']; export const CODE_FILES = [ ...MAIN, ...SOURCE, diff --git a/arduino-ide-extension/src/node/board-discovery.ts b/arduino-ide-extension/src/node/board-discovery.ts index 5d6c137de..628ed97ec 100644 --- a/arduino-ide-extension/src/node/board-discovery.ts +++ b/arduino-ide-extension/src/node/board-discovery.ts @@ -1,4 +1,4 @@ -import type { ClientDuplexStream } from '@grpc/grpc-js'; +import type { ClientReadableStream } from '@grpc/grpc-js'; import { Disposable, DisposableCollection, @@ -30,9 +30,9 @@ import type { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/ import { CoreClientAware } from './core-client-provider'; import { ServiceError } from './service-error'; -type Duplex = ClientDuplexStream<BoardListWatchRequest, BoardListWatchResponse>; +type Stream = ClientReadableStream<BoardListWatchResponse>; interface StreamWrapper extends Disposable { - readonly stream: Duplex; + readonly stream: Stream; readonly uuid: string; // For logging only } @@ -121,34 +121,15 @@ export class BoardDiscovery return Disposable.create(() => clearTimeout(timer)); } - private async requestStartWatch( - req: BoardListWatchRequest, - duplex: Duplex - ): Promise<void> { - return new Promise<void>((resolve, reject) => { - if ( - !duplex.write(req, (err: Error | undefined) => { - if (err) { - reject(err); - return; - } - }) - ) { - duplex.once('drain', resolve); - } else { - process.nextTick(resolve); - } - }); - } - private async createWrapper( - client: ArduinoCoreServiceClient + client: ArduinoCoreServiceClient, + req: BoardListWatchRequest ): Promise<StreamWrapper> { if (this.wrapper) { throw new Error(`Duplex was already set.`); } const stream = client - .boardListWatch() + .boardListWatch(req) .on('end', () => { this.logger.info('received end'); this.onStreamDidEndEmitter.fire(); @@ -202,14 +183,11 @@ export class BoardDiscovery this.watching = new Deferred(); this.logger.info('start new deferred'); const { client, instance } = await this.coreClient; - const wrapper = await this.createWrapper(client); - wrapper.stream.on('data', (resp) => this.onBoardListWatchResponse(resp)); - this.logger.info('start request start watch'); - await this.requestStartWatch( - new BoardListWatchRequest().setInstance(instance), - wrapper.stream + const wrapper = await this.createWrapper( + client, + new BoardListWatchRequest().setInstance(instance) ); - this.logger.info('start requested start watch'); + wrapper.stream.on('data', (resp) => this.onBoardListWatchResponse(resp)); this.watching.resolve(); this.logger.info('start resolved watching'); } diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 80f1446e0..3b04b18eb 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -1,38 +1,30 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; import { ILogger } from '@theia/core/lib/common/logger'; +import { nls } from '@theia/core/lib/common/nls'; import { notEmpty } from '@theia/core/lib/common/objects'; +import { inject, injectable } from '@theia/core/shared/inversify'; import { - BoardsService, - Installable, - BoardsPackage, Board, BoardDetails, + BoardSearch, + BoardUserField, + BoardWithPackage, + BoardsPackage, + BoardsService, + CheckDebugEnabledParams, ConfigOption, ConfigValue, + DetectedPorts, + Installable, + NotificationServiceServer, Programmer, ResponseService, - NotificationServiceServer, - DetectedPorts, - BoardWithPackage, - BoardUserField, - BoardSearch, - sortComponents, SortGroup, - platformInstallFailed, createPlatformIdentifier, platformIdentifierEquals, + platformInstallFailed, + sortComponents, } from '../common/protocol'; -import { - PlatformInstallRequest, - PlatformListRequest, - PlatformListResponse, - PlatformSearchRequest, - PlatformSearchResponse, - PlatformUninstallRequest, -} from './cli-protocol/cc/arduino/cli/commands/v1/core_pb'; -import { Platform } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { BoardDiscovery } from './board-discovery'; -import { CoreClientAware } from './core-client-provider'; import { BoardDetailsRequest, BoardDetailsResponse, @@ -40,15 +32,25 @@ import { BoardListAllResponse, BoardSearchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; +import { Platform } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; +import { + PlatformInstallRequest, + PlatformListRequest, + PlatformListResponse, + PlatformSearchRequest, + PlatformSearchResponse, + PlatformUninstallRequest, +} from './cli-protocol/cc/arduino/cli/commands/v1/core_pb'; +import { IsDebugSupportedRequest } from './cli-protocol/cc/arduino/cli/commands/v1/debug_pb'; import { ListProgrammersAvailableForUploadRequest, ListProgrammersAvailableForUploadResponse, SupportedUserFieldsRequest, SupportedUserFieldsResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; +import { CoreClientAware } from './core-client-provider'; import { ExecuteWithProgress } from './grpc-progressible'; import { ServiceError } from './service-error'; -import { nls } from '@theia/core/lib/common'; @injectable() export class BoardsServiceImpl @@ -99,8 +101,6 @@ export class BoardsServiceImpl return undefined; } - const debuggingSupported = detailsResp.getDebuggingSupported(); - const requiredTools = detailsResp.getToolsDependenciesList().map((t) => ({ name: t.getName(), packager: t.getPackager(), @@ -146,6 +146,7 @@ export class BoardsServiceImpl platform: p.getPlatform(), } ); + const defaultProgrammerId = detailsResp.getDefaultProgrammerId(); let VID = 'N/A'; let PID = 'N/A'; @@ -164,13 +165,43 @@ export class BoardsServiceImpl requiredTools, configOptions, programmers, - debuggingSupported, VID, PID, buildProperties, + ...(defaultProgrammerId ? { defaultProgrammerId } : {}), }; } + async checkDebugEnabled(params: CheckDebugEnabledParams): Promise<string> { + const { fqbn, programmer } = params; + const { client, instance } = await this.coreClient; + const req = new IsDebugSupportedRequest() + .setInstance(instance) + .setFqbn(fqbn) + .setProgrammer(programmer); + try { + const debugFqbn = await new Promise<string>((resolve, reject) => + client.isDebugSupported(req, (err, resp) => { + if (err) { + reject(err); + return; + } + if (resp.getDebuggingSupported()) { + const debugFqbn = resp.getDebugFqbn(); + if (debugFqbn) { + resolve(debugFqbn); + } + } + reject(new Error(`Debugging is not supported.`)); + }) + ); + return debugFqbn; + } catch (err) { + console.error(`Failed to get debug config: ${fqbn}, ${programmer}`, err); + throw err; + } + } + async getBoardPackage(options: { id: string; }): Promise<BoardsPackage | undefined> { 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 fbf5b47b7..0cd416a54 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 @@ -74,8 +74,6 @@ export class BoardDetailsResponse extends jspb.Message { getProgrammersList(): Array<cc_arduino_cli_commands_v1_common_pb.Programmer>; setProgrammersList(value: Array<cc_arduino_cli_commands_v1_common_pb.Programmer>): BoardDetailsResponse; addProgrammers(value?: cc_arduino_cli_commands_v1_common_pb.Programmer, index?: number): cc_arduino_cli_commands_v1_common_pb.Programmer; - getDebuggingSupported(): boolean; - setDebuggingSupported(value: boolean): BoardDetailsResponse; clearIdentificationPropertiesList(): void; getIdentificationPropertiesList(): Array<BoardIdentificationProperties>; setIdentificationPropertiesList(value: Array<BoardIdentificationProperties>): BoardDetailsResponse; @@ -84,6 +82,8 @@ export class BoardDetailsResponse extends jspb.Message { getBuildPropertiesList(): Array<string>; setBuildPropertiesList(value: Array<string>): BoardDetailsResponse; addBuildProperties(value: string, index?: number): string; + getDefaultProgrammerId(): string; + setDefaultProgrammerId(value: string): BoardDetailsResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; @@ -109,9 +109,9 @@ export namespace BoardDetailsResponse { toolsDependenciesList: Array<ToolsDependencies.AsObject>, configOptionsList: Array<ConfigOption.AsObject>, programmersList: Array<cc_arduino_cli_commands_v1_common_pb.Programmer.AsObject>, - debuggingSupported: boolean, identificationPropertiesList: Array<BoardIdentificationProperties.AsObject>, buildPropertiesList: Array<string>, + defaultProgrammerId: string, } } @@ -488,8 +488,6 @@ 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; @@ -504,7 +502,6 @@ export class BoardListWatchRequest extends jspb.Message { export namespace BoardListWatchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - interrupt: boolean, } } 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 da5148eac..12119bd31 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 @@ -730,10 +730,10 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.toObject = function(includ proto.cc.arduino.cli.commands.v1.ConfigOption.toObject, includeInstance), programmersList: jspb.Message.toObjectList(msg.getProgrammersList(), cc_arduino_cli_commands_v1_common_pb.Programmer.toObject, includeInstance), - debuggingSupported: jspb.Message.getBooleanFieldWithDefault(msg, 14, false), identificationPropertiesList: jspb.Message.toObjectList(msg.getIdentificationPropertiesList(), proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.toObject, includeInstance), - buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 16)) == null ? undefined : f + buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 16)) == null ? undefined : f, + defaultProgrammerId: jspb.Message.getFieldWithDefault(msg, 17, "") }; if (includeInstance) { @@ -823,10 +823,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.deserializeBinaryFromReade reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Programmer.deserializeBinaryFromReader); msg.addProgrammers(value); break; - case 14: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDebuggingSupported(value); - break; case 15: var value = new proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties; reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties.deserializeBinaryFromReader); @@ -836,6 +832,10 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.deserializeBinaryFromReade var value = /** @type {string} */ (reader.readString()); msg.addBuildProperties(value); break; + case 17: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProgrammerId(value); + break; default: reader.skipField(); break; @@ -954,13 +954,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.serializeBinaryToWriter = cc_arduino_cli_commands_v1_common_pb.Programmer.serializeBinaryToWriter ); } - f = message.getDebuggingSupported(); - if (f) { - writer.writeBool( - 14, - f - ); - } f = message.getIdentificationPropertiesList(); if (f.length > 0) { writer.writeRepeatedMessage( @@ -976,6 +969,13 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.serializeBinaryToWriter = f ); } + f = message.getDefaultProgrammerId(); + if (f.length > 0) { + writer.writeString( + 17, + f + ); + } }; @@ -1293,24 +1293,6 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearProgrammers }; -/** - * optional bool debugging_supported = 14; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getDebuggingSupported = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 14, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setDebuggingSupported = function(value) { - return jspb.Message.setProto3BooleanField(this, 14, value); -}; - - /** * repeated BoardIdentificationProperties identification_properties = 15; * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties>} @@ -1386,6 +1368,24 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearBuildProper }; +/** + * optional string default_programmer_id = 17; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getDefaultProgrammerId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 17, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardDetailsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.setDefaultProgrammerId = function(value) { + return jspb.Message.setProto3StringField(this, 17, value); +}; + + @@ -4181,8 +4181,7 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.toObject = func */ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - interrupt: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) }; if (includeInstance) { @@ -4224,10 +4223,6 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromRead reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); msg.setInstance(value); break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setInterrupt(value); - break; default: reader.skipField(); break; @@ -4265,13 +4260,6 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter = cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getInterrupt(); - if (f) { - writer.writeBool( - 2, - f - ); - } }; @@ -4312,24 +4300,6 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.hasInstance = f }; -/** - * optional bool interrupt = 2; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.getInterrupt = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.setInterrupt = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - 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 c5159b1cb..d1692362f 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 @@ -11,6 +11,7 @@ import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino import * as cc_arduino_cli_commands_v1_board_pb from "../../../../../cc/arduino/cli/commands/v1/board_pb"; import * as cc_arduino_cli_commands_v1_compile_pb from "../../../../../cc/arduino/cli/commands/v1/compile_pb"; import * as cc_arduino_cli_commands_v1_core_pb from "../../../../../cc/arduino/cli/commands/v1/core_pb"; +import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/cli/commands/v1/debug_pb"; import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; @@ -55,6 +56,9 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped libraryList: IArduinoCoreServiceService_ILibraryList; monitor: IArduinoCoreServiceService_IMonitor; enumerateMonitorPortSettings: IArduinoCoreServiceService_IEnumerateMonitorPortSettings; + debug: IArduinoCoreServiceService_IDebug; + isDebugSupported: IArduinoCoreServiceService_IIsDebugSupported; + getDebugConfig: IArduinoCoreServiceService_IGetDebugConfig; } interface IArduinoCoreServiceService_ICreate extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CreateRequest, cc_arduino_cli_commands_v1_commands_pb.CreateResponse> { @@ -185,7 +189,7 @@ interface IArduinoCoreServiceService_IBoardSearch extends grpc.MethodDefinition< } interface IArduinoCoreServiceService_IBoardListWatch extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch"; - requestStream: true; + requestStream: false; responseStream: true; requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest>; requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest>; @@ -408,6 +412,33 @@ interface IArduinoCoreServiceService_IEnumerateMonitorPortSettings extends grpc. responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse>; } +interface IArduinoCoreServiceService_IDebug extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/Debug"; + requestStream: true; + responseStream: true; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.DebugRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.DebugRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; +} +interface IArduinoCoreServiceService_IIsDebugSupported extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/IsDebugSupported"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; +} +interface IArduinoCoreServiceService_IGetDebugConfig extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/GetDebugConfig"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; +} export const ArduinoCoreServiceService: IArduinoCoreServiceService; @@ -426,7 +457,7 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa boardList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListRequest, cc_arduino_cli_commands_v1_board_pb.BoardListResponse>; boardListAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest, cc_arduino_cli_commands_v1_board_pb.BoardListAllResponse>; boardSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>; - boardListWatch: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + boardListWatch: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; compile: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_compile_pb.CompileRequest, cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; platformInstall: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>; platformDownload: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_core_pb.PlatformDownloadRequest, cc_arduino_cli_commands_v1_core_pb.PlatformDownloadResponse>; @@ -451,6 +482,9 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa libraryList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_lib_pb.LibraryListRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryListResponse>; monitor: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_monitor_pb.MonitorRequest, cc_arduino_cli_commands_v1_monitor_pb.MonitorResponse>; enumerateMonitorPortSettings: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse>; + debug: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + isDebugSupported: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; + getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; } export interface IArduinoCoreServiceClient { @@ -493,9 +527,8 @@ export interface IArduinoCoreServiceClient { boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; - boardListWatch(): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; - boardListWatch(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; - boardListWatch(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; platformInstall(request: cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>; @@ -553,6 +586,15 @@ export interface IArduinoCoreServiceClient { enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; + debug(): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + debug(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + debug(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; } export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCoreServiceClient { @@ -596,8 +638,8 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; - public boardListWatch(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; - public boardListWatch(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; + public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; public compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; public compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; public platformInstall(request: cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>; @@ -654,4 +696,12 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; public enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; public enumerateMonitorPortSettings(request: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse) => void): grpc.ClientUnaryCall; + public debug(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + public debug(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; + public isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + public isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + public isDebugSupported(request: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse) => void): grpc.ClientUnaryCall; + public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; } 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 8947c7570..671e361d0 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 @@ -23,6 +23,7 @@ var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cl var cc_arduino_cli_commands_v1_board_pb = require('../../../../../cc/arduino/cli/commands/v1/board_pb.js'); var cc_arduino_cli_commands_v1_compile_pb = require('../../../../../cc/arduino/cli/commands/v1/compile_pb.js'); var cc_arduino_cli_commands_v1_core_pb = require('../../../../../cc/arduino/cli/commands/v1/core_pb.js'); +var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli/commands/v1/debug_pb.js'); var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); @@ -225,6 +226,28 @@ function deserialize_cc_arduino_cli_commands_v1_CreateResponse(buffer_arg) { return cc_arduino_cli_commands_v1_commands_pb.CreateResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_DebugRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.DebugRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.DebugRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_DebugRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.DebugRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_DebugResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.DebugResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.DebugResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_DebugResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.DebugResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_DestroyRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.DestroyRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.DestroyRequest'); @@ -269,6 +292,28 @@ function deserialize_cc_arduino_cli_commands_v1_EnumerateMonitorPortSettingsResp return cc_arduino_cli_commands_v1_monitor_pb.EnumerateMonitorPortSettingsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.GetDebugConfigRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.GetDebugConfigResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_GitLibraryInstallRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_lib_pb.GitLibraryInstallRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.GitLibraryInstallRequest'); @@ -313,6 +358,28 @@ function deserialize_cc_arduino_cli_commands_v1_InitResponse(buffer_arg) { return cc_arduino_cli_commands_v1_commands_pb.InitResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.IsDebugSupportedRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.IsDebugSupportedResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_LibraryDownloadRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.LibraryDownloadRequest'); @@ -1065,7 +1132,7 @@ boardSearch: { // List boards connection and disconnected events. boardListWatch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch', - requestStream: true, + requestStream: false, responseStream: true, requestType: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, responseType: cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse, @@ -1367,5 +1434,41 @@ enumerateMonitorPortSettings: { responseSerialize: serialize_cc_arduino_cli_commands_v1_EnumerateMonitorPortSettingsResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_EnumerateMonitorPortSettingsResponse, }, + // Start a debug session and communicate with the debugger tool. +debug: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Debug', + requestStream: true, + responseStream: true, + requestType: cc_arduino_cli_commands_v1_debug_pb.DebugRequest, + responseType: cc_arduino_cli_commands_v1_debug_pb.DebugResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_DebugRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_DebugRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_DebugResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_DebugResponse, + }, + // Determine if debugging is suported given a specific configuration. +isDebugSupported: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/IsDebugSupported', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, + responseType: cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_IsDebugSupportedResponse, + }, + // Query the debugger information given a specific configuration. +getDebugConfig: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/GetDebugConfig', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, + responseType: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_GetDebugConfigRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, + }, }; 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 6957c8971..981a4c793 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 @@ -10,6 +10,7 @@ import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino import * as cc_arduino_cli_commands_v1_board_pb from "../../../../../cc/arduino/cli/commands/v1/board_pb"; import * as cc_arduino_cli_commands_v1_compile_pb from "../../../../../cc/arduino/cli/commands/v1/compile_pb"; import * as cc_arduino_cli_commands_v1_core_pb from "../../../../../cc/arduino/cli/commands/v1/core_pb"; +import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/cli/commands/v1/debug_pb"; import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; 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 5ce1aa6bc..7c8f9d694 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 @@ -31,6 +31,8 @@ var cc_arduino_cli_commands_v1_compile_pb = require('../../../../../cc/arduino/c goog.object.extend(proto, cc_arduino_cli_commands_v1_compile_pb); var cc_arduino_cli_commands_v1_core_pb = require('../../../../../cc/arduino/cli/commands/v1/core_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_core_pb); +var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli/commands/v1/debug_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_debug_pb); var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_monitor_pb); var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); 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 7df25a374..76437e03f 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 @@ -195,6 +195,23 @@ export namespace Programmer { } } +export class MissingProgrammerError extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MissingProgrammerError.AsObject; + static toObject(includeInstance: boolean, msg: MissingProgrammerError): MissingProgrammerError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MissingProgrammerError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MissingProgrammerError; + static deserializeBinaryFromReader(message: MissingProgrammerError, reader: jspb.BinaryReader): MissingProgrammerError; +} + +export namespace MissingProgrammerError { + export type AsObject = { + } +} + export class Platform extends jspb.Message { getId(): string; setId(value: string): Platform; 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 f0eaaaf44..3f7418a1d 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 @@ -30,6 +30,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgressUpdate', nul goog.exportSymbol('proto.cc.arduino.cli.commands.v1.HelpResources', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledPlatformReference', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Instance', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MissingProgrammerError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Profile', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Programmer', null, global); @@ -181,6 +182,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Programmer.displayName = 'proto.cc.arduino.cli.commands.v1.Programmer'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MissingProgrammerError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MissingProgrammerError.displayName = 'proto.cc.arduino.cli.commands.v1.MissingProgrammerError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -1587,6 +1609,107 @@ proto.cc.arduino.cli.commands.v1.Programmer.prototype.setName = function(value) + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MissingProgrammerError.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.MissingProgrammerError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.MissingProgrammerError} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.MissingProgrammerError; + return proto.cc.arduino.cli.commands.v1.MissingProgrammerError.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.MissingProgrammerError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.MissingProgrammerError} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.MissingProgrammerError.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.MissingProgrammerError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MissingProgrammerError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + /** * List of repeated fields within this message type. * @private {!Array<number>} 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 3034f8446..99b25cb15 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 @@ -23,6 +23,8 @@ export class PlatformInstallRequest extends jspb.Message { setSkipPostInstall(value: boolean): PlatformInstallRequest; getNoOverwrite(): boolean; setNoOverwrite(value: boolean): PlatformInstallRequest; + getSkipPreUninstall(): boolean; + setSkipPreUninstall(value: boolean): PlatformInstallRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformInstallRequest.AsObject; @@ -42,6 +44,7 @@ export namespace PlatformInstallRequest { version: string, skipPostInstall: boolean, noOverwrite: boolean, + skipPreUninstall: boolean, } } @@ -156,6 +159,8 @@ export class PlatformUninstallRequest extends jspb.Message { setPlatformPackage(value: string): PlatformUninstallRequest; getArchitecture(): string; setArchitecture(value: string): PlatformUninstallRequest; + getSkipPreUninstall(): boolean; + setSkipPreUninstall(value: boolean): PlatformUninstallRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUninstallRequest.AsObject; @@ -172,6 +177,7 @@ export namespace PlatformUninstallRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, platformPackage: string, architecture: string, + skipPreUninstall: boolean, } } @@ -227,6 +233,8 @@ export class PlatformUpgradeRequest extends jspb.Message { setArchitecture(value: string): PlatformUpgradeRequest; getSkipPostInstall(): boolean; setSkipPostInstall(value: boolean): PlatformUpgradeRequest; + getSkipPreUninstall(): boolean; + setSkipPreUninstall(value: boolean): PlatformUpgradeRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUpgradeRequest.AsObject; @@ -244,6 +252,7 @@ export namespace PlatformUpgradeRequest { platformPackage: string, architecture: string, skipPostInstall: boolean, + skipPreUninstall: boolean, } } 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 837c234fe..9e49ed462 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 @@ -368,7 +368,8 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.toObject = function(incl architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), version: jspb.Message.getFieldWithDefault(msg, 4, ""), skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), - noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) + noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), + skipPreUninstall: jspb.Message.getBooleanFieldWithDefault(msg, 7, false) }; if (includeInstance) { @@ -430,6 +431,10 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.deserializeBinaryFromRea var value = /** @type {boolean} */ (reader.readBool()); msg.setNoOverwrite(value); break; + case 7: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipPreUninstall(value); + break; default: reader.skipField(); break; @@ -502,6 +507,13 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.serializeBinaryToWriter f ); } + f = message.getSkipPreUninstall(); + if (f) { + writer.writeBool( + 7, + f + ); + } }; @@ -632,6 +644,24 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.setNoOverwrite }; +/** + * optional bool skip_pre_uninstall = 7; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.getSkipPreUninstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.setSkipPreUninstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 7, value); +}; + + @@ -1361,7 +1391,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.toObject = function(in var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), platformPackage: jspb.Message.getFieldWithDefault(msg, 2, ""), - architecture: jspb.Message.getFieldWithDefault(msg, 3, "") + architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), + skipPreUninstall: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -1411,6 +1442,10 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.deserializeBinaryFromR var value = /** @type {string} */ (reader.readString()); msg.setArchitecture(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipPreUninstall(value); + break; default: reader.skipField(); break; @@ -1462,6 +1497,13 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.serializeBinaryToWrite f ); } + f = message.getSkipPreUninstall(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -1538,6 +1580,24 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.setArchitect }; +/** + * optional bool skip_pre_uninstall = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.getSkipPreUninstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.setSkipPreUninstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + @@ -1825,7 +1885,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.toObject = function(incl instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), platformPackage: jspb.Message.getFieldWithDefault(msg, 2, ""), architecture: jspb.Message.getFieldWithDefault(msg, 3, ""), - skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + skipPostInstall: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + skipPreUninstall: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) }; if (includeInstance) { @@ -1879,6 +1940,10 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.deserializeBinaryFromRea var value = /** @type {boolean} */ (reader.readBool()); msg.setSkipPostInstall(value); break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipPreUninstall(value); + break; default: reader.skipField(); break; @@ -1937,6 +2002,13 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.serializeBinaryToWriter f ); } + f = message.getSkipPreUninstall(); + if (f) { + writer.writeBool( + 5, + f + ); + } }; @@ -2031,6 +2103,24 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.setSkipPostIns }; +/** + * optional bool skip_pre_uninstall = 5; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.getSkipPreUninstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.setSkipPreUninstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js new file mode 100644 index 000000000..97b3a2461 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts new file mode 100644 index 000000000..b37a9d558 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts @@ -0,0 +1,274 @@ +// package: cc.arduino.cli.commands.v1 +// file: cc/arduino/cli/commands/v1/debug.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; +import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; +import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/cli/commands/v1/port_pb"; +import * as google_protobuf_any_pb from "google-protobuf/google/protobuf/any_pb"; + +export class DebugRequest extends jspb.Message { + + hasDebugRequest(): boolean; + clearDebugRequest(): void; + getDebugRequest(): GetDebugConfigRequest | undefined; + setDebugRequest(value?: GetDebugConfigRequest): DebugRequest; + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): DebugRequest; + getSendInterrupt(): boolean; + setSendInterrupt(value: boolean): DebugRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugRequest.AsObject; + static toObject(includeInstance: boolean, msg: DebugRequest): DebugRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugRequest; + static deserializeBinaryFromReader(message: DebugRequest, reader: jspb.BinaryReader): DebugRequest; +} + +export namespace DebugRequest { + export type AsObject = { + debugRequest?: GetDebugConfigRequest.AsObject, + data: Uint8Array | string, + sendInterrupt: boolean, + } +} + +export class DebugResponse extends jspb.Message { + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): DebugResponse; + getError(): string; + setError(value: string): DebugResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugResponse.AsObject; + static toObject(includeInstance: boolean, msg: DebugResponse): DebugResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugResponse; + static deserializeBinaryFromReader(message: DebugResponse, reader: jspb.BinaryReader): DebugResponse; +} + +export namespace DebugResponse { + export type AsObject = { + data: Uint8Array | string, + error: string, + } +} + +export class IsDebugSupportedRequest extends jspb.Message { + + hasInstance(): boolean; + clearInstance(): void; + getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; + setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): IsDebugSupportedRequest; + getFqbn(): string; + setFqbn(value: string): IsDebugSupportedRequest; + + hasPort(): boolean; + clearPort(): void; + getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): IsDebugSupportedRequest; + getInterpreter(): string; + setInterpreter(value: string): IsDebugSupportedRequest; + getProgrammer(): string; + setProgrammer(value: string): IsDebugSupportedRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IsDebugSupportedRequest.AsObject; + static toObject(includeInstance: boolean, msg: IsDebugSupportedRequest): IsDebugSupportedRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IsDebugSupportedRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IsDebugSupportedRequest; + static deserializeBinaryFromReader(message: IsDebugSupportedRequest, reader: jspb.BinaryReader): IsDebugSupportedRequest; +} + +export namespace IsDebugSupportedRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + fqbn: string, + port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, + interpreter: string, + programmer: string, + } +} + +export class IsDebugSupportedResponse extends jspb.Message { + getDebuggingSupported(): boolean; + setDebuggingSupported(value: boolean): IsDebugSupportedResponse; + getDebugFqbn(): string; + setDebugFqbn(value: string): IsDebugSupportedResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IsDebugSupportedResponse.AsObject; + static toObject(includeInstance: boolean, msg: IsDebugSupportedResponse): IsDebugSupportedResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IsDebugSupportedResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IsDebugSupportedResponse; + static deserializeBinaryFromReader(message: IsDebugSupportedResponse, reader: jspb.BinaryReader): IsDebugSupportedResponse; +} + +export namespace IsDebugSupportedResponse { + export type AsObject = { + debuggingSupported: boolean, + debugFqbn: string, + } +} + +export class GetDebugConfigRequest extends jspb.Message { + + hasInstance(): boolean; + clearInstance(): void; + getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; + setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): GetDebugConfigRequest; + getFqbn(): string; + setFqbn(value: string): GetDebugConfigRequest; + getSketchPath(): string; + setSketchPath(value: string): GetDebugConfigRequest; + + hasPort(): boolean; + clearPort(): void; + getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): GetDebugConfigRequest; + getInterpreter(): string; + setInterpreter(value: string): GetDebugConfigRequest; + getImportDir(): string; + setImportDir(value: string): GetDebugConfigRequest; + getProgrammer(): string; + setProgrammer(value: string): GetDebugConfigRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetDebugConfigRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetDebugConfigRequest): GetDebugConfigRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetDebugConfigRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetDebugConfigRequest; + static deserializeBinaryFromReader(message: GetDebugConfigRequest, reader: jspb.BinaryReader): GetDebugConfigRequest; +} + +export namespace GetDebugConfigRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + fqbn: string, + sketchPath: string, + port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, + interpreter: string, + importDir: string, + programmer: string, + } +} + +export class GetDebugConfigResponse extends jspb.Message { + getExecutable(): string; + setExecutable(value: string): GetDebugConfigResponse; + getToolchain(): string; + setToolchain(value: string): GetDebugConfigResponse; + getToolchainPath(): string; + setToolchainPath(value: string): GetDebugConfigResponse; + getToolchainPrefix(): string; + setToolchainPrefix(value: string): GetDebugConfigResponse; + getServer(): string; + setServer(value: string): GetDebugConfigResponse; + getServerPath(): string; + setServerPath(value: string): GetDebugConfigResponse; + + hasToolchainConfiguration(): boolean; + clearToolchainConfiguration(): void; + getToolchainConfiguration(): google_protobuf_any_pb.Any | undefined; + setToolchainConfiguration(value?: google_protobuf_any_pb.Any): GetDebugConfigResponse; + + hasServerConfiguration(): boolean; + clearServerConfiguration(): void; + getServerConfiguration(): google_protobuf_any_pb.Any | undefined; + setServerConfiguration(value?: google_protobuf_any_pb.Any): GetDebugConfigResponse; + + getCustomConfigsMap(): jspb.Map<string, string>; + clearCustomConfigsMap(): void; + getSvdFile(): string; + setSvdFile(value: string): GetDebugConfigResponse; + getProgrammer(): string; + setProgrammer(value: string): GetDebugConfigResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetDebugConfigResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetDebugConfigResponse): GetDebugConfigResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetDebugConfigResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetDebugConfigResponse; + static deserializeBinaryFromReader(message: GetDebugConfigResponse, reader: jspb.BinaryReader): GetDebugConfigResponse; +} + +export namespace GetDebugConfigResponse { + export type AsObject = { + executable: string, + toolchain: string, + toolchainPath: string, + toolchainPrefix: string, + server: string, + serverPath: string, + toolchainConfiguration?: google_protobuf_any_pb.Any.AsObject, + serverConfiguration?: google_protobuf_any_pb.Any.AsObject, + + customConfigsMap: Array<[string, string]>, + svdFile: string, + programmer: string, + } +} + +export class DebugGCCToolchainConfiguration extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugGCCToolchainConfiguration.AsObject; + static toObject(includeInstance: boolean, msg: DebugGCCToolchainConfiguration): DebugGCCToolchainConfiguration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugGCCToolchainConfiguration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugGCCToolchainConfiguration; + static deserializeBinaryFromReader(message: DebugGCCToolchainConfiguration, reader: jspb.BinaryReader): DebugGCCToolchainConfiguration; +} + +export namespace DebugGCCToolchainConfiguration { + export type AsObject = { + } +} + +export class DebugOpenOCDServerConfiguration extends jspb.Message { + getPath(): string; + setPath(value: string): DebugOpenOCDServerConfiguration; + getScriptsDir(): string; + setScriptsDir(value: string): DebugOpenOCDServerConfiguration; + clearScriptsList(): void; + getScriptsList(): Array<string>; + setScriptsList(value: Array<string>): DebugOpenOCDServerConfiguration; + addScripts(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DebugOpenOCDServerConfiguration.AsObject; + static toObject(includeInstance: boolean, msg: DebugOpenOCDServerConfiguration): DebugOpenOCDServerConfiguration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DebugOpenOCDServerConfiguration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DebugOpenOCDServerConfiguration; + static deserializeBinaryFromReader(message: DebugOpenOCDServerConfiguration, reader: jspb.BinaryReader): DebugOpenOCDServerConfiguration; +} + +export namespace DebugOpenOCDServerConfiguration { + export type AsObject = { + path: string, + scriptsDir: string, + scriptsList: Array<string>, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js new file mode 100644 index 000000000..125c03f2d --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js @@ -0,0 +1,2221 @@ +// source: cc/arduino/cli/commands/v1/debug.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); +var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); +var google_protobuf_any_pb = require('google-protobuf/google/protobuf/any_pb.js'); +goog.object.extend(proto, google_protobuf_any_pb); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DebugRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugRequest.displayName = 'proto.cc.arduino.cli.commands.v1.DebugRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DebugResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugResponse.displayName = 'proto.cc.arduino.cli.commands.v1.DebugResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.displayName = 'proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.displayName = 'proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.displayName = 'proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.displayName = 'proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.DebugRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.toObject = function(includeInstance, msg) { + var f, obj = { + debugRequest: (f = msg.getDebugRequest()) && proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.toObject(includeInstance, f), + data: msg.getData_asB64(), + sendInterrupt: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugRequest; + return proto.cc.arduino.cli.commands.v1.DebugRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DebugRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinaryFromReader); + msg.setDebugRequest(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSendInterrupt(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DebugRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDebugRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.serializeBinaryToWriter + ); + } + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getSendInterrupt(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional GetDebugConfigRequest debug_request = 1; + * @return {?proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getDebugRequest = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setDebugRequest = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.clearDebugRequest = function() { + return this.setDebugRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.hasDebugRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional bytes data = 2; + * @return {!(string|Uint8Array)} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes data = 2; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bool send_interrupt = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.getSendInterrupt = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setSendInterrupt = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.DebugResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.toObject = function(includeInstance, msg) { + var f, obj = { + data: msg.getData_asB64(), + error: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugResponse; + return proto.cc.arduino.cli.commands.v1.DebugResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DebugResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setError(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DebugResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getError(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional bytes data = 1; + * @return {!(string|Uint8Array)} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data = 1; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string error = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getError = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setError = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), + interpreter: jspb.Message.getFieldWithDefault(msg, 4, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 5, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest; + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Instance; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); + msg.setInstance(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + case 3: + var value = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setPort(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setInterpreter(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getInstance(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getPort(); + if (f != null) { + writer.writeMessage( + 3, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } + f = message.getInterpreter(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } +}; + + +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getInstance = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional Port port = 3; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.clearPort = function() { + return this.setPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.hasPort = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional string interpreter = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getInterpreter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setInterpreter = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string programmer = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.toObject = function(includeInstance, msg) { + var f, obj = { + debuggingSupported: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), + debugFqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse; + return proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDebuggingSupported(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDebugFqbn(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDebuggingSupported(); + if (f) { + writer.writeBool( + 1, + f + ); + } + f = message.getDebugFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional bool debugging_supported = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.getDebuggingSupported = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.setDebuggingSupported = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + +/** + * optional string debug_fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.getDebugFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.setDebugFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + sketchPath: jspb.Message.getFieldWithDefault(msg, 3, ""), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), + interpreter: jspb.Message.getFieldWithDefault(msg, 5, ""), + importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 9, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest; + return proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Instance; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); + msg.setInstance(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchPath(value); + break; + case 4: + var value = new cc_arduino_cli_commands_v1_port_pb.Port; + reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); + msg.setPort(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setInterpreter(value); + break; + case 8: + var value = /** @type {string} */ (reader.readString()); + msg.setImportDir(value); + break; + case 9: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getInstance(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSketchPath(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getPort(); + if (f != null) { + writer.writeMessage( + 4, + f, + cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter + ); + } + f = message.getInterpreter(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } + f = message.getImportDir(); + if (f.length > 0) { + writer.writeString( + 8, + f + ); + } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 9, + f + ); + } +}; + + +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getInstance = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string sketch_path = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setSketchPath = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional Port port = 4; + * @return {?proto.cc.arduino.cli.commands.v1.Port} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getPort = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setPort = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.clearPort = function() { + return this.setPort(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.hasPort = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional string interpreter = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getInterpreter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setInterpreter = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + +/** + * optional string import_dir = 8; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getImportDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setImportDir = function(value) { + return jspb.Message.setProto3StringField(this, 8, value); +}; + + +/** + * optional string programmer = 9; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 9, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.toObject = function(includeInstance, msg) { + var f, obj = { + executable: jspb.Message.getFieldWithDefault(msg, 1, ""), + toolchain: jspb.Message.getFieldWithDefault(msg, 2, ""), + toolchainPath: jspb.Message.getFieldWithDefault(msg, 3, ""), + toolchainPrefix: jspb.Message.getFieldWithDefault(msg, 4, ""), + server: jspb.Message.getFieldWithDefault(msg, 5, ""), + serverPath: jspb.Message.getFieldWithDefault(msg, 6, ""), + toolchainConfiguration: (f = msg.getToolchainConfiguration()) && google_protobuf_any_pb.Any.toObject(includeInstance, f), + serverConfiguration: (f = msg.getServerConfiguration()) && google_protobuf_any_pb.Any.toObject(includeInstance, f), + customConfigsMap: (f = msg.getCustomConfigsMap()) ? f.toObject(includeInstance, undefined) : [], + svdFile: jspb.Message.getFieldWithDefault(msg, 10, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 11, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse; + return proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExecutable(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setToolchain(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setToolchainPath(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setToolchainPrefix(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setServer(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setServerPath(value); + break; + case 7: + var value = new google_protobuf_any_pb.Any; + reader.readMessage(value,google_protobuf_any_pb.Any.deserializeBinaryFromReader); + msg.setToolchainConfiguration(value); + break; + case 8: + var value = new google_protobuf_any_pb.Any; + reader.readMessage(value,google_protobuf_any_pb.Any.deserializeBinaryFromReader); + msg.setServerConfiguration(value); + break; + case 9: + var value = msg.getCustomConfigsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 10: + var value = /** @type {string} */ (reader.readString()); + msg.setSvdFile(value); + break; + case 11: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getExecutable(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getToolchain(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getToolchainPath(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getToolchainPrefix(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getServer(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } + f = message.getServerPath(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } + f = message.getToolchainConfiguration(); + if (f != null) { + writer.writeMessage( + 7, + f, + google_protobuf_any_pb.Any.serializeBinaryToWriter + ); + } + f = message.getServerConfiguration(); + if (f != null) { + writer.writeMessage( + 8, + f, + google_protobuf_any_pb.Any.serializeBinaryToWriter + ); + } + f = message.getCustomConfigsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(9, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = message.getSvdFile(); + if (f.length > 0) { + writer.writeString( + 10, + f + ); + } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 11, + f + ); + } +}; + + +/** + * optional string executable = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getExecutable = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setExecutable = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string toolchain = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchain = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchain = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string toolchain_path = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchainPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchainPath = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string toolchain_prefix = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchainPrefix = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchainPrefix = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string server = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getServer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setServer = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + +/** + * optional string server_path = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getServerPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setServerPath = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + +/** + * optional google.protobuf.Any toolchain_configuration = 7; + * @return {?proto.google.protobuf.Any} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getToolchainConfiguration = function() { + return /** @type{?proto.google.protobuf.Any} */ ( + jspb.Message.getWrapperField(this, google_protobuf_any_pb.Any, 7)); +}; + + +/** + * @param {?proto.google.protobuf.Any|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setToolchainConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 7, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.clearToolchainConfiguration = function() { + return this.setToolchainConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.hasToolchainConfiguration = function() { + return jspb.Message.getField(this, 7) != null; +}; + + +/** + * optional google.protobuf.Any server_configuration = 8; + * @return {?proto.google.protobuf.Any} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getServerConfiguration = function() { + return /** @type{?proto.google.protobuf.Any} */ ( + jspb.Message.getWrapperField(this, google_protobuf_any_pb.Any, 8)); +}; + + +/** + * @param {?proto.google.protobuf.Any|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setServerConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 8, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.clearServerConfiguration = function() { + return this.setServerConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.hasServerConfiguration = function() { + return jspb.Message.getField(this, 8) != null; +}; + + +/** + * map<string, string> custom_configs = 9; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<string,string>} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getCustomConfigsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<string,string>} */ ( + jspb.Message.getMapField(this, 9, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.clearCustomConfigsMap = function() { + this.getCustomConfigsMap().clear(); + return this;}; + + +/** + * optional string svd_file = 10; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getSvdFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 10, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setSvdFile = function(value) { + return jspb.Message.setProto3StringField(this, 10, value); +}; + + +/** + * optional string programmer = 11; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 11, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 11, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration; + return proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfiguration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.toObject = function(includeInstance, msg) { + var f, obj = { + path: jspb.Message.getFieldWithDefault(msg, 1, ""), + scriptsDir: jspb.Message.getFieldWithDefault(msg, 2, ""), + scriptsList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration; + return proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setPath(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setScriptsDir(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.addScripts(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPath(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getScriptsDir(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getScriptsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 3, + f + ); + } +}; + + +/** + * optional string path = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.getPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.setPath = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string scripts_dir = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.getScriptsDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.setScriptsDir = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * repeated string scripts = 3; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.getScriptsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.setScriptsList = function(value) { + return jspb.Message.setField(this, 3, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.addScripts = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration.prototype.clearScriptsList = function() { + return this.setScriptsList([]); +}; + + +goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts deleted file mode 100644 index a5e384a95..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -// package: cc.arduino.cli.debug.v1 -// file: cc/arduino/cli/debug/v1/debug.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "@grpc/grpc-js"; -import * as cc_arduino_cli_debug_v1_debug_pb from "../../../../../cc/arduino/cli/debug/v1/debug_pb"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; -import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/cli/commands/v1/port_pb"; - -interface IDebugServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { - debug: IDebugServiceService_IDebug; - getDebugConfig: IDebugServiceService_IGetDebugConfig; -} - -interface IDebugServiceService_IDebug extends grpc.MethodDefinition<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse> { - path: "/cc.arduino.cli.debug.v1.DebugService/Debug"; - requestStream: true; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.DebugRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.DebugRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; -} -interface IDebugServiceService_IGetDebugConfig extends grpc.MethodDefinition<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse> { - path: "/cc.arduino.cli.debug.v1.DebugService/GetDebugConfig"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; -} - -export const DebugServiceService: IDebugServiceService; - -export interface IDebugServiceServer extends grpc.UntypedServiceImplementation { - debug: grpc.handleBidiStreamingCall<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse>; -} - -export interface IDebugServiceClient { - debug(): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - debug(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - debug(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; -} - -export class DebugServiceClient extends grpc.Client implements IDebugServiceClient { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>); - public debug(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - public debug(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_debug_v1_debug_pb.DebugRequest, cc_arduino_cli_debug_v1_debug_pb.DebugResponse>; - public getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - public getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - public getDebugConfig(request: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js deleted file mode 100644 index 829ca77d3..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_grpc_pb.js +++ /dev/null @@ -1,95 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// This file is part of arduino-cli. -// -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. -// -'use strict'; -var cc_arduino_cli_debug_v1_debug_pb = require('../../../../../cc/arduino/cli/debug/v1/debug_pb.js'); -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); -var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); - -function serialize_cc_arduino_cli_debug_v1_DebugConfigRequest(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.DebugConfigRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_DebugConfigRequest(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_debug_v1_DebugRequest(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.DebugRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.DebugRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_DebugRequest(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.DebugRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_debug_v1_DebugResponse(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.DebugResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.DebugResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_DebugResponse(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.DebugResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse(arg) { - if (!(arg instanceof cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.debug.v1.GetDebugConfigResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse(buffer_arg) { - return cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -// DebugService abstracts a debug Session usage -var DebugServiceService = exports['cc.arduino.cli.debug.v1.DebugService'] = { - // Start a debug session and communicate with the debugger tool. -debug: { - path: '/cc.arduino.cli.debug.v1.DebugService/Debug', - requestStream: true, - responseStream: true, - requestType: cc_arduino_cli_debug_v1_debug_pb.DebugRequest, - responseType: cc_arduino_cli_debug_v1_debug_pb.DebugResponse, - requestSerialize: serialize_cc_arduino_cli_debug_v1_DebugRequest, - requestDeserialize: deserialize_cc_arduino_cli_debug_v1_DebugRequest, - responseSerialize: serialize_cc_arduino_cli_debug_v1_DebugResponse, - responseDeserialize: deserialize_cc_arduino_cli_debug_v1_DebugResponse, - }, - getDebugConfig: { - path: '/cc.arduino.cli.debug.v1.DebugService/GetDebugConfig', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_debug_v1_debug_pb.DebugConfigRequest, - responseType: cc_arduino_cli_debug_v1_debug_pb.GetDebugConfigResponse, - requestSerialize: serialize_cc_arduino_cli_debug_v1_DebugConfigRequest, - requestDeserialize: deserialize_cc_arduino_cli_debug_v1_DebugConfigRequest, - responseSerialize: serialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse, - responseDeserialize: deserialize_cc_arduino_cli_debug_v1_GetDebugConfigResponse, - }, -}; - diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts deleted file mode 100644 index 5a8f0d0f6..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.d.ts +++ /dev/null @@ -1,154 +0,0 @@ -// package: cc.arduino.cli.debug.v1 -// file: cc/arduino/cli/debug/v1/debug.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; -import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/cli/commands/v1/port_pb"; - -export class DebugRequest extends jspb.Message { - - hasDebugRequest(): boolean; - clearDebugRequest(): void; - getDebugRequest(): DebugConfigRequest | undefined; - setDebugRequest(value?: DebugConfigRequest): DebugRequest; - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): DebugRequest; - getSendInterrupt(): boolean; - setSendInterrupt(value: boolean): DebugRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): DebugRequest.AsObject; - static toObject(includeInstance: boolean, msg: DebugRequest): DebugRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: DebugRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): DebugRequest; - static deserializeBinaryFromReader(message: DebugRequest, reader: jspb.BinaryReader): DebugRequest; -} - -export namespace DebugRequest { - export type AsObject = { - debugRequest?: DebugConfigRequest.AsObject, - data: Uint8Array | string, - sendInterrupt: boolean, - } -} - -export class DebugConfigRequest extends jspb.Message { - - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): DebugConfigRequest; - getFqbn(): string; - setFqbn(value: string): DebugConfigRequest; - getSketchPath(): string; - setSketchPath(value: string): DebugConfigRequest; - - hasPort(): boolean; - clearPort(): void; - getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; - setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): DebugConfigRequest; - getInterpreter(): string; - setInterpreter(value: string): DebugConfigRequest; - getImportDir(): string; - setImportDir(value: string): DebugConfigRequest; - getProgrammer(): string; - setProgrammer(value: string): DebugConfigRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): DebugConfigRequest.AsObject; - static toObject(includeInstance: boolean, msg: DebugConfigRequest): DebugConfigRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: DebugConfigRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): DebugConfigRequest; - static deserializeBinaryFromReader(message: DebugConfigRequest, reader: jspb.BinaryReader): DebugConfigRequest; -} - -export namespace DebugConfigRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - fqbn: string, - sketchPath: string, - port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, - interpreter: string, - importDir: string, - programmer: string, - } -} - -export class DebugResponse extends jspb.Message { - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): DebugResponse; - getError(): string; - setError(value: string): DebugResponse; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): DebugResponse.AsObject; - static toObject(includeInstance: boolean, msg: DebugResponse): DebugResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: DebugResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): DebugResponse; - static deserializeBinaryFromReader(message: DebugResponse, reader: jspb.BinaryReader): DebugResponse; -} - -export namespace DebugResponse { - export type AsObject = { - data: Uint8Array | string, - error: string, - } -} - -export class GetDebugConfigResponse extends jspb.Message { - getExecutable(): string; - setExecutable(value: string): GetDebugConfigResponse; - getToolchain(): string; - setToolchain(value: string): GetDebugConfigResponse; - getToolchainPath(): string; - setToolchainPath(value: string): GetDebugConfigResponse; - getToolchainPrefix(): string; - setToolchainPrefix(value: string): GetDebugConfigResponse; - getServer(): string; - setServer(value: string): GetDebugConfigResponse; - getServerPath(): string; - setServerPath(value: string): GetDebugConfigResponse; - - getToolchainConfigurationMap(): jspb.Map<string, string>; - clearToolchainConfigurationMap(): void; - - getServerConfigurationMap(): jspb.Map<string, string>; - clearServerConfigurationMap(): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetDebugConfigResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetDebugConfigResponse): GetDebugConfigResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetDebugConfigResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetDebugConfigResponse; - static deserializeBinaryFromReader(message: GetDebugConfigResponse, reader: jspb.BinaryReader): GetDebugConfigResponse; -} - -export namespace GetDebugConfigResponse { - export type AsObject = { - executable: string, - toolchain: string, - toolchainPath: string, - toolchainPrefix: string, - server: string, - serverPath: string, - - toolchainConfigurationMap: Array<[string, string]>, - - serverConfigurationMap: Array<[string, string]>, - } -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js deleted file mode 100644 index 136919afe..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/debug/v1/debug_pb.js +++ /dev/null @@ -1,1233 +0,0 @@ -// source: cc/arduino/cli/debug/v1/debug.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = (function() { - if (this) { return this; } - if (typeof window !== 'undefined') { return window; } - if (typeof global !== 'undefined') { return global; } - if (typeof self !== 'undefined') { return self; } - return Function('return this')(); -}.call(null)); - -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); -var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/commands/v1/port_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.DebugConfigRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.DebugRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.DebugResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse', null, global); -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.debug.v1.DebugRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.DebugRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.DebugRequest.displayName = 'proto.cc.arduino.cli.debug.v1.DebugRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.DebugConfigRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.DebugConfigRequest.displayName = 'proto.cc.arduino.cli.debug.v1.DebugConfigRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.debug.v1.DebugResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.DebugResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.DebugResponse.displayName = 'proto.cc.arduino.cli.debug.v1.DebugResponse'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.displayName = 'proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse'; -} - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.DebugRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.debug.v1.DebugRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.toObject = function(includeInstance, msg) { - var f, obj = { - debugRequest: (f = msg.getDebugRequest()) && proto.cc.arduino.cli.debug.v1.DebugConfigRequest.toObject(includeInstance, f), - data: msg.getData_asB64(), - sendInterrupt: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.DebugRequest; - return proto.cc.arduino.cli.debug.v1.DebugRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.DebugRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.cc.arduino.cli.debug.v1.DebugConfigRequest; - reader.readMessage(value,proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinaryFromReader); - msg.setDebugRequest(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setSendInterrupt(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.DebugRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.debug.v1.DebugRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDebugRequest(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.cc.arduino.cli.debug.v1.DebugConfigRequest.serializeBinaryToWriter - ); - } - f = message.getData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getSendInterrupt(); - if (f) { - writer.writeBool( - 3, - f - ); - } -}; - - -/** - * optional DebugConfigRequest debug_request = 1; - * @return {?proto.cc.arduino.cli.debug.v1.DebugConfigRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getDebugRequest = function() { - return /** @type{?proto.cc.arduino.cli.debug.v1.DebugConfigRequest} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.debug.v1.DebugConfigRequest, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.debug.v1.DebugConfigRequest|undefined} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this -*/ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.setDebugRequest = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.clearDebugRequest = function() { - return this.setDebugRequest(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.hasDebugRequest = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bytes data = 2; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes data = 2; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * optional bool send_interrupt = 3; - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.getSendInterrupt = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugRequest.prototype.setSendInterrupt = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.DebugConfigRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), - sketchPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), - interpreter: jspb.Message.getFieldWithDefault(msg, 5, ""), - importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), - programmer: jspb.Message.getFieldWithDefault(msg, 9, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.DebugConfigRequest; - return proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); - break; - case 4: - var value = new cc_arduino_cli_commands_v1_port_pb.Port; - reader.readMessage(value,cc_arduino_cli_commands_v1_port_pb.Port.deserializeBinaryFromReader); - msg.setPort(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setInterpreter(value); - break; - case 8: - var value = /** @type {string} */ (reader.readString()); - msg.setImportDir(value); - break; - case 9: - var value = /** @type {string} */ (reader.readString()); - msg.setProgrammer(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.DebugConfigRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } - f = message.getFqbn(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getSketchPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getPort(); - if (f != null) { - writer.writeMessage( - 4, - f, - cc_arduino_cli_commands_v1_port_pb.Port.serializeBinaryToWriter - ); - } - f = message.getInterpreter(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); - } - f = message.getImportDir(); - if (f.length > 0) { - writer.writeString( - 8, - f - ); - } - f = message.getProgrammer(); - if (f.length > 0) { - writer.writeString( - 9, - f - ); - } -}; - - -/** - * optional cc.arduino.cli.commands.v1.Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getInstance = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this -*/ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional string fqbn = 2; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getFqbn = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setFqbn = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string sketch_path = 3; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getSketchPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setSketchPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional cc.arduino.cli.commands.v1.Port port = 4; - * @return {?proto.cc.arduino.cli.commands.v1.Port} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getPort = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 4)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this -*/ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setPort = function(value) { - return jspb.Message.setWrapperField(this, 4, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.clearPort = function() { - return this.setPort(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.hasPort = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional string interpreter = 5; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getInterpreter = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setInterpreter = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; - - -/** - * optional string import_dir = 8; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getImportDir = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setImportDir = function(value) { - return jspb.Message.setProto3StringField(this, 8, value); -}; - - -/** - * optional string programmer = 9; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.getProgrammer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugConfigRequest} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugConfigRequest.prototype.setProgrammer = function(value) { - return jspb.Message.setProto3StringField(this, 9, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.DebugResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.debug.v1.DebugResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.toObject = function(includeInstance, msg) { - var f, obj = { - data: msg.getData_asB64(), - error: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.DebugResponse; - return proto.cc.arduino.cli.debug.v1.DebugResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.DebugResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setError(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.DebugResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.debug.v1.DebugResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getError(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional bytes data = 1; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes data = 1; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string error = 2; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.getError = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.DebugResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.DebugResponse.prototype.setError = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.toObject = function(includeInstance, msg) { - var f, obj = { - executable: jspb.Message.getFieldWithDefault(msg, 1, ""), - toolchain: jspb.Message.getFieldWithDefault(msg, 2, ""), - toolchainPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - toolchainPrefix: jspb.Message.getFieldWithDefault(msg, 4, ""), - server: jspb.Message.getFieldWithDefault(msg, 5, ""), - serverPath: jspb.Message.getFieldWithDefault(msg, 6, ""), - toolchainConfigurationMap: (f = msg.getToolchainConfigurationMap()) ? f.toObject(includeInstance, undefined) : [], - serverConfigurationMap: (f = msg.getServerConfigurationMap()) ? f.toObject(includeInstance, undefined) : [] - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse; - return proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setExecutable(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setToolchain(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setToolchainPath(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setToolchainPrefix(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setServer(value); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setServerPath(value); - break; - case 7: - var value = msg.getToolchainConfigurationMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); - }); - break; - case 8: - var value = msg.getServerConfigurationMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); - }); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getExecutable(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getToolchain(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getToolchainPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getToolchainPrefix(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getServer(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); - } - f = message.getServerPath(); - if (f.length > 0) { - writer.writeString( - 6, - f - ); - } - f = message.getToolchainConfigurationMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(7, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); - } - f = message.getServerConfigurationMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(8, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); - } -}; - - -/** - * optional string executable = 1; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getExecutable = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setExecutable = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string toolchain = 2; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchain = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setToolchain = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string toolchain_path = 3; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchainPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setToolchainPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional string toolchain_prefix = 4; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchainPrefix = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setToolchainPrefix = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); -}; - - -/** - * optional string server = 5; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getServer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setServer = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; - - -/** - * optional string server_path = 6; - * @return {string} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getServerPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.setServerPath = function(value) { - return jspb.Message.setProto3StringField(this, 6, value); -}; - - -/** - * map<string, string> toolchain_configuration = 7; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<string,string>} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getToolchainConfigurationMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<string,string>} */ ( - jspb.Message.getMapField(this, 7, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.clearToolchainConfigurationMap = function() { - this.getToolchainConfigurationMap().clear(); - return this;}; - - -/** - * map<string, string> server_configuration = 8; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<string,string>} - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.getServerConfigurationMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<string,string>} */ ( - jspb.Message.getMapField(this, 8, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse} returns this - */ -proto.cc.arduino.cli.debug.v1.GetDebugConfigResponse.prototype.clearServerConfigurationMap = function() { - this.getServerConfigurationMap().clear(); - return this;}; - - -goog.object.extend(exports, proto.cc.arduino.cli.debug.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts deleted file mode 100644 index 981a1da92..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -// package: cc.arduino.cli.monitor.v1 -// file: cc/arduino/cli/monitor/v1/monitor.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "@grpc/grpc-js"; -import {handleClientStreamingCall} from "@grpc/grpc-js/build/src/server-call"; -import * as cc_arduino_cli_monitor_v1_monitor_pb from "../../../../../cc/arduino/cli/monitor/v1/monitor_pb"; -import * as google_protobuf_struct_pb from "google-protobuf/google/protobuf/struct_pb"; - -interface IMonitorServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { - streamingOpen: IMonitorServiceService_IStreamingOpen; -} - -interface IMonitorServiceService_IStreamingOpen extends grpc.MethodDefinition<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse> { - path: "/cc.arduino.cli.monitor.v1.MonitorService/StreamingOpen"; - requestStream: true; - responseStream: true; - requestSerialize: grpc.serialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} - -export const MonitorServiceService: IMonitorServiceService; - -export interface IMonitorServiceServer { - streamingOpen: grpc.handleBidiStreamingCall<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} - -export interface IMonitorServiceClient { - streamingOpen(): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - streamingOpen(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - streamingOpen(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} - -export class MonitorServiceClient extends grpc.Client implements IMonitorServiceClient { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>); - public streamingOpen(options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; - public streamingOpen(metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse>; -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js deleted file mode 100644 index f20982617..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_grpc_pb.js +++ /dev/null @@ -1,65 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// This file is part of arduino-cli. -// -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. -// -'use strict'; -var cc_arduino_cli_monitor_v1_monitor_pb = require('../../../../../cc/arduino/cli/monitor/v1/monitor_pb.js'); -var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js'); - -function serialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest(arg) { - if (!(arg instanceof cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.monitor.v1.StreamingOpenRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest(buffer_arg) { - return cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse(arg) { - if (!(arg instanceof cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.monitor.v1.StreamingOpenResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse(buffer_arg) { - return cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -// MonitorService provides services for boards monitor. -// DEPRECATION WARNING: MonitorService is deprecated and will be removed in a -// future release. Use ArduinoCoreService.Monitor and -// ArduinoCoreService.EnumerateMonitorPortSettings instead. -var MonitorServiceService = exports['cc.arduino.cli.monitor.v1.MonitorService'] = { - // Open a bidirectional monitor stream. This can be used to implement -// something similar to the Arduino IDE's Serial Monitor. -streamingOpen: { - path: '/cc.arduino.cli.monitor.v1.MonitorService/StreamingOpen', - requestStream: true, - responseStream: true, - requestType: cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenRequest, - responseType: cc_arduino_cli_monitor_v1_monitor_pb.StreamingOpenResponse, - requestSerialize: serialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest, - requestDeserialize: deserialize_cc_arduino_cli_monitor_v1_StreamingOpenRequest, - responseSerialize: serialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse, - responseDeserialize: deserialize_cc_arduino_cli_monitor_v1_StreamingOpenResponse, - }, -}; - diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts deleted file mode 100644 index 9d158dd24..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -// package: cc.arduino.cli.monitor.v1 -// file: cc/arduino/cli/monitor/v1/monitor.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; -import * as google_protobuf_struct_pb from "google-protobuf/google/protobuf/struct_pb"; - -export class StreamingOpenRequest extends jspb.Message { - - hasConfig(): boolean; - clearConfig(): void; - getConfig(): MonitorConfig | undefined; - setConfig(value?: MonitorConfig): StreamingOpenRequest; - - - hasData(): boolean; - clearData(): void; - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): StreamingOpenRequest; - - - hasRecvAcknowledge(): boolean; - clearRecvAcknowledge(): void; - getRecvAcknowledge(): number; - setRecvAcknowledge(value: number): StreamingOpenRequest; - - - getContentCase(): StreamingOpenRequest.ContentCase; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): StreamingOpenRequest.AsObject; - static toObject(includeInstance: boolean, msg: StreamingOpenRequest): StreamingOpenRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: StreamingOpenRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): StreamingOpenRequest; - static deserializeBinaryFromReader(message: StreamingOpenRequest, reader: jspb.BinaryReader): StreamingOpenRequest; -} - -export namespace StreamingOpenRequest { - export type AsObject = { - config?: MonitorConfig.AsObject, - data: Uint8Array | string, - recvAcknowledge: number, - } - - export enum ContentCase { - CONTENT_NOT_SET = 0, - - CONFIG = 1, - - DATA = 2, - - RECV_ACKNOWLEDGE = 3, - - } - -} - -export class MonitorConfig extends jspb.Message { - getTarget(): string; - setTarget(value: string): MonitorConfig; - - getType(): MonitorConfig.TargetType; - setType(value: MonitorConfig.TargetType): MonitorConfig; - - - hasAdditionalConfig(): boolean; - clearAdditionalConfig(): void; - getAdditionalConfig(): google_protobuf_struct_pb.Struct | undefined; - setAdditionalConfig(value?: google_protobuf_struct_pb.Struct): MonitorConfig; - - getRecvRateLimitBuffer(): number; - setRecvRateLimitBuffer(value: number): MonitorConfig; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MonitorConfig.AsObject; - static toObject(includeInstance: boolean, msg: MonitorConfig): MonitorConfig.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MonitorConfig, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MonitorConfig; - static deserializeBinaryFromReader(message: MonitorConfig, reader: jspb.BinaryReader): MonitorConfig; -} - -export namespace MonitorConfig { - export type AsObject = { - target: string, - type: MonitorConfig.TargetType, - additionalConfig?: google_protobuf_struct_pb.Struct.AsObject, - recvRateLimitBuffer: number, - } - - export enum TargetType { - TARGET_TYPE_SERIAL = 0, - TARGET_TYPE_NULL = 99, - } - -} - -export class StreamingOpenResponse extends jspb.Message { - getData(): Uint8Array | string; - getData_asU8(): Uint8Array; - getData_asB64(): string; - setData(value: Uint8Array | string): StreamingOpenResponse; - - getDropped(): number; - setDropped(value: number): StreamingOpenResponse; - - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): StreamingOpenResponse.AsObject; - static toObject(includeInstance: boolean, msg: StreamingOpenResponse): StreamingOpenResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: StreamingOpenResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): StreamingOpenResponse; - static deserializeBinaryFromReader(message: StreamingOpenResponse, reader: jspb.BinaryReader): StreamingOpenResponse; -} - -export namespace StreamingOpenResponse { - export type AsObject = { - data: Uint8Array | string, - dropped: number, - } -} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js deleted file mode 100644 index 4546fe982..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/monitor/v1/monitor_pb.js +++ /dev/null @@ -1,819 +0,0 @@ -// source: cc/arduino/cli/monitor/v1/monitor.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = Function('return this')(); - -var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js'); -goog.object.extend(proto, google_protobuf_struct_pb); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.MonitorConfig', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase', null, global); -goog.exportSymbol('proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse', null, global); -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_); -}; -goog.inherits(proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.displayName = 'proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.monitor.v1.MonitorConfig, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.monitor.v1.MonitorConfig.displayName = 'proto.cc.arduino.cli.monitor.v1.MonitorConfig'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.displayName = 'proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse'; -} - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_ = [[1,2,3]]; - -/** - * @enum {number} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase = { - CONTENT_NOT_SET: 0, - CONFIG: 1, - DATA: 2, - RECV_ACKNOWLEDGE: 3 -}; - -/** - * @return {proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getContentCase = function() { - return /** @type {proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.ContentCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.toObject = function(includeInstance, msg) { - var f, obj = { - config: (f = msg.getConfig()) && proto.cc.arduino.cli.monitor.v1.MonitorConfig.toObject(includeInstance, f), - data: msg.getData_asB64(), - recvAcknowledge: jspb.Message.getFieldWithDefault(msg, 3, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest; - return proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.cc.arduino.cli.monitor.v1.MonitorConfig; - reader.readMessage(value,proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinaryFromReader); - msg.setConfig(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 3: - var value = /** @type {number} */ (reader.readInt32()); - msg.setRecvAcknowledge(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getConfig(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.cc.arduino.cli.monitor.v1.MonitorConfig.serializeBinaryToWriter - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeBytes( - 2, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeInt32( - 3, - f - ); - } -}; - - -/** - * optional MonitorConfig config = 1; - * @return {?proto.cc.arduino.cli.monitor.v1.MonitorConfig} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getConfig = function() { - return /** @type{?proto.cc.arduino.cli.monitor.v1.MonitorConfig} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.monitor.v1.MonitorConfig, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.monitor.v1.MonitorConfig|undefined} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this -*/ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.setConfig = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.clearConfig = function() { - return this.setConfig(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.hasConfig = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bytes data = 2; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes data = 2; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.setData = function(value) { - return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.clearData = function() { - return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.hasData = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional int32 recv_acknowledge = 3; - * @return {number} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.getRecvAcknowledge = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.setRecvAcknowledge = function(value) { - return jspb.Message.setOneofField(this, 3, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.clearRecvAcknowledge = function() { - return jspb.Message.setOneofField(this, 3, proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenRequest.prototype.hasRecvAcknowledge = function() { - return jspb.Message.getField(this, 3) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.monitor.v1.MonitorConfig.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.toObject = function(includeInstance, msg) { - var f, obj = { - target: jspb.Message.getFieldWithDefault(msg, 1, ""), - type: jspb.Message.getFieldWithDefault(msg, 2, 0), - additionalConfig: (f = msg.getAdditionalConfig()) && google_protobuf_struct_pb.Struct.toObject(includeInstance, f), - recvRateLimitBuffer: jspb.Message.getFieldWithDefault(msg, 4, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.monitor.v1.MonitorConfig; - return proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setTarget(value); - break; - case 2: - var value = /** @type {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} */ (reader.readEnum()); - msg.setType(value); - break; - case 3: - var value = new google_protobuf_struct_pb.Struct; - reader.readMessage(value,google_protobuf_struct_pb.Struct.deserializeBinaryFromReader); - msg.setAdditionalConfig(value); - break; - case 4: - var value = /** @type {number} */ (reader.readInt32()); - msg.setRecvRateLimitBuffer(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.monitor.v1.MonitorConfig.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getTarget(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getType(); - if (f !== 0.0) { - writer.writeEnum( - 2, - f - ); - } - f = message.getAdditionalConfig(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_struct_pb.Struct.serializeBinaryToWriter - ); - } - f = message.getRecvRateLimitBuffer(); - if (f !== 0) { - writer.writeInt32( - 4, - f - ); - } -}; - - -/** - * @enum {number} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType = { - TARGET_TYPE_SERIAL: 0, - TARGET_TYPE_NULL: 99 -}; - -/** - * optional string target = 1; - * @return {string} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getTarget = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setTarget = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional TargetType type = 2; - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getType = function() { - return /** @type {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {!proto.cc.arduino.cli.monitor.v1.MonitorConfig.TargetType} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); -}; - - -/** - * optional google.protobuf.Struct additional_config = 3; - * @return {?proto.google.protobuf.Struct} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getAdditionalConfig = function() { - return /** @type{?proto.google.protobuf.Struct} */ ( - jspb.Message.getWrapperField(this, google_protobuf_struct_pb.Struct, 3)); -}; - - -/** - * @param {?proto.google.protobuf.Struct|undefined} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this -*/ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setAdditionalConfig = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.clearAdditionalConfig = function() { - return this.setAdditionalConfig(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.hasAdditionalConfig = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional int32 recv_rate_limit_buffer = 4; - * @return {number} - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.getRecvRateLimitBuffer = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.cc.arduino.cli.monitor.v1.MonitorConfig} returns this - */ -proto.cc.arduino.cli.monitor.v1.MonitorConfig.prototype.setRecvRateLimitBuffer = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.toObject = function(includeInstance, msg) { - var f, obj = { - data: msg.getData_asB64(), - dropped: jspb.Message.getFieldWithDefault(msg, 2, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse; - return proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); - break; - case 2: - var value = /** @type {number} */ (reader.readInt32()); - msg.setDropped(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getDropped(); - if (f !== 0) { - writer.writeInt32( - 2, - f - ); - } -}; - - -/** - * optional bytes data = 1; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes data = 1; - * This is a type-conversion wrapper around `getData()` - * @return {string} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); -}; - - -/** - * optional bytes data = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional int32 dropped = 2; - * @return {number} - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.getDropped = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse} returns this - */ -proto.cc.arduino.cli.monitor.v1.StreamingOpenResponse.prototype.setDropped = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -goog.object.extend(exports, proto.cc.arduino.cli.monitor.v1); diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 0fe8a2158..e14b123dd 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -555,12 +555,12 @@ export class SketchesServiceImpl return destinationUri; } - async getIdeTempFolderUri(sketch: Sketch): Promise<string> { + async getIdeTempFolderUri(sketch: SketchRef): Promise<string> { const genBuildPath = await this.getIdeTempFolderPath(sketch); return FileUri.create(genBuildPath).toString(); } - private async getIdeTempFolderPath(sketch: Sketch): Promise<string> { + private async getIdeTempFolderPath(sketch: SketchRef): Promise<string> { const sketchPath = FileUri.fsPath(sketch.uri); await fs.readdir(sketchPath); // Validates the sketch folder and rejects if not accessible. const suffix = crypto.createHash('md5').update(sketchPath).digest('hex'); 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 b9030b60b..9ad7625b3 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 @@ -12,25 +12,25 @@ export class HostedPluginReader extends TheiaHostedPluginReader { ): Promise<PluginContribution | undefined> { const scanner = this.scanner.getScanner(plugin); const contributions = await scanner.getContribution(plugin); - return this.filterContribution(plugin.name, contributions); + return this.mapContribution(plugin.name, contributions); } - private filterContribution( + private mapContribution( pluginName: string, contributions: PluginContribution | undefined ): PluginContribution | undefined { if (!contributions) { return contributions; } - const filter = pluginFilters.get(pluginName); - return filter ? filter(contributions) : contributions; + const mapper = pluginMappers.get(pluginName); + return mapper ? mapper(contributions) : contributions; } } -type PluginContributionFilter = ( +type PluginContributionMapper = ( contribution: PluginContribution ) => PluginContribution | undefined; -const cortexDebugFilter: PluginContributionFilter = ( +const cortexDebugMapper: PluginContributionMapper = ( contribution: PluginContribution ) => { if (contribution.viewsContainers) { @@ -81,9 +81,24 @@ const cortexDebugFilter: PluginContributionFilter = ( } } } + for (const _debugger of contribution.debuggers ?? []) { + if (_debugger.type === 'cortex-debug') { + for (const attributes of _debugger.configurationAttributes ?? []) { + if (attributes.properties) { + // Patch the cortex-debug debug config schema to allow the in-house `configId`. + attributes.properties['configId'] = { + type: 'string', + description: + 'Arduino debug configuration identifier consisting of the Fully Qualified Board Name (FQBN) and the programmer identifier (for example, `esptool`)', + }; + } + } + } + } + return contribution; }; -const pluginFilters = new Map<string, PluginContributionFilter>([ - ['cortex-debug', cortexDebugFilter], +const pluginMappers = new Map<string, PluginContributionMapper>([ + ['cortex-debug', cortexDebugMapper], ]); diff --git a/arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts b/arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts new file mode 100644 index 000000000..04d464106 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/auto-select-programmer.test.ts @@ -0,0 +1,176 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { expect } from 'chai'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { ensureProgrammerIsSelected } from '../../browser/contributions/auto-select-programmer'; +import { Programmer } from '../../common/protocol'; + +disableJSDOM(); + +describe('auto-select-programmer', () => { + describe('ensureProgrammerIsSelected', () => { + let debugMessages: string[]; + const toDispose = new DisposableCollection(); + const fqbn = 'a:b:c'; + const programmer: Programmer = { + id: 'p1', + name: 'P1', + platform: 'a:b', + }; + const anotherProgrammer: Programmer = { + id: 'p2', + name: 'P2', + platform: 'a:b', + }; + + before(() => { + const debug = console.debug; + console.debug = (message: string) => debugMessages.push(message); + toDispose.push(Disposable.create(() => (console.debug = debug))); + }); + + beforeEach(() => (debugMessages = [])); + + after(() => toDispose.dispose()); + + it('should not set when the fqbn is missing', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn: undefined, + getData: () => BoardsDataStore.Data.EMPTY, + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.false; + expect(debugMessages).to.be.empty; + }); + + it('should not set when no board details found (missing core)', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => BoardsDataStore.Data.EMPTY, + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.false; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + 'Skipping. No boards data is available for a:b:c.', + ]); + }); + + it('should be noop when the programmer is already selected', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [], + programmers: [programmer], + selectedProgrammer: programmer, + defaultProgrammerId: undefined, + }), + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.true; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + "A programmer is already selected for a:b:c: 'p1'.", + ]); + }); + + it('should automatically select the default one if not selected', async () => { + const selectedProgrammers: Record<string, Programmer | undefined> = {}; + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [], + programmers: [anotherProgrammer, programmer], + selectedProgrammer: undefined, + defaultProgrammerId: programmer.id, + }), + loadBoardDetails: () => undefined, + selectProgrammer: (arg) => { + selectedProgrammers[arg.fqbn] = arg.selectedProgrammer; + return true; + }, + }); + expect(ok).to.be.true; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + "Selected 'p1' programmer for a:b:c.", + ]); + expect(selectedProgrammers).to.be.deep.equal({ + [fqbn]: programmer, + }); + }); + + it('should not select the programmer when loading the board details fails', async () => { + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [], + programmers: [], + selectedProgrammer: undefined, + defaultProgrammerId: undefined, + }), + loadBoardDetails: () => undefined, + selectProgrammer: () => false, + }); + expect(ok).to.be.false; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + 'Skipping. No boards data is available for a:b:c.', + ]); + }); + + it('should select the programmer after reloading the data', async () => { + const selectedProgrammers: Record<string, Programmer | undefined> = {}; + const ok = await ensureProgrammerIsSelected({ + fqbn, + getData: () => ({ + configOptions: [ + { + label: 'config', + option: 'opt1', + values: [{ label: 'Opt1', selected: true, value: 'Value' }], + }, + ], + programmers: [], + selectedProgrammer: undefined, + defaultProgrammerId: undefined, + }), + loadBoardDetails: () => ({ + fqbn, + requiredTools: [], + configOptions: [], + programmers: [programmer, anotherProgrammer], + debuggingSupported: false, + VID: 'VID', + PID: 'PID', + buildProperties: [], + defaultProgrammerId: programmer.id, + }), + selectProgrammer: (arg) => { + selectedProgrammers[arg.fqbn] = arg.selectedProgrammer; + return true; + }, + }); + expect(ok).to.be.true; + expect(debugMessages).to.be.deep.equal([ + 'Ensuring a programmer is selected for a:b:c...', + 'Reloading board details for a:b:c...', + "Selected 'p1' programmer for a:b:c.", + ]); + expect(selectedProgrammers).to.be.deep.equal({ + [fqbn]: programmer, + }); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/browser/boards-data-store.test.ts b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts index 4f52c207d..791c74e72 100644 --- a/arduino-ide-extension/src/test/browser/boards-data-store.test.ts +++ b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts @@ -16,7 +16,6 @@ import { } from '@theia/core/lib/common/disposable'; import { MessageService } from '@theia/core/lib/common/message-service'; import { wait } from '@theia/core/lib/common/promise-util'; -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'; @@ -30,7 +29,7 @@ import { Programmer, } from '../../common/protocol/boards-service'; import { NotificationServiceServer } from '../../common/protocol/notification-service'; -import { ConsoleLogger, bindCommon } from '../common/common-test-bindings'; +import { bindBrowser } from './browser-test-bindings'; disableJSDOM(); @@ -76,7 +75,6 @@ describe('boards-data-store', function () { const storedData: BoardsDataStore.Data = { configOptions: [], programmers: [edbg], - selectedProgrammer: edbg, }; await setStorageData(fqbn, storedData); const data = await boardsDataStore.getData(fqbn); @@ -86,7 +84,7 @@ describe('boards-data-store', function () { it('should update board details of selected board (selected with FQBN)', async () => { const updated = boardsServiceProvider.updateConfig(board); expect(updated).to.be.ok; - await wait(50); + await wait(1); const selectedBoardData = boardsDataStore['_selectedBoardData']; expect(selectedBoardData).to.be.deep.equal({ @@ -104,7 +102,7 @@ describe('boards-data-store', function () { const board = { name, fqbn }; const updated = boardsServiceProvider.updateConfig(board); expect(updated).to.ok; - await wait(50); + await wait(1); const selectedBoardData = boardsDataStore['_selectedBoardData']; expect(selectedBoardData).to.be.undefined; @@ -113,7 +111,7 @@ describe('boards-data-store', function () { it('should unset the the board details of selected board when no board was selected', async () => { let updated = boardsServiceProvider.updateConfig(board); expect(updated).to.ok; - await wait(50); + await wait(1); let selectedBoardData = boardsDataStore['_selectedBoardData']; expect(selectedBoardData).to.be.deep.equal({ @@ -126,18 +124,18 @@ describe('boards-data-store', function () { updated = boardsServiceProvider.updateConfig('unset-board'); expect(updated).to.be.true; - await wait(50); + await wait(1); selectedBoardData = boardsDataStore['_selectedBoardData']; expect(selectedBoardData).to.be.undefined; }); it('should provide startup tasks when the data is available for the selected board', async () => { - const updated = boardsServiceProvider.updateConfig(board); + let updated = boardsServiceProvider.updateConfig(board); expect(updated).to.be.true; - await wait(50); + await wait(1); - const tasks = boardsDataStore.tasks(); + let tasks = boardsDataStore.tasks(); expect(tasks).to.be.deep.equal([ { command: 'arduino-use-inherited-boards-data', @@ -152,6 +150,13 @@ describe('boards-data-store', function () { ], }, ]); + + updated = boardsServiceProvider.updateConfig('unset-board'); + expect(updated).to.be.true; + await wait(1); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; }); it('should not provide any startup tasks when no data is available for the selected board', async () => { @@ -159,6 +164,187 @@ describe('boards-data-store', function () { expect(tasks).to.be.empty; }); + it('should update the startup task arg when the selected programmer changes', async () => { + let tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.ok; + await wait(1); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + + const result = await boardsDataStore.selectProgrammer({ + fqbn, + selectedProgrammer: edbg, + }); + expect(result).to.be.ok; + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + selectedProgrammer: edbg, + }); + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + selectedProgrammer: edbg, + }, + }, + ], + }, + ]); + }); + + it('should update the startup task arg when the config options change', async () => { + let tasks = boardsDataStore.tasks(); + expect(tasks).to.be.empty; + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + const updated = boardsServiceProvider.updateConfig(board); + expect(updated).to.be.ok; + await wait(1); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [configOption1], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + + const result = await boardsDataStore.selectConfigOption({ + fqbn, + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }); + expect(result).to.be.ok; + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + + tasks = boardsDataStore.tasks(); + expect(tasks).to.be.deep.equal([ + { + command: 'arduino-use-inherited-boards-data', + args: [ + { + fqbn, + data: { + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }, + }, + ], + }, + ]); + }); + + it('should select the default programmer', async () => { + const storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + defaultProgrammerId: edbg.id, + }, + ]) + ); + + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + defaultProgrammerId: edbg.id, + selectedProgrammer: edbg, + }); + }); + + it('should not select the default programmer when no match', async () => { + const storedData = await getStoredData(fqbn); + expect(storedData).to.be.undefined; + + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + defaultProgrammerId: 'missing', + }, + ]) + ); + + const data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + defaultProgrammerId: 'missing', + }); + }); + it('should select a programmer', async () => { let data = await boardsDataStore.getData(fqbn); expect(data).to.be.deep.equal({ @@ -306,7 +492,7 @@ describe('boards-data-store', function () { boardsDataStore.onDidChange(() => didChangeCounter++) ); notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); - await wait(50); + await wait(1); expect(didChangeCounter).to.be.equal(0); storedData = await getStoredData(fqbn); @@ -326,7 +512,7 @@ describe('boards-data-store', function () { boardsDataStore.onDidChange(() => didChangeCounter++) ); notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); - await wait(50); + await wait(1); expect(didChangeCounter).to.be.equal(1); storedData = await getStoredData(fqbn); @@ -359,7 +545,7 @@ describe('boards-data-store', function () { boardsDataStore.onDidChange(() => didChangeCounter++) ); notificationCenter.notifyPlatformDidInstall({ item: boardsPackage }); - await wait(50); + await wait(1); expect(didChangeCounter).to.be.equal(1); storedData = await boardsDataStore.getData(fqbn); @@ -390,7 +576,7 @@ describe('boards-data-store', function () { const container = new Container({ defaultScope: 'Singleton' }); container.load( new ContainerModule((bind, unbind, isBound, rebind) => { - bindCommon(bind); + bindBrowser(bind, unbind, isBound, rebind); bind(MessageService).toConstantValue(<MessageService>{}); bind(BoardsService).toConstantValue(<BoardsService>{ getDetectedPorts() { @@ -415,11 +601,6 @@ describe('boards-data-store', function () { bind(WindowService).toConstantValue(<WindowService>{}); 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; @@ -460,7 +641,6 @@ describe('boards-data-store', function () { PID: '1', buildProperties: [], configOptions: [configOption1], - debuggingSupported: false, programmers: [edbg, jlink], requiredTools: [], }; diff --git a/arduino-ide-extension/src/test/browser/browser-test-bindings.ts b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts index 7b950833b..7afb44e8f 100644 --- a/arduino-ide-extension/src/test/browser/browser-test-bindings.ts +++ b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts @@ -1,10 +1,43 @@ +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; +import { OpenerService } from '@theia/core/lib/browser/opener-service'; +import { + LocalStorageService, + StorageService, +} from '@theia/core/lib/browser/storage-service'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { MessageService } from '@theia/core/lib/common/message-service'; import { MockLogger } from '@theia/core/lib/common/test/mock-logger'; -import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { ArduinoPreferences } from '../../browser/arduino-preferences'; +import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { ConfigServiceClient } from '../../browser/config/config-service-client'; +import { DialogService } from '../../browser/dialog-service'; +import { SettingsService } from '../../browser/dialogs/settings/settings'; +import { HostedPluginSupport } from '../../browser/hosted/hosted-plugin-support'; +import { NotificationCenter } from '../../browser/notification-center'; +import { SketchesServiceClientImpl } from '../../browser/sketches-service-client-impl'; +import { ApplicationConnectionStatusContribution } from '../../browser/theia/core/connection-status-service'; +import { OutputChannelManager } from '../../browser/theia/output/output-channel'; +import { WorkspaceService } from '../../browser/theia/workspace/workspace-service'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import { FileSystemExt, SketchesService } from '../../common/protocol'; +import { BoardsService } from '../../common/protocol/boards-service'; +import { NotificationServiceServer } from '../../common/protocol/notification-service'; import { Bind, ConsoleLogger, bindCommon, } from '../common/common-test-bindings'; +import { never } from '../utils'; export function createBaseContainer(bind: Bind = bindBrowser): Container { const container = new Container({ defaultScope: 'Singleton' }); @@ -23,3 +56,57 @@ export const bindBrowser: Bind = function ( bind(MockLogger).toSelf().inSingletonScope(); rebind(ConsoleLogger).toService(MockLogger); }; + +/** + * Binds all required services as a mock to test a `SketchesContribution` instance. + */ +export const bindSketchesContribution: Bind = function ( + ...args: Parameters<Bind> +): ReturnType<Bind> { + const [bind] = args; + bindBrowser(...args); + bind(MessageService).toConstantValue(<MessageService>{}); + bind(BoardsService).toConstantValue(<BoardsService>{}); + bind(NotificationCenter).toSelf().inSingletonScope(); + bind(NotificationServiceServer).toConstantValue(<NotificationServiceServer>{ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setClient(_) { + // nothing + }, + }); + bind(FrontendApplicationStateService).toSelf().inSingletonScope(); + bind(BoardsDataStore).toConstantValue(<BoardsDataStore>{}); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue(<WindowService>{}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + bind(NoopHostedPluginSupport).toSelf().inSingletonScope(); + bind(HostedPluginSupport).toService(NoopHostedPluginSupport); + bind(FileService).toConstantValue(<FileService>{}); + bind(FileSystemExt).toConstantValue(<FileSystemExt>{}); + bind(ConfigServiceClient).toConstantValue(<ConfigServiceClient>{}); + bind(SketchesService).toConstantValue(<SketchesService>{}); + bind(OpenerService).toConstantValue(<OpenerService>{}); + bind(SketchesServiceClientImpl).toConstantValue( + <SketchesServiceClientImpl>{} + ); + bind(EditorManager).toConstantValue(<EditorManager>{}); + bind(OutputChannelManager).toConstantValue(<OutputChannelManager>{}); + bind(EnvVariablesServer).toConstantValue(<EnvVariablesServer>{}); + bind(ApplicationConnectionStatusContribution).toConstantValue( + <ApplicationConnectionStatusContribution>{} + ); + bind(WorkspaceService).toConstantValue(<WorkspaceService>{}); + bind(LabelProvider).toConstantValue(<LabelProvider>{}); + bind(SettingsService).toConstantValue(<SettingsService>{}); + bind(ArduinoPreferences).toConstantValue(<ArduinoPreferences>{}); + bind(DialogService).toConstantValue(<DialogService>{}); + bind(MainMenuManager).toConstantValue(<MainMenuManager>{}); +}; + +@injectable() +export class NoopHostedPluginSupport implements HostedPluginSupport { + readonly didStart = Promise.resolve(); + readonly onDidCloseConnection = never(); + readonly onDidLoad = never(); +} diff --git a/arduino-ide-extension/src/test/browser/debug.test.ts b/arduino-ide-extension/src/test/browser/debug.test.ts new file mode 100644 index 000000000..0f41bad5c --- /dev/null +++ b/arduino-ide-extension/src/test/browser/debug.test.ts @@ -0,0 +1,379 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +FrontendApplicationConfigProvider.set({}); + +import { DisposableCollection } from '@theia/core/lib/common/disposable'; + +import { CommandEvent, CommandRegistry } from '@theia/core/lib/common/command'; +import { Emitter } from '@theia/core/lib/common/event'; +import { deepClone } from '@theia/core/lib/common/objects'; +import { wait } from '@theia/core/lib/common/promise-util'; +import { Mutable } from '@theia/core/lib/common/types'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { doesNotReject, rejects } from 'node:assert/strict'; +import { + BoardsDataStore, + BoardsDataStoreChangeEvent, +} from '../../browser/boards/boards-data-store'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { + Debug, + debuggingNotSupported, + isDebugEnabled, + noPlatformInstalledFor, + noProgrammerSelectedFor, +} from '../../browser/contributions/debug'; +import { NotificationCenter } from '../../browser/notification-center'; +import { noBoardSelected } from '../../common/nls'; +import { + BoardsConfigChangeEvent, + BoardsPackage, + CompileSummary, + ExecutableService, + type BoardDetails, + type Programmer, +} from '../../common/protocol'; +import { + BoardsConfig, + emptyBoardsConfig, +} from '../../common/protocol/boards-service'; +import { bindSketchesContribution } from './browser-test-bindings'; +import { aPackage } from './fixtures/boards'; + +disableJSDOM(); + +describe('debug', () => { + describe('isDebugEnabled', () => { + const fqbn = 'a:b:c'; + const name = 'ABC'; + const board = { fqbn, name }; + const p1: Programmer = { id: 'p1', name: 'P1', platform: 'The platform' }; + const p2: Programmer = { id: 'p2', name: 'P2', platform: 'The platform' }; + const data: BoardsDataStore.Data = { + configOptions: [], + defaultProgrammerId: 'p1', + programmers: [p1, p2], + selectedProgrammer: p1, + }; + const boardDetails: BoardDetails = { + buildProperties: [], + configOptions: [], + defaultProgrammerId: 'p1', + programmers: [p1, p2], + fqbn, + PID: '0', + VID: '0', + requiredTools: [], + }; + + it('should error when no board selected', async () => { + await rejects( + isDebugEnabled( + undefined, + unexpectedCall(), + unexpectedCall(), + unexpectedCall(), + unexpectedCall() + ), + (reason) => + reason instanceof Error && reason.message === noBoardSelected + ); + }); + + it('should error when platform is not installed (FQBN is undefined)', async () => { + await rejects( + isDebugEnabled( + { name, fqbn: undefined }, + unexpectedCall(), + unexpectedCall(), + unexpectedCall(), + unexpectedCall() + ), + (reason) => + reason instanceof Error && + reason.message === noPlatformInstalledFor(board.name) + ); + }); + + it('should error when platform is not installed (board details not available)', async () => { + await rejects( + isDebugEnabled( + board, + () => undefined, + () => data, + (fqbn) => fqbn, + unexpectedCall() + ), + (reason) => + reason instanceof Error && + reason.message === noPlatformInstalledFor(board.name) + ); + }); + + it('should error when no programmer selected', async () => { + const copyData: Mutable<BoardsDataStore.Data> = deepClone(data); + delete copyData.selectedProgrammer; + await rejects( + isDebugEnabled( + board, + () => boardDetails, + () => copyData, + (fqbn) => fqbn, + unexpectedCall() + ), + (reason) => + reason instanceof Error && + reason.message === noProgrammerSelectedFor(board.name) + ); + }); + + it('should error when it fails to get the debug info from the CLI', async () => { + await rejects( + isDebugEnabled( + board, + () => boardDetails, + () => data, + (fqbn) => fqbn, + () => { + throw new Error('unhandled error'); + } + ), + (reason) => + reason instanceof Error && + reason.message === debuggingNotSupported(board.name) + ); + }); + + it('should resolve when debugging is supported', async () => { + await doesNotReject( + isDebugEnabled( + board, + () => boardDetails, + () => data, + (fqbn) => fqbn, + () => Promise.resolve(`${fqbn}:USBMode=hwcdc`) + ) + ); + }); + + describe('onDidChangeMessage', () => { + let debug: MockDebug; + let onDidChangeMessageEvents: (string | undefined)[]; + + let toDisposeAfterEach: DisposableCollection; + let mockBoardsConfig: BoardsConfig; + let mockBoardsConfigDidChangeEmitter: Emitter<BoardsConfigChangeEvent>; + let mockPlatformDidInstallEmitter: Emitter<{ item: BoardsPackage }>; + let mockPlatformDidUninstallEmitter: Emitter<{ item: BoardsPackage }>; + let mockBoardsDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>; + let mockDidExecuteCommandEmitter: Emitter<CommandEvent>; + + beforeEach(() => { + mockBoardsConfig = emptyBoardsConfig(); + mockBoardsConfigDidChangeEmitter = new Emitter(); + mockPlatformDidInstallEmitter = new Emitter(); + mockPlatformDidUninstallEmitter = new Emitter(); + mockBoardsDataStoreDidChangeEmitter = new Emitter(); + mockDidExecuteCommandEmitter = new Emitter(); + toDisposeAfterEach = new DisposableCollection( + mockBoardsConfigDidChangeEmitter, + mockPlatformDidInstallEmitter, + mockPlatformDidUninstallEmitter, + mockBoardsDataStoreDidChangeEmitter, + mockDidExecuteCommandEmitter + ); + + const container = createContainer(); + const d = container.get<Debug>(Debug); + expect(d).to.be.an.instanceOf(MockDebug); + debug = d as MockDebug; + + onDidChangeMessageEvents = []; + toDisposeAfterEach.push( + debug['onDidChangeMessage']((event) => { + onDidChangeMessageEvents.push(event); + }) + ); + + const commandRegistry: Mutable<CommandRegistry> = + container.get<CommandRegistry>(CommandRegistry); + commandRegistry['onDidExecuteCommand'] = + mockDidExecuteCommandEmitter.event; + debug.onStart(); + }); + + it('should update on board identifier change', async () => { + mockBoardsConfigDidChangeEmitter.fire({ + previousSelectedBoard: undefined, + selectedBoard: { fqbn: 'a:b:c', name: 'ABC' }, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should not update on port identifier change', async () => { + mockBoardsConfigDidChangeEmitter.fire({ + previousSelectedPort: undefined, + selectedPort: { protocol: 'serial', address: 'COM1' }, + }); + await wait(1); + + expect(onDidChangeMessageEvents).to.be.empty; + }); + + it('should update on platform install', async () => { + mockPlatformDidInstallEmitter.fire({ + item: aPackage, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should update on platform uninstall', async () => { + mockPlatformDidUninstallEmitter.fire({ + item: aPackage, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should update on boards data store change when affects the selected board', async () => { + mockBoardsConfig = { + selectedBoard: { fqbn: 'a:b:c', name: '' }, + selectedPort: undefined, + }; + mockBoardsDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'a:b:c', + data: BoardsDataStore.Data.EMPTY, // it does not matter + }, + ], + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should not update on boards data store change when does not affect the selected board', async () => { + mockBoardsConfig = { + selectedBoard: { fqbn: 'a:b:c', name: '' }, + selectedPort: undefined, + }; + mockBoardsDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'x:y:z', + data: BoardsDataStore.Data.EMPTY, // it does not matter + }, + ], + }); + await wait(1); + + expect(onDidChangeMessageEvents).to.be.empty; + }); + + it('should update after verify', async () => { + const summary: CompileSummary = { + buildPath: '', + buildProperties: [], + executableSectionsSize: [], + usedLibraries: [], + boardPlatform: undefined, + buildPlatform: undefined, + buildOutputUri: '', + }; + mockDidExecuteCommandEmitter.fire({ + commandId: 'arduino.languageserver.notifyBuildDidComplete', + args: [summary], + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal([undefined]); + }); + + it('should not update when unrelated command executes', async () => { + mockDidExecuteCommandEmitter.fire({ + commandId: 'other.command', + args: [], + }); + await wait(1); + + expect(onDidChangeMessageEvents).to.be.empty; + }); + + it('should update the error message', async () => { + debug.isDebugEnabledMock = Promise.reject(new Error('my error')); + mockBoardsConfigDidChangeEmitter.fire({ + previousSelectedBoard: undefined, + selectedBoard: { fqbn: 'a:b:c', name: 'ABC' }, + }); + await wait(1); + + expect(onDidChangeMessageEvents).deep.equal(['my error']); + }); + + afterEach(() => toDisposeAfterEach.dispose()); + + function createContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load( + new ContainerModule((bind, unbind, isBound, rebind) => { + bind(MockDebug).toSelf().inSingletonScope(); + bind(Debug).toService(MockDebug); + bindSketchesContribution(bind, unbind, isBound, rebind); + bind(ExecutableService).toConstantValue(<ExecutableService>{}); + rebind(NotificationCenter).toConstantValue(<NotificationCenter>{ + get onPlatformDidInstall() { + return mockPlatformDidInstallEmitter.event; + }, + get onPlatformDidUninstall() { + return mockPlatformDidUninstallEmitter.event; + }, + }); + rebind(BoardsServiceProvider).toConstantValue(< + BoardsServiceProvider + >{ + get onBoardsConfigDidChange() { + return mockBoardsConfigDidChangeEmitter.event; + }, + get boardsConfig() { + return mockBoardsConfig; + }, + }); + rebind(BoardsDataStore).toConstantValue(<BoardsDataStore>{ + get onDidChange() { + return mockBoardsDataStoreDidChangeEmitter.event; + }, + }); + }) + ); + return container; + } + }); + + function unexpectedCall(): () => never { + return () => expect.fail('unexpected call'); + } + }); +}); + +@injectable() +class MockDebug extends Debug { + isDebugEnabledMock: Promise<string> = Promise.resolve('a:b:c:USBMode:hwcdc'); + + constructor() { + super(); + this['isDebugEnabled'] = () => this.isDebugEnabledMock; + } +} diff --git a/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts index c3ad66ce9..31a534f33 100644 --- a/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts +++ b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts @@ -5,29 +5,14 @@ import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/front FrontendApplicationConfigProvider.set({}); import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { LabelProvider } from '@theia/core/lib/browser/label-provider'; -import { OpenerService } from '@theia/core/lib/browser/opener-service'; -import { - LocalStorageService, - StorageService, -} from '@theia/core/lib/browser/storage-service'; -import { WindowService } from '@theia/core/lib/browser/window/window-service'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { Emitter } from '@theia/core/lib/common/event'; -import { MessageService } from '@theia/core/lib/common/message-service'; import { wait } from '@theia/core/lib/common/promise-util'; import URI from '@theia/core/lib/common/uri'; -import { - Container, - ContainerModule, - injectable, -} from '@theia/core/shared/inversify'; -import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import type { BoardDetails as ApiBoardDetails, @@ -35,8 +20,10 @@ import type { Port as ApiPort, } from 'vscode-arduino-api'; import { URI as CodeURI } from 'vscode-uri'; -import { ArduinoPreferences } from '../../browser/arduino-preferences'; -import { BoardsDataStore } from '../../browser/boards/boards-data-store'; +import { + BoardsDataStore, + BoardsDataStoreChangeEvent, +} from '../../browser/boards/boards-data-store'; import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; import { ConfigServiceClient } from '../../browser/config/config-service-client'; import { CommandRegistry } from '../../browser/contributions/contribution'; @@ -44,31 +31,18 @@ import { UpdateArduinoState, UpdateStateParams, } from '../../browser/contributions/update-arduino-state'; -import { DialogService } from '../../browser/dialog-service'; -import { SettingsService } from '../../browser/dialogs/settings/settings'; -import { HostedPluginSupport } from '../../browser/hosted/hosted-plugin-support'; import { NotificationCenter } from '../../browser/notification-center'; import { CurrentSketch, SketchesServiceClientImpl, } from '../../browser/sketches-service-client-impl'; -import { ApplicationConnectionStatusContribution } from '../../browser/theia/core/connection-status-service'; -import { OutputChannelManager } from '../../browser/theia/output/output-channel'; -import { WorkspaceService } from '../../browser/theia/workspace/workspace-service'; -import { MainMenuManager } from '../../common/main-menu-manager'; -import { - CompileSummary, - FileSystemExt, - SketchesService, -} from '../../common/protocol'; +import { CompileSummary } from '../../common/protocol'; import { BoardDetails, BoardsService, Port, } from '../../common/protocol/boards-service'; -import { NotificationServiceServer } from '../../common/protocol/notification-service'; -import { never } from '../utils'; -import { bindBrowser } from './browser-test-bindings'; +import { bindSketchesContribution } from './browser-test-bindings'; disableJSDOM(); @@ -90,7 +64,7 @@ describe('update-arduino-state', function () { let onCurrentSketchDidChangeEmitter: Emitter<CurrentSketch>; let onDataDirDidChangeEmitter: Emitter<URI | undefined>; let onSketchDirDidChangeEmitter: Emitter<URI | undefined>; - let onDataStoreDidChangeEmitter: Emitter<string[]>; + let onDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>; beforeEach(async () => { toDisposeAfterEach = new DisposableCollection(); @@ -157,10 +131,10 @@ describe('update-arduino-state', function () { it('should automatically update the boards config (board+port) on ready', async () => { const fqbn = 'a:b:c'; const board = { fqbn, name: 'ABC' }; - const boardDetails = { + const boardDetails: BoardDetails = { buildProperties: [], configOptions: [], - debuggingSupported: false, + defaultProgrammerId: undefined, fqbn, PID: '0', VID: '0', @@ -290,7 +264,7 @@ describe('update-arduino-state', function () { const boardDetails = { buildProperties: [], configOptions: [], - debuggingSupported: false, + defaultProgrammerId: undefined, fqbn, PID: '0', VID: '0', @@ -372,7 +346,7 @@ describe('update-arduino-state', function () { const boardDetails = { buildProperties: [], configOptions: [], - debuggingSupported: false, + defaultProgrammerId: undefined, fqbn, PID: '0', VID: '0', @@ -525,7 +499,25 @@ describe('update-arduino-state', function () { }); it('should not update the board details when data store did change but the selected board does not match', async () => { - onDataStoreDidChangeEmitter.fire(['a:b:c']); + onDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'a:b:c', + // the data does not matter + data: { + configOptions: [ + { + label: 'C1', + option: 'c1', + values: [{ label: 'C1V1', selected: true, value: 'c1v1' }], + }, + ], + programmers: [], + defaultProgrammerId: undefined, + }, + }, + ], + }); await wait(50); expect(stateUpdateParams).to.be.empty; @@ -537,7 +529,7 @@ describe('update-arduino-state', function () { const boardDetails = { buildProperties: [], configOptions: [], - debuggingSupported: false, + defaultProgrammerId: undefined, fqbn, PID: '0', VID: '0', @@ -552,7 +544,19 @@ describe('update-arduino-state', function () { selectedPort: undefined, }; - onDataStoreDidChangeEmitter.fire(['a:b:c']); + onDataStoreDidChangeEmitter.fire({ + changes: [ + { + fqbn: 'a:b:c', + // the data does not matter + data: { + configOptions: [], + programmers: [{ id: 'p1', name: 'P1', platform: 'The platform' }], + defaultProgrammerId: 'p1', + }, + }, + ], + }); await wait(50); const params = stateUpdateParams.filter( @@ -579,9 +583,9 @@ describe('update-arduino-state', function () { const container = new Container({ defaultScope: 'Singleton' }); container.load( new ContainerModule((bind, unbind, isBound, rebind) => { - bindBrowser(bind, unbind, isBound, rebind); - bind(MessageService).toConstantValue(<MessageService>{}); - bind(BoardsService).toConstantValue(<BoardsService>{ + bindSketchesContribution(bind, unbind, isBound, rebind); + bind(UpdateArduinoState).toSelf().inSingletonScope(); + rebind(BoardsService).toConstantValue(<BoardsService>{ getDetectedPorts() { return {}; }, @@ -589,17 +593,7 @@ describe('update-arduino-state', function () { return boardDetailsMocks[fqbn]; }, }); - bind(NotificationCenter).toSelf().inSingletonScope(); - bind(NotificationServiceServer).toConstantValue(< - NotificationServiceServer - >{ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - setClient(_) { - // nothing - }, - }); - bind(FrontendApplicationStateService).toSelf().inSingletonScope(); - bind(BoardsDataStore).toConstantValue(<BoardsDataStore>{ + rebind(BoardsDataStore).toConstantValue(<BoardsDataStore>{ async getData(fqbn) { if (!fqbn) { return BoardsDataStore.Data.EMPTY; @@ -607,20 +601,11 @@ describe('update-arduino-state', function () { const data = dataStoreMocks[fqbn] ?? BoardsDataStore.Data.EMPTY; return data; }, - get onChanged() { + get onDidChange() { return onDataStoreDidChangeEmitter.event; }, }); - bind(LocalStorageService).toSelf().inSingletonScope(); - bind(WindowService).toConstantValue(<WindowService>{}); - bind(StorageService).toService(LocalStorageService); - bind(BoardsServiceProvider).toSelf().inSingletonScope(); - bind(NoopHostedPluginSupport).toSelf().inSingletonScope(); - bind(HostedPluginSupport).toService(NoopHostedPluginSupport); - bind(UpdateArduinoState).toSelf().inSingletonScope(); - bind(FileService).toConstantValue(<FileService>{}); - bind(FileSystemExt).toConstantValue(<FileSystemExt>{}); - bind(ConfigServiceClient).toConstantValue(<ConfigServiceClient>{ + rebind(ConfigServiceClient).toConstantValue(<ConfigServiceClient>{ tryGetSketchDirUri() { return sketchDirUriMock; }, @@ -634,9 +619,7 @@ describe('update-arduino-state', function () { return onDataDirDidChangeEmitter.event; }, }); - bind(SketchesService).toConstantValue(<SketchesService>{}); - bind(OpenerService).toConstantValue(<OpenerService>{}); - bind(SketchesServiceClientImpl).toConstantValue(< + rebind(SketchesServiceClientImpl).toConstantValue(< SketchesServiceClientImpl >{ tryGetCurrentSketch() { @@ -644,27 +627,8 @@ describe('update-arduino-state', function () { }, onCurrentSketchDidChange: onCurrentSketchDidChangeEmitter.event, }); - bind(EditorManager).toConstantValue(<EditorManager>{}); - bind(OutputChannelManager).toConstantValue(<OutputChannelManager>{}); - bind(EnvVariablesServer).toConstantValue(<EnvVariablesServer>{}); - bind(ApplicationConnectionStatusContribution).toConstantValue( - <ApplicationConnectionStatusContribution>{} - ); - bind(WorkspaceService).toConstantValue(<WorkspaceService>{}); - bind(LabelProvider).toConstantValue(<LabelProvider>{}); - bind(SettingsService).toConstantValue(<SettingsService>{}); - bind(ArduinoPreferences).toConstantValue(<ArduinoPreferences>{}); - bind(DialogService).toConstantValue(<DialogService>{}); - bind(MainMenuManager).toConstantValue(<MainMenuManager>{}); }) ); return container; } }); - -@injectable() -class NoopHostedPluginSupport implements HostedPluginSupport { - readonly didStart = Promise.resolve(); - readonly onDidCloseConnection = never(); - readonly onDidLoad = never(); -} diff --git a/electron-app/package.json b/electron-app/package.json index 9778a4128..de1249641 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -196,7 +196,7 @@ "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-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.1.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", diff --git a/i18n/en.json b/i18n/en.json index 91b37f6a1..9eb41d68c 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -139,6 +139,7 @@ "installManually": "Install Manually", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Processing", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "noProgrammerSelectedFor": "No programmer selected 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?" }, From 3eef857b4843d33ca96d36f6e8cc2228f8e386ec Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 20 Nov 2023 13:37:47 +0100 Subject: [PATCH 286/384] fix: can open IDE from an ino file Use a fallback frontend app config when starting IDE2 from an ino file (from Explorer, Finder, etc.) and the app config is not yet set. Closes #2209 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../theia/electron-main-application.ts | 62 +++++++++++++++++-- 1 file changed, 56 insertions(+), 6 deletions(-) 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 506cd7c18..35063bc8f 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 @@ -16,8 +16,8 @@ import { Deferred } from '@theia/core/lib/common/promise-util'; import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types'; import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token'; import { - ElectronMainApplication as TheiaElectronMainApplication, ElectronMainExecutionParams, + ElectronMainApplication as TheiaElectronMainApplication, } from '@theia/core/lib/electron-main/electron-main-application'; import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window'; import { FileUri } from '@theia/core/lib/node/file-uri'; @@ -25,7 +25,7 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { URI } from '@theia/core/shared/vscode-uri'; import { log as logToFile, setup as setupFileLog } from 'node-log-rotate'; import { fork } from 'node:child_process'; -import { promises as fs, rm, rmSync } from 'node:fs'; +import { promises as fs, readFileSync, rm, rmSync } from 'node:fs'; import type { AddressInfo } from 'node:net'; import { isAbsolute, join, resolve } from 'node:path'; import { Sketch } from '../../common/protocol'; @@ -745,6 +745,19 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } } } + + // Fallback app config when starting IDE2 from an ino file (from Explorer, Finder, etc.) and the app config is not yet set. + // https://github.com/arduino/arduino-ide/issues/2209 + private _fallbackConfig: FrontendApplicationConfig | undefined; + override get config(): FrontendApplicationConfig { + if (!this._config) { + if (!this._fallbackConfig) { + this._fallbackConfig = readFrontendAppConfigSync(); + } + return this._fallbackConfig; + } + return super.config; + } } class InterruptWorkspaceRestoreError extends Error { @@ -775,11 +788,8 @@ async function updateFrontendApplicationConfigFromPackageJson( 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}` + `Checking for frontend application configuration customizations. Module path: ${__filename}, destination 'package.json': ${packageJsonPath}` ); const rawPackageJson = await fs.readFile(packageJsonPath, { encoding: 'utf8', @@ -827,6 +837,46 @@ async function updateFrontendApplicationConfigFromPackageJson( return config; } +const fallbackFrontendAppConfig: FrontendApplicationConfig = { + applicationName: 'Arduino IDE', + defaultTheme: { + light: 'arduino-theme', + dark: 'arduino-theme-dark', + }, + defaultIconTheme: 'none', + validatePreferencesSchema: false, + defaultLocale: '', + electron: {}, +}; + +// When the package.json must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked. +// Only for production mode! +const packageJsonPath = join(__filename, '..', '..', '..', 'package.json'); + +function readFrontendAppConfigSync(): FrontendApplicationConfig { + if (environment.electron.isDevMode()) { + console.debug( + 'Running in dev mode. Using the fallback fronted application config.' + ); + return fallbackFrontendAppConfig; + } + try { + const raw = readFileSync(packageJsonPath, { encoding: 'utf8' }); + const packageJson = JSON.parse(raw); + const config = packageJson?.theia?.frontend?.config; + if (config) { + return config; + } + throw new Error(`Frontend application config not found. ${packageJson}`); + } catch (err) { + console.error( + `Could not read package.json content from ${packageJsonPath}.`, + err + ); + return fallbackFrontendAppConfig; + } +} + /** * Mutates the `toUpdate` argument and returns with it. */ From 074f65445728cb1950bfe1a01017c8227e43aba6 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 23 Nov 2023 11:34:05 +0100 Subject: [PATCH 287/384] fix: sketch Save As preserves the folder structure This commit rewrites how IDE copies sketches as part of the _Save As_ operation. Instead of copying to the destination, IDE copies the sketch into a temporary location, then to the desired destination. This commit drops [`cpy`](https://www.npmjs.com/package/cpy). Ref: https://github.com/sindresorhus/cpy/commit/47b89a70b51af32133750ea2c73bed65fbe0ce56 Closes #2077 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 1 - .../src/common/protocol/sketches-service.ts | 10 ++ .../src/node/sketches-service-impl.ts | 138 ++++++++++++------ .../node/sketches-service-impl.slow-test.ts | 130 ++++++++++++++--- yarn.lock | 81 +--------- 5 files changed, 220 insertions(+), 140 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index ba340a0f7..a7bc5354e 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -63,7 +63,6 @@ "auth0-js": "^9.23.2", "btoa": "^1.2.1", "classnames": "^2.3.1", - "cpy": "^10.0.0", "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", "deepmerge": "^4.2.2", diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 3c98252c1..43c739433 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -8,6 +8,7 @@ export namespace SketchesError { export const Codes = { NotFound: 5001, InvalidName: 5002, + InvalidFolderName: 5003, }; export const NotFound = ApplicationError.declare( Codes.NotFound, @@ -27,6 +28,15 @@ export namespace SketchesError { }; } ); + export const InvalidFolderName = ApplicationError.declare( + Codes.InvalidFolderName, + (message: string, invalidFolderName: string) => { + return { + message, + data: { invalidFolderName }, + }; + } + ); } export const SketchesServicePath = '/services/sketches-service'; diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index e14b123dd..8fb2ada07 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -1,48 +1,55 @@ -import { injectable, inject, named } from '@theia/core/shared/inversify'; -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 { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { nls } from '@theia/core/lib/common/nls'; +import { isWindows } from '@theia/core/lib/common/os'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { escapeRegExpCharacters } from '@theia/core/lib/common/strings'; import type { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; -import { ILogger } from '@theia/core/lib/common/logger'; import { FileUri } from '@theia/core/lib/node/file-uri'; -import { ConfigServiceImpl } from './config-service-impl'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import glob from 'glob'; +import crypto from 'node:crypto'; +import { + CopyOptions, + Stats, + constants, + promises as fs, + lstat, + realpath, +} from 'node:fs'; +import os from 'node:os'; +import path, { join } from 'node:path'; +import PQueue from 'p-queue'; +import temp from 'temp'; +import { NotificationServiceServer } from '../common/protocol'; import { - SketchesService, Sketch, - SketchRef, SketchContainer, + SketchRef, SketchesError, + SketchesService, } from '../common/protocol/sketches-service'; -import { NotificationServiceServer } from '../common/protocol'; -import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { CoreClientAware } from './core-client-provider'; +import { + firstToLowerCase, + firstToUpperCase, + startsWithUpperCase, +} from '../common/utils'; import { ArchiveSketchRequest, LoadSketchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { escapeRegExpCharacters } from '@theia/core/lib/common/strings'; -import { ServiceError } from './service-error'; +import { ConfigServiceImpl } from './config-service-impl'; +import { CoreClientAware } from './core-client-provider'; import { IsTempSketch, - maybeNormalizeDrive, TempSketchPrefix, Win32DriveRegex, + maybeNormalizeDrive, } from './is-temp-sketch'; -import { join } from 'node:path'; -import { ErrnoException } from './utils/errors'; -import { isWindows } from '@theia/core/lib/common/os'; -import { - firstToLowerCase, - firstToUpperCase, - startsWithUpperCase, -} from '../common/utils'; +import { ServiceError } from './service-error'; import { SettingsReader } from './settings-reader'; +import { ErrnoException } from './utils/errors'; const RecentSketches = 'recent-sketches.json'; const DefaultIno = `void setup() { @@ -510,26 +517,75 @@ export class SketchesServiceImpl } const sourceFolderBasename = path.basename(source); const destinationFolderBasename = path.basename(destination); - let filter; + + const errorMessage = Sketch.validateSketchFolderName( + destinationFolderBasename + ); + if (errorMessage) { + const message = `${nls.localize( + 'arduino/sketch/invalidSketchFolderNameMessage', + "Invalid sketch folder name: '{0}'", + destinationFolderBasename + )} ${errorMessage}`; + throw SketchesError.InvalidFolderName(message, destinationFolderBasename); + } + + let filter: CopyOptions['filter']; if (onlySketchFiles) { - const sketchFilePaths = Sketch.uris(sketch).map(FileUri.fsPath); - filter = (file: { path: string }) => sketchFilePaths.includes(file.path); + // The Windows paths, can be a trash (see below). Hence, it must be resolved with Node.js. + // After resolving the path, the drive letter is still a gamble (can be upper or lower case) and could result in a false negative match. + // Here, all sketch file paths must be resolved by Node.js, to provide the same drive letter casing. + const sketchFilePaths = await Promise.all( + Sketch.uris(sketch) + .map(FileUri.fsPath) + .map((path) => fs.realpath(path)) + ); + filter = async (s) => { + // On Windows, the source path could start with a complete trash. For example, \\\\?\\c:\\Users\\kittaakos\\AppData\\Local\\Temp\\.arduinoIDE-unsaved20231024-9300-1hp64fi.g8yh\\sketch_nov24d. + // The path must be resolved. + const resolvedSource = await fs.realpath(s); + if (sketchFilePaths.includes(resolvedSource)) { + return true; + } + const stat = await fs.stat(resolvedSource); + if (stat.isFile()) { + return false; + } + // Copy the folder if any of the sketch file path starts with this folder + return sketchFilePaths.some((sketchFilePath) => + sketchFilePath.startsWith(resolvedSource) + ); + }; } else { filter = () => true; } - const cpyModule = await import('cpy'); - const cpy = cpyModule.default; - await cpy(sourceFolderBasename, destination, { - rename: (basename) => - sourceFolderBasename !== destinationFolderBasename && - basename === `${sourceFolderBasename}.ino` - ? `${destinationFolderBasename}.ino` - : basename, + + const tempRoot = await this.createTempFolder(); + const temp = join(tempRoot, destinationFolderBasename); + await fs.mkdir(temp, { recursive: true }); + + // copy to temp folder + await fs.cp(source, temp, { filter, - cwd: path.dirname(source), + recursive: true, + force: true, }); - const copiedSketch = await this.doLoadSketch(destinationUri, false); - return copiedSketch; + + // rename the main sketch file + await fs.rename( + join(temp, `${sourceFolderBasename}.ino`), + join(temp, `${destinationFolderBasename}.ino`) + ); + + // copy to destination + try { + await fs.cp(temp, destination, { recursive: true, force: true }); + const copiedSketch = await this.doLoadSketch(destinationUri, false); + return copiedSketch; + } finally { + // remove temp + fs.rm(tempRoot, { recursive: true, force: true, maxRetries: 5 }); // no await + } } async archive(sketch: Sketch, destinationUri: string): Promise<string> { 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 f9d750d3c..d4e4f154c 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 @@ -8,9 +8,10 @@ import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { promises as fs } from 'node:fs'; import { basename, join } from 'node:path'; +import { rejects } from 'node:assert/strict'; import { sync as rimrafSync } from 'rimraf'; import temp from 'temp'; -import { Sketch, SketchesService } from '../../common/protocol'; +import { Sketch, SketchesError, SketchesService } from '../../common/protocol'; import { isAccessibleSketchPath, SketchesServiceImpl, @@ -138,12 +139,31 @@ describe('sketches-service-impl', () => { after(() => toDispose.dispose()); - describe('copy', () => { - it('should copy a sketch when the destination does not exist', async function () { - this.timeout(testTimeout); + describe('copy', function () { + this.timeout(testTimeout); + this.slow(250); + + it('should error when the destination sketch folder name is invalid', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'invalid with spaces'); + const sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + await rejects( + sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }), + SketchesError.InvalidFolderName.is + ); + }); + + it('should copy a sketch when the destination does not exist', async () => { const sketchesService = container.get<SketchesServiceImpl>(SketchesService); - const destinationPath = await sketchesService['createTempFolder'](); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'Does_Not_Exist_but_valid'); + await rejects(fs.readdir(destinationPath), ErrnoException.isENOENT); let sketch = await sketchesService.createNewSketch(); toDispose.push(disposeSketch(sketch)); const sourcePath = FileUri.fsPath(sketch.uri); @@ -187,11 +207,11 @@ describe('sketches-service-impl', () => { ).to.be.true; }); - it("should copy only sketch files if 'onlySketchFiles' is true", async function () { - this.timeout(testTimeout); + it("should copy only sketch files if 'onlySketchFiles' is true", async () => { const sketchesService = container.get<SketchesServiceImpl>(SketchesService); - const destinationPath = await sketchesService['createTempFolder'](); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'OnlySketchFiles'); let sketch = await sketchesService.createNewSketch(); toDispose.push(disposeSketch(sketch)); const sourcePath = FileUri.fsPath(sketch.uri); @@ -207,11 +227,25 @@ describe('sketches-service-impl', () => { const logContent = 'log file content'; const logPath = join(sourcePath, logBasename); await fs.writeFile(logPath, logContent, { encoding: 'utf8' }); + const srcPath = join(sourcePath, 'src'); + await fs.mkdir(srcPath, { recursive: true }); + const libInSrcBasename = 'lib_in_src.cpp'; + const libInSrcContent = 'lib in src content'; + const libInSrcPath = join(srcPath, libInSrcBasename); + await fs.writeFile(libInSrcPath, libInSrcContent, { encoding: 'utf8' }); + const logInSrcBasename = 'inols-clangd-err_in_src.log'; + const logInSrcContent = 'log file content in src'; + const logInSrcPath = join(srcPath, logInSrcBasename); + await fs.writeFile(logInSrcPath, logInSrcContent, { encoding: 'utf8' }); sketch = await sketchesService.loadSketch(sketch.uri); expect(Sketch.isInSketch(FileUri.create(libPath), sketch)).to.be.true; expect(Sketch.isInSketch(FileUri.create(headerPath), sketch)).to.be.true; expect(Sketch.isInSketch(FileUri.create(logPath), sketch)).to.be.false; + expect(Sketch.isInSketch(FileUri.create(libInSrcPath), sketch)).to.be + .true; + expect(Sketch.isInSketch(FileUri.create(logInSrcPath), sketch)).to.be + .false; const reloadedLogContent = await fs.readFile(logPath, { encoding: 'utf8', }); @@ -249,20 +283,25 @@ describe('sketches-service-impl', () => { copied ) ).to.be.false; - try { - await fs.readFile(join(destinationPath, logBasename), { - encoding: 'utf8', - }); - expect.fail( - 'Log file must not exist in the destination. Expected ENOENT when loading the log file.' - ); - } catch (err) { - expect(ErrnoException.isENOENT(err)).to.be.true; - } + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, 'src', libInSrcBasename)), + copied + ) + ).to.be.true; + expect( + Sketch.isInSketch( + FileUri.create(join(destinationPath, 'src', logInSrcBasename)), + copied + ) + ).to.be.false; + await rejects( + fs.readFile(join(destinationPath, logBasename)), + ErrnoException.isENOENT + ); }); - it('should copy sketch inside the sketch folder', async function () { - this.timeout(testTimeout); + it('should copy sketch inside the sketch folder', async () => { const sketchesService = container.get<SketchesServiceImpl>(SketchesService); let sketch = await sketchesService.createNewSketch(); @@ -309,6 +348,55 @@ describe('sketches-service-impl', () => { ).to.be.true; }); + it('should not modify the subfolder structure', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'HasSubfolders_copy'); + await fs.mkdir(destinationPath, { recursive: true }); + let sketch = await sketchesService.createNewSketch('HasSubfolders'); + toDispose.push(disposeSketch(sketch)); + + const sourcePath = FileUri.fsPath(sketch.uri); + const srcPath = join(sourcePath, 'src'); + await fs.mkdir(srcPath, { recursive: true }); + const headerPath = join(srcPath, 'FomSubfolder.h'); + await fs.writeFile(headerPath, '// empty', { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + + expect(sketch.mainFileUri).to.be.equal( + FileUri.create(join(sourcePath, 'HasSubfolders.ino')).toString() + ); + expect(sketch.additionalFileUris).to.be.deep.equal([ + FileUri.create(join(srcPath, 'FomSubfolder.h')).toString(), + ]); + expect(sketch.otherSketchFileUris).to.be.empty; + expect(sketch.rootFolderFileUris).to.be.empty; + + const destinationUri = FileUri.create(destinationPath).toString(); + const copySketch = await sketchesService.copy(sketch, { destinationUri }); + toDispose.push(disposeSketch(copySketch)); + expect(copySketch.mainFileUri).to.be.equal( + FileUri.create( + join(destinationPath, 'HasSubfolders_copy.ino') + ).toString() + ); + expect(copySketch.additionalFileUris).to.be.deep.equal([ + FileUri.create( + join(destinationPath, 'src', 'FomSubfolder.h') + ).toString(), + ]); + expect(copySketch.otherSketchFileUris).to.be.empty; + expect(copySketch.rootFolderFileUris).to.be.empty; + + const actualHeaderContent = await fs.readFile( + join(destinationPath, 'src', 'FomSubfolder.h'), + { encoding: 'utf8' } + ); + expect(actualHeaderContent).to.be.equal('// empty'); + }); + it('should copy sketch with overwrite when source and destination sketch folder names are the same', async function () { this.timeout(testTimeout); const sketchesService = @@ -346,7 +434,7 @@ describe('sketches-service-impl', () => { [ '<', '>', - 'chevrons', + 'lt+gt', { predicate: () => isWindows, why: '< (less than) and > (greater than) are reserved characters on Windows (https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions)', diff --git a/yarn.lock b/yarn.lock index c75cfaf75..7e7f75a09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4026,11 +4026,6 @@ 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" @@ -5281,29 +5276,6 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" -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.2.10" - nested-error-stacks "^2.1.1" - p-event "^5.0.1" - -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 "^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" @@ -6627,7 +6599,7 @@ fast-fifo@^1.1.0, fast-fifo@^1.2.0: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== @@ -7347,17 +7319,6 @@ globby@11.1.0, globby@^11.0.3, globby@^11.1.0: 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" @@ -7421,7 +7382,7 @@ got@^12.0.0, got@^12.1.0, got@^12.6.1: 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: +graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, 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== @@ -7763,7 +7724,7 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: +ignore@^5.0.4, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -8521,11 +8482,6 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: object.assign "^4.1.4" object.values "^1.1.6" -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@^5.1.1: version "5.2.0" resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" @@ -9396,7 +9352,7 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -9832,11 +9788,6 @@ 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.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" @@ -10422,13 +10373,6 @@ p-event@^5.0.1: dependencies: p-timeout "^5.0.2" -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 "^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" @@ -10500,18 +10444,6 @@ p-map@4.0.0, p-map@^4.0.0: dependencies: aggregate-error "^3.0.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" @@ -12109,11 +12041,6 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== -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" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" From d01f95647e756056aa4ee217746ec40063b2a84c Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 23 Nov 2023 17:13:11 +0100 Subject: [PATCH 288/384] fix: sketch Save As errors on name collision The Save As operation is halted and the problem clearly communicated to the user when there is a collision between the target primary source file name and existing secondary source files of the sketch. Closes #827 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/contributions/save-as-sketch.ts | 33 ++++++++++++++++--- .../src/common/protocol/sketches-service.ts | 16 +++++++++ .../src/node/sketches-service-impl.ts | 29 ++++++++++++++++ .../node/sketches-service-impl.slow-test.ts | 31 +++++++++++++++++ i18n/en.json | 2 ++ 5 files changed, 107 insertions(+), 4 deletions(-) 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 26dd6158f..1c4747225 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -3,10 +3,12 @@ import { NavigatableWidget } from '@theia/core/lib/browser/navigatable'; import { Saveable } from '@theia/core/lib/browser/saveable'; import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { WorkspaceInput } from '@theia/workspace/lib/browser/workspace-service'; +import { SketchesError } from '../../common/protocol'; import { StartupTasks } from '../../electron-common/startup-task'; import { ArduinoMenus } from '../menu/arduino-menus'; import { CurrentSketch } from '../sketches-service-client-impl'; @@ -35,7 +37,29 @@ export class SaveAsSketch extends CloudSketchContribution { override registerCommands(registry: CommandRegistry): void { registry.registerCommand(SaveAsSketch.Commands.SAVE_AS_SKETCH, { - execute: (args) => this.saveAs(args), + execute: async (args) => { + try { + return await this.saveAs(args); + } catch (err) { + let message = String(err); + if (ApplicationError.is(err)) { + if (SketchesError.SketchAlreadyContainsThisFile.is(err)) { + message = nls.localize( + 'arduino/sketch/sketchAlreadyContainsThisFileMessage', + 'Failed to save sketch "{0}" as "{1}". {2}', + err.data.sourceSketchName, + err.data.targetSketchName, + err.message + ); + } else { + message = err.message; + } + } else if (err instanceof Error) { + message = err.message; + } + this.messageService.error(message); + } + }, }); } @@ -58,13 +82,14 @@ export class SaveAsSketch extends CloudSketchContribution { * Resolves `true` if the sketch was successfully saved as something. */ private async saveAs( - { + params = SaveAsSketch.Options.DEFAULT + ): Promise<boolean> { + const { execOnlyIfTemp, openAfterMove, wipeOriginal, markAsRecentlyOpened, - }: SaveAsSketch.Options = SaveAsSketch.Options.DEFAULT - ): Promise<boolean> { + } = params; assertConnectedToBackend({ connectionStatusService: this.connectionStatusService, messageService: this.messageService, diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 43c739433..4cc253d79 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -9,6 +9,7 @@ export namespace SketchesError { NotFound: 5001, InvalidName: 5002, InvalidFolderName: 5003, + SketchAlreadyContainsThisFile: 5004, }; export const NotFound = ApplicationError.declare( Codes.NotFound, @@ -37,6 +38,21 @@ export namespace SketchesError { }; } ); + // https://github.com/arduino/arduino-ide/issues/827 + export const SketchAlreadyContainsThisFile = ApplicationError.declare( + Codes.SketchAlreadyContainsThisFile, + ( + message: string, + sourceSketchName: string, + targetSketchName: string, + existingSketchFilename: string + ) => { + return { + message, + data: { sourceSketchName, targetSketchName, existingSketchFilename }, + }; + } + ); } export const SketchesServicePath = '/services/sketches-service'; diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 8fb2ada07..6e1b987bc 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -530,6 +530,35 @@ export class SketchesServiceImpl throw SketchesError.InvalidFolderName(message, destinationFolderBasename); } + // verify a possible name collision with existing ino files + if (sourceFolderBasename !== destinationFolderBasename) { + try { + const otherInoBasename = `${destinationFolderBasename}.ino`; + const otherInoPath = join(source, otherInoBasename); + const stat = await fs.stat(otherInoPath); + if (stat.isFile()) { + const message = nls.localize( + 'arduino/sketch/sketchAlreadyContainsThisFileError', + "The sketch already contains a file named '{0}'", + otherInoBasename + ); + // if can read the file, it will be a collision + throw SketchesError.SketchAlreadyContainsThisFile( + message, + sourceFolderBasename, + destinationFolderBasename, + otherInoBasename + ); + } + // Otherwise, it's OK, if it is an existing directory + } catch (err) { + // It's OK if the file is missing. + if (!ErrnoException.isENOENT(err)) { + throw err; + } + } + } + let filter: CopyOptions['filter']; if (onlySketchFiles) { // The Windows paths, can be a trash (see below). Hence, it must be resolved with Node.js. 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 d4e4f154c..37b839507 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 @@ -158,6 +158,37 @@ describe('sketches-service-impl', () => { ); }); + it('should error when the destination sketch folder name collides with an existing sketch file name', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'ExistingSketchFile'); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + const sourcePath = FileUri.fsPath(sketch.uri); + const otherInoBasename = 'ExistingSketchFile.ino'; + const otherInoPath = join(sourcePath, otherInoBasename); + await fs.writeFile(otherInoPath, '// a comment', { encoding: 'utf8' }); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(Sketch.isInSketch(FileUri.create(otherInoPath), sketch)).to.be + .true; + + await rejects( + sketchesService.copy(sketch, { + destinationUri: FileUri.create(destinationPath).toString(), + }), + (reason) => { + return ( + typeof reason === 'object' && + reason !== null && + SketchesError.SketchAlreadyContainsThisFile.is(reason) && + reason.data.existingSketchFilename === otherInoBasename + ); + } + ); + }); + it('should copy a sketch when the destination does not exist', async () => { const sketchesService = container.get<SketchesServiceImpl>(SketchesService); diff --git a/i18n/en.json b/i18n/en.json index 9eb41d68c..0f09cc75a 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -464,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", From 0ca1a31747847c170d6af99839601a3e9911cdad Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 22 Nov 2023 16:33:01 +0100 Subject: [PATCH 289/384] fix: board `<select>` update on board detach When the previously selected board is not detected, unset the `<select>` option. Closes #2222 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../certificate-uploader-component.tsx | 1 + .../certificate-uploader/select-board-components.tsx | 11 +++++++---- .../firmware-uploader/firmware-uploader-component.tsx | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) 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 91e8126af..0429ff487 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-component.tsx @@ -69,6 +69,7 @@ export const CertificateUploaderComponent = ({ const onItemSelect = React.useCallback( (item: BoardOptionValue | null) => { if (!item) { + setSelectedItem(null); return; } const board = item.board; 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 1f59b5239..d20bf1f87 100644 --- a/arduino-ide-extension/src/browser/dialogs/certificate-uploader/select-board-components.tsx +++ b/arduino-ide-extension/src/browser/dialogs/certificate-uploader/select-board-components.tsx @@ -1,8 +1,9 @@ import { nls } from '@theia/core/lib/common'; import React from '@theia/core/shared/react'; -import type { - BoardList, - BoardListItemWithBoard, +import { + boardListItemEquals, + type BoardList, + type BoardListItemWithBoard, } from '../../../common/protocol/board-list'; import { ArduinoSelect } from '../../widgets/arduino-select'; @@ -75,7 +76,9 @@ export const SelectBoardComponent = ({ setSelectOptions(boardOptions); if (selectedItem) { - selBoard = updatableBoards.indexOf(selectedItem); + selBoard = updatableBoards.findIndex((board) => + boardListItemEquals(board, selectedItem) + ); } selectOption(boardOptions[selBoard] || null); diff --git a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx index d7ba26803..3b77511d3 100644 --- a/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx @@ -104,6 +104,7 @@ export const FirmwareUploaderComponent = ({ const onItemSelect = React.useCallback( (item: BoardListItemWithBoard | null) => { if (!item) { + setSelectedItem(null); return; } const board = item.board; From 2f2b19f613ed604da6e5af4f4a1e8018190f157c Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sat, 30 Dec 2023 06:54:01 -0800 Subject: [PATCH 290/384] Bump built-in example sketches version to 1.10.1 The Arduino IDE installation includes a collection of example sketches demonstrating fundamental concepts. These examples are hosted in a dedicated repository, which is a dependency of this project. A new release has been made in that `arduino/arduino-examples` repository. The infrastructure for downloading the examples during the Arduino IDE build is hereby updated to use the latest release of the `arduino/arduino-examples` repository. --- arduino-ide-extension/scripts/download-examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index 029517d43..557c34089 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -1,7 +1,7 @@ // @ts-check // The version to use. -const version = '1.10.0'; +const version = '1.10.1'; (async () => { const os = require('node:os'); From d6de53780d1a6470f4097777d637bb8d2d5514c2 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 15 Jan 2024 13:49:18 +0100 Subject: [PATCH 291/384] chore(dev): use latest settings for auto-format From VS Code `>=1.85` Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0d8f3bbd2..e69e89f6d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,6 @@ }, "typescript.tsdk": "node_modules/typescript/lib", "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" } } From b8dd39c729d9fb4b886f3552d382f930b5aec605 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 15 Jan 2024 13:51:58 +0100 Subject: [PATCH 292/384] chore: pinned Arduino CLI `0.35.1` Closes arduino/arduino-ide#2318 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index a7bc5354e..f6f09af97 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -169,7 +169,7 @@ ], "arduino": { "arduino-cli": { - "version": "0.35.0-rc.7" + "version": "0.35.1" }, "arduino-fwuploader": { "version": "2.4.1" From 0e7b0c94863cd948a1f77f5090e0affb3fe6804f Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sun, 21 Jan 2024 08:23:27 -0800 Subject: [PATCH 293/384] Bundle native Arduino Firmware Uploader with Apple Silicon build A separate build of Arduino IDE is produced for each of the macOS host architectures: * Apple Silicon (ARM) * Intel (x86) The Arduino IDE distribution includes several bundled helper tools. The build of those tools should also be selected according to the target host architecture. At the time the infrastructure was set up for bundling the "Arduino Firmware Uploader" tool with the Arduino IDE distribution, that tool was only produced in a macOS x86 variant. So this was used even in the Apple Silicon Arduino IDE distribution, relying on Rosetta 2 to provide compatibility when used on Apple Silicon machines. Since that time, the Arduino Firmware Uploader build infrastructure has been updated to produce an Apple Silicon build of the tool and such a build is available for the IDE's current version dependency of Arduino Firmware Updater. The "Arduino Firmware Uploader" tool bundling script is hereby updated to use the most appropriate variant of the dependency for the target host architecture. This provides the following benefits * Compatibility with systems that don't have Rosetta 2 installed * Improved performance --- arduino-ide-extension/scripts/download-fwuploader.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arduino-ide-extension/scripts/download-fwuploader.js b/arduino-ide-extension/scripts/download-fwuploader.js index 99c30887a..54b527b1d 100755 --- a/arduino-ide-extension/scripts/download-fwuploader.js +++ b/arduino-ide-extension/scripts/download-fwuploader.js @@ -50,7 +50,14 @@ const suffix = (() => { switch (platform) { case 'darwin': - return 'macOS_64bit.tar.gz'; + switch (arch) { + case 'arm64': + return 'macOS_ARM64.tar.gz'; + case 'x64': + return 'macOS_64bit.tar.gz'; + default: + return undefined; + } case 'win32': return 'Windows_64bit.zip'; case 'linux': { From 763fde036cd18befd5c5db3fecbf80165206ad9d Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Fri, 26 Jan 2024 16:48:21 +0100 Subject: [PATCH 294/384] feat: disable debug widget if unsupported by board Remove the 'Add configuration...' select option from the debug widget. Closes #14 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/arduino-ide-frontend-module.ts | 9 ++- .../src/browser/contributions/debug.ts | 28 +++++++-- .../src/browser/style/debug.css | 41 +++---------- .../debug/debug-configuration-widget.tsx | 19 +++++++ .../src/browser/theia/debug/debug-widget.ts | 57 +++++++++++++++++++ 5 files changed, 115 insertions(+), 39 deletions(-) create mode 100644 arduino-ide-extension/src/browser/theia/debug/debug-widget.ts 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 f481dfc21..89b2b218d 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -180,7 +180,7 @@ import { TabBarRenderer } from './theia/core/tab-bars'; import { EditorCommandContribution } from './theia/editor/editor-command'; import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator'; import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator'; -import { Debug } from './contributions/debug'; +import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug'; import { Sketchbook } from './contributions/sketchbook'; import { DebugFrontendApplicationContribution } from './theia/debug/debug-frontend-application-contribution'; import { DebugFrontendApplicationContribution as TheiaDebugFrontendApplicationContribution } from '@theia/debug/lib/browser/debug-frontend-application-contribution'; @@ -365,7 +365,8 @@ import { AutoSelectProgrammer } from './contributions/auto-select-programmer'; import { HostedPluginSupport } from './hosted/hosted-plugin-support'; import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; import { DebugSessionManager } from './theia/debug/debug-session-manager'; -import { DebugWidget } from '@theia/debug/lib/browser/view/debug-widget'; +import { DebugWidget as TheiaDebugWidget } from '@theia/debug/lib/browser/view/debug-widget'; +import { DebugWidget } from './theia/debug/debug-widget'; import { DebugViewModel } from '@theia/debug/lib/browser/view/debug-view-model'; import { DebugSessionWidget } from '@theia/debug/lib/browser/view/debug-session-widget'; import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget'; @@ -771,6 +772,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window + bind(DebugDisabledStatusMessageSource).toService(Debug); + // Disabled the quick-pick customization from Theia when multiple formatters are available. // Use the default VS Code behavior, and pick the first one. In the IDE2, clang-format has `exclusive` selectors. bind(MonacoFormattingConflictsContribution).toSelf().inSingletonScope(); @@ -874,7 +877,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // Customized debug widget with its customized config <select> to update it programmatically. bind(WidgetFactory) .toDynamicValue(({ container }) => ({ - id: DebugWidget.ID, + id: TheiaDebugWidget.ID, createWidget: () => { const child = new Container({ defaultScope: 'Singleton' }); child.parent = container; diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index d1f205051..cc49b3809 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -64,8 +64,26 @@ interface StartDebugParams { } type StartDebugResult = boolean; +export const DebugDisabledStatusMessageSource = Symbol( + 'DebugDisabledStatusMessageSource' +); +export interface DebugDisabledStatusMessageSource { + /** + * `undefined` if debugging is enabled (for the currently selected board + programmer + config options). + * Otherwise, it's the human readable message why it's disabled. + */ + get message(): string | undefined; + /** + * Emits an event when {@link message} changes. + */ + get onDidChangeMessage(): Event<string | undefined>; +} + @injectable() -export class Debug extends SketchContribution { +export class Debug + extends SketchContribution + implements DebugDisabledStatusMessageSource +{ @inject(HostedPluginSupport) private readonly hostedPluginSupport: HostedPluginSupport; @inject(NotificationCenter) @@ -83,10 +101,10 @@ export class Debug extends SketchContribution { * If `undefined`, debugging is enabled. Otherwise, the human-readable reason why it's disabled. */ private _message?: string = noBoardSelected; // Initial pessimism. - private didChangeMessageEmitter = new Emitter<string | undefined>(); - private onDidChangeMessage = this.didChangeMessageEmitter.event; + private readonly didChangeMessageEmitter = new Emitter<string | undefined>(); + readonly onDidChangeMessage = this.didChangeMessageEmitter.event; - private get message(): string | undefined { + get message(): string | undefined { return this._message; } private set message(message: string | undefined) { @@ -349,6 +367,8 @@ export namespace Debug { } /** + * Resolves with the FQBN to use for the `debug --info --programmer p --fqbn $FQBN` command. Otherwise, rejects. + * * (non-API) */ export async function isDebugEnabled( diff --git a/arduino-ide-extension/src/browser/style/debug.css b/arduino-ide-extension/src/browser/style/debug.css index 62f2a07f9..a5a37abd9 100644 --- a/arduino-ide-extension/src/browser/style/debug.css +++ b/arduino-ide-extension/src/browser/style/debug.css @@ -1,36 +1,13 @@ -/* TODO: remove after https://github.com/eclipse-theia/theia/pull/9256/ */ - -/* To fix colors in Theia. */ -.theia-debug-hover-title.number, -.theia-debug-console-variable.number { - color: var(--theia-variable-number-variable-color); -} -.theia-debug-hover-title.boolean, -.theia-debug-console-variable.boolean { - color: var(--theia-variable-boolean-variable-color); -} -.theia-debug-hover-title.string, -.theia-debug-console-variable.string { - color: var(--theia-variable-string-variable-color); +/* Naive way of hiding the debug widget when the debug functionality is disabled https://github.com/arduino/arduino-ide/issues/14 */ +.theia-debug-container .debug-toolbar.hidden, +.theia-debug-container .theia-session-container.hidden { + visibility: hidden; } -/* To unset the default debug hover dimension. */ -.theia-debug-hover { - min-width: unset; - min-height: unset; - width: unset; - height: unset; -} - -/* To adjust the left padding in the hover title. */ -.theia-debug-hover-title { - padding-left: 5px; -} +.theia-debug-container .status-message { + font-family: "Open Sans"; + font-style: normal; + font-size: 12px; -/* Use the default Theia dimensions only iff the expression is complex (`!!expression.hasChildren~) */ -.theia-debug-hover.complex-value { - min-width: 324px; - min-height: 324px; - width: 324px; - height: 324px; + padding: 10px; } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx index 7d05a4b68..cabaabf39 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx +++ b/arduino-ide-extension/src/browser/theia/debug/debug-configuration-widget.tsx @@ -1,3 +1,4 @@ +import { SelectOption } from '@theia/core/lib/browser/widgets/select-component'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { nls } from '@theia/core/lib/common/nls'; import { injectable } from '@theia/core/shared/inversify'; @@ -51,6 +52,24 @@ class DebugConfigurationSelect extends TheiaDebugConfigurationSelect { ); } + protected override renderOptions(): SelectOption[] { + const options = super.renderOptions(); + const addConfiguration = options[options.length - 1]; + const separator = options[options.length - 2]; + // Remove "Add configuration..." and the preceding separator options. + // They're expected to be the last two items. + if ( + addConfiguration.value === + TheiaDebugConfigurationSelect.ADD_CONFIGURATION && + separator.separator + ) { + options.splice(options.length - 2, 2); + return options; + } + // Something is unexpected with the select options. + return options; + } + override componentWillUnmount(): void { this.toDisposeOnUnmount.dispose(); } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts b/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts new file mode 100644 index 000000000..cca4d1b06 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts @@ -0,0 +1,57 @@ +import { + codicon, + PanelLayout, + Widget, +} from '@theia/core/lib/browser/widgets/widget'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { DebugWidget as TheiaDebugWidget } from '@theia/debug/lib/browser/view/debug-widget'; +import { DebugDisabledStatusMessageSource } from '../../contributions/debug'; + +@injectable() +export class DebugWidget extends TheiaDebugWidget { + @inject(DebugDisabledStatusMessageSource) + private readonly debugStatusMessageSource: DebugDisabledStatusMessageSource; + + private readonly statusMessageWidget = new Widget(); + private readonly messageNode = document.createElement('div'); + + @postConstruct() + protected override init(): void { + super.init(); + this.messageNode.classList.add('status-message', 'noselect'); + this.statusMessageWidget.node.appendChild(this.messageNode); + this.updateState(); + this.toDisposeOnDetach.pushAll([ + this.debugStatusMessageSource.onDidChangeMessage((message) => + this.updateState(message) + ), + this.statusMessageWidget, + ]); + } + + private updateState(message = this.debugStatusMessageSource.message): void { + requestAnimationFrame(() => { + this.messageNode.textContent = message ?? ''; + const enabled = !message; + updateVisibility(enabled, this.toolbar, this.sessionWidget); + if (this.layout instanceof PanelLayout) { + if (enabled) { + this.layout.removeWidget(this.statusMessageWidget); + } else { + this.layout.insertWidget(0, this.statusMessageWidget); + } + } + this.title.iconClass = enabled ? codicon('debug-alt') : 'fa fa-ban'; // TODO: find a better icon? + }); + } +} + +function updateVisibility(visible: boolean, ...widgets: Widget[]): void { + widgets.forEach((widget) => + visible ? widget.removeClass('hidden') : widget.addClass('hidden') + ); +} From dda77701054e748f07d99e191eefb67b60239d5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 02:09:36 +0000 Subject: [PATCH 295/384] Updated translation files --- i18n/af.json | 6 + i18n/ar.json | 22 +- i18n/az.json | 6 + i18n/bg.json | 6 + i18n/ca_ES.json | 6 + i18n/cs.json | 6 + i18n/de.json | 66 ++-- i18n/el.json | 494 ++++++++++++++-------------- i18n/es.json | 32 +- i18n/eu.json | 6 + i18n/fa.json | 200 ++++++------ i18n/fil.json | 6 + i18n/fr.json | 6 + i18n/he.json | 6 + i18n/hu.json | 6 + i18n/id.json | 6 + i18n/it.json | 6 + i18n/ja.json | 6 + i18n/ko.json | 16 +- i18n/my_MM.json | 6 + i18n/ne.json | 798 +++++++++++++++++++++++----------------------- i18n/nl.json | 174 +++++----- i18n/pl.json | 6 + i18n/pt.json | 8 +- i18n/ro.json | 6 + i18n/ru.json | 6 + i18n/sr.json | 6 + i18n/th.json | 6 + i18n/tr.json | 6 + i18n/uk.json | 672 +++++++++++++++++++------------------- i18n/vi.json | 6 + i18n/zh-Hant.json | 26 +- i18n/zh.json | 30 +- i18n/zh_TW.json | 104 +++--- 34 files changed, 1486 insertions(+), 1282 deletions(-) diff --git a/i18n/af.json b/i18n/af.json index ed2081552..599088bc6 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -139,6 +139,7 @@ "installManually": "Install Manually", "later": "Later", "noBoardSelected": "Geen bord geselekteer", + "noSketchOpened": "No sketch opened", "notConnected": "[nie gekoppel]", "offlineIndicator": "Dit lyk of jy van af lyn is. Sonder 'n internetverbinding kan die Arduino CLI moontlik nie die nodige hulpbronne aflaai nie en kan dit wanfunksionering veroorsaak. Koppel asseblief aan die internet en herbegin die toepassing.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Verwerking", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "aan {0}", "serialMonitor": "Seriaal Monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Ontfouting {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is nie geïnstalleer vir ' {0} '", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Skets", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/ar.json b/i18n/ar.json index 8b41c6b36..bf072b1f6 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -18,7 +18,7 @@ "configDialog1": "اختر لوحة و منفذ معا اذا اردت ان ترفع السكتش", "configDialog2": "اذا قمت باختيار لوحة فقط ستسطيع ان تترجم لكن بدون ان ترفع المشروع", "couldNotFindPreviouslySelected": "تعذر ايجاد اللوحة '{0}' المختارة مسبقا في المنصة المثبتة '{1}' . الرجاء اعادة اختيار اللوحة التي تريد استعمالها يدويا . هل تريد باعادة الاختيار الان؟", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "تعديل اللوحة و المنفذ", "getBoardInfo": "الحصول على معلومات اللوحة", "inSketchbook": "(داخل ملف المشاريع)", "installNow": "نواة \"{0} {1}\" يجب تثبيتها للوحة \"{2}\" التي تم اختيارها . هل تريد تثبيتها الان ؟", @@ -32,7 +32,7 @@ "ports": "منافذ", "programmer": "المبرمجة", "reselectLater": "اعد الاختيار لاحقا", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "استخدم '{0}' تعامل مع '{1}'", "searchBoard": "أبحث عن متحكم", "selectBoard": "اختر لوحة", "selectPortForInfo": "الرجاء اختيار منفذ من اجل الحصول على معلومات اللوحة", @@ -41,7 +41,7 @@ "succesfullyInstalledPlatform": "تم تثبيت المنصة {0}:{1} بنجاح", "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح", "typeOfPorts": "المنافذ {0}", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "اللوحة غير مدعومة", "unknownBoard": "لوحة غير معروفة" }, "boardsManager": "مدير اللوحة", @@ -139,6 +139,7 @@ "installManually": "ثبّت يدويا", "later": "لاحقا", "noBoardSelected": "لم يتم اختيار اي لوحة", + "noSketchOpened": "No sketch opened", "notConnected": "[غير متصل]", "offlineIndicator": "انت غير متصل بالانترنت على الارجح , بدون الاتصال بالانترنت لن تستطيع واجهة سطر الاوامر الخاصة بالاردوينو \"Arduino CLI\" تحميل الموارد المطلوبة و من الممكن ان تسبب باخطاء , الرجاء الاتصال بالانترنت و اعادة تشغيل البرنامج", "oldFormat": "ال '{0}' ما زالت تستخدم صيغة `.pde` القديمة . هل تريد الانتقال الى صيغة `.ino`  الجديدة ؟", @@ -146,6 +147,7 @@ "processing": "تتم المعالجة", "recommended": "يُنصح به", "retired": "متقاعد", + "selectManually": "Select Manually", "selectedOn": "{0} شغّل", "serialMonitor": "مراقب المنفذ التسلسلي \"سيريال بورت\"\n ", "type": "النوع", @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "تصحيح برمجي - {0}", "debuggingNotSupported": "'{0}' لا يقبل التصحيح البرمجي", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "المنصة غير مثبتة ل '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي", "sketchIsNotCompiled": "المشروع '{0}' يجب ان يتم التحقق منه قبل بدء جلسة تصحيح الاخطاء . الرجاء التحقق من المشروع و اعادة تشغيل مصحح الاخطاء مرة اخرى .\nهل تريد التحقق من المشروع الان؟" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "أمسح سجل قائمة اللوحة", + "clearBoardsConfig": "إزالة تحديد المنفذ و اللوحة المحددة", + "dumpBoardList": "تفريغ قائمة اللوحة" }, "dialog": { "dontAskAgain": "لا تسأل مرة اخرى" @@ -250,7 +254,7 @@ "selectBoard": "اختر لوحة", "selectVersion": "اختر نسخة البرامج الثابتة", "successfullyInstalled": "تم تثبيت البرامج الثابتة بنجاح", - "updater": "Firmware Updater" + "updater": "تحديث البرنامج" }, "help": { "environment": "البيئة", @@ -385,7 +389,7 @@ "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}\"." + "dockPanel": "منطقة التطبيق هي _{0}_ حيث سيتم وضع عنصر واجهة المستخدم. إنها إما \"أسفل\" أو \"يمين\". الأفتراضي هو \"{1}\"" }, "network": "شبكة", "newSketchbookLocation": "اختر مكان المشروع الجديد", @@ -460,6 +464,8 @@ "saveSketchAs": "حفظ ملف المشروع باسم ...", "showFolder": "اعرض ملف المشروع", "sketch": "مشروع", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "مجلد المشاريع", "titleLocalSketchbook": "مجلد المشاريع المحلي", "titleSketchbook": "مجلد المشاريع", diff --git a/i18n/az.json b/i18n/az.json index acf39a361..6ad56476a 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -139,6 +139,7 @@ "installManually": "Əl ilə yüklə", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Processing", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "noProgrammerSelectedFor": "No programmer selected 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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/bg.json b/i18n/bg.json index a03b75b4c..0a10a6b33 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -139,6 +139,7 @@ "installManually": "Инсталирай ръчно", "later": "По-късно", "noBoardSelected": "Не е избрана платка", + "noSketchOpened": "No sketch opened", "notConnected": "[няма връзка]", "offlineIndicator": "Изглежда, че сте офлайн. Без интернет връзка, Arduino CLI може да не успее да изтегли необходимите ресурси и може да причини неизправност. Моля, свържете се с интернет и рестартирайте приложението.", "oldFormat": "„{0}“ все още използва стария формат .pde. Искате ли да преминете към новото разширение `.ino`?", @@ -146,6 +147,7 @@ "processing": "Обработва се", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "на {0}", "serialMonitor": "Сериен Монитор", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Отстраняване на грешки - {0}", "debuggingNotSupported": "Отстраняването на грешки не се поддържа от „{0}“", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформата не е инсталирана за „{0}“", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Запазете папката със скици като...", "showFolder": "Показване на папка за скици", "sketch": "Скица", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Скицник", "titleLocalSketchbook": "Локален скицник", "titleSketchbook": "Скицник", diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 53d1b8089..5d0d7dabf 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -139,6 +139,7 @@ "installManually": "Instal·la manualment", "later": "Més tard", "noBoardSelected": "No s'ha seleccionat cap placa", + "noSketchOpened": "No sketch opened", "notConnected": "[no connectat]", "offlineIndicator": "Sembla que estàs fora de línia. Sense connexió a Internet, és possible que l'Arduino CLI no pugui descarregar els recursos necessaris i podria provocar un mal funcionament. Connecteu-vos a Internet i reinicieu l'aplicació.", "oldFormat": "El \"{0}\" encara utilitza l'antic format \".pde\". Voleu canviar a la nova extensió \".ino\"?", @@ -146,6 +147,7 @@ "processing": "Processant", "recommended": "Recomanat", "retired": "Retirat", + "selectManually": "Select Manually", "selectedOn": "sobre {0}", "serialMonitor": "Monitor sèrie", "type": "Tipus", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Depuració - {0}", "debuggingNotSupported": "La depuració no és compatible amb '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "La plataforma no està instal·lada per a '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Desa la carpeta del programa com a...", "showFolder": "Mostra la carpeta del programa", "sketch": "Programa", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Quadern de programes", "titleLocalSketchbook": "Quadern de programes local", "titleSketchbook": "Quadern de programes", diff --git a/i18n/cs.json b/i18n/cs.json index 1e08e82aa..4af815f13 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -139,6 +139,7 @@ "installManually": "Instalovat ručně", "later": "Později", "noBoardSelected": "Nebyla zvolena deska", + "noSketchOpened": "No sketch opened", "notConnected": "[nepřipojen]", "offlineIndicator": "Nejspíše nejste online. Bez Internetového připojení nebude Arduino CLI schopno stáhnout potřebné zdroje a toto může způsobit chybu. Prosím připojte se k Internetu a restartujte aplikaci.", "oldFormat": "{0}používá stále starý formát `.pde`. Chcete ho převést na soubor s příponou `.ino`?", @@ -146,6 +147,7 @@ "processing": "Zpracovávám", "recommended": "Doporučené", "retired": "Zastaralý", + "selectManually": "Select Manually", "selectedOn": "zapnuto{0}", "serialMonitor": "Seriový monitor", "type": "typ", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging není podporován s '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma není nainstalována pro '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Uložit složku sketche jako...", "showFolder": "Zobrazit složku sketche", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Projekty", "titleLocalSketchbook": "Složka lokálních projektů", "titleSketchbook": "Projekty", diff --git a/i18n/de.json b/i18n/de.json index 9bdcddaa7..6b5163050 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -12,13 +12,13 @@ }, "board": { "board": "Board{0}", - "boardConfigDialogTitle": "Anderes Boards und Ports wählen", + "boardConfigDialogTitle": "Andere Boards und Ports wählen", "boardInfo": "Board-Informationen", "boards": "Boards", "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?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Board und Port ändern...", "getBoardInfo": "Board-Informationen abrufen", "inSketchbook": "(im Sketchbook)", "installNow": "Der \"{0} {1}\" Core muss für das ausgewählte \"{2}\" Board installiert werden. Jetzt installieren?", @@ -32,7 +32,7 @@ "ports": "Ports", "programmer": "Programmer", "reselectLater": "Später auswählen", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "Verwende {0} an {1}", "searchBoard": "Board suchen", "selectBoard": "Board wählen", "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", @@ -41,7 +41,7 @@ "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", "typeOfPorts": "{0} Ports", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "Board nicht bestätigt", "unknownBoard": "Unbekanntes Board" }, "boardsManager": "Board-Verwaltung", @@ -102,16 +102,16 @@ "offline": "Offline", "openInCloudEditor": "Im Cloud Editor öffnen", "options": "Optionen ...", - "privateVisibility": "Private. Nur du siehst diesen Sketch.", + "privateVisibility": "Privat. Nur du siehst diesen Sketch.", "profilePicture": "Profilbild", - "publicVisibility": "Public. Jeder kann mit diesen Link den Sketch sehen.", + "publicVisibility": "Öffentlich - Jeder kann mit diesen Link den Sketch sehen.", "pull": "Pull", "pullFirst": "Du musst zuerst herunterladen, damit du in die Cloud schieben kannst.", "pullSketch": "Pull Sketch", "pullSketchMsg": "Wenn du diesen Sketch aus der Cloud lädst, wird die lokale Version überschrieben. Möchtest du fortfahren?", "push": "Push", "pushSketch": "Push Sketch", - "pushSketchMsg": "Das ist ein öffentliches Sketch. Vor dem Pushen solltest du überprüfen, ob alle sensiblen Informationen in arduino_secrets.h definiert sind. Du kannst einen Sketch mit dem Teilen-Feld privat machen.", + "pushSketchMsg": "Das ist ein öffentlicher Sketch. Vor dem Pushen solltest du überprüfen, ob alle sensiblen Informationen in arduino_secrets.h definiert sind. Du kannst einen Sketch mit dem Teilen-Feld als privat definieren.", "remote": "Remote", "share": "Teilen....", "shareSketch": "Sketch teilen", @@ -139,6 +139,7 @@ "installManually": "Manuell installieren", "later": "später", "noBoardSelected": "Kein Board ausgewählt", + "noSketchOpened": "No sketch opened", "notConnected": "[keine Verbindung]", "offlineIndicator": "Anscheinend bist du offline. Ohne eine aktive Internetverbindung kann das Arduino CLI nicht die nötigen Ressourcen herunterladen, was zu Problemen führen kann. Bitte überprüfe deine Internetverbindung und starte das Programm neu. ", "oldFormat": "Der Sketch '{0}' verwendet noch das alte '.pde' Format. Möchtest du auf die neuere '.ino' Endung wechseln?", @@ -146,6 +147,7 @@ "processing": "Verarbeiten", "recommended": "Empfohlen", "retired": "Zurückgezogen", + "selectManually": "Select Manually", "selectedOn": "an {0}", "serialMonitor": "Serieller Monitor", "type": "Typ", @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "'{0}' unterstützt kein Debuggen", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Die Platform für '{0}' ist nicht instaliert.", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "Für Debugging optimieren", "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" + "clearBoardList": "Board-Tabellen-Historie leeren", + "clearBoardsConfig": "Board- und Portauswahl aufheben", + "dumpBoardList": "Board-Tabelle löschen" }, "dialog": { "dontAskAgain": "Nicht noch einmal fragen" @@ -267,18 +271,18 @@ "ide-updater": { "checkForUpdates": "Nach Arduino IDE Updates suchen", "closeAndInstallButton": "Schließen und Installieren", - "closeToInstallNotice": "Schließe die Software und installiere das Update auf deinem Computer", + "closeToInstallNotice": "Beende die Software und installiere das Update auf deinem Computer", "downloadButton": "Download", "downloadingNotice": "Die neueste Version der Arduino IDE wird heruntergeladen", "errorCheckingForUpdates": "Fehler bei der Suche nach IDE Updates{0}", - "goToDownloadButton": "Zum Download Wechseln", - "goToDownloadPage": "Eine Update für die Arduino IDE ist verfügbar, konnte aber nicht automatisch heruntergeladen und installiert werden. Bitte gehen sie zur Download-Seite und laden sie dort die neueste Version herunter", + "goToDownloadButton": "Zum Download wechseln", + "goToDownloadPage": "Ein Update für die Arduino IDE ist verfügbar, konnte aber nicht automatisch heruntergeladen und installiert werden. Bitte gehen sie zur Download-Seite und laden sie dort die neueste Version herunter ", "ideUpdaterDialog": "Software Update", "newVersionAvailable": "Eine neue Version der Arduino IDE ({0}) ist zum Download verfügbar", "noUpdatesAvailable": "Es gibt keine neuen Updates für die Arduino IDE", "notNowButton": "Später", - "skipVersionButton": "Version Überspringen", - "updateAvailable": "Update Verfügbar", + "skipVersionButton": "Version überspringen", + "updateAvailable": "Update verfügbar", "versionDownloaded": "Arduino IDE {0} wurde heruntergeladen" }, "installable": { @@ -292,8 +296,8 @@ "include": "Bibliothek einbinden", "installAll": "Alle installieren", "installLibraryDependencies": "Bibliotheksabhängigkeiten installieren", - "installMissingDependencies": "Möchten Sie alle fehlenden Ressourcen installieren?", - "installOneMissingDependency": "Möchten Sie die fehlende Ressource installieren?", + "installMissingDependencies": "Möchtest Du die fehlenden Abhängigkeiten installieren?", + "installOneMissingDependency": "Möchtest Du die fehlende Abhängigkeit installieren?", "installWithoutDependencies": "Ohne Abhängigkeiten installieren", "installedSuccessfully": "Bibliothek {0}:{1} erfolgreich installiert", "libraryAlreadyExists": "Eine Bibliothek existiert bereits. Möchten sie diese überschreiben?", @@ -350,7 +354,7 @@ }, "preferences": { "additionalManagerURLs": "Zusätzliche Boardverwalter-URLs", - "auth.audience": "Das The OAuth2 Audience.", + "auth.audience": "Die OAuth2 Audience", "auth.clientID": "Die OAuth2 client ID.", "auth.domain": "Die OAuth2 Domain.", "auth.registerUri": "Das URI hat einen neuen Benutzer registriert.", @@ -381,11 +385,11 @@ "invalid.editorFontSize": "Ungültige Editor-Schriftgröße. Wert muss eine Ganzzahl größer 0 (Null) sein.", "invalid.sketchbook.location": "Ungültiger Sketchbook Speicherort: {0}", "invalid.theme": "Ungültiges Erscheinungsbild", - "language.log": "Wenn aktivert, werden Arduino-Sprach-Server-Logdateien in den Sketch-Ordner geschrieben. Standardgemäß deaktivert.", + "language.log": "Wenn aktivert, werden Arduino-Sprach-Server-Logdateien in den Sketch-Ordner geschrieben. Standardmäßig 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}\"." + "dockPanel": "Der Bereich der Applikations-Shell wo das {0}-Widget angezeigt werden soll. Entweder \"unten\" oder \"rechts\". Standardmäßig \"{1}\"." }, "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", @@ -402,15 +406,15 @@ "inoBlueprint": "Absoluter Dateipfad zur Standard-'.ino'-Dateivorlage. Wenn angegeben, wird der Inhalt der Dateivorlage für jeden, mit der IDE erstellten, Sketch verwendet. Wenn nicht angegeben, werden die Sketches mit dem Standard-Arduino-Inhalt erstellt. Unauffindbare Dateivorlagen werden ignoriert. **Ein Neustarten der IDE ist erforderlich**, um diese Einstellung zu übernehmen." }, "sketchbook.location": "Dateipfad des Sketchbooks", - "sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardgemäß deaktiviert. ", - "survey.notification": "Wenn aktiviert, werden Nutzer benachrichtigt, wenn eine Umfrage verfügbar ist. Standardgemäß aktiviert.", + "sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardmäßig deaktiviert. ", + "survey.notification": "Wenn aktiviert, werden Nutzer benachrichtigt, wenn eine Umfrage verfügbar ist. Standardmäßig aktiviert.", "unofficialBoardSupport": "Klicke hier für eine Liste von inoffiziell unterstützten Boards", "upload": "Hochladen", - "upload.verbose": "Wenn aktiviert, werden ausführliche Compiler-Meldungen angezeigt. Standardgemäß deaktiviert.", + "upload.verbose": "Wenn aktiviert, werden ausführliche Compiler-Meldungen angezeigt. Standardmäßig deaktiviert.", "verifyAfterUpload": "Code nach Hochladen überprüfen ", "window.autoScale": "Wenn aktiviert: Benutzeroberfläche soll mit Schriftgröße skalieren.", "window.zoomLevel": { - "deprecationMessage": "Veraltet. Bitte 'window.zommLevel' stattdessen benutzen." + "deprecationMessage": "Veraltet. Bitte 'window.zoomLevel' stattdessen benutzen." } }, "renameCloudSketch": { @@ -447,19 +451,21 @@ "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...", + "moving": "Verschieben", "movingMsg": "Die Datei \"{0}\" muss sich in einen Sketch Ordner \"{1}\" befinden.\nOrdner erstellen, Datei verschieben und fortfahren?", - "new": "Neu", + "new": "Neuer Sketch", "noTrailingPeriod": "Ein Dateiname kann nicht mit einem Punkt enden", "openFolder": "Ordner öffnen", "openRecent": "Zuletzt geöffnet", "openSketchInNewWindow": "Sketch in neuen Fenster öffnen", "reservedFilename": "'{0}' ist ein reservierter Dateiname.", "saveFolderAs": "Sketch Ordner speichern als...", - "saveSketch": "Sketch speichern und später wieder öffnen", + "saveSketch": "Sketch für spätere Verwendung speichern", "saveSketchAs": "Sketch Ordner speichern als...", "showFolder": "Zeige Sketch Ordner", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Lokales Sketchbook", "titleSketchbook": "Sketchbook", @@ -509,7 +515,7 @@ "abortFixTitle": "Ungültiger Sketch", "renameSketchFileMessage": "Die Sketch-Datei '{0}' kann nicht verwendet werden. {1} Soll die Sketch-Datei jetzt umbenannt werden?", "renameSketchFileTitle": "Ungültiger Sketch-Dateiname", - "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Nachricht loszuwerden, muss der Sketch umbenannt werden. Wollen Sie den Sketch jetzt umbenennen?", + "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Meldung loszuwerden, muss der Sketch umbenannt werden. Wollen Sie den Sketch jetzt umbenennen?", "renameSketchFolderTitle": "Ungültiger Sketch-Name" }, "workspace": { @@ -534,8 +540,8 @@ "expand": "Ausklappen" }, "workspace": { - "deleteCloudSketch": "Der Cloud-Sketch '{0}' wird dauerhaft vpn den Arduino-Servern und den lokalen Caches gelöscht. Diese Aktion ist nicht umkehrbar. Wollen Sie den aktuellen Sketch löschen?", - "deleteCurrentSketch": "Der Sketch '{0}' wird dauerhaft gelöscht. Diese Aktion ist nicht umkehrbar. Wollen Sie den aktuellen Sketch löschen?", + "deleteCloudSketch": "Der Cloud-Sketch '{0}' wird dauerhaft von den Arduino-Servern und den lokalen Caches gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest Du den aktuellen Sketch löschen?", + "deleteCurrentSketch": "Der Sketch {0} wird dauerhaft gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest Du den aktuellen Sketch löschen?", "fileNewName": "Name für die neue Datei", "invalidExtension": "\".{0}\" ist keine gültige Dateierweiterung.", "newFileName": "Neuer Name für die Datei" diff --git a/i18n/el.json b/i18n/el.json index 538e76385..aec883d22 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -1,284 +1,288 @@ { "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", + "goToCloudEditor": "Μεταβείτε στο Cloud Editor", + "goToIoTCloud": "Μεταβείτε στο IoT Cloud", + "goToProfile": "Πήγαινε στο προφίλ", "menuTitle": "Arduino Cloud" }, "board": { "board": "Πλακέτα{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Επιλέξτε Άλλη Πλακέτα & Θύρα", "boardInfo": "Πληροφορίες Πλακέτας", - "boards": "boards", + "boards": "Πίνακες - Πλακέτες", "configDialog1": "Επίλεξε και Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα σχέδιο.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", + "configDialog2": "Αν επιλέξεις μονο Πλακέτα θα μπορείς να κάνεις μόνο μεταγγλώτιση, αλλά οχι να ανεβάσεις το σχέδιο.", "couldNotFindPreviouslySelected": "Δεν έγινε εντοπισμός της προηγουμένως επιλεγμένης πλακέτας '{0}' στην εγκατεστημένη πλατφόρμα '{1}'. Παρακαλώ επίλεξε πάλι χειροκίνητα την πλακέτα που θέλεις να χρησιμοποιήσεις. Θέλεις να την επιλέξεις τώρα;", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Πλακέτα και θύρα...", "getBoardInfo": "Εμφάνιση Πληροφοριών Πλακέτας", "inSketchbook": "(στα Σχέδια)", "installNow": "Ο πυρήνας \"{0} {1}\" πρέπει να εγκατασταθεί για την επιλεγμένη πλακέτα {2}. Θέλεις να την εγκαταστήσεις τώρα;", - "noBoardsFound": "No boards found for \"{0}\"", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "nonSerialPort": "Non-serial port, can't obtain info.", + "noBoardsFound": "Δεν βρέθηκαν πλακέτες για \" {0}\"", + "noNativeSerialPort": "Δεν είναι δυνατή η λήψη πληροφοριών μέσω της ενσωματωμένης σειριακής θύρας", + "noPortsDiscovered": "Δεν βρέθηκαν Θύρες", + "nonSerialPort": "Μη σειριακή θύρα, δεν είναι δυνατή η λήψη πληροφοριών.", "openBoardsConfig": "Επιλογή διαφορετικής πλακέτας και θύρας...", "pleasePickBoard": "Πσρακαλώ επίλεξε μια πλακέτα που συνδέθηκε στην θύρα που έχεις επιλέξει.", "port": "Θύρα{0}", - "ports": "ports", + "ports": "Θύρες", "programmer": "Προγραμματιστής", "reselectLater": "Επιλογή αργότερα", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", - "searchBoard": "Search board", + "searchBoard": "Αναζήτηση πλακέτας", "selectBoard": "Επιλογή Πλακέτας", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", "showAllAvailablePorts": "Εμφανίζει όλες τις διαθέσιμες θύρες όταν είναι ενεργοποιημένο.", - "showAllPorts": "Show all ports", + "showAllPorts": "Εμφάνιση όλων των θυρών", "succesfullyInstalledPlatform": "Επιτυχής εγκατάσταση πλατφόρμας {0}:{1}", "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}", - "typeOfPorts": "{0} ports", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" + "typeOfPorts": "{0}Θύρες", + "unconfirmedBoard": "Μη επιβεβαιωμένη πλακέτα", + "unknownBoard": "Άγνωστη πλακέτα" }, "boardsManager": "Διαχειριστής Πλακετών", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Πιστοποίηση Arduino" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "Εγγραφή Bootloader", + "burningBootloader": "Εγγραφή bootloader...", + "doneBurningBootloader": "Ολοκληρώθηκε η εγγραφή του bootloader." }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "Σφάλμα κατά την εγγραφή του bootloader:{0}" }, "certificate": { "addNew": "Προσθήκη Νέου", - "addURL": "Add URL to fetch SSL certificate", + "addURL": "Προσθήκη διεύθυνσης URL για λήψη πιστοποιητικού SSL", "boardAtPort": "{0} στο {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", + "certificatesUploaded": "Τα πιστοποιητικά φορτώθηκαν.", + "enterURL": "Εισαγάγετε τη διεύθυνση URL", + "noSupportedBoardConnected": "Δεν έχει συνδεθεί υποστηριζόμενη πλακέτα", + "openContext": "Ανοιχτό πλαίσιο", "remove": "Αφαίρεση", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", + "selectBoard": "Επιλογή Πλακέτας", + "selectCertificateToUpload": "1. Επιλέξτε πιστοποιητικό για φόρτωση", + "selectDestinationBoardToUpload": "2. Επιλέξτε πλακέτα προορισμού και φορτώστε το πιστοποιητικό", "upload": "Ανέβασμα", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "uploadFailed": "Η φόρτωση απέτυχε. Παρακαλώ προσπαθήστε ξανά.", + "uploadRootCertificates": "Φορτώστε τα πιστοποιητικά SSL Root", + "uploadingCertificates": "Ανέβασμα πιστοποιητικών." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Ελέγξτε το Arduino για ενημερώσεις ", + "installAll": "Εγκατάσταση όλων", + "noUpdates": "Δεν υπάρχουν διαθέσιμες πρόσφατες ενημερώσεις.", + "promptUpdateBoards": "Διατίθενται ενημερώσεις για ορισμένες από τις πλακέτες", + "promptUpdateLibraries": "Υπάρχουν διαθέσιμες ενημερώσεις για ορισμένες από τις βιβλιοθήκες σας.", + "updatingBoards": "Ενημέρωση πλακετών...", + "updatingLibraries": "Ενημέρωση βιβλιοθηκών..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "Το \"πληκτρολόγιο\" δεν βρέθηκε. Το σχέδιό σας περιλαμβάνει τη γραμμή '#include <Keyboard.h>';", + "mouseError": "Το 'Ποντίκι' δεν βρέθηκε. Περιλαμβάνει το σχέδιό σας τη γραμμή '#include <Mouse.h>'; " }, "cloud": { "chooseSketchVisibility": "Επίλεξε την ορατότητα του Σχεδίου σου:", "cloudSketchbook": "Σχέδια Cloud", "connected": "Συνδέθηκε", "continue": "Συνέχεια", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "Τελείωσε το κατέβασμα '{0}'.", + "donePushing": "Τελείωσε το ανέβασμα '{0}'.", "embed": "Ενσωμάτωση:", "emptySketchbook": "Τα Σχέδια σου είναι άδεια.", - "goToCloud": "Go to Cloud", + "goToCloud": "Μεταβείτε στο Cloud", "learnMore": "Μάθε περισσότερα", "link": "Σύνδεσμος:", - "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", + "notYetPulled": "Δεν είναι δυνατή η προώθηση στο Cloud. Δεν έχει κατέβει ακόμα.", "offline": "Εκτός Σύνδεσης", "openInCloudEditor": "Άνοιγμα σε Συντάκτη Cloud", "options": "Επιλογές...", "privateVisibility": "Ιδιωτικό. Μόνο εσύ μπορείς να δεις το Σχέδιο.", "profilePicture": "Εικόνα προφίλ", "publicVisibility": "Δημόσιο. Οποιόσδηποτε με το σύνδεσμο μπορεί να δει το Σχέδιο.", - "pull": "Pull", - "pullFirst": "You have to pull first to be able to push to the Cloud.", - "pullSketch": "Pull Sketch", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", + "pull": "Τραβήξτε", + "pullFirst": "Πρώτα πρέπει να τραβήξετε για να μπορέσετε να το ανεβάσετε στο Cloud.", + "pullSketch": "Τραβήξτε το σχέδιο", + "pullSketchMsg": "Αν τραβήξετε αυτό το Σχέδιο από το Cloud, θα αντικατασταθεί η τοπική του έκδοση. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", "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.", + "pushSketchMsg": "Αυτό είναι ένα Δημόσιο Σχέδιο. Βεβαιωθείτε ότι οποιεσδήποτε ευαίσθητες πληροφορίες έχουν οριστεί στο φάκελο arduino_secrets.h. Μπορείτε να κάνετε ένα Σχέδιο ιδιωτικό από τον πίνακα Κοινή χρήση.", "remote": "Απομακρυνσμένο", "share": "Κοινοποίηση...", "shareSketch": "Κοινοποίηση Σχεδίου", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Εμφάνιση/Απόκρυψη του βιβλίου σχεδίων του Cloud", "signIn": "ΣΥΥΝΔΕΣΗ", "signInToCloud": "Σύνδεση στο Arduino Cloud", "signOut": "Αποσύνδεση", - "sync": "Sync", + "sync": "Συγχρονισμός", "syncEditSketches": "Συγχρονισμός και τροποποίηση των Arduino Cloud Σχεδίων σου.", "visitArduinoCloud": "Επισκέψου το Arduino Cloud για δημιουργία Σχεδίων Cloud." }, "cloudSketch": { - "alreadyExists": "Cloud sketch '{0}' already exists.", - "creating": "Creating cloud sketch '{0}'...", - "new": "New Cloud Sketch", + "alreadyExists": "Υπάρχει ήδη το σχέδιο '{0}' στο Cloud ", + "creating": "Δημιουργία σχεδίου στο cloud '{0}'...", + "new": "Νέο σχέδιο Cloud ", "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}'...", + "renaming": "Μετονομασία σχεδίου cloud από '{0}' σε '{1}'...", "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { - "all": "All", + "all": "Όλα", "contributed": "Contributed", "installManually": "Χειροκίνητη Εγκατάσταση", "later": "Αργότερα", "noBoardSelected": "Δεν έχει επιλεχθεί πλακέτα", + "noSketchOpened": "No sketch opened", "notConnected": "[μη συνδεμένο]", "offlineIndicator": "Φαίνεται πως είστε εκτός σύνδεσης. Χωρίς σύνδεση στο Internet, το Arduino CLI ίσως να μη μπορεί να κάνει λήψη των απαιτούμενων πόρων και να υπάρξει δυσλειτουργία. Παρακαλώ συνδεθείτε στο Internet και επανεκκινήστε την εφαρμογή.", "oldFormat": "Το '{0}' χρησιμοποιεί ακόμα το παλιό '.pde' στυλ. Θέλετε να αλλάξετε στην νέα κατάληξη '.ino';", "partner": "Partner", "processing": "Επεξεργασία", "recommended": "Recommended", - "retired": "Retired", + "retired": "Παλιό ", + "selectManually": "Επιλέξτε Χειροκίνητα", "selectedOn": "στο {0}", "serialMonitor": "Παρακολούθηση Σειριακής", - "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}", - "filterSearch": "Filter your search...", + "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": "Do you want to uninstall {0}?", - "update": "Update" + "uninstallMsg": "Θέλετε να απεγκαταστήσετε το {0};", + "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": "Η σύνδεση χάθηκε. Οι ενέργειες και οι ενημερώσεις σχεδίων στο cloud δεν θα είναι διαθέσιμες." }, "contributions": { "addFile": "Προσθήκη αρχείου", "fileAdded": "Ένα αρχείο προστέθηκε στον κώδικα.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "Δεν ήταν δυνατό το άνοιγμα του σειριακού plotter" }, "replaceTitle": "Αντικατάσταση" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "Όλα ", + "default": "Προκαθορισμένο", + "more": "Περισσότερα ", + "none": "Κανένας" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Αντιγραφή μηνυμάτων σφάλματος", + "noBoardSelected": "Δεν έχει επιλεγεί πίνακας. Επιλέξτε την πλακέτα Arduino από το μενού Εργαλεία > Πίνακας" }, "createCloudCopy": "Push Sketch to Cloud", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", + "restart": "Επανεκκινήστε το Daemon", + "start": "Ξεκινήστε το Daemon", "stop": "Stop Daemon" }, "debug": { "debugWithMessage": "Αποσφαλμάτωση - {0}", "debuggingNotSupported": "Δεν υποστιρίζεται αποσφαλμάτωση από '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Δεν έχει εγκατασταθεί πλατφόρμα για '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, "developer": { "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", + "clearBoardsConfig": "Διαγράψτε την επιλογή πλακέτας και θύρας", "dumpBoardList": "Dump the Board List" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "Μην με ξαναρωτήσεις" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "autoFormat": "Αυτόματο Format", + "commentUncomment": "Σχόλιο/Μη σχολιασμός", + "copyForForum": "Αντιγραφή για φόρουμ (Markdown)", + "decreaseFontSize": "Μειώστε το μέγεθος γραμματοσειράς", + "decreaseIndent": "Μείωση εσοχής", + "increaseFontSize": "Αυξήστε το μέγεθος γραμματοσειράς", + "increaseIndent": "Αύξηση εσοχής", + "nextError": "Επόμενο Σφάλμα", + "previousError": "Προηγούμενο Σφάλμα", + "revealError": "Αποκάλυψη σφάλματος" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", + "builtInExamples": "Ενσωματωμένα παραδείγματα", + "couldNotInitializeExamples": "Δεν ήταν δυνατή η προετοιμασία των ενσωματωμένων παραδειγμάτων.", + "customLibrary": "Παραδείγματα από τις προσαρμοσμένες βιβλιοθήκες", "for": "Παραδείγματα για {0}", - "forAny": "Examples for any board", + "forAny": "Παραδείγματα για οποιαδήποτε πλακέτα", "menu": "Παραδείγματα" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", + "checkUpdates": "Ελέγξτε τις ενημερώσεις", + "failedInstall": "Η εγκατάσταση απέτυχε. Παρακαλώ προσπαθήστε ξανά.", "install": "Εγκατάσταση", - "installingFirmware": "Installing firmware.", + "installingFirmware": "Εγκατάσταση λογισμικού.", "overwriteSketch": "Installation will overwrite the Sketch on the board.", "selectBoard": "Επιλογή Πλακέτας", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "Firmware Updater" + "selectVersion": "Επιλέξτε έκδοση λογισμικού", + "successfullyInstalled": "Το λογισμικό εγκαταστάθηκε με επιτυχία.", + "updater": "Ενημέρωση λογισμικού" }, "help": { "environment": "Περιβάλλον", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", + "faq": "Συχνές Ερωτήσεις", + "findInReference": "Βρείτε στην Αναφορά", + "gettingStarted": "Ξεκινώντας", + "keyword": "Πληκτρολογήστε μια λέξη-κλειδί", + "privacyPolicy": "Πολιτική Απορρήτου", "reference": "Reference", "search": "Αναζήτηση στο Arduino.cc", - "troubleshooting": "Troubleshooting", + "troubleshooting": "Αντιμετώπιση προβλημάτων", "visit": "Επίσκεψη Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "checkForUpdates": "Ελέγξτε για νέες ενημερώσεις Arduino IDE", + "closeAndInstallButton": "Κλείσιμο και εγκατάσταση", + "closeToInstallNotice": "Κλείστε το πρόγραμμα και εγκαταστήστε την ενημέρωση στον υπολογιστή σας.", + "downloadButton": "Κατεβάστε", + "downloadingNotice": "Λήψη της πιο πρόσφατης έκδοσης του Arduino IDE.", + "errorCheckingForUpdates": "Σφάλμα κατά τον έλεγχο για ενημερώσεις του Arduino IDE.\n{0}", + "goToDownloadButton": "Μετάβαση στη λήψη", + "goToDownloadPage": "Υπάρχει διαθέσιμη ενημέρωση για το Arduino IDE, αλλά δεν μπορούμε να το κατεβάσουμε και να το εγκαταστήσουμε αυτόματα. Μεταβείτε στη σελίδα λήψης και κατεβάστε την πιο πρόσφατη έκδοση από εκεί. ", "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", + "newVersionAvailable": "Μια νέα έκδοση του Arduino IDE ({0}) είναι διαθέσιμη για λήψη.", + "noUpdatesAvailable": "Δεν υπάρχουν διαθέσιμες πρόσφατες ενημερώσεις για το Arduino IDE", + "notNowButton": "Όχι τώρα", + "skipVersionButton": "Παράλειψη έκδοσης", + "updateAvailable": "Διαθέσιμη ενημέρωση", "versionDownloaded": "Arduino IDE {0} has been downloaded." }, "installable": { @@ -288,85 +292,85 @@ "library": { "addZip": "Προσθέστε μια βιβλιοθήκη μορφής .ZIP", "arduinoLibraries": "Βιβλιοθήκες Arduino", - "contributedLibraries": "Contributed libraries", + "contributedLibraries": "Συνεισφορά βιβλιοθηκών", "include": "Συμπεριλάβετε βιβλιοθήκη", - "installAll": "Install All", + "installAll": "Εγκατάσταση όλων", "installLibraryDependencies": "Install library dependencies", "installMissingDependencies": "Would you like to install all the missing dependencies?", "installOneMissingDependency": "Would you like to install the missing dependency?", "installWithoutDependencies": "Install without dependencies", - "installedSuccessfully": "Successfully installed library {0}:{1}", + "installedSuccessfully": "Επιτυχής εγκατάσταση Βιβλιοθήκης {0} :{1} ", "libraryAlreadyExists": "Μια βιβλιοθήκη υπάρχει ήδη. Θέλετε να την αντικαταστήσετε;", "manageLibraries": "Διαχείριση βιβλιοθηκών...", "namedLibraryAlreadyExists": "Μια βιβλιοθήκη με όνομα {0} υπάρχει ήδη. Θέλετε να γίνει αντικατάσταση;", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "needsMultipleDependencies": "Η βιβλιοθήκη <b>{0}:{1}</b> χρειάζεται κάποιες άλλες εξαρτήσεις που δεν είναι εγκατεστημένες αυτήν τη στιγμή:", + "needsOneDependency": "Η βιβλιοθήκη <b>{0}:{1} </b>χρειάζεται μια άλλη εξάρτηση που δεν έχει εγκατασταθεί αυτήν τη στιγμή:", "overwriteExistingLibrary": "Θέλετε να αντικαταστήσετε αυτή τη βιβλιοθήκη;", "successfullyInstalledZipLibrary": "Επιτυχής εγκατάσταση βιβλιοθήκης απο το αρχείο {0}", "title": "Διαχειριστής βιβλιοθηκών", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "uninstalledSuccessfully": " Επιτυχής απεγκατάστασης Βιβλιοθήκης {0}:{1}", "zipLibrary": "Διαχειριστής βιβλιοθήκης" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Θέμα" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", + "communication": "Επικοινωνία ", + "dataProcessing": "Επεξεργασία δεδομένων", + "dataStorage": "Αποθήκευση δεδομένων", + "deviceControl": "Έλεγχος συσκευής", "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "other": "Άλλα", + "sensors": "Αισθητήρες", + "signalInputOutput": "Είσοδος/Έξοδος Σήματος", + "timing": "Συγχρονισμός", + "uncategorized": "Χωρίς κατηγοριοποίηση" }, "libraryType": { - "installed": "Installed" + "installed": "Εγκατεστημένο" }, "menu": { - "advanced": "Advanced", + "advanced": "Προχωρημένος", "sketch": "Σχέδιο", "tools": "Εργαλεία" }, "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "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" + "alreadyConnectedError": "Δεν ήταν δυνατή η σύνδεση στη θύρα{0}{1}. Είστε ήδη συνδεδεμένος.", + "baudRate": "{0}baud", + "connectionFailedError": "Δεν ήταν δυνατή η σύνδεση στη θύρα {0}{1}.", + "connectionFailedErrorWithDetails": "{0}Δεν ήταν δυνατή η σύνδεση στη θύρα.{1}{2}", + "connectionTimeout": "Τέλος χρόνου. Το IDE δεν έχει λάβει το μήνυμα «επιτυχίας» από την οθόνη μετά την επιτυχή σύνδεση σε αυτό", + "missingConfigurationError": "Δεν ήταν δυνατή η σύνδεση στη θύρα{0} {1}. Λείπει η διαμόρφωση της οθόνης.", + "notConnectedError": "Δεν είναι συνδεδεμένο στη θύρα {0} {1}.", + "unableToCloseWebSocket": "Δεν είναι δυνατό να κλείσει η διαδικτυακή πρίζα", + "unableToConnectToWebSocket": "Δεν είναι δυνατή η σύνδεση με την διαδικτυακή πρίζα" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Όνομα του νέου Cloud Σχεδίου" }, "portProtocol": { "network": "Δίκτυο", - "serial": "Serial" + "serial": "Σειριακός" }, "preferences": { "additionalManagerURLs": "Πρόσθετοι Σύνδεσμοι Διαχειριστή Πλακετών", "auth.audience": "The OAuth2 audience.", "auth.clientID": "The OAuth2 client ID.", "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", + "auth.registerUri": "Αυτό το URI χρησιμοποιήθηκε για την εγγραφή ενός νέου χρήστη.", "automatic": "Αυτόματο", "board.certificates": "Λίστα πιστοποιητικών που μπορούν να ανέβουν σε πλακέτες", "browse": "Περιήγηση", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Λάβετε ειδοποιήσεις σχετικά με τις διαθέσιμες ενημερώσεις για το IDE, τις πλακέτες και τις βιβλιοθήκες. Απαιτεί επανεκκίνηση του IDE μετά την αλλαγή. Είναι αλήθεια από προεπιλογή.", "choose": "Επιλογή", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "Ενεργοποίηση καταγραφής εντοπισμού σφαλμάτων των κλήσεων gRPC προς το Arduino CLI. Απαιτείται επανεκκίνηση του IDE για να εφαρμοστεί αυτή η ρύθμιση. Είναι ψευδές από προεπιλογή.", "cloud.enabled": "Αληθές αν οι λειτουγίες συγχονισμού σχεδίου είναι ενεργοποιημένες. Προεπιλογή ως αληθές.", "cloud.pull.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν τραβηχτεί ενα σχέδιο σύννεφου. Προεπιλογή ως αληθές.", "cloud.push.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν σπρωχθεί ενα σχέδιο σύννεφου. Προεπιλογή ως αληθές. ", "cloud.pushpublic.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν σπρωχθεί ενα δημόσιο σχέδιο σύννεφου. Προεπιλογή ως αληθές. ", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "μεταγλώττιση", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.experimental": "Σωστό αν το IDE πρέπει να χειρίζεται πολλαπλά σφάλματα μεταγλωττιστή. Λάθος από προεπιλογή", "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", "compile.verbose": "Αληθές για λεπτομερή έξοδο μεταγλώττισης. Ψευδές απο προεπιλογή.", "compile.warnings": "Λέει στο gcc ποιο επίπεδο προειδοποίησης να χρησιμοποιήσει. Είναι 'None' απο προεπιλογή", @@ -375,169 +379,171 @@ "editorQuickSuggestions": "Επιμελιτής γρήγορων προτάσεων", "enterAdditionalURLs": "Τοποθετήστε πρόσθετους Συνδέσμους, ένα σε κάθε σειρά", "files.inside.sketches": "Εμφάνιση αρχείων μέσα σε Σχέδια", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "ide.updateBaseUrl": "Η βασική διεύθυνση URL από την οποία μπορείτε να πραγματοποιήσετε λήψη ενημερώσεων. Οι προεπιλογές είναι \"https://downloads.arduino.cc/arduino-ide\"", + "ide.updateChannel": "Κυκλοφόρησε το κανάλι για να ενημέρωση. Το \"stable\" είναι η σταθερή έκδοση, το \"nightly\" είναι η τελευταία έκδοση ανάπτυξης.", "interfaceScale": "Κλίμακα διεπαφής", "invalid.editorFontSize": "Μη-έγκυρο μέγεθος γραμματοσειράς συντάκτη. Πρέπει να είναι θετικός ακέραιος.", "invalid.sketchbook.location": "Μη-έγκυρη τοποθεσία σχεδίων: {0}", "invalid.theme": "Μη-έγκυρο θέμα.", - "language.log": "Αληθές αν ο Arduino Language Server πρέπει να παράξει αρχεία κατάστασης στον φάκελο σχεδίου. Διαφορετικά, ψευδές. Είναι ψευδές απο προεπιλογή.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", + "language.log": "Σωστό εάν ο διακομιστής γλώσσας Arduino πρέπει να δημιουργήσει αρχεία καταγραφής στο φάκελο σκίτσου. Διαφορετικά, ψευδής. Είναι ψευδές από προεπιλογή.", + "language.realTimeDiagnostics": "Εάν ισχύει, ο διακομιστής γλώσσας παρέχει διαγνωστικά σε πραγματικό χρόνο όταν πληκτρολογείτε στον επεξεργαστή. Είναι ψευδές από προεπιλογή.", + "manualProxy": "Μη αυτόματη διαμόρφωση proxy διακομιστή μεσολάβησης", "monitor": { "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." }, "network": "Δίκτυο", "newSketchbookLocation": "Επιλογή νέας τοποθεσίας σχεδίων", - "noCliConfig": "Could not load the CLI configuration", - "noProxy": "No proxy", + "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. Τα σκίτσα θα δημιουργηθούν με το προεπιλεγμένο περιεχόμενο Arduino εάν δεν καθοριστεί. Τα μη προσβάσιμα αρχεία σχεδιαγράμματος αγνοούνται. **Απαιτείται επανεκκίνηση του IDE** για να τεθεί σε ισχύ αυτή η ρύθμιση." }, "sketchbook.location": "Τοποθεσία σχεδίων", "sketchbook.showAllFiles": "Αληθές για εμφάνιση όλων των αρχείων σχεδίου μεσα στο σχέδιο. Είναι ψευδές απο προεπιλογή.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", + "survey.notification": "Σωστό εάν οι χρήστες πρέπει να ειδοποιούνται εάν υπάρχει διαθέσιμη έρευνα. Αληθές από προεπιλογή.", "unofficialBoardSupport": "Κλικ για λίστα Συνδέσμων ανεπίσημης υποστήριξης πλακετών", "upload": "ανέβασμα", "upload.verbose": "Αληθές για λεπτομερή έξοδο ανεβάσματος. Ψευδές απο προεπιλογή.", "verifyAfterUpload": "Επιβεβαίωση κώδικα μετά το ανέβασμα", "window.autoScale": "Αληθές αν η διεπαφή χρήστη κλιμακλωνεται αυτόματα μαζί με το μέγεθος γραμματοσειράς.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Καταργήθηκε. Χρησιμοποιήστε αντί αυτού το 'window.zoomLevel'." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Νέο όνομα του Cloud Σχεδίου" }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "replaceMsg": "Αντικατάσταση της υπάρχουσας έκδοσης του {0};", + "selectZip": "Επιλέξτε ένα αρχείο zip που περιέχει τη βιβλιοθήκη που θέλετε να προσθέσετε", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "autoscroll": "Αυτόματη κύλιση", + "carriageReturn": "Μεταφορά Επιστροφή", + "connecting": "Σύνδεση από '{0}' στο '{1}'...", + "message": "Μήνυμα (Εισαγάγετε για να στείλετε μήνυμα από '{0}' στο '{1}')", "newLine": "Νέα γραμμή", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" + "newLineCarriageReturn": "Και τα δύο NL και CR", + "noLineEndings": "Χωρίς τέλος γραμμής", + "notConnected": "Μη συνδεδεμένο. Επιλέξτε μια πλακέτα και μια θύρα για αυτόματη σύνδεση.", + "openSerialPlotter": "Σειριακός Plotter", + "timestamp": "Χρονική Σήμανση ", + "toggleTimestamp": "Εναλλαγή Χρονική Σήμανσης" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", + "archiveSketch": "Αρχείο Σχεδίου", + "cantOpen": "Ένας φάκελος με το όνομα \"{0}\" υπάρχει ήδη. Δεν είναι δυνατό το άνοιγμα του σχεδίου.", + "compile": "Σύνταξη σχεδίου...", + "configureAndUpload": "Διαμόρφωση και φόρτωση", + "createdArchive": "Δημιουργήθηκε το αρχείο '{0}'.", + "doneCompiling": "Ολοκληρώθηκε η δημιουργία.", "doneUploading": "Ολοκλήρωση ανεβάσματος", - "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", - "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", - "exportBinary": "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", + "editInvalidSketchFolderLocationQuestion": "Θέλετε να δοκιμάσετε να αποθηκεύσετε το σχεδιο σε διαφορετική τοποθεσία;", + "editInvalidSketchFolderQuestion": "Θέλετε να δοκιμάσετε να αποθηκεύσετε το σχέδιο με διαφορετικό όνομα;", + "exportBinary": "Εξαγωγή μεταγλωττισμένου δυαδικού αρχείου", + "invalidCloudSketchName": "Το όνομα πρέπει να ξεκινά με γράμμα, αριθμό ή κάτω παύλα, ακολουθούμενα από γράμματα, αριθμούς, παύλες, τελείες και κάτω παύλες. Το μέγιστο μήκος είναι 36 χαρακτήρες.", + "invalidSketchFolderLocationDetails": "Δεν μπορείτε να αποθηκεύσετε ένα σχέδιο σε έναν φάκελο που βρίσκεται μέσα του.", + "invalidSketchFolderLocationMessage": "Μη έγκυρη θέση φακέλου σχεδίου: '{0}'", + "invalidSketchFolderNameMessage": "Μη έγκυρο όνομα φακέλου σχεδίου: '{0}'", + "invalidSketchName": "Το όνομα πρέπει να ξεκινά με γράμμα, αριθμό ή κάτω παύλα, ακολουθούμενα από γράμματα, αριθμούς, παύλες, τελείες και κάτω παύλες. Το μέγιστο μήκος είναι 63 χαρακτήρες.", + "moving": "Μετακίνηση", + "movingMsg": "Το αρχείο \"{0}\" πρέπει να βρίσκεται μέσα σε έναν φάκελο σχεδίου με το όνομα \"{1}\". \nΔημιουργία φακέλου, μεταφορά του αρχείου και συνέχεια;", + "new": "Νέο Σχέδιο ", + "noTrailingPeriod": "Ένα όνομα αρχείου δεν μπορεί να τελειώνει με τελεία", "openFolder": "Άνοιγμα φακέλου", "openRecent": "Άνοιγμα πρόσφατου", - "openSketchInNewWindow": "Open Sketch in New Window", - "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", + "openSketchInNewWindow": "Ανοίξτε το Σχέδιο σε νέο παράθυρο", + "reservedFilename": "Το '{0}' είναι δεσμευμένο όνομα αρχείου.", + "saveFolderAs": "Αποθήκευση φακέλου σχεδίου ως ...", + "saveSketch": "Αποθηκεύστε το σχεδιό σας για να το ανοίξετε ξανά αργότερα.", + "saveSketchAs": "Αποθήκευση φακέλου σχεδίου ως...", + "showFolder": "Εμφάνιση φακέλου σχεδίου", "sketch": "Σχέδιο", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", + "sketchAlreadyContainsThisFileError": "Αυτό το σχέδιο περιέχει ήδη ένα αρχείο με το όνομα '{0}'", + "sketchAlreadyContainsThisFileMessage": "Αποτυχία αποθήκευσης του σχεδίου \"{0}\" ως \"{1}\".{2}", + "sketchbook": "Άλμπουμ", + "titleLocalSketchbook": "Τοπικό Σχέδιο", + "titleSketchbook": "Άλμπουμ ", "upload": "Ανέβασμα", "uploadUsingProgrammer": "Ανέβασμα μέσω προγραμματιστή", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", + "uploading": "Φότρωση....", + "userFieldsNotFoundError": "Δεν είναι δυνατή η εύρεση των πεδίων χρήστη για την συνδεδεμένη πλακέτα", "verify": "Επαλήθευση", "verifyOrCompile": "Επικύρωση" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Νέο σχέδιο Cloud ", + "newSketch": "Νέο Σχέδιο" }, "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", - "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "Δεν ήταν δυνατή η εύρεση του τρέχοντος επιλεγμένου θέματος:{0} . Το Arduino IDE έχει επιλέξει ένα ενσωματωμένο θέμα συμβατό με αυτό που λείπει.", + "dark": "Σκοτεινό", + "deprecated": "{0}(καταργήθηκε)", + "hc": "Σκούρο Υψηλής Αντίθεσης", + "hcLight": "Φωτεινό Υψηλής Αντίθεσης", + "light": "Φωτεινό", + "user": "{0} (χρήστης)" }, "title": { "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": "Enter Εισαγωγή {0}", "upload": "Ανέβασμα" }, "validateSketch": { - "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", - "abortFixTitle": "Invalid sketch", - "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", - "renameSketchFileTitle": "Invalid sketch filename", - "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", - "renameSketchFolderTitle": "Invalid sketch name" + "abortFixMessage": "Το σκίτσο εξακολουθεί να είναι άκυρο. Θέλετε να διορθώσετε τα προβλήματα που απομένουν; Κάνοντας κλικ στο '{0}', θα ανοίξει ένα νέο σχέδιο.", + "abortFixTitle": "Μη έγκυρο σχέδιο", + "renameSketchFileMessage": "Το αρχείο σχεδίου '{0}' δεν μπορεί να χρησιμοποιηθεί. {1}Θέλετε να μετονομάσετε το αρχείο του σχεδίου τώρα;", + "renameSketchFileTitle": "Μη έγκυρο όνομα αρχείου σχεδίου", + "renameSketchFolderMessage": "Το σχέδιο '{0}' δεν μπορεί να χρησιμοποιηθεί. {1}Για να απαλλαγείτε από αυτό το μήνυμα, μετονομάστε το σχέδιο. Θέλετε να μετονομάσετε το σχέδιο τώρα;", + "renameSketchFolderTitle": "Μη έγκυρο όνομα σκίτσου" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' υπάρχει ήδη." } }, "theia": { "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "cannotConnectBackend": "Δεν είναι δυνατή η σύνδεση στο σύστημα υποστήριξης.", + "cannotConnectDaemon": "Δεν είναι δυνατή η σύνδεση με το daemon CLI.", "couldNotSave": "Δεν έγινε αποθήκευση του προγράμματος. Παρακαλώ αντιγράψτε ό,τι δεν έχει αποθηκευθεί στον αγαπημένο σας επεξεργαστή κειμένου, και επανεκινήστε το Ολοκληρωμένο Περιβάλλον Ανάπτυξης IDE.", - "daemonOffline": "CLI Daemon Offline", + "daemonOffline": "CLI Daemon Εκτός σύνδεσης", "offline": "Εκτός Σύνδεσης", "offlineText": "Εκτός Σύνδεσης", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε;" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "Μη αποθηκευμένο –{0}" }, "messages": { "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?", + "deleteCloudSketch": "Το σχέδιο του cloud '{0}' θα διαγραφεί οριστικά από τους διακομιστές Arduino και τις τοπικές κρυφές μνήμες. Αυτή η ενέργεια είναι μη αναστρέψιμη. Θέλετε να διαγράψετε το τρέχον σχέδιο;", + "deleteCurrentSketch": "Το σχέδιο '{0}' θα διαγραφεί οριστικά. Αυτή η ενέργεια είναι μη αναστρέψιμη. Θέλετε να διαγράψετε το τρέχον σχέδιο; ", "fileNewName": "Όνομα για το νεό αρχείο", - "invalidExtension": ".{0} is not a valid extension", + "invalidExtension": ". {0}δεν είναι έγκυρη επέκταση", "newFileName": "Νέο όνομα για το αρχείο" } } diff --git a/i18n/es.json b/i18n/es.json index 8e8109fa5..cdc6369fb 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -115,7 +115,7 @@ "remote": "Remoto", "share": "Compartir...", "shareSketch": "Compartir Sketch", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Mostrar/Ocultar Sketchbook Remoto", "signIn": "Iniciar sesión", "signInToCloud": "Iniciar sesión en Arduino Cloud", "signOut": "Cerrar sesión", @@ -124,13 +124,13 @@ "visitArduinoCloud": "Visita Arduino Cloud para crear 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}'...", + "alreadyExists": "El sketch remoto '{0}' ya existe.", + "creating": "Creando sketch remoto '{0}'...", + "new": "Nuevo Sketch en la Nube", + "notFound": "No se pudieron obtener los cambios del sketch remoto '{0}'. No existe.", + "pulling": "Sincronizando sketchbook, extrayendo '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "renaming": "Renombrando el sketch remoto de '{0}' a '{1}'...", "synchronizingSketchbook": "Sincronizando carpeta..." }, "common": { @@ -139,6 +139,7 @@ "installManually": "Instalar manualmente", "later": "Más tarde", "noBoardSelected": "Ninguna placa seleccionada.", + "noSketchOpened": "No sketch opened", "notConnected": "[no conectado]", "offlineIndicator": "Al parecer no estás en línea. Sin una conexión a internet, el CLI de Arduino no podrá descargar los recursos necesarios, lo cual puede ocasionar fallos. Por favor, conecte a internet y reinicie la aplicación.", "oldFormat": "La página '{0}' sigue utilizando el formato antiguo `.pde`. ¿Quieres cambiar a la nueva extensión `.ino`?", @@ -146,6 +147,7 @@ "processing": "Procesando", "recommended": "Recomendado", "retired": "Retirado", + "selectManually": "Select Manually", "selectedOn": "en {0}", "serialMonitor": "Monitor Serie", "type": "Tipo", @@ -178,7 +180,7 @@ } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "Conexión perdida. Las acciones y actualizaciones de los sketchs remotos no estarán disponibles." }, "contributions": { "addFile": "Añadir fichero...", @@ -209,9 +211,11 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "La depuración no está soportada por '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "La plataforma no está instalada para '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" + "sketchIsNotCompiled": "El sketch '{0}' debe ser verificado antes de iniciar una sesión de depuración. Por favor, verifique el sketch e inicia la depuración nuevamente. ¿Deseas verificar el sketch ahora?" }, "developer": { "clearBoardList": "Clear the Board List History", @@ -342,7 +346,7 @@ "unableToConnectToWebSocket": "No se puede conectar al websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Nombre del nuevo Sketch Remoto" }, "portProtocol": { "network": "Red", @@ -414,7 +418,7 @@ } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Nuevo nombre del Sketch Remoto" }, "replaceMsg": "¿Sustituir la versión existente de {0}?", "selectZip": "Seleccione un archivo zip que contenga la biblioteca que deseas añadir", @@ -443,7 +447,7 @@ "editInvalidSketchFolderQuestion": "¿Quieres intentar guardar el código con un nombre diferente?", "exportBinary": "Exportar binario compilado", "invalidCloudSketchName": "El nombre debe comenzar con una letra, un número, o un guión bajo, seguido de letras, números, guiones, puntos y guiones bajos. El máximo número de caracteres es 36.", - "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationDetails": "No puedes guardar un sketch dentro de una carpeta dentro de sí misma.", "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", "invalidSketchName": "El nombre debe comenzar con una letra, un número, o un guión bajo, seguido de letras, números, guiones, puntos y guiones bajos. El máximo número de caracteres es 63.", @@ -460,6 +464,8 @@ "saveSketchAs": "Guardar carpeta de sketch como...", "showFolder": "Mostrar carpeta de Sketch", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Sketchbook Local", "titleSketchbook": "Sketchbook", @@ -471,7 +477,7 @@ "verifyOrCompile": "Verificar/Compilar" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", + "newCloudSketch": "Nuevo Sketch en la Nube", "newSketch": "New Sketch" }, "survey": { diff --git a/i18n/eu.json b/i18n/eu.json index 9e6dfdd6a..8d1287392 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -139,6 +139,7 @@ "installManually": "Instalatu eskuz", "later": "Gero", "noBoardSelected": "Plakarik ez da hautatu", + "noSketchOpened": "No sketch opened", "notConnected": "[konektatu gabe]", "offlineIndicator": "Deskonektatuta zaudela dirudi. Interneterako konexiorik gabe, baliteke Arduino CLI ez izatea gai beharrezko baliabideak deskargatzeko, eta funtzionamendu txarra eragin lezake. Mesedez, konektatu Internetera eta berrabiarazi aplikazioa.", "oldFormat": "'{0}' programak `.pde` formatu zaharra erabiltzen du oraindik. `.ino` luzapen berrira aldatu nahi duzu?", @@ -146,6 +147,7 @@ "processing": "Prozesatzen", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "Non: {0}", "serialMonitor": "Serieko monitorea", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Araztu - {0}", "debuggingNotSupported": "Ez dauka arazketarako euskarririk: '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Plataforma ez dago instalatuta honentzat: '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Gorde programen karpeta honela...", "showFolder": "Erakutsi programen karpeta", "sketch": "Programa", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Programa bilduma", "titleLocalSketchbook": "Programa bilduma lokala", "titleSketchbook": "Programa bilduma", diff --git a/i18n/fa.json b/i18n/fa.json index 8e5f3f446..addd3ca19 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -1,14 +1,14 @@ { "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", - "menuTitle": "Arduino Cloud" + "goToCloudEditor": "به ویرایشگر فضای ابری برو", + "goToIoTCloud": "به فضای ابری اینترنت اشیاء برو", + "goToProfile": "به نمایه برو", + "menuTitle": "فضای ابری آردواینو" }, "board": { "board": "بورد {0}", @@ -18,21 +18,21 @@ "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", "configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.", "couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "ویرایش بورد و پورت", "getBoardInfo": "دریافت راهنمای برد", "inSketchbook": "(در منبع طرح ها)", "installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟", "noBoardsFound": "هیچ بردی پیدا نشد برای{0}", - "noNativeSerialPort": "Native serial port, can't obtain info.", + "noNativeSerialPort": "سریال پورت داخلی، نمی تواند اطلاعات را بدست آورد.", "noPortsDiscovered": "هیچ پورتی پیدا نشد", - "nonSerialPort": "Non-serial port, can't obtain info.", + "nonSerialPort": "سریال پورتی یافت نشد، نمی توان اطلاعاتی را نمایش داد.", "openBoardsConfig": "انتخاب سایر برد ها و پورت ها", "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", "ports": "پورت ها", - "programmer": "برنامه ریز", + "programmer": "Programmer", "reselectLater": "بعدا انتخاب کنید", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "استفاده از «{0}» پیدا شده در «{1}»", "searchBoard": "جستجوی بورد", "selectBoard": "انتخاب برد", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", @@ -41,8 +41,8 @@ "succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}", "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}", "typeOfPorts": "پورت ها{0}", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" + "unconfirmedBoard": "بورد تایید نشده است.", + "unknownBoard": "بورد ناشناخته هست." }, "boardsManager": "مدیریت برد ها", "boardsType": { @@ -68,8 +68,8 @@ "selectBoard": "انتخاب یک برد ...", "selectCertificateToUpload": "1. انتخاب سند برای بارگذاری", "selectDestinationBoardToUpload": "2. انتخاب برد مورد نظر و بارگذاری سند", - "upload": "آپلود", - "uploadFailed": "آپلود ناموفق بود. لطفا دوباره سعی کنید.", + "upload": "بارگذاری", + "uploadFailed": "باگذاری ناموفق بود. لطفا دوباره سعی کنید.", "uploadRootCertificates": "بارگذاری سند ریشه SSL", "uploadingCertificates": "در حال بارگذاری سند." }, @@ -89,10 +89,10 @@ "cloud": { "chooseSketchVisibility": "قابلیت مشاهده طرح خود را انتخاب کنید:", "cloudSketchbook": "منبع ابری طرح ها", - "connected": "متصل", + "connected": "متصل است.", "continue": "ادامه", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "پایان دریافت {0}", + "donePushing": "پایان ارسال {0}", "embed": "قرار دادن:", "emptySketchbook": "طرح شما خالی است", "goToCloud": "به فضای ابری بروید", @@ -101,7 +101,7 @@ "notYetPulled": "نمی توان به ابر ارسال کرد. هنوز دریافت نشده است.", "offline": "آفلاین", "openInCloudEditor": "در ویرایشگر ابری باز کن", - "options": "تنظیمات...", + "options": "گزینه‌ها", "privateVisibility": "خصوصی است. فقط شما می توانید طرح را مشاهده کنید.", "profilePicture": "عکس پروفایل", "publicVisibility": "عمومی است. هر کسی که پیوند را داشته باشد می تواند طرح را مشاهده کند.", @@ -115,23 +115,23 @@ "remote": "از راه دور", "share": "اشتراک گذاری...", "shareSketch": "اشتراک طرح", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", - "signIn": "ورود کاربر", + "showHideSketchbook": "نمایش/پنهان کردن طرح‌های روی فضای ابری", + "signIn": "ورود", "signInToCloud": "ورود به ابر آردوینو", - "signOut": "خروج کاربر", + "signOut": "خروج", "sync": "همگام سازی", "syncEditSketches": "طرح های ابر آردوینو خود را همگام سازی و ویرایش کنید", "visitArduinoCloud": "بازدید از ابر آردوینو برای ساخت ابر طرح ها" }, "cloudSketch": { - "alreadyExists": "Cloud sketch '{0}' already exists.", - "creating": "Creating cloud sketch '{0}'...", - "new": "New Cloud Sketch", - "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", - "pulling": "Synchronizing sketchbook, pulling '{0}'...", - "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "alreadyExists": "طرح روی فضای ابری «{0}» از قبل وجود دارد.", + "creating": "در حال ایجاد طرح رو فضای ابری «{0}»...", + "new": "طرح جدید روی فضای ابری", + "notFound": "نمی توان طرح ابری «{0}» را دریافت کرد. چنین طرحی وجود ندارد.", + "pulling": "همگام سازی طرح، در حالت دریافت «{0}» ...", + "pushing": "همگام سازی طرح، در حالت ارسال «{0}» ...", + "renaming": "تغییر نام طرح فضای ابری از «{0}» به «{1}»...", + "synchronizingSketchbook": "همگام سازی طرح..." }, "common": { "all": "همه", @@ -139,13 +139,15 @@ "installManually": "دستی نصب کن", "later": "بعدا", "noBoardSelected": "بردی انتخاب نشده", + "noSketchOpened": "هیچ طرحی باز نشده است", "notConnected": "[متصل نشد]", "offlineIndicator": "به نظر می رسد آفلاین هستید. بدون اتصال به اینترنت، رابط ترمینال آردوینو ممکن است نتواند منابع مورد نیاز را دانلود کند و باعث اختلال در عملکرد شود. لطفاً به اینترنت متصل شوید و برنامه را مجدداً راه اندازی کنید.", "oldFormat": "'{0}' هنوز از قالب قدیمی `.pde` استفاده می کند. آیا می‌خواهید به برنامه افزودنی «.ino» جدید بروید؟", "partner": "شریک", - "processing": "در حال محاسبه", + "processing": "در حال پردازش", "recommended": "توصیه شده", "retired": "بازنشسته", + "selectManually": "به صورت دستی انتخاب کنید", "selectedOn": "روشن {0}", "serialMonitor": "نمایشگر ترمینال سریال", "type": "نوع", @@ -158,30 +160,30 @@ "component": { "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": "فایل اظافه کن", + "addFile": "اضافه کردن فایل", "fileAdded": "یک فایل به طرح افزوده شد.", "plotter": { "couldNotOpen": "پلاتر سریال باز نشد" @@ -200,7 +202,7 @@ "copyError": "کپی پیام های خطا", "noBoardSelected": "هیچ بردی انتخاب نشده است. لطفاً برد آردوینو خود را از منوی Tools > Board انتخاب کنید" }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "طرح را به فضای ابری منتقل کنید", "daemon": { "restart": "راه اندازی مجدد Daemon", "start": "شروع Daemon", @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "رفع خطا {0}", "debuggingNotSupported": "رفع خطا توسط {0} پشتیبانی نمی شود.", + "getDebugInfo": "در حال دریافت اطلاعات اشکال زدایی...", "noPlatformInstalledFor": "دستگاه مورد نظر برای {0} نصب نشده است", + "noProgrammerSelectedFor": "برنامه‌نویسی برای \"{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}» باید قبل از شروع برای اشکال‌زدایی بازبینی شود. لطفاً طرح را بازبینی کنید و دوباره اشکال زدایی را شروع کنید. آیا می خواهید اکنون طرح را تأیید کنید؟" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "تاریخچه فهرست بورد را پاک کنید", + "clearBoardsConfig": "بورد و پورت انتخاب شده را پاک کنید", + "dumpBoardList": "روبرداری از لیست بردارها" }, "dialog": { "dontAskAgain": "نمی تواند بپرسد." @@ -250,7 +254,7 @@ "selectBoard": "انتخاب برد", "selectVersion": "انتخاب نسخه درایور", "successfullyInstalled": "نصب درایور موفقیت آمیز بود.", - "updater": "Firmware Updater" + "updater": "بروز رسانی میان‌افزار" }, "help": { "environment": "محیط", @@ -282,11 +286,11 @@ "versionDownloaded": "آردوینو {0} دانلود شده بوده است." }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "کتابخانه نصب نشد: '{0}{1}'.", + "platformInstallFailed": "پلتفرم نصب نشد: '{0}{1}'" }, "library": { - "addZip": "اضافه کتابخانه ی .zip شده", + "addZip": "اضافه کتابخانه‌ی .ZIP شده", "arduinoLibraries": "کتابخانه های آردوینو", "contributedLibraries": "کتابخانه های اشتراکی", "include": "اضافه کتابخانه", @@ -328,21 +332,21 @@ "menu": { "advanced": "پیشرفته", "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.", + "alreadyConnectedError": "به پورت «{0}{1}» متصل نشد. از قبل متصل است.", + "baudRate": "baud {0}", + "connectionFailedError": "به پورت«{0}{1}» متصل نشد.", + "connectionFailedErrorWithDetails": "متاسفانه، «{0}» به پورت «{1}{2}» متصل نشد.", + "connectionTimeout": "تایم اوت، IDE پس از اتصال موفقیت آمیز، پیام 'موفقیت' را از نظارت کننده دریافت نکرده است", + "missingConfigurationError": "به پورت «{0} {1}» متصل نشد. پیکربندی مانیتور وجود ندارد.", + "notConnectedError": "به پورت «{0} {1} » متصل نیست.", "unableToCloseWebSocket": "بسته شدن وب سوکت ممکن نیست", "unableToConnectToWebSocket": "اتصال به وب سوکت امکان پذیر نیست" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "نام جدید برای طرح روی فضای ابری" }, "portProtocol": { "network": "نتورک", @@ -354,7 +358,7 @@ "auth.clientID": "شناسه مشتری OAuth2(احراز هویت اینترنتی).", "auth.domain": "دامنه OAuth2(احراز هویت اینترنتی).", "auth.registerUri": "لینک برای ثبت یک کاربر جدید استفاده می شود.", - "automatic": "اتوماتیک", + "automatic": "خودکار", "board.certificates": "فهرست گواهی‌هایی که می‌توان در تابلوها بارگذاری کرد", "browse": "مرور کردن", "checkForUpdate": "اعلان‌های به‌روزرسانی‌های موجود برای IDE، بردها و کتابخانه‌ها را دریافت کنید. پس از تغییر نیاز به راه اندازی مجدد IDE دارد. به طور پیش فرض درست است.", @@ -385,11 +389,11 @@ "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}\"." + "dockPanel": "ناحیه ای از پوسته برنامه که ویجت _«{0} »_ در آن قرار دارد. یا «پایین» است یا در «راست». پیش‌فرض روی «{1}» است." }, - "network": "نتورک", + "network": "شبکه", "newSketchbookLocation": "مکان جدید منبع طرح ها را مشخص کنید", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "تنظیمات CLI بارگیری نشد\n ", "noProxy": "بدون پروکسی", "proxySettings": { "hostname": "نام میزبان", @@ -405,23 +409,23 @@ "sketchbook.showAllFiles": "همه فایل‌های طرح را در داخل طرح نشان دهد درست است. به طور پیش فرض نادرست است.", "survey.notification": "درست است اگر در صورت وجود نظرسنجی به کاربران اطلاع داده شود. به طور پیش فرض درست است.", "unofficialBoardSupport": "برای لیستی از آدرس های اینترنتی پشتیبانی هیئت مدیره غیررسمی کلیک کنید", - "upload": "آپلود", + "upload": "بارگذاری", "upload.verbose": "برای خروجی آپلود پرمخاطب درست است. به طور پیش فرض نادرست است.", - "verifyAfterUpload": "تائید کد بعد از آپلود", + "verifyAfterUpload": "تائید کد بعد از بارگذاری", "window.autoScale": "اگر رابط کاربری به طور خودکار با اندازه فونت تغییر کند درست است.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "منسوخ شده است. به جای آن از «window.zoomLevel» استفاده کنید." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "نام جدید برای طرح روی ابر\n " }, "replaceMsg": "آیا می خواهید نسخه موجود را با {0} جایگزین کنید؟", "selectZip": "یک فایل فشرده حاوی کتابخانه ای را که می خواهید اضافه کنید انتخاب کنید", "serial": { "autoscroll": "پیمایش خودکار", "carriageReturn": "رفتن به سر سطر", - "connecting": "Connecting to '{0}' on '{1}'...", + "connecting": "برقراری ارتباط '{0}' روی '{1}'", "message": "پیام (برای ارسال پیام به '' د{0}ر '' وارد شوید{1})", "newLine": "خط جدید", "newLineCarriageReturn": "هم NL و هم CR", @@ -439,31 +443,33 @@ "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": "ذخیره پوشه طرح در ...", "showFolder": "نمایش پوشه ظرح", "sketch": "طرح", + "sketchAlreadyContainsThisFileError": "طرح از قبل حاوی یک پرونده با نام '{0}' می باشد.", + "sketchAlreadyContainsThisFileMessage": "عدم موفقیت در ذخیره سازی \"{0}\" به عنوان \"{1}\". {2}", "sketchbook": "منبع طرح ها", "titleLocalSketchbook": "منبع طرح محلی", "titleSketchbook": "منبع طرح ها", - "upload": "آپلود", + "upload": "بارگذاری", "uploadUsingProgrammer": "بارگذاری با استفاده از پروگرامر", "uploading": "درحال بارگذاری...", "userFieldsNotFoundError": "عدم یافت شدن فیلد های کاربر برای برد متصل", @@ -471,8 +477,8 @@ "verifyOrCompile": "تائید / کامپایل" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "طرح جدید روی فضای ابری", + "newSketch": "طرح جدید" }, "survey": { "answerSurvey": "به نظرسنجی پاسخ دهید", @@ -480,16 +486,16 @@ "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": "Dark High Contrast", - "hcLight": "Light 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": "به روز رسانی شاخص ها", @@ -505,15 +511,15 @@ "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": { @@ -534,8 +540,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/fil.json b/i18n/fil.json index 821392850..540002e5a 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -139,6 +139,7 @@ "installManually": "Install Manually", "later": "Mamaya", "noBoardSelected": "Walang board na pinili. ", + "noSketchOpened": "No sketch opened", "notConnected": "[hindi konektado] ", "offlineIndicator": "Mukhang ikaw ay offline. Kung walang internet, maaaring hindi madownload ng Arduino CLI ang mga kakailanganin nitong resources at mag-malfunction. Kumonekta sa internet at i-restart ang application. ", "oldFormat": "Ang '{0}' ay gumagamit pa ng lumang `.pde` format. Gusto mo bang gamitin ang bagong `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Pinoproseso", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Ang debugging ay hindi suportado ng '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Ang platform ay hindi naka-install para sa '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/fr.json b/i18n/fr.json index 8ac0ad762..1ce2da3c8 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -139,6 +139,7 @@ "installManually": "Installer manuellement.", "later": "Plus tard", "noBoardSelected": "Aucune carte sélectionnée.", + "noSketchOpened": "No sketch opened", "notConnected": "[hors ligne]", "offlineIndicator": "Il semblerait que vous êtes déconnecté. Sans connexion internet la CLI d'Arduino pourrait ne pas être en mesure de télécharger les resources requises, ce qui pourrait provoquer des dysfonctionnements. Merci de vous connecter à Internet et de redémarrer l'application.", "oldFormat": "Le '{0}' utilise toujours l'ancien format `.pde`. Souhaitez-vous utiliser le nouveau format `.ino`?", @@ -146,6 +147,7 @@ "processing": "Traitement en cours", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "sur {0}", "serialMonitor": "Moniteur série", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Débogage - {0}", "debuggingNotSupported": "Le débogage n'est pas supporté pour '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "La plateforme n'est pas installée pour '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Sauvegarder un dossier de croquis comme ...", "showFolder": "Ouvrir le dossier de croquis", "sketch": "Croquis", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Carnet de croquis", "titleLocalSketchbook": "Localiser le carnet de croquis", "titleSketchbook": "Carnet de croquis", diff --git a/i18n/he.json b/i18n/he.json index 3f8d9d6d3..80dd5c521 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -139,6 +139,7 @@ "installManually": "התקן ידנית", "later": "אחר כך", "noBoardSelected": "לא נבחר לוח", + "noSketchOpened": "No sketch opened", "notConnected": "[לא מחובר]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "ה'{0}' עדיין משתמש בפורמט הישן `.pde`. האם תרצה להחליף לסיומת החדשה `.ino` ? ", @@ -146,6 +147,7 @@ "processing": "מעבד", "recommended": "מומלץ", "retired": "פרש", + "selectManually": "Select Manually", "selectedOn": "ב {0}", "serialMonitor": "מוניטור סיריאלי", "type": "סוג", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "דיבאג - {0}", "debuggingNotSupported": "דיבאג לא נתמך על ידי '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "פלטפורמה אינה מותקנת עבור ׳{0}׳", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "שמירת תיקיית הסקיצה כ...", "showFolder": "הראה תיקית הסקיצה", "sketch": "סקיצה", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "ספר סקיצות", "titleLocalSketchbook": "ספר סקיצות מקומי", "titleSketchbook": "ספר סקיצות", diff --git a/i18n/hu.json b/i18n/hu.json index 9c1b919fb..9323774f3 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -139,6 +139,7 @@ "installManually": "Kézi telepítés", "later": "később", "noBoardSelected": "Nincsen alappanel kiválasztva", + "noSketchOpened": "No sketch opened", "notConnected": "[nem csatlakozik]", "offlineIndicator": "Az internet nem érhető el. Internetkapcsolat nélkül előfordulhat, hogy az Arduino CLI nem tudja letölteni a szükséges erőforrásokat, és hibás működést okozhat. Csatlakozz az internethez és indítsd újra az alkalmazást. ", "oldFormat": "A „{0}” továbbra is a régi „.pde” formátumot használja. Szeretnéd átírni az új `.ino` kiterjesztésre? ", @@ -146,6 +147,7 @@ "processing": "Feldolgozás", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "{0}-n", "serialMonitor": "Soros monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Hibakeresés/Debug - {0}", "debuggingNotSupported": "A hibakeresést a '{0}' nem támogatja ", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "A platform nincs telepítve a következőhöz: „{0}” ", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Vázlat-/sketch-mappa mentése másként... ", "showFolder": "Vázlat-/sketch-mappa megjelenítése", "sketch": "Vázlat/sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Vázlatfüzet/sketchbook ", "titleLocalSketchbook": "Helyi vázlatfüzet/sketchbook ", "titleSketchbook": "Vázlatfüzet/sketchbook ", diff --git a/i18n/id.json b/i18n/id.json index 7f261e9bf..3454cf733 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -139,6 +139,7 @@ "installManually": "Install Manually", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Processing", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "noProgrammerSelectedFor": "No programmer selected 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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/it.json b/i18n/it.json index 9f85f8d03..61e4d6a4a 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -139,6 +139,7 @@ "installManually": "Installa manualmente", "later": "Salta", "noBoardSelected": "Nessuna scheda selezionata", + "noSketchOpened": "Nessuno sketch aperto", "notConnected": "[non connesso]", "offlineIndicator": "Sembra che tu sia offline. Senza una connessione Internet, l'Arduino CLI potrebbe non essere in grado di scaricare le risorse richieste e potrebbe causare un malfunzionamento. Verificare la connessione a Internet e riavviare l'applicazione.", "oldFormat": "Il '{0}' utilizza ancora il vecchio formato `.pde`. Vuoi sostituirlo con la nuova estensione `.ino?", @@ -146,6 +147,7 @@ "processing": "In elaborazione", "recommended": "Consigliato", "retired": "Fuori produzione", + "selectManually": "Seleziona manualmente", "selectedOn": "su {0}", "serialMonitor": "Monitor seriale", "type": "Tipo", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Il debug non è supportato da '{0}'", + "getDebugInfo": "Acquisizione delle informazioni di debug in corso...", "noPlatformInstalledFor": "La piattaforma non è ancora stata installata per '{0}'", + "noProgrammerSelectedFor": "Nessun programmatore selezionato per '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Salva la cartella dello sketch come...", "showFolder": "Mostra la cartella dello Sketch", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "Lo sketch contiene già un file denominato '{0}'", + "sketchAlreadyContainsThisFileMessage": "Impossibile salvare lo sketch \"{0}\" come \"{1}\". {2}", "sketchbook": "Raccolta degli sketch", "titleLocalSketchbook": "Cartella degli sketch locali", "titleSketchbook": "Sketchbook", diff --git a/i18n/ja.json b/i18n/ja.json index c0611ea31..1d852e9b5 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -139,6 +139,7 @@ "installManually": "手動でインストール", "later": "後で", "noBoardSelected": "ボード未選択", + "noSketchOpened": "No sketch opened", "notConnected": "[未接続]", "offlineIndicator": "オフラインのようです。 インターネットに接続していないと、Arduino CLIが必要なリソースをダウンロードできず、誤動作を引き起こす可能性があります。 インターネットに接続して、アプリケーションを再起動してください。", "oldFormat": "'{0}'はまだ古い`.pde`形式を使用しています。新しい`.ino`拡張子に切り替えますか?", @@ -146,6 +147,7 @@ "processing": "処理中", "recommended": "推奨", "retired": "廃止済み", + "selectManually": "Select Manually", "selectedOn": "{0}の", "serialMonitor": "シリアルモニタ", "type": "タイプ", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "デバッグ - {0}", "debuggingNotSupported": "デバッグは'{0}'ではサポートされていません。", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}'用にプラットフォームがインストールされていません。", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "デバッグに最適化", "sketchIsNotCompiled": "デバッグセッションを開始する前に、スケッチ'{0}'を検証する必要があります。スケッチを検証してから、もう一度デバッグを開始してください。今すぐスケッチを検証しますか?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "スケッチを別名で保存…", "showFolder": "スケッチフォルダを表示", "sketch": "スケッチ", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "スケッチブック", "titleLocalSketchbook": "ローカルスケッチブック", "titleSketchbook": "スケッチブック", diff --git a/i18n/ko.json b/i18n/ko.json index d2f856582..4c6d0d8da 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -108,14 +108,14 @@ "pull": "Pull", "pullFirst": "클라우드로 Push하려면 먼저 Pull 합니다.", "pullSketch": "Pull 스케치", - "pullSketchMsg": "Pulling this Sketch from the Cloud will overwrite its local version. Are you sure you want to continue?", + "pullSketchMsg": "클라우드에서 이 스케치를 가져오면 로컬 버전을 덮어쓰게 됩니다. 계속하시겠습니까?", "push": "Push", "pushSketch": "Push 스케치", - "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.", + "pushSketchMsg": "이것은 공개 스케치입니다. 클라우드로 내보내기 전에 민감한 정보가 arduino_secrets.h 파일에 정의되어 있는지 확인하세요. 공유 패널에서 스케치를 비공개로 설정할 수 있습니다.", "remote": "원격", "share": "공유...", "shareSketch": "스케치 공유", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "클라우드 스케치북 보이기/숨기기", "signIn": "로그인", "signInToCloud": "아두이노 클라우드에 로그인", "signOut": "로그아웃", @@ -139,6 +139,7 @@ "installManually": "수동으로 설치", "later": "나중에", "noBoardSelected": "선택된 보드 없음", + "noSketchOpened": "No sketch opened", "notConnected": "[연결되지 않음]", "offlineIndicator": "오프라인 상태인 것 같습니다. 인터넷 연결이 없으면 Arduino CLI가 필요한 리소스를 다운로드하지 못하고 오작동을 일으킬 수 있습니다. 인터넷에 연결하고 애플리케이션을 다시 시작해주세요.", "oldFormat": "'{0}' 파일은 오래된 `.pde` 확장자로 되어있어요. 새로운 `.ino` 확장자로 변경하시겠어요?", @@ -146,6 +147,7 @@ "processing": "처리 중", "recommended": "추천됨", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "{0} 켜기", "serialMonitor": "시리얼 모니터", "type": "Type", @@ -170,7 +172,7 @@ "title": "{0} by {1}", "uninstall": "설치해제", "uninstallMsg": "설치해제를 원하십니까 {0}?", - "update": "Update" + "update": "업데이트" }, "configuration": { "cli": { @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "디버그 - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}'에 대한 플랫폼이 설치되어 있지 않습니다", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -250,7 +254,7 @@ "selectBoard": "보드 선택", "selectVersion": "펌웨어 버전 선택", "successfullyInstalled": "펌웨어가 성공적으로 설치되었습니다.", - "updater": "Firmware Updater" + "updater": "펌웨어 업데이터" }, "help": { "environment": "환경", @@ -460,6 +464,8 @@ "saveSketchAs": "스케치 폴더를 다른 이름으로 저장...", "showFolder": "스케치 폴더 보기", "sketch": "스케치", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "스케치북", "titleLocalSketchbook": "로컬 스케치북", "titleSketchbook": "스케치북", diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 08b058070..b305a978d 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -139,6 +139,7 @@ "installManually": "ကိုယ်တိုင်တပ်ဆင်မည်", "later": "နောက်မှ", "noBoardSelected": "ဘုတ် မရွေးချယ်ထားပါ", + "noSketchOpened": "No sketch opened", "notConnected": "[မချိတ်ဆက်ထားပါ]", "offlineIndicator": "အော့ဖ်လိုင်းဖြစ်နေသည်။ အင်တာနက်မရှိလျှင် Arduino CLIသည် လိုအပ်သော ဒေတာများမရယူနိုင်သောကြောင့် လုပ်ဆောင်ချက်ချို့ယွင်းမှုဖြစ်ပေါ်မည်။ အင်တာနက်နှင့်ချိတ်ဆက်ပြီး အပ္ပလီကေးရှင်းကို ပြန်စတင်ပေးပါ။", "oldFormat": "'{0}'သည် မူပုံစံအဟောင်း `.pde`ကိုအသုံးပြုထားသည်။ ဖိုင်လ်တိုးချဲ့အမှတ်အသားအသစ် `.ino` သို့ ပြောင်းလဲမှာလား။", @@ -146,6 +147,7 @@ "processing": "အဆင့်ဆင့်ဆောင်ရွက်နေသည်", "recommended": "အသုံးပြုရန်အကြုံပြုထားသည်များ", "retired": "အငြိမ်းစား", + "selectManually": "Select Manually", "selectedOn": "{0}တွင်", "serialMonitor": "အတန်းလိုက်ဆက်သွယ်မှုမော်နီတာ", "type": "အမျိုးအစား", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "ပြစ်ချက်ရှာဖွေချက် - {0}", "debuggingNotSupported": "ကုတ်ပြစ်ချက်ရှာဖွေမှုကို '{0}'မှ မပေးထားပါ", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}' အတွက် ပလက်ဖောင်းကို မထည့်သွင်းရသေးပါ", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "ကုတ်ဖိုင်လ် ဖိုလ်ဒါကို သိမ်းမည်…", "showFolder": "ကုတ်ပုံကြမ်းဖိုလ်ဒါပြမည်", "sketch": "ကုတ်ပုံကြမ်း", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "ကုတ်ဖိုင်လ်စာအုပ်", "titleLocalSketchbook": "စက်တွင်းကုတ်ဖိုင်လ်စာအုပ်", "titleSketchbook": "ကုတ်ဖိုင်လ်စာအုပ်", diff --git a/i18n/ne.json b/i18n/ne.json index 9b8856501..dfe400c1f 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -1,13 +1,13 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", - "label": "About {0}" + "detail": "संस्करण: {0}\nमिति: {1} {2}\nCLI संस्करण: {3}\n\n{4} ", + "label": "{0}को बारेमा " }, "account": { "goToCloudEditor": "क्लाउड सम्पादकमा जानुहोस् |", "goToIoTCloud": "IoT क्लाउडमा जानुहोस् । ", - "goToProfile": "प्रोफाइल मा जानुहोस् ।", + "goToProfile": "प्रोफाइल मा जानुहोस्।", "menuTitle": "आर्डुइनो क्लाउड्" }, "board": { @@ -25,520 +25,526 @@ "noBoardsFound": "\"{0}\" को लागि कुनै बोर्ड फेला परेन।", "noNativeSerialPort": "Native serial port, जानकारी प्राप्त गर्न सक्दैन। ", "noPortsDiscovered": "कुनै पोर्टहरू फेला परेन।", - "nonSerialPort": "Non-serial port, can't obtain info.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "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.", - "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", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", + "nonSerialPort": "गैर-सीरियल पोर्ट, जानकारी प्राप्त गर्न सकिदैन | ", + "openBoardsConfig": "अन्य बोर्ड र पोर्ट चयन गर्नुहोस्...", + "pleasePickBoard": "कृपया तपाईंले चयन गर्नुभएको पोर्टमा जडान भएको बोर्ड छान्नुहोस्।", + "port": "पोर्ट {0}", + "ports": "पोर्टहरू", + "programmer": "प्रोग्रामर", + "reselectLater": "पुन: चयन गर्नुहोस्", + "revertBoardsConfig": "'{1}' मा फेला परेको '{0}' प्रयोग गर्नुहोस्", + "searchBoard": "बोर्ड खोज्नुहोस। ", + "selectBoard": "बोर्ड छान्नुहोस । ", + "selectPortForInfo": "बोर्ड जानकारी प्राप्त गर्न पोर्ट चयन गर्नुहोस्।", + "showAllAvailablePorts": "अनुमति हुँदा सबै उपलब्ध पोर्टहरू देखाउँछ।", + "showAllPorts": "पोर्टहरु हेर्नुहोस |", + "succesfullyInstalledPlatform": "प्लेटफर्म {0} : {1} को स्थापना सफलतापूर्वक रद्द गरियो।", + "succesfullyUninstalledPlatform": "प्लेटफर्म {0} : {1} सफलतापूर्वक अनइन्स्टल गरियो।", + "typeOfPorts": "{0} पोर्टहरू", + "unconfirmedBoard": "पुष्टि नभएको बोर्ड", + "unknownBoard": "बोर्ड चिनिएन" + }, + "boardsManager": "बोर्ड म्यानेजर ", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "अर्डुइनो प्रमाणित" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "बूटलोडर बर्न् गर्नुहोस। ", + "burningBootloader": "बूटलोडर बर्न् गर्दै... ", + "doneBurningBootloader": "बूटलोडर बर्न् भयो। " }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "{0}: बुटलोडर बर्न् गर्दा त्रुटि भेटियो। " }, "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "addNew": "नयाँ राख्नुहोस। ", + "addURL": "SSL प्रमाणपत्र ल्याउन URL राख्नुहोस्। ", + "boardAtPort": "{1} मा {0}", + "certificatesUploaded": "प्रमाणपत्रहरू अपलोड गरियो।", + "enterURL": "URL राख्नुहोस्। ", + "noSupportedBoardConnected": "कुनै समर्थित बोर्ड जडान गरिएको छैन |", + "openContext": "सन्दर्भ खोल्नुहोस् |", + "remove": "हटाउनुहोस्", + "selectBoard": "बोर्ड छान्नुहोस |", + "selectCertificateToUpload": "1. अपलोड गर्न प्रमाणपत्र चयन गर्नुहोस् |", + "selectDestinationBoardToUpload": "2. बोर्ड चयन गर्नुहोस् र प्रमाणपत्र अपलोड गर्नुहोस् |", + "upload": "अपलोड गर्नुहोस्", + "uploadFailed": "अपलोड असफल भयो | कृपया फेरि प्रयास गर्नुहोस |", + "uploadRootCertificates": "SSL रूट प्रमाणपत्रहरू अपलोड गर्नुहोस्", + "uploadingCertificates": "प्रमाणपत्रहरू अपलोड गर्दै |" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Arduino अपडेटको लागि जाँच गर्नुहोस्", + "installAll": "सबै स्थापना गर्नुहोस्", + "noUpdates": "हाल कुनै अपडेटहरू उपलब्ध छैनन् |", + "promptUpdateBoards": "तपाईंका केही बोर्डहरूको लागि अपडेटहरू उपलब्ध छन्।", + "promptUpdateLibraries": "तपाईंका केही लाईब्रेरिहरुको लागि अपडेटहरू उपलब्ध छन्।", + "updatingBoards": "बोर्डहरू अद्यावधिक गर्दै...", + "updatingLibraries": "लाईब्रेरिहरु अद्यावधिक गर्दै..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "'Keyboard' फेला परेन। के तपाईको स्केचमा 'include<Keyboard.h>' लाई समावेश गरिएको छ?", + "mouseError": "'Mouse'फेला परेन। के तपाईको स्केचमा 'include<Mouse.h>' लाई समावेश गरिएको छ?" }, "cloud": { - "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." + "chooseSketchVisibility": "आफ्नो स्केचको दृश्यता छान्नुहोस्:", + "cloudSketchbook": "क्लाउड स्केचबुक", + "connected": "जोडियो ", + "continue": "जारी राख्नुहोस्", + "donePulling": "'{0}' पूल् गरेर सकियो|", + "donePushing": "'{0}' पूस् गरेर सकियो|", + "embed": "इम्बेड:", + "emptySketchbook": "तपाईको स्केचबुक खाली छ", + "goToCloud": "क्लाउडमा जानुहोस्", + "learnMore": "विस्तृत रूपमा जान्नुहोस्| ", + "link": "लिङ्क:", + "notYetPulled": "क्लाउडमा पूस् गर्न सकिदैन । यो अझै पूल् हुन बाँकी छ । ", + "offline": "अफलाइन", + "openInCloudEditor": "क्लाउड सम्पादकमा खोल्नुहोस्", + "options": "विकल्पहरू...", + "privateVisibility": "निजी। तपाईं मात्र स्केच हेर्न सक्नुहुन्छ।", + "profilePicture": "प्रोफाइल तस्वीर", + "publicVisibility": "सार्वजनिक। लिङ्क भएका जो कोहीले स्केच हेर्न सक्छन्।", + "pull": "पुल", + "pullFirst": "क्लाउडमा पूस् गर्नका लागि तपाईंले पहिले पुल गर्नु पर्छ।", + "pullSketch": "स्केच पुल गर्नुहोस", + "pullSketchMsg": "क्लाउडबाट यो स्केच पुल गर्दा यस्मा भएको संस्करण अधिलेखन हुनेछ। के तपाइँ जारी राख्न निश्चित हुनुहुन्छ?", + "push": "पुश", + "pushSketch": "स्केच पुश गर्नुहोस", + "pushSketchMsg": "यो सार्वजनिक स्केच हो। पुश गर्नु अघि, arduino_secrets.h फाइलहरूमा कुनै पनि संवेदनशील जानकारी परिभाषित गरिएको छ भने सुनिश्चित गर्नुहोस्। तपाईंले साझेदारी प्यानलबाट स्केच निजी बनाउन सक्नुहुन्छ।", + "remote": "रिमोट", + "share": "साझेदारी...", + "shareSketch": "स्केच साझेदारी गर्नुहोस", + "showHideSketchbook": "क्लाउड स्केचबुक देखाउनुहोस् / लुकाउनुहोस्", + "signIn": "साइन इन ", + "signInToCloud": "अर्डुइनो क्लाउड मा साइन इन गर्नुहोस्", + "signOut": "साइन आउट ", + "sync": "सिंक गर्नुहोस्", + "syncEditSketches": "आफ्नो अर्डुइनो क्लाउड स्केचहरू सिङ्क गरेर सम्पादन गर्नुहोस्", + "visitArduinoCloud": "क्लाउड स्केचहरू सिर्जना गर्न अर्डुइनो क्लाउडमा जानुहोस्" }, "cloudSketch": { - "alreadyExists": "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", - "installManually": "Install Manually", - "later": "Later", + "all": "सबै", + "contributed": "योगदान गरेको", + "installManually": "म्यानुअल रूपमा स्थापना गर्नुहोस्", + "later": "पछि", "noBoardSelected": "बोर्ड चयन गरिएको छैन।", + "noSketchOpened": "No sketch opened", "notConnected": "[ जोडिएको छैन ]", "offlineIndicator": "तपाईं अफलाइन हुनुहुन्छ। इन्टरनेट जडान बिना, Arduino CLI आवश्यक स्रोतहरू डाउनलोड गर्न सक्षम नहुन सक्छ र यसले खराबी निम्त्याउन सक्छ। कृपया इन्टरनेट जडान गर्नुहोस् र एप पुन: सुरु गर्नुहोस्।", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "partner": "Partner", - "processing": "Processing", - "recommended": "Recommended", - "retired": "Retired", - "selectedOn": "on {0}", + "oldFormat": "'{0}' ले अझै पुरानो '.pde' ढाँचा प्रयोग गर्छ। के तपाइँ नयाँ '.ino' एक्सटेन्सनमा स्विच गर्न चाहनुहुन्छ?", + "partner": "साथी", + "processing": "प्रशोधन हुँदैछ", + "recommended": "सिफारिस गरिएको", + "retired": "सेवानिवृत्त भएको", + "selectManually": "Select Manually", + "selectedOn": "{0} मा", "serialMonitor": "सिरियल मनिटर", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" + "type": "प्रकार", + "unknown": "थाहा नभएको", + "updateable": "अपडेट गर्न मिल्ने" }, "compile": { - "error": "Compilation error: {0}" + "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" + "boardsIncluded": "यस प्याकेजमा समावेश बोर्डहरू:", + "by": "द्वारा", + "clickToOpen": "ब्राउजरमा खोल्न क्लिक गर्नुहोस्: {0}", + "filterSearch": "आफ्नो खोज फिल्टर गर्नुहोस...", + "install": "स्थापना गर्नुहोस्", + "installLatest": "नवीनतम संस्करण स्थापना गर्नुहोस्", + "installVersion": "{0} स्थापना गर्नुहोस्", + "installed": "{0} स्थापित भयो", + "moreInfo": "थप जानकारी", + "otherVersions": "अन्य संस्करणहरू", + "remove": "हटाउनुहोस्", + "title": "{1} द्वारा {0}", + "uninstall": "स्थापना रद्द गर्नुहोस्", + "uninstallMsg": "के तपाई {0} को स्थापना रद्द गर्न चाहनुहुन्छ?", + "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": "Add File", - "fileAdded": "One file added to the sketch.", + "addFile": "फाइल थप्नुहोस्", + "fileAdded": "स्केचमा एउटा फाइल थपियो", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "सिरियल प्लटर खोल्न सकेन" }, - "replaceTitle": "Replace" + "replaceTitle": "प्रतिस्थापन गर्नुहोस्" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "सबै", + "default": "पूर्वनिर्धारित", + "more": "थप", + "none": "कुनै पनि होइन" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "त्रुटि सन्देशहरूको प्रतिलिपि गर्नुहोस्", + "noBoardSelected": "बोर्ड चयन गरिएको छैन। कृपया उपकरण>बोर्ड मेनुबाट आफ्नो अर्डुइनो बोर्ड चयन गर्नुहोस्|" }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "स्केचलाई क्लाउडमा पुश गर्नुहोस्", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "डेमन पुन: सुरु गर्नुहोस्", + "start": "डेमन सुरु गर्नुहोस्", + "stop": "डेमन रोक्नुहोस्" }, "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging", - "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?" + "debugWithMessage": "डिबग - {0}", + "debuggingNotSupported": "डिबगिङ '{0}' द्वारा समर्थित छैन", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "'{0}' को लागि प्लेटफर्म स्थापना गरिएको छैन", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", + "optimizeForDebugging": "डिबगिङका लागि अप्टिमाइज गर्नुहोस्", + "sketchIsNotCompiled": "डिबग अवधि सुरु गर्नु अघि स्केच {0} पुष्टि गरिनुपर्छ। कृपया स्केच पुष्टि गर्नुहोस् र फेरि डिबगिङ सुरु गर्नुहोस्। के तपाई अहिले स्केच पुष्टि गर्न चाहनुहुन्छ?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "बोर्ड इतिहास सूची खाली गर्नुहोस्", + "clearBoardsConfig": "चयन गरिएको बोर्ड र पोर्ट खाली गर्नुहोस् हटाउनुहोस्", + "dumpBoardList": "बोर्ड सूची हटाउनुहोस्" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "फेरि नसोध्नुहोस्" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "autoFormat": "ढाँचा स्वत: मिलाउनुहोस", + "commentUncomment": "टिप्पणी / टिप्पणी हटाउनुहोस्", + "copyForForum": "फोरमको लागि प्रतिलिपि गर्नुहोस् (मार्कडाउन)", + "decreaseFontSize": "फन्ट साइज घटाउनुहोस्", + "decreaseIndent": "इन्डेन्ट घटाउनुहोस्", + "increaseFontSize": "फन्ट साइज बढाउनुहोस्", + "increaseIndent": "इन्डेन्ट बढाउनुहोस्", + "nextError": "अर्को त्रुटि", + "previousError": "अघिल्लो त्रुटि", + "revealError": "त्रुटि देखाउनुहोस" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" + "builtInExamples": "पुन: निर्मित उदाहरणहरू", + "couldNotInitializeExamples": "पुन: निर्मित उदाहरणहरू सुरु गर्न सकिएन", + "customLibrary": "अनुकूलन लाईब्रेरीका उदाहरणहरू", + "for": "{0} को लागि उदाहरणहरू", + "forAny": "कुनै पनि बोर्डको लागि उदाहरणहरू", + "menu": "उदाहरणहरू" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "Firmware Updater" + "checkUpdates": "अपडेटहरू जाँच गर्नुहोस्", + "failedInstall": "स्थापना असफल भयो। फेरि प्रयास गर्नुहोस", + "install": "स्थापना गर्नुहोस्", + "installingFirmware": "फर्मवेयर स्थापना हुँदैछ", + "overwriteSketch": "स्थापना गर्दा बोर्डमा स्केच अधिलेखन हुनेछ", + "selectBoard": "बोर्ड चयन गर्नुहोस्।", + "selectVersion": "फर्मवेयर संस्करण चयन गर्नुहोस्", + "successfullyInstalled": "फर्मवेयर सफलतापूर्वक स्थापित भयो।", + "updater": "फर्मवेयर अपडेटर" }, "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" + "environment": "वातावरण", + "faq": "बारम्बार सोधिने प्रश्नहरू", + "findInReference": "सन्दर्भमा फेला पार्नुहोस्", + "gettingStarted": "सुरु गर्दै", + "keyword": "किवर्ड टाइप गर्नुहोस्", + "privacyPolicy": "गोपनीयता नीति", + "reference": "सन्दर्भ", + "search": "Arduino.cc मा खोज्नुहोस्", + "troubleshooting": "समस्या निवारण", + "visit": "Arduino.cc मा जानुहोस्" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." + "checkForUpdates": "Arduino IDE अपडेटहरूको लागि जाँच गर्नुहोस्", + "closeAndInstallButton": "बन्द गरेर र स्थापना गर्नुहोस्", + "closeToInstallNotice": "सफ्टवेयर बन्द गर्नुहोस् र आफ्नो मेसिनमा अपडेट स्थापना गर्नुहोस्।", + "downloadButton": "डाउनलोड ", + "downloadingNotice": "अर्डुइनो IDE को नवीनतम संस्करण डाउनलोड हुँदैछ।", + "errorCheckingForUpdates": "अर्डुइनो IDE अपडेटहरूको लागि जाँच गर्दा त्रुटि भेटियो।\n{0}", + "goToDownloadButton": "डाउनलोड मा जानुहोस्", + "goToDownloadPage": "अर्डुइनो IDE को लागि अपडेट उपलब्ध छ, तर हामी यसलाई स्वचालित रूपमा डाउनलोड र स्थापना गर्न सकेनौँ । कृपया डाउनलोड पृष्ठमा जानुहोस् र त्यहाँबाट नवीनतम संस्करण डाउनलोड गर्नुहोस्।", + "ideUpdaterDialog": "सफ्टवेयर अपडेट", + "newVersionAvailable": "अर्डुइनो IDE ({0})को नयाँ संस्करण डाउनलोडको लागि उपलब्ध छ।", + "noUpdatesAvailable": "अर्डुइनो IDE को लागि कुनै हालको अपडेटहरू उपलब्ध छैनन्", + "notNowButton": "अहिले होइन", + "skipVersionButton": "संस्करण छोड्नुहोस्", + "updateAvailable": "अपडेट उपलब्ध छ", + "versionDownloaded": "अर्डुइनो IDE {0} डाउनलोड गरिएको छ।" }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": " '{0} {1}' लाईब्रेरी स्थापना गर्न असफल भयो।", + "platformInstallFailed": " '{0} {1}' प्लेटफर्म स्थापना गर्न असफल भयो।" }, "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" + "addZip": ".ZIP लाइब्रेरी राख्नुहोस...", + "arduinoLibraries": "अर्डुइनो लाईब्रेरीहरू", + "contributedLibraries": "योगदान गरिएको लाईब्रेरीहरू ", + "include": "लाइब्रेरी समावेश गर्नुहोस्", + "installAll": "सबै स्थापना गर्नुहोस्", + "installLibraryDependencies": "लाइब्रेरी निर्भरताहरू स्थापना गर्नुहोस्", + "installMissingDependencies": "के तपाइँ सबै छुटेको निर्भरताहरू स्थापना गर्न चाहनुहुन्छ?", + "installOneMissingDependency": "के तपाइँ छुटेको निर्भरता स्थापना गर्न चाहनुहुन्छ?", + "installWithoutDependencies": "निर्भरता बिना स्थापना गर्नुहोस्", + "installedSuccessfully": "{0}:{1} लाइब्रेरी सफलतापूर्वक स्थापना गरियो", + "libraryAlreadyExists": "एउटा पुस्तकालय पहिले नै अवस्थित छ। के तपाइँ यसलाई अधिलेखन गर्न चाहनुहुन्छ?", + "manageLibraries": "लाईब्रेरीहरू व्यवस्थापन गर्नुहोस्...", + "namedLibraryAlreadyExists": "{0} नामको लाईब्रेरी फोल्डर पहिले नै अवस्थित छ। के तपाइँ यसलाई अधिलेखन गर्न चाहनुहुन्छ?", + "needsMultipleDependencies": "<b> {0}:{1} </b> लाईब्रेरीलाई हाल स्थापित नभएका केही अन्य निर्भरताहरू चाहिन्छ:", + "needsOneDependency": "<b> {0} : {1} </b> लाईब्रेरीलाई हाल स्थापित नभएको अर्को निर्भरता चाहिन्छ:", + "overwriteExistingLibrary": "के तपाइँ अवस्थित लाइब्रेरी अधिलेखन गर्न चाहनुहुन्छ?", + "successfullyInstalledZipLibrary": "{0} अभिलेखबाट लाइब्रेरी सफलतापूर्वक स्थापना गरियो", + "title": "लाईब्रेरी प्रबन्धक", + "uninstalledSuccessfully": "{0} : {1} लाईब्रेरीको स्थापना सफलतापूर्वक रद्द गरियो", + "zipLibrary": "लाईब्रेरी " }, "librarySearchProperty": { - "topic": "Topic" + "topic": "विषय" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "संचार", + "dataProcessing": "डाटा प्रशोधन", + "dataStorage": "डाटा भण्डारण", + "deviceControl": "उपकरण नियन्त्रण", + "display": "प्रदर्शन", + "other": "अन्य", + "sensors": "सेन्सरहरू", + "signalInputOutput": "सिग्नल इनपुट/आउटपुट", + "timing": "समय", + "uncategorized": "अवर्गीकृत" }, "libraryType": { - "installed": "Installed" + "installed": "स्थापित" }, "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" + "advanced": "उन्नत", + "sketch": "स्केच", + "tools": "उपकरणहरू" }, "monitor": { - "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" + "alreadyConnectedError": "{0} {1} पोर्टमा जडान गर्न सकिएन। पहिले नै जोडिएको छ।", + "baudRate": "{0} बड", + "connectionFailedError": "{0} {1} पोर्टमा जडान गर्न सकिएन।", + "connectionFailedErrorWithDetails": "{1} {2} पोर्ट {0}मा जडान गर्न सकिएन।", + "connectionTimeout": "समय सकियो। सफलतापूर्वक जडान गरे पनि IDE ले मनिटरबाट 'सफलता' सन्देश प्राप्त गरेको छैन", + "missingConfigurationError": "{0} {1} पोर्टमा जडान गर्न सकिएन। मनिटर कन्फिगरेसन छुटेको छ।", + "notConnectedError": "{0} {1} पोर्टमा जोडिएको छैन।", + "unableToCloseWebSocket": "वेबसकेट बन्द गर्न सकिएन ", + "unableToConnectToWebSocket": "वेबसकेटमा जडान गर्न सकिएन " }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "नयाँ क्लाउड स्केचको नाम" }, "portProtocol": { - "network": "Network", - "serial": "Serial" + "network": "नेटवर्क", + "serial": "सिरियल" }, "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", + "additionalManagerURLs": "अतिरिक्त बोर्ड प्रबन्धक URLहरू", + "auth.audience": "OAuth2 दर्शक।", + "auth.clientID": "OAuth2 क्लाएन्ट ID।", + "auth.domain": "OAuth2 डोमेन।", + "auth.registerUri": "नयाँ प्रयोगकर्ता दर्ता गर्न प्रयोग गरिएको URI", + "automatic": "स्वचालित", + "board.certificates": "बोर्डहरूमा अपलोड गर्न सकिने प्रमाणपत्रहरूको सूची", + "browse": "ब्राउज गर्नुहोस्", + "checkForUpdate": "IDE, बोर्डहरू र लाईब्रेरीहरूको लागि उपलब्ध अपडेटहरूको सूचनाहरू प्राप्त गर्नुहोस्। परिवर्तन पछि IDE पुन: सुरु गर्न आवश्यक छ। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "choose": "छान्नुहोस्", + "cli.daemonDebug": "Arduino CLI मा gRPC कलहरूको डिबग लगिङ सक्षम गर्नुहोस्। यो सेटिङ प्रभावकारी हुनको लागि IDE को पुन: सुरु गर्न आवश्यक छ। यो पूर्वनिर्धारित सेटिङमा असक्षम छ।", + "cloud.enabled": "स्केच सिंक प्रकार्यहरू सक्रिय छन् भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.pull.warn": "क्लाउड स्केच पुल गर्नु अघि प्रयोगकर्ताहरूलाई चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.push.warn": "क्लाउड स्केच पुश गर्नु अघि प्रयोगकर्ताहरूलाई चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.pushpublic.warn": "यदि प्रयोगकर्ताहरूलाई क्लाउडमा सार्वजनिक स्केच पुश गर्नु अघि चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.sketchSyncEndpoint": "ब्याकइन्डबाट स्केचहरू पुश गर्न र पुल गर्न अन्तिम बिन्दु प्रयोग गरियो। पूर्वनिर्धारित रूपमा यसले Arduino क्लाउड API लाई संकेत गर्दछ।", + "compile": "कम्पाइल ", + "compile.experimental": "यदि IDE ले धेरै कम्पाइलर त्रुटिहरू ह्यान्डल गर्नुपर्छ भने सक्षम गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा असक्षम छ।", + "compile.revealRange": "असफल प्रमाणित/अपलोड पछि सम्पादकमा कम्पाइलर त्रुटिहरू कसरी प्रकट हुन्छन् भनेर समायोजन गर्दछ। कोड परिभाषा हेर्नको लागि अनुकूलित गरिएको सम्भावित मानहरू: 'स्वतः': आवश्यक्ता अनुसार ठाडो रूपमा स्क्रोल गर्नुहोस् र कोड भएको रेखा हेर्नुहोस। 'केन्द्र': आवश्यक्ता अनुसार ठाडो रूपमा स्क्रोल गर्नुहोस् र ठाडो रूपमा केन्द्रित कोड भएको रेखा हेर्नुहोस। 'शीर्ष': आवश्यक रूपमा ठाडो रूपमा स्क्रोल गर्नुहोस् र भ्यूपोर्टको शीर्ष नजिकको रेखा हेर्नुहोस। 'centerIfOutsideViewport': आवश्यकता अनुसार ठाडो रूपमा स्क्रोल गर्नुहोस् र ठाडो रूपमा केन्द्रित रेखालाई भ्यूपोर्ट बाहिर रहेको खण्डमा मात्र प्रकट गर्नुहोस्। यस्को पूर्वनिर्धारित मान '{0}' हो।", + "compile.verbose": "वर्बोज कम्पाइल आउटपुटको लागि सक्षम। पूर्वनिर्धारित रूपमा असक्षम।", + "compile.warnings": "gcc लाई कुन चेतावनी स्तर प्रयोग गर्ने भनेर बताउँछ। पूर्वनिर्धारित रूपमा कुनै पनि अनुमति दिइएको छैन। ", + "compilerWarnings": "कम्पाइलर चेतावनीहरू", + "editorFontSize": "सम्पादकको फन्ट साइज", + "editorQuickSuggestions": "सम्पादकको द्रुत सुझावहरू", + "enterAdditionalURLs": "प्रत्येक पङ्क्तिको लागि एक थप URL प्रविष्ट गर्नुहोस्", + "files.inside.sketches": "स्केचहरू भित्र फाइलहरू देखाउनुहोस्", + "ide.updateBaseUrl": "अपडेटहरू डाउनलोड गर्ने आधार URL। पूर्वनिर्धारित URL 'https://downloads.arduino.cc/arduino-ide' छ।", + "ide.updateChannel": "अपडेट प्राप्त गर्न च्यानल जारी गर्नुहोस्। 'stable' स्थिर रिलीज हो, 'nightly' पछिल्लो विकास निर्माण हो।", + "interfaceScale": "इन्टरफेस स्केल", + "invalid.editorFontSize": "अवैध सम्पादक फन्ट साइज। यो सकारात्मक पूर्णांक हुनुपर्छ।", + "invalid.sketchbook.location": "अवैध स्केचबुक स्थान: {0}", + "invalid.theme": "अमान्य विषयवस्तु।", + "language.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}\"." + "dockPanel": "एप्लिकेसन शेलको क्षेत्र जहाँ _{0}_ विजेट रहनेछ। या त \"तल\" वा \"दायाँ\"। यो \"{1}\" मा पूर्वनिर्धारित छ|" }, - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noCliConfig": "Could not load the CLI configuration", - "noProxy": "No proxy", + "network": "नेटवर्क", + "newSketchbookLocation": "नयाँ स्केचबुक स्थान चयन गर्नुहोस्", + "noCliConfig": "CLI कन्फिगरेसन लोड गर्न सकिएन", + "noProxy": "कुनै प्रोक्सी छैन", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "होस्टको नाम", + "password": "पासवर्ड", + "port": "पोर्ट नम्बर", + "username": "प्रयोगकर्ता नाम" }, - "showVerbose": "Show verbose output during", + "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 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.", + "sketchbook.location": "स्केचबुकको स्थान", + "sketchbook.showAllFiles": "स्केच भित्र सबै स्केच फाइलहरू देखाउन सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा असक्षम छ।", + "survey.notification": "यदि सर्वेक्षण उपलब्ध छ भने प्रयोगकर्ताहरूलाई सूचित गरिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा सही छ।", + "unofficialBoardSupport": "अनौपचारिक बोर्ड समर्थन गर्ने URL को सूचीको लागि क्लिक गर्नुहोस्", + "upload": "अपलोड ", + "upload.verbose": "वर्बोज अपलोड आउटपुट को लागी सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा असक्षम छ। ", + "verifyAfterUpload": "कोड अपलोड गरेपछि प्रमाणित गर्नुहोस्", + "window.autoScale": "प्रयोगकर्ता इन्टरफेसले स्वचालित रूपमा फन्ट साइजसँग मापन गरेमा सही संकेत गर्नुहोस्।", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "यो बहिष्कृत भैसक्यो। यसको सट्टा 'window.zoomLevel' प्रयोग गर्नुहोस्।" } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "क्लाउड स्केचको नयाँ नाम" }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "replaceMsg": "{0} को अवस्थित संस्करण बदल्न चाहनुहुन्छ?", + "selectZip": "तपाईले थप्न चाहनु भएको लाईब्ररी भएको zip फाइल चयन गर्नुहोस्", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "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" + "autoscroll": "स्वत: स्क्रोल", + "carriageReturn": "क्यारिएज रिटर्न ", + "connecting": "'{1}' मा '{0}' सँग जडान गर्दै...", + "message": "सन्देश ('{1}' मा '{0}' लाई सन्देश पठाउन प्रविष्ट गर्नुहोस्)", + "newLine": "नयाँ लाइन", + "newLineCarriageReturn": "NL र CR दुबै", + "noLineEndings": "लाइन अन्त्य नगर्ने ", + "notConnected": "जोडिएको छैन। स्वचालित रूपमा जडान गर्न बोर्ड र पोर्ट चयन गर्नुहोस्।", + "openSerialPlotter": "सिरियल प्लटर ", + "timestamp": "टाइमस्ट्याम्प", + "toggleTimestamp": "टाइमस्ट्याम्प परिवर्तन गर्नुहोस्" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "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" + "archiveSketch": "स्केच अभिलेख गर्नुहोस ", + "cantOpen": "\"{0}\" नामको फोल्डर पहिले नै अवस्थित छ। स्केच खोल्न सकिँदैन।", + "compile": "स्केच कम्पाइल हुँदैछ", + "configureAndUpload": "कन्फिगर गरेर अपलोड गर्नुहोस्", + "createdArchive": "अभिलेख '{0}' सिर्जना गर्नुहोस्।", + "doneCompiling": "कम्पाइल भयो।", + "doneUploading": "अपलोड भयो।", + "editInvalidSketchFolderLocationQuestion": "के तपाईं स्केचलाई फरक स्थानमा सुरक्षित गर्ने प्रयास गर्न चाहनुहुन्छ?", + "editInvalidSketchFolderQuestion": "के तपाइँ फरक नाम संग स्केच सुरक्षित गर्ने प्रयास गर्न चाहनुहुन्छ?", + "exportBinary": "कम्पाइल कम्पाइल बाइनरी निर्यात गर्नुहोस्", + "invalidCloudSketchName": "नाम अक्षर, संख्या, वा अन्डरस्कोरबाट सुरु हुनुपर्छ, त्यसपछि अक्षरहरू, संख्याहरू, ड्यासहरू, थोप्लाहरू र अन्डरस्कोरहरू हुनुपर्छ। अधिकतम लम्बाइ 36 वर्ण हो।", + "invalidSketchFolderLocationDetails": "तपाईले स्केचलाई यही नामको फोल्डरमा सुरक्षित गर्न सक्नुहुन्न।", + "invalidSketchFolderLocationMessage": "अवैध स्केच फोल्डरको स्थान: '{0}'", + "invalidSketchFolderNameMessage": "अवैध स्केच फोल्डरको नाम: '{0}'", + "invalidSketchName": "नाम अक्षर, संख्या, वा अन्डरसोरबाट सुरु हुनुपर्छ, त्यसपछि अक्षरहरू, संख्याहरू, ड्यासहरू, थोप्लाहरू र अन्डरस्कोरहरू हुनुपर्छ, । अधिकतम लम्बाइ 63 वर्ण हो।", + "moving": "सार्दै", + "movingMsg": "फाइल \"{0}\" लाई \"{1}\" नामक स्केच फोल्डर भित्र राख्नपर्छ।\n यो फोल्डर सिर्जना गर्नुहोस्, फाइल सार्नुहोस्, र जारी राख्नुहोस्?", + "new": "नयाँ स्केच", + "noTrailingPeriod": "फाइलको नाम थोप्ला संग समाप्त गर्न मिल्दैन ", + "openFolder": "फोल्डर खोल्नुहोस्", + "openRecent": "पछिल्लो फाइलहरू खोल्नुहोस्", + "openSketchInNewWindow": "नयाँ विन्डोमा स्केच खोल्नुहोस्", + "reservedFilename": "'{0}' आरक्षित फाइलको नाम हो।", + "saveFolderAs": "स्केच फोल्डर यस रूपमा सुरक्षित गर्नुहोस्..", + "saveSketch": "यसलाई पछि फेरि खोल्न आफ्नो स्केच सुरक्षित गर्नुहोस्।", + "saveSketchAs": "स्केच फोल्डर यस रूपमा सुरक्षित गर्नुहोस्..", + "showFolder": "स्केच फोल्डर देखाउनुहोस्", + "sketch": "स्केच", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "स्केचबुक", + "titleLocalSketchbook": "स्थानीय स्केचबुक", + "titleSketchbook": "स्केचबुक", + "upload": "अपलोड गर्नुहोस्", + "uploadUsingProgrammer": "प्रोग्रामर प्रयोग गरेर अपलोड गर्नुहोस्", + "uploading": "अपलोड हुँदैछ...", + "userFieldsNotFoundError": "जडान गरिएको बोर्डको लागि प्रयोगकर्ता क्षेत्रहरू फेला पार्न सकिदैन ", + "verify": "प्रमाणित गर्नुहोस्", + "verifyOrCompile": "प्रमाणित/कम्पाइल गर्नुहोस्" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "नयाँ क्लाउड स्केच", + "newSketch": "नयाँ स्केच" }, "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", - "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "हाल चयन गरिएको विषयवस्तु फेला पार्न सकेन: {0}। अर्डुइनो 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} error: {1}" + "error": "{0} त्रुटि: {1}" }, "userFields": { - "cancel": "Cancel", - "enterField": "Enter {0}", - "upload": "Upload" + "cancel": "रद्द गर्नुहोस्", + "enterField": "{0} प्रविष्ट गर्नुहोस्", + "upload": "अपलोड गर्नुहोस्" }, "validateSketch": { - "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", - "abortFixTitle": "Invalid sketch", - "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", - "renameSketchFileTitle": "Invalid sketch filename", - "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", - "renameSketchFolderTitle": "Invalid sketch name" + "abortFixMessage": "स्केच अझै अमान्य छ। के तपाईं बाँकी समस्याहरू समाधान गर्न चाहनुहुन्छ? '{0}' क्लिक गरेर, नयाँ स्केच खुल्नेछ।", + "abortFixTitle": "अवैध स्केच", + "renameSketchFileMessage": "स्केच फाइल '{0}' प्रयोग गर्न सकिँदैन। {1} के तपाई अहिले स्केच फाइलको नाम परिवर्तन गर्न चाहनुहुन्छ? ", + "renameSketchFileTitle": "स्केच फाइलको नाम अमान्य छ", + "renameSketchFolderMessage": "स्केच '{0}' प्रयोग गर्न सकिँदैन। {1} यो सन्देशबाट छुटकारा पाउन, स्केचको नाम बदल्नुहोस्। के तपाई अहिले स्केचको नाम परिवर्तन गर्न चाहनुहुन्छ?", + "renameSketchFolderTitle": "स्केचको नाम अमान्य छ" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' पहिले नै अवस्थित छ।" } }, "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?" + "cannotConnectBackend": "ब्याकइन्डमा जडान हुन सकेन ", + "cannotConnectDaemon": "CLI डेमनमा जडान गर्न सकेन।", + "couldNotSave": "स्केच सुरक्षित गर्न सकेन। कृपया सुरक्षित नगरिएको काम आफ्नो मनपर्ने पाठ सम्पादकमा प्रतिलिपि गर्नुहोस्, र IDE पुन: सुरु गर्नुहोस्।", + "daemonOffline": "CLI डेमन अफलाइन छ", + "offline": "अफलाइन", + "offlineText": "अफलाइन", + "quitTitle": "के तपाइँ निश्चित हुनुहुन्छ कि तपाइँ छोड्न चाहनुहुन्छ?" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "सुरक्षित गरिएको छैन – {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", - "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file" + "deleteCloudSketch": "क्लाउड स्केच '{0}' स्थायी रूपमा अर्डुइनो सर्भरहरू र स्थानीय क्यासहरूबाट मेटिनेछ। यो कार्य अपरिवर्तनीय छ। के तपाइँ हालको स्केच मेटाउन चाहनुहुन्छ?", + "deleteCurrentSketch": "स्केच '{0}' स्थायी रूपमा मेटिनेछ। यो कार्य अपरिवर्तनीय छ। के तपाइँ हालको स्केच मेटाउन चाहनुहुन्छ?", + "fileNewName": "नयाँ फाइलको लागि नाम", + "invalidExtension": ".{0} एक्स्टेन्सन मान्य छैन ", + "newFileName": "फाइलको लागि नयाँ नाम" } } } diff --git a/i18n/nl.json b/i18n/nl.json index 3a3e91c7b..1703b2371 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -15,36 +15,36 @@ "boardConfigDialogTitle": "Selecteer Ander Bord en Poort", "boardInfo": "Bord Informatie", "boards": "borden", - "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?", - "editBoardsConfig": "Edit Board and Port...", + "configDialog1": "Selecteer een Bord en een Poort als je een schets wilt opladen.", + "configDialog2": "Als je alleen een bord kiest, kun je wel compileren, maar niet je schets opladen.", + "couldNotFindPreviouslySelected": "Kan het eerder geselecteerde bord '{0}' niet vinden in het geïnstalleerde platform '{1}'. Gelieve het bord, dat je wil gebruiken, manueel te selecteren. Wil je het bord nu opnieuw selecteren?", + "editBoardsConfig": "Bewerk Bord en Poort", "getBoardInfo": "Verkrijg Bord Informatie", "inSketchbook": "(in Schetsboek)", - "installNow": "De \"{0} {1}\" kern moet geïnstalleerd zijn om het huidige geselecteerde \"{2}\" bord. Wilt U dit nu installeren?", + "installNow": "De \"{0} {1}\" kern moet geïnstalleerd zijn voor het huidig geselecteerde \"{2}\" bord. Wil je dit nu installeren?", "noBoardsFound": "Geen borden gevonden voor \"{0}\"", "noNativeSerialPort": "Oorpronkelijke seriële poort, ik kan geen info verkrijgen", "noPortsDiscovered": "Geen poorten gevonden", "nonSerialPort": "Dit is geen seriële poort, ik kan geen info verkrijgen", "openBoardsConfig": "Selecteer een ander bord en poort...", - "pleasePickBoard": "Gelieve een bord te selecteren dat verbonden is met de door U gekozen poort.", + "pleasePickBoard": "Gelieve een bord te kiezen dat verbonden is met poort die je geselecteerd hebt.", "port": "Poort{0}", "ports": "poorten", "programmer": "Programmeerapparaat", "reselectLater": "Later opnieuw selecteren", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Bord zoeken", - "selectBoard": "Selecteer Bord", + "selectBoard": "Bord selecteren", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", "showAllAvailablePorts": "Toont alle beschikbare poorten indien ingeschakeld", "showAllPorts": "Toon alle poorten", "succesfullyInstalledPlatform": "Platform {0}:{1} succesvol geïnstalleerd", - "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd", - "typeOfPorts": "\"{0}\" poorten", - "unconfirmedBoard": "Unconfirmed board", + "succesfullyUninstalledPlatform": "Platform {0}:{1} succesvol verwijderd", + "typeOfPorts": "{0} poorten", + "unconfirmedBoard": "Onbevestigd bord", "unknownBoard": "Onbekend bord" }, - "boardsManager": "Borden Beheerder", + "boardsManager": "Bordbeheerder", "boardsType": { "arduinoCertified": "Arduino gecertificeerd" }, @@ -69,7 +69,7 @@ "selectCertificateToUpload": "1. Selecteer certificaat om te uploaden", "selectDestinationBoardToUpload": "2. Selecteer bestemming bord en upload certificaat", "upload": "Uploaden", - "uploadFailed": "Upload mislukt. Probeer het opnieuw.", + "uploadFailed": "Uploaden mislukt. Probeer het opnieuw.", "uploadRootCertificates": "SSL-rootcertificaten uploaden", "uploadingCertificates": "Certificaten uploaden." }, @@ -88,48 +88,48 @@ }, "cloud": { "chooseSketchVisibility": "Kies de zichtbaarheid van je Sketch:", - "cloudSketchbook": "Cload Schetsboek", + "cloudSketchbook": "Cloud Schetsboek", "connected": "Verbonden", "continue": "Doorgaan", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "Klaar met ophalen van '{0}'.", + "donePushing": "Klaar met opladen van '{0}'.", "embed": "Integreren:", "emptySketchbook": "Je schetsboek is leeg", "goToCloud": "Ga naar de Cloud", "learnMore": "Leer meer", "link": "Koppeling:", - "notYetPulled": "Kan niet pushen naar Cloud. Het is nog niet getrokken.", + "notYetPulled": "Kan niet naar de Cloud opladen. Het is nog niet opgehaald.", "offline": "Offline", "openInCloudEditor": "Openen in Cloud Editor", "options": "Opties...", "privateVisibility": "Privaat. Alleen jij kunt de schets bekijken.", "profilePicture": "Profiel afbeelding", "publicVisibility": "Openbaar. Iedereen met de link kan de Sketch bekijken.", - "pull": "Trek", - "pullFirst": "Je moet eerst trekken om naar de Cloud te kunnen pushen.", - "pullSketch": "Schets Trekken", - "pullSketchMsg": "Als u deze schets uit de cloud haalt, wordt de lokale versie overschreven. Weet je zeker dat je door wilt gaan?", - "push": "Push", - "pushSketch": "Push Schets", - "pushSketchMsg": "Dit is een openbare schets. Voordat u gaat pushen, moet u ervoor zorgen dat gevoelige informatie is gedefinieerd in arduino_secrets.h bestanden. U kunt een schets privé maken vanuit het deelvenster Delen.", + "pull": "Ophalen", + "pullFirst": "Je moet eerst ophalen voordat je kan opladen naar de Cloud.", + "pullSketch": "Schets ophalen", + "pullSketchMsg": "Ophalen van deze schets uit de cloud zal de lokale versie overschrijven. Weet je zeker dat je door wilt gaan?", + "push": "Opladen", + "pushSketch": "Schets opladen", + "pushSketchMsg": "Dit is een openbare schets. Wees er zeker van dat eender welke gevoelige informatie in arduino_secrets.h bestanden gedefinieerd is voordat u ze oplaadt. Je kan een schets privé maken vanuit het deelvenster Delen.", "remote": "Op Afstand", "share": "Delen...", "shareSketch": "Schets Delen", "showHideSketchbook": "Toon / Verberg het Cloud Schetsboek", - "signIn": "INLOGGEN", + "signIn": "AANMELDEN", "signInToCloud": "Aanmelden bij Arduino Cloud", - "signOut": "Uitloggen", + "signOut": "Afmelden", "sync": "Sync", - "syncEditSketches": "Synchroniseer en bewerk uw Arduino Cloud Sketches", - "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Sketches te maken." + "syncEditSketches": "Synchroniseer en bewerk je Arduino Cloud Schetsen", + "visitArduinoCloud": "Bezoek Arduino Cloud om Cloud Schetsen te maken." }, "cloudSketch": { "alreadyExists": "Cloud sketch '{0}' bestaat al", "creating": "cloud sketch '{0}'  maken...", "new": "Nieuwe Cloud Sketch", - "notFound": "Kan de cloud sketch '{0}'niet vinden, het bestaat niet.", - "pulling": "Schetsboek synchroniseren, ik haal '{0}'. op .....", - "pushing": "Schetsboek synchroniseren, ik sla '{0}' op.......", + "notFound": "Kan Cloud schets '{0}' niet ophalen, Het bestaat niet.", + "pulling": "Schetsboek synchroniseren, ophalen van '{0}'...", + "pushing": "Schetsboek synchroniseren, opladen van '{0}'...", "renaming": "Cloud schets hernoemen van '{0}' naar '{1}' ...", "synchronizingSketchbook": "Schetsboek synchroniseren..." }, @@ -139,13 +139,15 @@ "installManually": "Handmatig installeren", "later": "Later", "noBoardSelected": "Geen bord geselecteerd", + "noSketchOpened": "No sketch opened", "notConnected": "[niet verbonden]", - "offlineIndicator": "Je lijkt offline te zijn. Zonder een internetverbinding kan de Arduino CLI mogelijk niet de vereiste bronnen downloaden en dit kan storingen veroorzaken. Maak verbinding met het internet en start de applicatie opnieuw. ", + "offlineIndicator": "Je lijkt offline te zijn. Zonder een internetverbinding kan de Arduino CLI mogelijk niet de vereiste bronnen downloaden en dit kan storingen veroorzaken. Maak verbinding met het internet en herstart de applicatie. ", "oldFormat": "De '{0}' gebruikt nog steeds het oude '.pde' formaat. Wil je overstappen naar de nieuwe `.ino` extensie?", "partner": "Partner", "processing": "Verwerken", "recommended": "Aanbevolen", "retired": "Stopgezet", + "selectManually": "Select Manually", "selectedOn": "aan {0}", "serialMonitor": "Seriële Monitor", "type": "Type", @@ -158,19 +160,19 @@ "component": { "boardsIncluded": "Borden in dit pakket:", "by": "door", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "Klip om te openen in browser: {0}", "filterSearch": "Filter je zoekopdracht...", "install": "Installeren", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "Meest recente installeren", + "installVersion": "Installeer {0}", + "installed": "{0}geïnstalleerd", "moreInfo": "Meer informatie", - "otherVersions": "Other Versions", - "remove": "Verwijder", - "title": "{0} by {1}", + "otherVersions": "Andere versies", + "remove": "Verwijderer", + "title": "{0} bij {1}", "uninstall": "Verwijderen", "uninstallMsg": "Wil je {0} verwijderen?", - "update": "Update" + "update": "Bijwerken" }, "configuration": { "cli": { @@ -178,7 +180,7 @@ } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "Verbinding verbroken. Acties en updates voor Cloud schetsen zijn niet beschikbaar." }, "contributions": { "addFile": "Bestand Toevoegen", @@ -198,9 +200,9 @@ }, "coreContribution": { "copyError": "Foutmeldingen kopiëren", - "noBoardSelected": "Geen bord geselecteerd. Selecteer je Arduino-bord in het menu Extra > Board." + "noBoardSelected": "Geen bord geselecteerd. Selecteer je Arduino-bord in het menu Extra > Bord." }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "Schets opladen naar de Cloud.", "daemon": { "restart": "Daemon opnieuw starten", "start": "Daemon starten", @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "Foutopsporing - {0}", "debuggingNotSupported": "Foutopsporing wordt niet ondersteund door '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is niet geïnstalleerd voor '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" + "sketchIsNotCompiled": "Schets '{0}' moet geverifieerd worden voordat de foutopsporing kan beginnen. Verifieer aub de schets opnieuw en herstart foutopsporing. Wil je de schets nu opnieuw verifiëren?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "Bordenlijst-geschiedenis wissen", + "clearBoardsConfig": "Bord en poort selectie wissen", + "dumpBoardList": "Bordenlijst dumpen" }, "dialog": { "dontAskAgain": "Niet meer vragen" @@ -282,8 +286,8 @@ "versionDownloaded": "Arduino IDE {0} is gedownload." }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "Installeren van bibliotheek mislukt: '{0} {1}'.", + "platformInstallFailed": "Installeren van platform mislukt: '{0} {1}'." }, "library": { "addZip": ".ZIP-bibliotheek toevoegen...", @@ -292,16 +296,16 @@ "include": "Bibliotheek Gebruiken", "installAll": "Alles installeren", "installLibraryDependencies": "Installeer de bibliotheek afhankelijkheden", - "installMissingDependencies": "Wilt u de ontbrekende afhankelijkheid installeren?", - "installOneMissingDependency": "Wilt u de ontbrekende afhankelijkheid installeren?", + "installMissingDependencies": "Wil je al de ontbrekende afhankelijkheden installeren?", + "installOneMissingDependency": "Wil je de ontbrekende afhankelijkheid installeren?", "installWithoutDependencies": "Installeer zonder afhankelijkheden", "installedSuccessfully": "Bibliotheek {0}:{1} succesvol geïnstalleerd", - "libraryAlreadyExists": "Er bestaat al een bibliotheek. Wil U het overschrijven? ", + "libraryAlreadyExists": "Er bestaat al een bibliotheek. Wil je het overschrijven? ", "manageLibraries": "Bibliotheken Beheren...", - "namedLibraryAlreadyExists": "Er bestaat al een bibliotheek map met de naam {0}. Wil U het overschrijven?", + "namedLibraryAlreadyExists": "Er bestaat al een bibliotheekmap met de naam {0}. Wil je het overschrijven?", "needsMultipleDependencies": "De bibliotheek <b>{0}:{1}</b> heeft enkele andere afhankelijkheden nodig die momenteel niet zijn geïnstalleerd: ", "needsOneDependency": "De bibliotheek <b>{0}:{1}</b> heeft een andere afhankelijkheid nodig die momenteel niet is geïnstalleerd:", - "overwriteExistingLibrary": "Wilt u de bestaande bibliotheek overschrijven?", + "overwriteExistingLibrary": "Wil je de bestaande bibliotheek overschrijven?", "successfullyInstalledZipLibrary": "Succesvol bibliotheek uit {0} archief geïnstalleerd", "title": "Bibliotheken beheerder", "uninstalledSuccessfully": "Bibliotheek {0}:{1} succesvol verwijdert", @@ -331,13 +335,13 @@ "tools": "Hulpmiddelen" }, "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "alreadyConnectedError": "Kan niet verbinden met {0} {1} poort. Reeds verbonden.", "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": "Kan niet verbinden met {0} {1} poort.", + "connectionFailedErrorWithDetails": "{0} Kan niet verbinden met {1} {2} poort.", + "connectionTimeout": "Time-out. De IDE heeft het 'succes'-bericht niet ontvangen van de monitor nadat er succesvol verbinding mee is gemaakt", + "missingConfigurationError": "Kon geen verbinding maken met de {0} {1} poort. De monitorconfiguratie ontbreekt.", + "notConnectedError": "Niet verbonden met {0}{1}poort.", "unableToCloseWebSocket": "Kan websocket niet sluiten", "unableToConnectToWebSocket": "Kan geen verbinding maken met websocket" }, @@ -361,10 +365,10 @@ "choose": "Kies", "cli.daemonDebug": "Schakel debug logging van de gRPC aanroepen naar de Arduino CLI in. Een herstart van de IDE is nodig om deze instelling in werking te laten treden. Standaard Onwaar.", "cloud.enabled": "Waar als de schets synchronisatie functies zijn ingeschakeld. Standaard ingesteld op waar.", - "cloud.pull.warn": "Waar als de gebruiker verwittigd moet worden voor een cloud schets trekken. Standaard ingesteld op waar. ", - "cloud.push.warn": "Waar als gebruikers moeten worden gewaarschuwd voordat ze een cloud schets pushen. Standaard ingesteld op waar. ", - "cloud.pushpublic.warn": "Waar als gebruikers moeten worden gewaarschuwd voordat ze een openbare schets naar de cloud pushen. Standaard ingesteld op waar.", - "cloud.sketchSyncEndpoint": "Het eindpunt dat wordt gebruikt om schetsen van een backend te pushen en te trekken. Standaard verwijst het naar Arduino Cloud API.", + "cloud.pull.warn": "Waar als de gebruiker verwittigd moet worden voordat een Cloud schets opgehaald wordt. Standaard ingesteld op waar. ", + "cloud.push.warn": "Waar als de gebruiker verwittigd moet worden voordat een Cloud schets opgeladen wordt. Standaard ingesteld op waar. ", + "cloud.pushpublic.warn": "Waar als de gebruiker verwittigd moet worden voordat een publieke Cloud schets opgeladen wordt. Standaard ingesteld op waar. ", + "cloud.sketchSyncEndpoint": "Het eindpunt dat gebruikt wordt voor het opladen of ophalen van schetsen van een backend. Standaard verwijst het naar Arduino Cloud API.", "compile": "compileren", "compile.experimental": "Waar als de IDE meerdere compileer fouten moet afhandelen. Standaard is het Onwaar", "compile.revealRange": "Regelt hoe compileer fouten in de editor getoond worden na een mislukte verificatie/upload. Mogelijke waarden: 'auto': Scroll verticaal als dat nodig is en onthul een regel. 'centreren': Scroll verticaal als nodig en onthul een verticaal gecentreerde lijn. 'top': Scroll verticaal als nodig en onthul een lijn dicht bij de bovenkant van het kijkvenster, geoptimaliseerd voor het bekijken van een code-definitie. 'centerIfOutsideViewport': Scroll verticaal als nodig en onthul een verticaal gecentreerde lijn alleen als ze buiten het kijkvenster ligt. De standaardwaarde is '{0}'.", @@ -399,7 +403,7 @@ }, "showVerbose": "Uitgebreide uitvoer weergeven tijdens", "sketch": { - "inoBlueprint": "Absoluut pad naar het standaard `.ino` systeem blauwdrukbestand. Indien gespecificeerd,, zal de inhoud van het systeem blauwdrukbestand gebruikt worden voor elke nieuwe schets gemaakt met behulp van de IDE. De schetsen zullen gegenereerd worden met de standaard Arduino inhoud indien niet gespecificeerd. Ontoegangelijke blauwdrukbestanden worden genegeerd. **Een herstart van de IDE is nodig** om deze instelling te activeren." + "inoBlueprint": "Absoluut pad naar het standaard `.ino` systeem blauwdrukbestand. Indien opgegeven, zal de inhoud van het systeem blauwdrukbestand gebruikt worden voor elke nieuwe schets gemaakt met behulp van de IDE. De schetsen zullen gegenereerd worden met de standaard Arduino inhoud indien niet opgegeven. Ontoegangelijke blauwdrukbestanden worden genegeerd. **Een herstart van de IDE is nodig** om deze instelling te activeren." }, "sketchbook.location": "Schetsboek locatie", "sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.", @@ -417,11 +421,11 @@ "renameSketchTitle": "Nieuwe naam van de Cloud schets" }, "replaceMsg": "De bestaande versie van {0} vervangen?", - "selectZip": "Selecteer een zipbestand met de bibliotheek die U wilt toevoegen", + "selectZip": "Selecteer een zip-bestand met de bibliotheek die je wil toevoegen", "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Carriage Return", - "connecting": "Connecting to '{0}' on '{1}'...", + "connecting": "Verbinding maken met '{0}' op '{1}'...", "message": "Bericht (Enter om het bericht naar '{0}' op '{1}' te zenden)", "newLine": "Nieuwe Regel", "newLineCarriageReturn": "Zowel NL & CR", @@ -442,11 +446,11 @@ "editInvalidSketchFolderLocationQuestion": "Wil je proberen om de schets op een andere locatie op te slaan?", "editInvalidSketchFolderQuestion": "Wil je proberen om de schets onder een andere naam op te slaan?", "exportBinary": "Gecompileerd binair bestand exporteren", - "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidCloudSketchName": "De naam moet beginnen met een letter, nummer of underscore, gevolgd door letters, nummers, streepjes, punten en underscores. De maximale lengte is 36 karakters.", "invalidSketchFolderLocationDetails": "Je kunt de schets niet opslaan in een map in de eigen map", "invalidSketchFolderLocationMessage": "Foute locatie van de schets map: '{0}'", "invalidSketchFolderNameMessage": "Ongeldige schets mapnaam: '{0}'", - "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "invalidSketchName": "De naam moet beginnen met een letter, nummer of underscore, gevolgd door letters, nummers, streepjes, punten en underscores. De maximale lengte is 63 karakters.", "moving": "Verplaatsten", "movingMsg": "Het bestand \"{0}\" moet binnen een schetsmap met de naam \"{1}\" staan.\nMaak deze map, verplaats het bestand, en ga verder?", "new": "Nieuwe schets", @@ -456,17 +460,19 @@ "openSketchInNewWindow": "Schets openen in nieuw venster", "reservedFilename": "'{0}' is een gereserveerde bestandsnaam.", "saveFolderAs": "Sla de schets map op als...", - "saveSketch": "Bewaar je schets om hem later weer te openen.", + "saveSketch": "Bewaar je schets om het later weer te openen.", "saveSketchAs": "Sla de schetsmap op als...", "showFolder": "Schetsmap tonen", "sketch": "Schets", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Schetsboek", "titleLocalSketchbook": "Lokaal schetsboek", "titleSketchbook": "Schetsboek", "upload": "Uploaden", "uploadUsingProgrammer": "Uploaden met behulp van Programmeerapparaat", "uploading": "Uploaden...", - "userFieldsNotFoundError": "Kan gebruiker veld van verbonden bord niet vinden", + "userFieldsNotFoundError": "Kan gebruiker velden van verbonden bord niet vinden", "verify": "Verifiëren", "verifyOrCompile": "Verifiëren/Compileren" }, @@ -476,25 +482,25 @@ }, "survey": { "answerSurvey": "Antwoord enquête", - "dismissSurvey": "Niet meer laten zien", + "dismissSurvey": "Niet meer tonen", "surveyMessage": "Help ons alsjeblieft te verbeteren door deze super korte enquête te beantwoorden. We waarderen onze gemeenschap en willen onze supporters graag wat beter leren kennen." }, "theme": { - "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", - "dark": "Dark", - "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "Kan het huidig geselecteerde thema niet vinden: {0}. Arduino IDE heeft een ingebouwd thema gekozen dat compatibel is met het ontbrekende.", + "dark": "Donker", + "deprecated": "{0} (verouderd)", + "hc": "Donker hoog contrast", + "hcLight": "Licht hoog contrast", + "light": "Licht", + "user": "{0} (gebruiker)" }, "title": { "cloud": "Cloud" }, "updateIndexes": { - "updateIndexes": "Update de indices", - "updateLibraryIndex": "Update de bibliotheek index", - "updatePackageIndex": "Update de index van het pakket" + "updateIndexes": "Indexen bijwerken", + "updateLibraryIndex": "Bibliotheek index bijwerken", + "updatePackageIndex": "Index van het pakket bijwerken" }, "upload": { "error": "{0} fout: {1}" @@ -509,7 +515,7 @@ "abortFixTitle": "Incorrecte schets", "renameSketchFileMessage": "De schetsnaam '{0}' kan niet gebruikt worden. {1} Wil je de schets nu hernoemen?", "renameSketchFileTitle": "Ongeldige bestandsnaam van de schets", - "renameSketchFolderMessage": "De schets '{0}' kan niet gebruikt worden. {1} Om van deze melding af te komen, hernoem de schets. Wil je de schets nu hernoemen?", + "renameSketchFolderMessage": "De schets '{0}' kan niet gebruikt worden. {1} Om van deze melding af te komen, hernoem de schets. Wil je de schets nu hernoemen?", "renameSketchFolderTitle": "Ongeldige schetsnaam" }, "workspace": { @@ -520,7 +526,7 @@ "core": { "cannotConnectBackend": "Kan geen verbinding maken met het backend.", "cannotConnectDaemon": "Kan geen verbinding maken met de CLI daemon.", - "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en start de IDE opnieuw. ", + "couldNotSave": "Kan de schets niet opslaan. Kopieer uw niet-opgeslagen werk naar uw favoriete teksteditor en herstart de IDE. ", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", "offlineText": "Offline", @@ -535,7 +541,7 @@ }, "workspace": { "deleteCloudSketch": "De Cloud schets '{0}' zal permanent verwijderd worden van de Arduino servers en van de locale caches. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", - "deleteCurrentSketch": "De schets '{0}' zal permanent verwijderd worden. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", + "deleteCurrentSketch": "De schets '{0}' zal permanent verwijderd worden. Deze actie is onomkeerbaar. Wil je de huidige schets verwijderen?", "fileNewName": "Naam voor nieuw bestand", "invalidExtension": ".{0} is geen geldige extensie", "newFileName": "Nieuwe naam voor bestand" diff --git a/i18n/pl.json b/i18n/pl.json index d6b00270e..8196ea056 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -139,6 +139,7 @@ "installManually": "Zainstaluj ręcznie", "later": "Później", "noBoardSelected": "Nie wybrano płytki", + "noSketchOpened": "No sketch opened", "notConnected": "[nie podłączone]", "offlineIndicator": "Wygląda na to, że jesteś w trybie offline. Bez połączenia z Internetem Arduino CLI może nie być w stanie pobrać wymaganych zasobów i może spowodować awarię. Połącz się z Internetem i uruchom ponownie aplikację.", "oldFormat": "'{0}' nadal używa starego formatu `.pde`. Czy chcesz się przełączyć na nowe rozszerzenie `.ino`?", @@ -146,6 +147,7 @@ "processing": "Przetwarzanie", "recommended": "Zalecane", "retired": "Odosobniony", + "selectManually": "Select Manually", "selectedOn": "na {0}", "serialMonitor": "Monitor portu szeregowego", "type": "Typ", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debuguj - {0}", "debuggingNotSupported": "Debugowanie nie jest wspierane przez '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma nie jest zainstalowana dla '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Zapisz folder szkicu jako...", "showFolder": "Pokaż folder szkiców.", "sketch": "Szkic", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Szkicownik", "titleLocalSketchbook": "Lokalny folder szkiców", "titleSketchbook": "Szkicownik", diff --git a/i18n/pt.json b/i18n/pt.json index 28e463a9a..59da2d312 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -139,6 +139,7 @@ "installManually": "Instalar Manualmente", "later": "Depois", "noBoardSelected": "Nenhuma placa selecionada.", + "noSketchOpened": "No sketch opened", "notConnected": "[não está conectado]", "offlineIndicator": "Parece que você está offline. Sem conexão com a Internet, o Arduino CLI não será capaz de baixar os recursos exigidos e poderá provovar mau funcionamento. Por favor, conecte-se à Internet e reinicie o aplicativo.", "oldFormat": "O '{0}' ainda utiliza o formato antigo `.pde`. Deseja mudar para a nova extensão `.ino`?", @@ -146,6 +147,7 @@ "processing": "Em processamento", "recommended": "Recomendado", "retired": "Afastado", + "selectManually": "Select Manually", "selectedOn": "em {0}", "serialMonitor": "Monitor Serial", "type": "Tipo", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Depuração - {0}", "debuggingNotSupported": "A depuração não é suportada por '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "A plataforma não está instalada para '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,10 +464,12 @@ "saveSketchAs": "Salvar o diretório de esboços como...", "showFolder": "Mostrar o diretório de Esboços...", "sketch": "Esboço", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Caderno de Esboços", "titleLocalSketchbook": "Caderno de Esboços local", "titleSketchbook": "Caderno de Esboços", - "upload": "Enviar usando Programador", + "upload": "Carregar", "uploadUsingProgrammer": "Enviar Usando Programador", "uploading": "Enviando...", "userFieldsNotFoundError": "Não é possível encontrar dados de usuário para placa conectada", diff --git a/i18n/ro.json b/i18n/ro.json index 629f9aa9b..0dbe128a7 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -139,6 +139,7 @@ "installManually": "Instalează Manual", "later": "Mai târziu", "noBoardSelected": "Placa de dezvoltare nu a fost aleasă.", + "noSketchOpened": "No sketch opened", "notConnected": "[neconectat]", "offlineIndicator": "Se pare că nu ești conectat la internet. Fără o conexiune la internet, Arduino CLI nu poate descarca resursele necesare și poate cauza funcționare anormală. Conectează-te la internet și repornește aplicația.", "oldFormat": "'{0}' utilizează formatul vechi `.pde`. Vrei să treci la noua extensie `ino`?", @@ -146,6 +147,7 @@ "processing": "Procesare", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "pe {0}", "serialMonitor": "Monitor Serial", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Depanare - {0}", "debuggingNotSupported": "Depanarea nu este suportată de '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma nu este instalată pentru '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Schița", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/ru.json b/i18n/ru.json index ce280aae8..d3fb6ede1 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -139,6 +139,7 @@ "installManually": "Установить вручную", "later": "Позже", "noBoardSelected": "Плата не выбрана", + "noSketchOpened": "No sketch opened", "notConnected": "[не подключено].", "offlineIndicator": "Похоже, у Вас нет подключения к Интернету. Без подключения к Интернету Arduino CLI не сможет загрузить необходимые ресурсы и упадет. Подключитесь к Интернету и перезапустите приложение.", "oldFormat": "'{0}' использует старый формат `.pde`. Хотите сконвертировать в новый формат `.ino`?", @@ -146,6 +147,7 @@ "processing": "Обработка", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "вкл. {0}", "serialMonitor": "Монитор порта", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Отладка - {0}", "debuggingNotSupported": "Отладка не поддерживается '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформа не установлена для '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Сохранить папку скетча как...", "showFolder": "Показать папку скетча", "sketch": "Скетч", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Альбом", "titleLocalSketchbook": "Локальный альбом", "titleSketchbook": "Альбом", diff --git a/i18n/sr.json b/i18n/sr.json index 0924a707d..bc5406fbe 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -139,6 +139,7 @@ "installManually": "Инсталирај ручно", "later": "Касније", "noBoardSelected": "Плоча није одабрана", + "noSketchOpened": "No sketch opened", "notConnected": "[није повезано]", "offlineIndicator": "Изгледа да сте ван мреже. Без интернет везе, Arduino CLI можда неће моћи да преузме потребне ресурсе и може изазвати квар. Повежите се на Интернет и поново покрените апликацију.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Обрађује се", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "на {0}", "serialMonitor": "Монитор серијског порта", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Отклањање грешака - {0}", "debuggingNotSupported": "'{0}' не подржава отклањање грешака", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформа није инсталирана за '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Сачувај радни фолдер као...", "showFolder": "Прикажи радни директоријум", "sketch": "Рад", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Радна свеска", "titleLocalSketchbook": "Локална радна свеска", "titleSketchbook": "Радна свеска", diff --git a/i18n/th.json b/i18n/th.json index f686149c5..5f4d161c7 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -139,6 +139,7 @@ "installManually": "Install Manually", "later": "Later", "noBoardSelected": "No board selected", + "noSketchOpened": "No sketch opened", "notConnected": "[not connected]", "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", @@ -146,6 +147,7 @@ "processing": "Processing", "recommended": "Recommended", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "on {0}", "serialMonitor": "Serial Monitor", "type": "Type", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "noProgrammerSelectedFor": "No programmer selected 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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Save sketch folder as...", "showFolder": "Show Sketch Folder", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/tr.json b/i18n/tr.json index 594738a54..871f31cdf 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -139,6 +139,7 @@ "installManually": "Elle Kur", "later": "Daha sonra", "noBoardSelected": "Kart seçili değil", + "noSketchOpened": "Eskiz açılmadı", "notConnected": "[bağlı değil]", "offlineIndicator": "Çevrimdışı görünüyorsunuz. Arduino CLI internet bağlantısı olmadan gerekli kaynakları indiremeyebilir ve hatalı çalışabilir. Lütfen internete bağlanın ve uygulamayı yeniden başlatın.", "oldFormat": "'{0}' hala eski `.pde` biçimini kullanıyor. Yeni `.ino` uzantısına geçmek istiyor musunuz?", @@ -146,6 +147,7 @@ "processing": "Processing", "recommended": "Önerilen", "retired": "Emekli", + "selectManually": "Elle Seç", "selectedOn": "- {0}", "serialMonitor": "Seri Port Ekranı", "type": "Tür", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debug '{0}' tarafından desteklenmiyor", + "getDebugInfo": "Hata ayıklama bilgisi alınıyor...", "noPlatformInstalledFor": "'{0}' için platform kurulmadı", + "noProgrammerSelectedFor": "'{0}' için programlayıcı seçilmedi", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Eskiz klasörünü farklı kaydet...", "showFolder": "Eskiz Klasörünü Göster", "sketch": "Eskiz", + "sketchAlreadyContainsThisFileError": "Eskizde zaten '{0}' isminde bir dosya var", + "sketchAlreadyContainsThisFileMessage": "\"{0}\" eskizi \"{1}\" olarak kaydedilemedi. {2}", "sketchbook": "Eskiz Defteri", "titleLocalSketchbook": "Yerel Eskiz Defteri", "titleSketchbook": "Eskiz Defteri", diff --git a/i18n/uk.json b/i18n/uk.json index ec6fdaa11..d85fed278 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -1,14 +1,14 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", - "label": "Про {0}" + "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", - "menuTitle": "Arduino Cloud" + "goToCloudEditor": "Перейти в Хмарний Редактор", + "goToIoTCloud": "Перейти в IoT Хмару", + "goToProfile": "Перейти в Профіль", + "menuTitle": "Arduino Хмара" }, "board": { "board": "Плата {0}", @@ -17,174 +17,176 @@ "boards": "плати", "configDialog1": "Оберіть плату та порт якщо бажаєте завантажити скетч", "configDialog2": "Якщо вибрати лише плату, ви зможете скомпілювати, але не завантажити свій ескіз.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "editBoardsConfig": "Edit Board and Port...", + "couldNotFindPreviouslySelected": "Не вдалося знайти раніше обрану плату '{0}' на встановленій платформі '{1}'. Будь ласка, вручну оберіть плату, яку хочете використовувати. Бажаєте повторно вибрати її зараз?", + "editBoardsConfig": "Змінити Плату та Порт...", "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?", + "inSketchbook": "(у книзі скетчів)", + "installNow": "Для обраної плати \"{2}\", має бути встановлено ядро \"{0} {1}\". Хочете встановити його зараз?", "noBoardsFound": "Для \"{0}\" не знайдено плат", - "noNativeSerialPort": "Native serial port, can't obtain info.", + "noNativeSerialPort": "Послідовний порт, не може отримати інформацію.", "noPortsDiscovered": "Порти не знайдено", - "nonSerialPort": "Non-serial port, can't obtain info.", + "nonSerialPort": "Не-послідовний порт, не може отримати інформацію.", "openBoardsConfig": "Оберіть іншу плату або порт", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "pleasePickBoard": "Будь ласка, оберіть підключену плату до порта, який ви вибрали.", "port": "Порт{0}", "ports": "порти", "programmer": "Програматор", - "reselectLater": "Reselect later", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "reselectLater": "Переобрати пізніше", + "revertBoardsConfig": "Використовувати '{0}' знайдену на '{1}'", "searchBoard": "Шукати плату", "selectBoard": "Оберіть плату", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", + "selectPortForInfo": "Оберіть порт для оновлення інформації про плату.", + "showAllAvailablePorts": "Відображати усі доступні порти коли увімкнено", "showAllPorts": "Показати всі порти", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0}порти", - "unconfirmedBoard": "Unconfirmed board", + "succesfullyInstalledPlatform": "Успішно встановлено платформу {0}:{1}", + "succesfullyUninstalledPlatform": "Успішно видалено платформу {0}:{1}", + "typeOfPorts": "{0} порти", + "unconfirmedBoard": "Неперевірена плата", "unknownBoard": "Невідома плата" }, "boardsManager": "Менеджер плат", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Сертифіковано Arduino" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "Записати загрузчик", + "burningBootloader": "Завантаження загрузчика...", + "doneBurningBootloader": "Завантажено загрузчика завершено." }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "Помилка при завантаженні загрузчика: {0}" }, "certificate": { "addNew": "Додати Новий", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", + "addURL": "Додайте URL для отримання SSL сертифікату", + "boardAtPort": "{0} в {1}", + "certificatesUploaded": "Сертифікат завантажено.", + "enterURL": "Введіть URL", + "noSupportedBoardConnected": "Підключена плата, що не підтримується", + "openContext": "Відкрити контекст", "remove": "Видалити ", "selectBoard": "Оберіть плату ...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", + "selectCertificateToUpload": "1. Оберіть сертифікат для завантаження", + "selectDestinationBoardToUpload": "2. Обрати плату та завантажити сертифікат", "upload": "Завантажити", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "uploadFailed": "Невдале завантаження. Спробуйте знову.", + "uploadRootCertificates": "Завантажити кореневі сертифікати SSL", + "uploadingCertificates": "Завантаження сертифікатів." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", + "checkForUpdates": "Перевірити оновлення Arduino", "installAll": "Встановити все", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", + "noUpdates": "Нема доступних оновлень.", + "promptUpdateBoards": "Доступні оновлення для плат.", + "promptUpdateLibraries": "Доступні оновлення бібліотек.", "updatingBoards": "Оновлення плат...", "updatingLibraries": "Оновлення бібліотек..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "'Клавіатура' не знайдено. Чи містить скетч рядок '#include <Keyboard.h>'?", + "mouseError": "'Миша' не знайдено. Чи містить скетч рядок '#include <Mouse.h>'?" }, "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", + "chooseSketchVisibility": "Виберіть видимість вашого скетчу:", + "cloudSketchbook": "Хмарна Книга Скетчів", "connected": "Під'єднано", "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." + "donePulling": "Отримано '{0}'.", + "donePushing": "Відправлено '{0}'.", + "embed": "Вбудовано:", + "emptySketchbook": "Ваша книга скетчів пуста", + "goToCloud": "Перейти в Хмару", + "learnMore": "Дізнатися більше", + "link": "Посилання:", + "notYetPulled": "Не можливо відправити у Хмару. Ще не отримано.", + "offline": "Відключено", + "openInCloudEditor": "Відкрити у Хмарному Редакторі", + "options": "Опції...", + "privateVisibility": "Приватно. Тільки ви можете бачити скетч. ", + "profilePicture": "Зображення профіля", + "publicVisibility": "Публічно. Будь-хто за посиланням, може бачити скетч.", + "pull": "Отримати", + "pullFirst": "Спочатку треба отримати, щоб мати мажливість надсилати в Хмару.", + "pullSketch": "Отримати скетч", + "pullSketchMsg": "Отримання цього скетчу з Хмари, призведе до заміщення локальної версії. Бажаєте продовжити?", + "push": "Надіслати", + "pushSketch": "Надіслати скетч", + "pushSketchMsg": "Це публічний скетч. Перед надсиланням переконайтеся, що він не містить конфіденційну інформацію у файлі arduino_secrets.h. Ви можете зробити скетч приватним на панелі «Поділитися».", + "remote": "Пульт", + "share": "Поділитися...", + "shareSketch": "Поділитися скетчем", + "showHideSketchbook": "Показати/Сховати Хмарну книгу скетчів", + "signIn": "Вхід", + "signInToCloud": "Вхід в Хмару Arduino", + "signOut": "Вихід", + "sync": "Синхронізувати", + "syncEditSketches": "Синхроніхувати та редагувати скетчі в Хмарі Arduino", + "visitArduinoCloud": "Перейти в Хмару Arduino, щоб створити хмарні скетчі" }, "cloudSketch": { - "alreadyExists": "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": "Всі", - "contributed": "Contributed", - "installManually": "Install Manually", + "contributed": "Внесено", + "installManually": "Встановити вручну", "later": "Пізніше", "noBoardSelected": "Не обрана плата", - "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}", + "noSketchOpened": "No sketch opened", + "notConnected": "[не підключено]", + "offlineIndicator": "Здається, ви відключені від мережі. Без підключення до Інтернету Arduino CLI не може завантажити необхідні ресурси. Підключіться до Інтернету та перезапустіть програму.", + "oldFormat": "'{0}' досі використовує старий формат `.pde`. Бажаєте перейти на нове розширення `.ino` ?", + "partner": "Партнер", + "processing": "Обробляється", + "recommended": "Рекомендовано", + "retired": "Застаріло", + "selectManually": "Select Manually", + "selectedOn": "на {0}", "serialMonitor": "Монітор порту", "type": "Тіп", - "unknown": "Unknown", - "updateable": "Updatable" + "unknown": "Невідомо", + "updateable": "Можливість оновлення" }, "compile": { - "error": "Compilation error: {0}" + "error": "Помилка компілятора: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", - "by": "by", - "clickToOpen": "Click to open in browser: {0}", - "filterSearch": "Filter your search...", + "boardsIncluded": "Плати в цьому пакунку:", + "by": "за", + "clickToOpen": "Натисніть, щоб відкрити браузер: {0}", + "filterSearch": "Фільтри пошуку...", "install": "Встановити", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "Встановити новіші", + "installVersion": "Встановити {0}", + "installed": "{0} встановлено", "moreInfo": "Більше інформації ", "otherVersions": "Інші Версії", "remove": "Видалити ", - "title": "{0} by {1}", + "title": "{0} з {1}", "uninstall": "Видалити", - "uninstallMsg": "Do you want to uninstall {0}?", + "uninstallMsg": "Бажаєте видалити {0}?", "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": "One file added to the sketch.", + "fileAdded": "Один файл додано до скетчу.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "Неможливо відкрити плотер" }, "replaceTitle": "Замінити " }, @@ -193,311 +195,315 @@ "all": "Все", "default": "По замовчуванню", "more": "Більше", - "none": "None" + "none": "Немає" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Скопіювати помилку", + "noBoardSelected": "Плата не вибрана. Будь ласка, виберіть свою плату Arduino в меню Інструменти > Плата." }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "Надіслати скетч в Хмару", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "Перезапуск служби", + "start": "Запуск служби", + "stop": "Спинення служби" }, "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging", - "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?" + "debugWithMessage": "Налагодження - {0}", + "debuggingNotSupported": "Налагодження не підтримується з '{0}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Не встановлення платформа для '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", + "optimizeForDebugging": "Оптимізація для налагодження", + "sketchIsNotCompiled": "Скетч'{0}' повинен бути перевірений до початку налагодження. Будь ласка, перевірте скетч та запустіть налагодження знову. Бажаєте перевірити скетч зараз?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "Очистити список історії плат", + "clearBoardsConfig": "Очистити вибір Плат та Портів", + "dumpBoardList": "Дамп списку плат" }, "dialog": { "dontAskAgain": "Не питати знову" }, "editor": { - "autoFormat": "Автофрмат", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", + "autoFormat": "Автоформат", + "commentUncomment": "Закоментувати/Розкоментувати", + "copyForForum": "Копіювати для форуму (Markdown)", + "decreaseFontSize": "Збільшити розмір шрифта", + "decreaseIndent": "Зменшити відступ", + "increaseFontSize": "Зменшити розмір шрифта", + "increaseIndent": "Збільшити відступ", "nextError": "Наступна помилка", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "previousError": "Попередня помилка", + "revealError": "Розгорнути помилку" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", + "builtInExamples": "Вбудовані приклади", + "couldNotInitializeExamples": "Помилка ініціалізації вбудованих прикладів", + "customLibrary": "Приклади з Користувацьких бібліотек", + "for": "Приклади для {0}", "forAny": "Приклади для будь-якої плати", "menu": "Приклади" }, "firmware": { "checkUpdates": "Перевірити Оновлення", - "failedInstall": "Installation failed. Please try again.", + "failedInstall": "Помилка при встановленні. Спробуйте знову.", "install": "Встановити", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "installingFirmware": "Встановлення прошивки.", + "overwriteSketch": "Встановлення замінить скетч в платі.", "selectBoard": "Оберіть плату", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "Firmware Updater" + "selectVersion": "Оберіть версію прошивки", + "successfullyInstalled": "Прошивку успішно встановлено.", + "updater": "Оновлювач прошивки" }, "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", + "environment": "Оточення", + "faq": "Часті питання", "findInReference": "Знайти в описі", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", + "gettingStarted": "Розпочнемо", + "keyword": "Введіть кодове слово", + "privacyPolicy": "Політика безпеки", + "reference": "Посилання", + "search": "Шукати на Arduino.cc", + "troubleshooting": "Вирішення проблем", "visit": "Відвідати Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Перевірка оновлень Arduino IDE", "closeAndInstallButton": "Закрити та Встановити", - "closeToInstallNotice": "Close the software and install the update on your machine.", + "closeToInstallNotice": "Закрийте програму та встановіть оновлення.", "downloadButton": "Завантажити", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "downloadingNotice": "Завантажити останню версію Arduino IDE.", + "errorCheckingForUpdates": "Помилка під час перевірки оновлень Arduino IDE {0}", "goToDownloadButton": "Перейти до завантаження ", - "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", + "goToDownloadPage": "Знайдено оновлення Arduino IDE, але його не вдається завантажити та встановити автоматично. Будь ласка, перейдіть на сторінку завантажень.", + "ideUpdaterDialog": "Оновлення ПЗ", + "newVersionAvailable": "Нова версія Arduino IDE ({0}) доступна для завантаження.", + "noUpdatesAvailable": "Нема доступних оновлень для Arduino IDE", "notNowButton": "Не зараз", "skipVersionButton": "Пропустити Версію", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." + "updateAvailable": "Доступне оновлення", + "versionDownloaded": "Arduino IDE {0} було завантажено" }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "Помилка при встановленні бібліотеки: '{0}{1}'.", + "platformInstallFailed": "Помилка при встановленні платформи: '{0}{1}'." }, "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", + "addZip": "Додати .ZIP бібліотеку...", + "arduinoLibraries": "Бібліотеки Arduino", + "contributedLibraries": "Додані бібліотеки", + "include": "Включити бібліотеку", "installAll": "Встановити все", - "installLibraryDependencies": "Install library dependencies", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "installOneMissingDependency": "Would you like to install the missing dependency?", - "installWithoutDependencies": "Install without dependencies", - "installedSuccessfully": "Successfully installed library {0}:{1}", - "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", - "manageLibraries": "Manage Libraries...", - "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", - "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "installLibraryDependencies": "Встановлення залежностей бібліотеки", + "installMissingDependencies": "Ви бажаєте встановити всі залежності для бібліотеки?", + "installOneMissingDependency": "Ви бажаєте встановити залежності, яких не вистачає?", + "installWithoutDependencies": "Встановити без залажностей", + "installedSuccessfully": "Бібліотеку успішно встановлено {0}:{1}", + "libraryAlreadyExists": "Бібліотеку вже зареєєстровано. Бажаєте її заміниити?", + "manageLibraries": "Керування бібліотеками...", + "namedLibraryAlreadyExists": "Тека бібліотеки з назвою {0} вже існує. Бажаєте перезаписати її?", + "needsMultipleDependencies": "Бібліотека <b>{0}:{1}</b> вимагає наступні залежності, які не встановлені:", + "needsOneDependency": "Ббліотека <b>{0}:{1}</b> вимагає інші залежності, які ще не встановлені:", + "overwriteExistingLibrary": "Бажаєте замінити існуючу бібліотеку?", + "successfullyInstalledZipLibrary": "Бібліотека успішно встановлена з {0} архіву", "title": "Менеджер бібліотек", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "uninstalledSuccessfully": "Бібліотеку успішно видалено {0}:{1}", "zipLibrary": "Бібліотеки " }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Тема" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "Спілкування", + "dataProcessing": "Обробка даних", + "dataStorage": "Сховище даних", + "deviceControl": "Керування пристроєм", + "display": "Дісплей", + "other": "Інше", + "sensors": "Сенсори", + "signalInputOutput": "Сигнал Вхід/Вихід", + "timing": "Період часу", + "uncategorized": "Без категорії" }, "libraryType": { "installed": "Встановлено " }, "menu": { - "advanced": "Advanced", - "sketch": "Sketch", + "advanced": "Додатково", + "sketch": "Скетч", "tools": "Інструменти" }, "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "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" + "alreadyConnectedError": "Не можливо підключитися до {0} {1} порту. Він вже зайнятий.", + "baudRate": "{0} бод", + "connectionFailedError": "Не можливо підключитися до {0} {1} порту.", + "connectionFailedErrorWithDetails": "{0} Не можливо підключитися до {1} {2} порту.", + "connectionTimeout": "Таймаут. IDE не отримало повідомлення 'Про успіх' від монітора після підключення до нього.", + "missingConfigurationError": "Не можливо підключитися до {0} {1} порту. Невизначені параметри монітору.", + "notConnectedError": "Відсутнє підключення до {0} {1} порту.", + "unableToCloseWebSocket": "Неможливо закрити websocket", + "unableToConnectToWebSocket": "Неможливо підключитися до websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Ім'я нового хмарного скетча" }, "portProtocol": { "network": "Мережа", - "serial": "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.", + "additionalManagerURLs": "Додаткові URL-адреси менеджера плат", + "auth.audience": "Спільнота OAuth2", + "auth.clientID": "Ідентифікатор клієнта OAuth2", + "auth.domain": "Домен OAuth2", + "auth.registerUri": "URI для реєстрації нового користувача", "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", + "board.certificates": "Перелік сертифікатів, які можуть бути завантажені на плату", + "browse": "Підбір", + "checkForUpdate": "Отримання сповіщень про доступні оновлення для IDE, плат та бібліотек. Потрібне перезапуск програми після зміни. \"Так\" за замовчуванням. ", + "choose": "Вибір", + "cli.daemonDebug": "Увімкніть журнал налагодження викликів gRPC до Arduino CLI. Щоб цей параметр набув чинності, потрібно перезапустити IDE. \"Ні\" за замовчуванням.", + "cloud.enabled": "\"Так\", якщо синхронізація скетча доступна. \"Так\" за замовчуванням. ", + "cloud.pull.warn": "\"Так\", якщо треба попередження перед отриманням хмарного скетчу. \"Так\" за замовчуванням. ", + "cloud.push.warn": "\"Так\", якщо треба попередження перед надсиланням хмарного скетчу. \"Так\" за замовчуванням.", + "cloud.pushpublic.warn": "\"Так\", якщо треба попередження перед надсиланням публічного скетча в хмару. \"Так\" за замовчуванням.", + "cloud.sketchSyncEndpoint": "Призначення для надсилання та отримання скетчів з серверної частини. За замовчуванням вказує на API хмари Arduino.", + "compile": "компіляція", + "compile.experimental": "\"Так\", якщо IDE може отримати декілька помилок компілятора. \"Ні\" за замовчуванням", + "compile.revealRange": "Спосіб відображення помилок компілятора в редакторі після невдалої перевірки/завантаження. Можливі значення: 'auto': Прокручує вертикально та розгортає рядок. 'center': Прокручує вертикально та разгортає рядок по центру. 'top': Прокручує вертикально та розгортає з розташованням ближче до верхньої частини вікна перегляду, 'centerIfOutsideViewport': Прокручує вертикально та розгортає рядок, центруючи вертикально, лише якщо він виходить за межі вікна перегляду. Значення за замовчуванням '{0}'.", + "compile.verbose": "\"Так\" для розширенного виводу компілятора. \"Ні\" за замовчуванням", + "compile.warnings": "Вказує gcc, який рівень попередження використовувати. За замовчуванням встановлено \"None\".", + "compilerWarnings": "Застереження компілятора", + "editorFontSize": "Розмір шрифта редактора", + "editorQuickSuggestions": "Швидкі підказки редактора", + "enterAdditionalURLs": "Введіть додаткові URL-адреси, по одній для кожного рядка", + "files.inside.sketches": "Відображати файли в середені скетчів", + "ide.updateBaseUrl": "Основна URL-адреса, з якої можна завантажити оновлення. За замовчуванням \"https://downloads.arduino.cc/arduino-ide\"", + "ide.updateChannel": "Вибір канала оновлень. 'Стабільні' - для стабільних релізів, 'Нічні' - найновіші збірки.", + "interfaceScale": "Масштаб інтерфейсу", + "invalid.editorFontSize": "Хибний розмір шрифта редактора. Значення повинно бути цілим числом.", + "invalid.sketchbook.location": "Хибний шлях до книги скетчів: {0}", + "invalid.theme": "Недійсна тема.", + "language.log": "\"Так\", якщо треба генерувати 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}\"." + "dockPanel": "Розташування віджетів _{0}_ . Можливі варіанти - \"Внизу\" або \"Справа\". Зазамовчуванням це \"{1}\"." }, "network": "Мережа", - "newSketchbookLocation": "Select new sketchbook location", - "noCliConfig": "Could not load the CLI configuration", + "newSketchbookLocation": "Оберіть новий шлях до книги скетчів", + "noCliConfig": "Неможливо прочитати конфігурацію клієнта CLI", "noProxy": "Нема проксі", "proxySettings": { - "hostname": "Host name", + "hostname": "Ім'я хоста", "password": "Пароль", "port": "Номер порту", - "username": "Username" + "username": "Ім'я користувача" }, - "showVerbose": "Show verbose output during", + "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`. Якщо значення вказане, він буде використовуватися кожен раз при створенні новго скетча. Якщо значення пусте, скетчі будуть згенеровані Arduino в форматі за замовчуванням. Недоступні файли ігноруються. **Потрібно перезапустити IDE**, щоб цей параметр набув чинності." }, - "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", + "sketchbook.location": "Шлях до книги скетчів", + "sketchbook.showAllFiles": "\"Так\" для відображення усіх файлів скетчу в середені скетчу. \"Ні\" за замовчуванням.", + "survey.notification": "\"Так\", якщо треба повідомляти про доступні опитування користувачів. \"Так\" за замовчуванням.", + "unofficialBoardSupport": "Клацніть, щоб переглянути список неофіційних форумів підтримки", "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.", + "upload.verbose": "\"Так\" для докладного виводу процесу завантаження. \"Ні\" за замовчуванням.", + "verifyAfterUpload": "Перевіряти код після завантаження", + "window.autoScale": "\"Так\", якщо інтерфейс користувача автоматично масштабується відповідно до розміру шрифту.", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Застаріле. Натомість використовуйте 'window.zoomLevel'." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Нове ім'я для хмарного скетча" }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", + "replaceMsg": "Замінити існуючу версію на {0}?", + "selectZip": "Оберіть zip-файл що містить бібліотеку, яку треба додати", "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "autoscroll": "Автопрокручування", + "carriageReturn": "Повернення коретки", + "connecting": "Підключення до '{0}' на '{1}'...", + "message": "Повідомлення (Введіть повідомлення для відправки до '{0}' на '{1}')", "newLine": "Новий рядок", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" + "newLineCarriageReturn": "Обидва \"Новий рядок\" та \"Повернення коретки\"", + "noLineEndings": "Без закінчення рядка", + "notConnected": "Не підключено. Оберіть плату та порт для автоматичного підключення.", + "openSerialPlotter": "Послідовний плотер", + "timestamp": "Мітка часу", + "toggleTimestamp": "Перемкнути мітку часу" }, "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", + "archiveSketch": "Архів скетчів", + "cantOpen": "Папка з ім'ям \"{0}\" вже існує. Неможливо відкрити скетч.", + "compile": "Компіляція скетча...", + "configureAndUpload": "Налаштувати та завантажити", + "createdArchive": "Створення архіву '{0}'.", + "doneCompiling": "Компіляцію завершено", "doneUploading": "Завантаження завершено.", - "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", - "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", - "exportBinary": "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", + "editInvalidSketchFolderLocationQuestion": "Бажаєте спробувати зберегти скетч в іншому місці?", + "editInvalidSketchFolderQuestion": "Бажаєте спробувати зберегти скетч під іншою назвою?", + "exportBinary": "Експортувати скомпільований двійковий файл", + "invalidCloudSketchName": "Ім’я має починатися з літери, цифри або підкреслення, за якими слідують літери, цифри, тире, крапки та підкреслення. Максимальна довжина – 36 символів.", + "invalidSketchFolderLocationDetails": "Не можна зберегти скетч у папці всередині самого себе.", + "invalidSketchFolderLocationMessage": "Недійсний шлях папки скетча: '{0}'", + "invalidSketchFolderNameMessage": "Хибна назва папки скетча: '{0}'", + "invalidSketchName": "Ім’я має починатися з літери, цифри або підкреслення, за якими слідують літери, цифри, тире, крапки та підкреслення. Максимальна довжина – 63 символи.", + "moving": "Пересування", + "movingMsg": "Файл \"{0}\" має бути в середені папки з ім'ям \"{1}\".\nСтворити папку, пересунути туди файл та продовжити?", + "new": "Новий скетч", + "noTrailingPeriod": "Ім'я файла не може закінчуватися крапкою", "openFolder": "Відкрити папку", "openRecent": "Відкрити останній", - "openSketchInNewWindow": "Open Sketch in New Window", - "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", + "openSketchInNewWindow": "Відкрити скетч у новому вікні", + "reservedFilename": "'{0}' це зарезервоване ім'я файла", + "saveFolderAs": "Зберігти папку скетча як...", + "saveSketch": "Збережіть свій скетч, щоб відкрити його пізніше.", + "saveSketchAs": "Зберігти папку скетча як...", + "showFolder": "Показати папку скетча", + "sketch": "Скетч", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Книга скетчів", + "titleLocalSketchbook": "Локальна книга скетчів", + "titleSketchbook": "Книга скетчів", "upload": "Завантажити", - "uploadUsingProgrammer": "Upload Using Programmer", + "uploadUsingProgrammer": "Завантажити за допомогою програматора", "uploading": "Завантаження..", - "userFieldsNotFoundError": "Can't find user fields for connected board", + "userFieldsNotFoundError": "Не вдається знайти поля користувача для підключеної плати", "verify": "Перевірити ", - "verifyOrCompile": "Verify/Compile" + "verifyOrCompile": "Перевірка/Компіляція" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Новий хмарний скетч", + "newSketch": "Новий скетч" }, "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", - "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light 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} error: {1}" + "error": "{0} помилка: {1}" }, "userFields": { "cancel": "Відміна ", @@ -505,39 +511,39 @@ "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": { "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?" + "cannotConnectBackend": "Неможливо підключитися до серверної частини.", + "cannotConnectDaemon": "Неможливо підключитися до CLI-служби", + "couldNotSave": "Не вдалося зберегти скетч. Скопіюйте незбережену роботу у свій улюблений текстовий редактор і перезапустіть IDE.", + "daemonOffline": "CLI-служба вимкнена", + "offline": "Відключено", + "offlineText": "Відключено", + "quitTitle": "Ви впевнені що хочети вийти?" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "Незбережений – {0}" }, "messages": { "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?", + "deleteCloudSketch": "Хмарний скетч '{0}' буде назавжди видалено з серверів Arduino та локальних кешів. Ця дія незворотна. Ви бажаєте видалити поточний скетч?", + "deleteCurrentSketch": "Скетч '{0}' буде остаточно видалено. Ця дія незворотна. Ви бажаєте видалити поточний скетч?", "fileNewName": "Ім'я для нового файлу", - "invalidExtension": ".{0} is not a valid extension", + "invalidExtension": ".{0} це хибне розширення", "newFileName": "Нове ім'я файлу" } } diff --git a/i18n/vi.json b/i18n/vi.json index 59f855bfb..95f504efd 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -139,6 +139,7 @@ "installManually": "Cài thủ công", "later": "Để sau", "noBoardSelected": "Không có bo mạch được chọn", + "noSketchOpened": "No sketch opened", "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?", @@ -146,6 +147,7 @@ "processing": "Đang sử lý", "recommended": "Khuyến khích", "retired": "Retired", + "selectManually": "Select Manually", "selectedOn": "tại {0}", "serialMonitor": "Serial Monitor", "type": "Kiểu", @@ -209,7 +211,9 @@ "debug": { "debugWithMessage": "Sửa lỗi - {0}", "debuggingNotSupported": "Sửa lỗi không hỗ trợ bởi '{0}'", + "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Nền tảng chưa được cài đặt cho '{0}'", + "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -460,6 +464,8 @@ "saveSketchAs": "Lưu thư mục sketch như là...", "showFolder": "Hiện thư mục sketch", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Sketchbook cục bộ", "titleSketchbook": "Sketchbook", diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index 19c099037..de7a26576 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -12,13 +12,13 @@ }, "board": { "board": "{0} 開發板", - "boardConfigDialogTitle": "選擇其他開發板和埠", + "boardConfigDialogTitle": "選擇其他開發板及連接埠", "boardInfo": "開發板資訊", "boards": "開發板", - "configDialog1": "若要上傳 Sketch 請選擇開發板及埠", + "configDialog1": "若要上傳 Sketch 請選擇開發板及連接埠", "configDialog2": "單選擇開發板只能編譯,不能上傳", "couldNotFindPreviouslySelected": "已安装平台{1}中找不到您選的開發板{0}。請手動選擇。你想選擇嗎?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "編輯開發板和連接埠", "getBoardInfo": "取得開發板資訊", "inSketchbook": "(在 sketchbook 內)", "installNow": "選取的 {2} 開發板必須安裝 {0} {1} 核心程式,要現在安裝嗎?", @@ -32,7 +32,7 @@ "ports": "連接埠", "programmer": "燒錄器", "reselectLater": "請稍後再選擇", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "使用在 '{1}' 發現的 '{0}'", "searchBoard": "搜尋開發板", "selectBoard": "選擇開發版", "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", @@ -41,7 +41,7 @@ "succesfullyInstalledPlatform": "成功安裝平台 {0}:{1}", "succesfullyUninstalledPlatform": "成功卸載平台 {0}:{1}", "typeOfPorts": "{0}連接埠", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "未知的開發板", "unknownBoard": "未知的開發版" }, "boardsManager": "開發板管理員", @@ -139,6 +139,7 @@ "installManually": "手動安裝", "later": "稍後", "noBoardSelected": "未選取開發板", + "noSketchOpened": "未開啟 sketch", "notConnected": "[未連接]", "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,要切換成新版 `.ino` 嗎?", @@ -146,6 +147,7 @@ "processing": "資料處理中", "recommended": "推薦", "retired": "不再支援", + "selectManually": "手動選取", "selectedOn": "在 {0}", "serialMonitor": "序列埠監控窗", "type": "類型", @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "除錯 - {0}", "debuggingNotSupported": "'{0}' 不支援除錯功能。", + "getDebugInfo": "取得除錯資訊...", "noPlatformInstalledFor": "平台未安裝給'{0}'", + "noProgrammerSelectedFor": "未選取給 '{0}' 用的燒錄器", "optimizeForDebugging": "除錯最佳化", "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "清除開發板歷史清單", + "clearBoardsConfig": "清除已選取的開發板及連接埠", + "dumpBoardList": "列出開發板清單" }, "dialog": { "dontAskAgain": "不要再詢問" @@ -250,7 +254,7 @@ "selectBoard": "選擇開發版", "selectVersion": "選擇韌體版本", "successfullyInstalled": "韌體安裝成功", - "updater": "Firmware Updater" + "updater": "韌體更新" }, "help": { "environment": "環境", @@ -289,7 +293,7 @@ "addZip": "加入 .zip 程式庫 ...", "arduinoLibraries": "Arduino 程式庫", "contributedLibraries": "貢獻的程式庫", - "include": "含括程式庫", + "include": "程式庫", "installAll": "安裝全部", "installLibraryDependencies": "安裝相依的程式庫", "installMissingDependencies": "要安裝缺少的相依程式嗎?", @@ -460,6 +464,8 @@ "saveSketchAs": "另存 Sketch 資料夾為", "showFolder": "顯示 Sketch 資料夾", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "本地端的 Sketchbook", "titleSketchbook": "Sketchbook", diff --git a/i18n/zh.json b/i18n/zh.json index 17e66f32e..9919e0ef2 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -18,7 +18,7 @@ "configDialog1": "如果要上传项目,请选择开发板和端口。", "configDialog2": "如果你只选择了开发板,你可以编译项目,但不能上传项目。", "couldNotFindPreviouslySelected": "在安装的平台 ‘{1}’ 中找不到以前选择的开发板 ‘{0}’。请手动选择要使用的开发板。你想现在重新选择它吗?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "编辑开发板和端口……", "getBoardInfo": "获得开发板信息", "inSketchbook": "(在项目文件夹中)", "installNow": "必须为当前选定的 {2} 开发板板安装 “{0}{1}” 内核。你想现在安装吗?", @@ -32,7 +32,7 @@ "ports": "端口", "programmer": "编程器", "reselectLater": "稍后重新选择", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "使用在 '{1}' 上发现的 '{0}'", "searchBoard": "搜索开发坂", "selectBoard": "选择开发板", "selectPortForInfo": "请选择一个端口以获取开发板信息。", @@ -41,7 +41,7 @@ "succesfullyInstalledPlatform": "已成功安装平台 {0}:{1}", "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}", "typeOfPorts": "{0} 端口", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "没有经过确认的开发板", "unknownBoard": "未知开发板" }, "boardsManager": "开发板管理器", @@ -139,6 +139,7 @@ "installManually": "手动安装", "later": "之后", "noBoardSelected": "没有选择开发板", + "noSketchOpened": "未打开项目", "notConnected": "[没有连接]", "offlineIndicator": "你似乎处于离线状态。如果没有网络连接,Arduino CLI 可能无法下载所需的资源,并可能导致故障。请连接网络并重新启动程序。", "oldFormat": "‘{0}’ 仍然使用旧的 ‘.pde’ 格式。是否要切换到新的 ‘.ino’ 扩展?", @@ -146,6 +147,7 @@ "processing": "正在处理中", "recommended": "推荐", "retired": "不再支持的", + "selectManually": "手动选择", "selectedOn": "在{0}上", "serialMonitor": "串口监视器", "type": "类型", @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "调试 - {0}", "debuggingNotSupported": "‘{0}’ 不支持调试", + "getDebugInfo": "正在获取调试信息。。。", "noPlatformInstalledFor": "‘{0}’ 平台未安装", + "noProgrammerSelectedFor": "未为'{0}'项目选择任何烧录器。", "optimizeForDebugging": "调试优化", "sketchIsNotCompiled": "项目 '{0}' 在开始调试会话之前必须经过验证。请验证草图并重新开始调试。你现在要验证草图吗?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "清除开发板的历史列表", + "clearBoardsConfig": "清除已经选择的开发板和连接端口", + "dumpBoardList": "列出开发板列表" }, "dialog": { "dontAskAgain": "不要再请求" @@ -250,7 +254,7 @@ "selectBoard": "选择开发板", "selectVersion": "选择固件版本", "successfullyInstalled": "固件成功安装", - "updater": "Firmware Updater" + "updater": "固件更新" }, "help": { "environment": "环境", @@ -282,8 +286,8 @@ "versionDownloaded": "Arduino IDE {0} 已经下载。" }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "库文件 '{0}{1}' 安装失败", + "platformInstallFailed": "平台安装失败:'{0}{1}'" }, "library": { "addZip": "添加 .ZIP 库...", @@ -385,7 +389,7 @@ "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}\"." + "dockPanel": "_{0}_窗口小部件所在的应用程序shell区域不是在 \"bottom\" 或 \"bottom\"。默认为 \"{1}\"。" }, "network": "网络", "newSketchbookLocation": "选择新的项目文件夹地址", @@ -460,6 +464,8 @@ "saveSketchAs": "将项目文件夹另存为…", "showFolder": "显示项目文件夹", "sketch": "项目", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "项目文件夹", "titleLocalSketchbook": "本地项目文件夹", "titleSketchbook": "项目文件夹", @@ -483,8 +489,8 @@ "currentThemeNotFound": "找不到当前选中的主题:{0}。Arduino IDE 已选择一个与缺失者兼容的内置主题。", "dark": "暗黑", "deprecated": "{0} (已弃用)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", + "hc": "深色高对比度", + "hcLight": "浅色高对比度", "light": "明亮", "user": "{0}(用户)" }, diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 45d9297f4..026bfbd2c 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -6,19 +6,19 @@ }, "account": { "goToCloudEditor": "前往雲端編輯器", - "goToIoTCloud": "前往物聯網雲", - "goToProfile": "到個人資訊", + "goToIoTCloud": "前往物聯網雲端", + "goToProfile": "前往個人資訊", "menuTitle": "Arduino雲" }, "board": { "board": "{0} 開發板", - "boardConfigDialogTitle": "選擇其他開發板和埠", + "boardConfigDialogTitle": "選擇其他開發板及連接埠", "boardInfo": "開發板資訊", - "boards": "開發版", - "configDialog1": "若要上傳 Sketch 請選擇開發板及埠", + "boards": "開發板", + "configDialog1": "若要上傳 Sketch 請選擇開發板及連接埠", "configDialog2": "單選擇開發板只能編譯,不能上傳", "couldNotFindPreviouslySelected": "已安装平台{1}中找不到您選的開發板{0}。請手動選擇。你想選擇嗎?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "編輯開發板和連接埠", "getBoardInfo": "取得開發板資訊", "inSketchbook": "(在 sketchbook 內)", "installNow": "選取的 {2} 開發板必須安裝 {0} {1} 核心程式,要現在安裝嗎?", @@ -27,22 +27,22 @@ "noPortsDiscovered": "未找到連接埠", "nonSerialPort": "非序列埠,無法取得資訊。", "openBoardsConfig": "選擇其他開發板及連接埠", - "pleasePickBoard": "請選擇已連接上的開發版", + "pleasePickBoard": "請選擇已連接上的開發板", "port": "連接埠: {0}", "ports": "連接埠", "programmer": "燒錄器", "reselectLater": "請稍後再選擇", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "使用在 '{1}' 發現的 '{0}'", "searchBoard": "搜尋開發板", - "selectBoard": "選擇開發版", + "selectBoard": "選擇開發板", "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", "showAllPorts": "顯示所有連接埠", "succesfullyInstalledPlatform": "成功安裝平台 {0}:{1}", "succesfullyUninstalledPlatform": "成功卸載平台 {0}:{1}", "typeOfPorts": "{0}連接埠", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "未知的開發版" + "unconfirmedBoard": "未確認的開發板", + "unknownBoard": "未知的開發板" }, "boardsManager": "開發板管理員", "boardsType": { @@ -76,11 +76,11 @@ "checkForUpdates": { "checkForUpdates": "檢查 Arduino 更新", "installAll": "全部安裝", - "noUpdates": "没有更新版。", + "noUpdates": "沒有版本更新。", "promptUpdateBoards": "部分開發板有更新檔。", - "promptUpdateLibraries": "部分程式庫有更新檔。", + "promptUpdateLibraries": "部分函式庫有更新檔。", "updatingBoards": "更新開發板中...", - "updatingLibraries": "更新程式庫中..." + "updatingLibraries": "更新函式庫中..." }, "cli-error-parser": { "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include <Keyboard.h>'。", @@ -138,7 +138,8 @@ "contributed": "已貢獻", "installManually": "手動安裝", "later": "稍後", - "noBoardSelected": "沒有選擇開發版", + "noBoardSelected": "沒有選擇開發板", + "noSketchOpened": "未開啟 sketch", "notConnected": "[未連接]", "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,要切換成新版 `.ino` 嗎?", @@ -146,6 +147,7 @@ "processing": "資料處理中", "recommended": "推薦", "retired": "不再支援", + "selectManually": "手動選取", "selectedOn": "在 {0}", "serialMonitor": "序列埠監控窗", "type": "類型", @@ -156,7 +158,7 @@ "error": "編譯錯誤:{0} " }, "component": { - "boardsIncluded": "本套件內建的開發版:", + "boardsIncluded": "本套件內建的開發板:", "by": "by", "clickToOpen": "點擊以瀏覽器開啟:{0}", "filterSearch": "篩選搜尋結果...", @@ -198,7 +200,7 @@ }, "coreContribution": { "copyError": "複製錯誤訊息", - "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取開發版" + "noBoardSelected": "未選取開發板。請從 工具 > 開發板 中選取開發板" }, "createCloudCopy": "推送 sketch 至雲端。", "daemon": { @@ -209,14 +211,16 @@ "debug": { "debugWithMessage": "除錯 - {0}", "debuggingNotSupported": "'{0}'不支援除錯。", + "getDebugInfo": "取得除錯資訊...", "noPlatformInstalledFor": "平台未安裝給'{0}'", + "noProgrammerSelectedFor": "未選取給 '{0}' 用的燒錄器", "optimizeForDebugging": "除錯最佳化", "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "清除開發板歷史清單", + "clearBoardsConfig": "清除已選取的開發板及連接埠", + "dumpBoardList": "列出開發板清單" }, "dialog": { "dontAskAgain": "不要再詢問" @@ -236,7 +240,7 @@ "examples": { "builtInExamples": "內建範例", "couldNotInitializeExamples": "無法初始內建的範例", - "customLibrary": "客製程式庫的範例", + "customLibrary": "客製函式庫的範例", "for": "{0} 的範例", "forAny": "適用各種開發板的範例", "menu": "範例" @@ -247,10 +251,10 @@ "install": "安裝", "installingFirmware": "安裝韌體", "overwriteSketch": "安裝將覆寫開發板上的 Sketch", - "selectBoard": "選擇開發版", + "selectBoard": "選擇開發板", "selectVersion": "選擇韌體版本", "successfullyInstalled": "韌體安裝成功", - "updater": "Firmware Updater" + "updater": "韌體更新" }, "help": { "environment": "環境", @@ -282,30 +286,30 @@ "versionDownloaded": "Arduino IDE{0}下載完成。" }, "installable": { - "libraryInstallFailed": "程式庫 ' {0} {1}' : 安裝失敗。", + "libraryInstallFailed": "函式庫 ' {0} {1}' : 安裝失敗。", "platformInstallFailed": "平台安裝失敗: '{0} {1}' " }, "library": { - "addZip": "加入 .zip 程式庫 ...", - "arduinoLibraries": "Arduino 程式庫", - "contributedLibraries": "貢獻的程式庫", - "include": "含括程式庫", + "addZip": "加入 .zip 函式庫 ...", + "arduinoLibraries": "Arduino 函式庫", + "contributedLibraries": "貢獻的函式庫", + "include": "函式庫", "installAll": "全部安裝", - "installLibraryDependencies": "安裝相依的程式庫", + "installLibraryDependencies": "安裝相依的函式庫", "installMissingDependencies": "要安裝缺少的相依程式嗎?", - "installOneMissingDependency": "要安裝缺少的相依程式庫嗎 ?", + "installOneMissingDependency": "要安裝缺少的相依函式庫嗎 ?", "installWithoutDependencies": "不管相依性直接安裝", - "installedSuccessfully": "成功安裝程式庫 {0}:{1} ", - "libraryAlreadyExists": "程式庫已存在,要覆寫它嗎?", - "manageLibraries": "管理程式庫", - "namedLibraryAlreadyExists": "{0} 程式庫資料夾已存在,要覆寫它嗎?", - "needsMultipleDependencies": "程式庫<b>{0}:{1}</b>需要下列未安裝的相依程式:", - "needsOneDependency": "程式庫<b>{0}:{1}</b>需要其他未安装的相依程式:", - "overwriteExistingLibrary": "要覆寫既有的程式庫嗎?", - "successfullyInstalledZipLibrary": "從 {0} 成功安裝程式庫", - "title": "程式庫管理員", - "uninstalledSuccessfully": "成功卸載程式庫 {0}:{1}", - "zipLibrary": "程式庫" + "installedSuccessfully": "成功安裝函式庫 {0}:{1} ", + "libraryAlreadyExists": "函式庫已存在,要覆寫它嗎?", + "manageLibraries": "管理函式庫", + "namedLibraryAlreadyExists": "{0} 函式庫資料夾已存在,要覆寫它嗎?", + "needsMultipleDependencies": "函式庫<b>{0}:{1}</b>需要下列未安裝的相依程式:", + "needsOneDependency": "函式庫<b>{0}:{1}</b>需要其他未安装的相依程式:", + "overwriteExistingLibrary": "要覆寫既有的函式庫嗎?", + "successfullyInstalledZipLibrary": "從 {0} 成功安裝函式庫", + "title": "函式庫管理員", + "uninstalledSuccessfully": "成功卸載函式庫 {0}:{1}", + "zipLibrary": "函式庫" }, "librarySearchProperty": { "topic": "主題" @@ -349,15 +353,15 @@ "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": "Sketch 同步, 預設:開啟。", @@ -404,7 +408,7 @@ "sketchbook.location": "sketchbook 位置", "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", "survey.notification": "有新問卷時會通知使用者, 預設為: true。", - "unofficialBoardSupport": "點擊來取得非官方開發版的支援網址", + "unofficialBoardSupport": "點擊來取得非官方開發板的支援網址", "upload": "上傳", "upload.verbose": "上傳時輸出的詳細資訊。預設: False", "verifyAfterUpload": "上傳後驗證程式碼", @@ -417,7 +421,7 @@ "renameSketchTitle": "雲 sketch 的新名稱" }, "replaceMsg": "取代現有的 {0} 版本?", - "selectZip": "選擇內含程式庫的 zip 檔", + "selectZip": "選擇內含函式庫的 zip 檔", "serial": { "autoscroll": "自動捲動", "carriageReturn": "內有 CR", @@ -427,7 +431,7 @@ "newLineCarriageReturn": "NL和CR字元", "noLineEndings": "沒有斷行字元", "notConnected": "未連上。請選擇開發板及連接埠後自動連接", - "openSerialPlotter": "序列埠監控窗", + "openSerialPlotter": "開啟序列繪圖家", "timestamp": "時間戳記", "toggleTimestamp": "切換時戳" }, @@ -460,13 +464,15 @@ "saveSketchAs": "另存 Sketch 資料夾為", "showFolder": "顯示 Sketch 資料夾", "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "本地端的 Sketchbook", "titleSketchbook": "Sketchbook", "upload": "上傳", "uploadUsingProgrammer": "使用燒錄器上傳", "uploading": "上傳...", - "userFieldsNotFoundError": "找不到已連接開發版中的用戶欄", + "userFieldsNotFoundError": "找不到已連接開發板中的用戶欄", "verify": "驗證", "verifyOrCompile": "驗證/編譯" }, @@ -493,7 +499,7 @@ }, "updateIndexes": { "updateIndexes": "更新索引", - "updateLibraryIndex": "更新程式庫索引", + "updateLibraryIndex": "更新函式庫索引", "updatePackageIndex": "更新套件索引" }, "upload": { From d419a6c6f0fa6503f9e94350d33ac0dd5fc39c54 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 6 Feb 2024 19:16:20 +0100 Subject: [PATCH 296/384] feat: preference to limit thread count of the LS Added a new preference (`arduino.language.asyncWorkers`) to control the number of async workers used by `clangd`. Users can fine tune the `clangd` thread count to overcome the excessive CPU usage. Use 0.1.2 Arduino Tools VSIX in IDE2. Ref: arduino/arduino-language-server#177 Ref: arduino/vscode-arduino-tools#46 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 4 +- .../src/browser/arduino-preferences.ts | 15 ++++++ .../src/browser/contributions/ino-language.ts | 48 ++++++++++++++++--- electron-app/package.json | 2 +- i18n/en.json | 1 + 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index f6f09af97..f353e961f 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -169,13 +169,13 @@ ], "arduino": { "arduino-cli": { - "version": "0.35.1" + "version": "0.35.2" }, "arduino-fwuploader": { "version": "2.4.1" }, "arduino-language-server": { - "version": "0.7.5" + "version": "0.7.6" }, "clangd": { "version": "14.0.0" diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index f2c83a7f6..bc9cdb099 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -54,6 +54,10 @@ export function isMonitorWidgetDockPanel( return arg === 'bottom' || arg === 'right'; } +export const defaultAsyncWorkers = 0 as const; +export const minAsyncWorkers = defaultAsyncWorkers; +export const maxAsyncWorkers = 8 as const; + type StrictPreferenceSchemaProperties<T extends object> = { [p in keyof T]: PreferenceSchemaProperty; }; @@ -79,6 +83,16 @@ const properties: ArduinoPreferenceSchemaProperties = { ), default: false, }, + 'arduino.language.asyncWorkers': { + type: 'number', + description: nls.localize( + 'arduino/preferences/language.asyncWorkers', + 'Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.' + ), + minimum: minAsyncWorkers, + maximum: maxAsyncWorkers, + default: defaultAsyncWorkers, + }, 'arduino.compile.verbose': { type: 'boolean', description: nls.localize( @@ -298,6 +312,7 @@ export const ArduinoConfigSchema: PreferenceSchema = { export interface ArduinoConfiguration { 'arduino.language.log': boolean; 'arduino.language.realTimeDiagnostics': boolean; + 'arduino.language.asyncWorkers': number; 'arduino.compile.verbose': boolean; 'arduino.compile.experimental': boolean; 'arduino.compile.revealRange': ErrorRevealStrategy; diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index 5d1fe4638..ab54c7ae4 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -6,19 +6,24 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { Mutex } from 'async-mutex'; import { ArduinoDaemon, - assertSanitizedFqbn, BoardIdentifier, BoardsService, ExecutableService, + assertSanitizedFqbn, isBoardIdentifierChangeEvent, sanitizeFqbn, } from '../../common/protocol'; -import { CurrentSketch } from '../sketches-service-client-impl'; +import { + defaultAsyncWorkers, + maxAsyncWorkers, + minAsyncWorkers, +} from '../arduino-preferences'; +import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { HostedPluginEvents } from '../hosted/hosted-plugin-events'; import { NotificationCenter } from '../notification-center'; +import { CurrentSketch } from '../sketches-service-client-impl'; import { SketchContribution, URI } from './contribution'; -import { BoardsDataStore } from '../boards/boards-data-store'; interface DaemonAddress { /** @@ -76,6 +81,10 @@ interface StartLanguageServerParams { * If `true`, the logging is not forwarded to the _Output_ view via the language client. */ readonly silentOutput?: boolean; + /** + * Number of async workers used by `clangd`. Background index also uses this many workers. If `0`, `clangd` uses all available cores. It's `0` by default. + */ + readonly jobs?: number; } /** @@ -137,6 +146,7 @@ export class InoLanguage extends SketchContribution { switch (preferenceName) { case 'arduino.language.log': case 'arduino.language.realTimeDiagnostics': + case 'arduino.language.asyncWorkers': forceRestart(); } } @@ -168,9 +178,12 @@ export class InoLanguage extends SketchContribution { } }), ]); - this.boardsServiceProvider.ready.then(() => - start(this.boardsServiceProvider.boardsConfig.selectedBoard) - ); + Promise.all([ + this.boardsServiceProvider.ready, + this.preferences.ready, + ]).then(() => { + start(this.boardsServiceProvider.boardsConfig.selectedBoard); + }); } onStop(): void { @@ -230,11 +243,16 @@ export class InoLanguage extends SketchContribution { // NOOP return; } - this.logger.info(`Starting language server: ${fqbnWithConfig}`); const log = this.preferences.get('arduino.language.log'); const realTimeDiagnostics = this.preferences.get( 'arduino.language.realTimeDiagnostics' ); + const jobs = this.getAsyncWorkersPreferenceSafe(); + this.logger.info( + `Starting language server: ${fqbnWithConfig}${ + jobs ? ` (async worker count: ${jobs})` : '' + }` + ); let currentSketchPath: string | undefined = undefined; if (log) { const currentSketch = await this.sketchServiceClient.currentSketch(); @@ -273,6 +291,7 @@ export class InoLanguage extends SketchContribution { }, realTimeDiagnostics, silentOutput: true, + jobs, }), ]); } catch (e) { @@ -283,6 +302,21 @@ export class InoLanguage extends SketchContribution { release(); } } + // The Theia preference UI validation is bogus. + // To restrict the number of jobs to a valid value. + private getAsyncWorkersPreferenceSafe(): number { + const jobs = this.preferences.get( + 'arduino.language.asyncWorkers', + defaultAsyncWorkers + ); + if (jobs < minAsyncWorkers) { + return minAsyncWorkers; + } + if (jobs > maxAsyncWorkers) { + return maxAsyncWorkers; + } + return jobs; + } private async start( params: StartLanguageServerParams diff --git a/electron-app/package.json b/electron-app/package.json index de1249641..d8a106c05 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -196,7 +196,7 @@ "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.1.1.vsix", + "vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.2.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", diff --git a/i18n/en.json b/i18n/en.json index 0f09cc75a..841ab3a91 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", From 1b9c7e93e029e65765010eb84e1604b5e483a963 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 7 Feb 2024 11:49:14 +0100 Subject: [PATCH 297/384] chore: use version `2.3.0` for the next release Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index f353e961f..a0548666e 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.2.2", + "version": "2.3.0", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index d8a106c05..ad8b4fc00 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.2.2", + "version": "2.3.0", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.41.0", "@theia/terminal": "1.41.0", "@theia/workspace": "1.41.0", - "arduino-ide-extension": "2.2.2" + "arduino-ide-extension": "2.3.0" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/package.json b/package.json index efcbfe936..84ed7d744 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.2.2", + "version": "2.3.0", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 0822ed28da382bc1db17b2730aad71698dce4868 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 7 Feb 2024 17:29:06 +0100 Subject: [PATCH 298/384] chore: switch to version `2.3.1` after the release To produce a correctly versioned nightly build. See the [docs](https://github.com/arduino/arduino-ide/blob/1b9c7e93e029e65765010eb84e1604b5e483a963/docs/internal/release-procedure.md#7-%EF%B8%8F-bump-version-metadata-of-packages) for more details. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index a0548666e..f54ef3017 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.0", + "version": "2.3.1", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index ad8b4fc00..d0e38cc60 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.0", + "version": "2.3.1", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.41.0", "@theia/terminal": "1.41.0", "@theia/workspace": "1.41.0", - "arduino-ide-extension": "2.3.0" + "arduino-ide-extension": "2.3.1" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/package.json b/package.json index 84ed7d744..95a53137f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.0", + "version": "2.3.1", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 71bd189eb134e37e2c2e32953b90ece715647a59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 19:24:30 +0000 Subject: [PATCH 299/384] build(deps): Bump arduino/setup-task from 1 to 2 Bumps [arduino/setup-task](https://github.com/arduino/setup-task) from 1 to 2. - [Release notes](https://github.com/arduino/setup-task/releases) - [Commits](https://github.com/arduino/setup-task/compare/v1...v2) --- updated-dependencies: - dependency-name: arduino/setup-task dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 4 ++-- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a73935c71..372f8bd59 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -320,7 +320,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x @@ -438,7 +438,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index b3179b101..ec80cad86 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -71,7 +71,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 77ac9ca3b..92e8b6eb0 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -29,7 +29,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 49910a5ad..7f4c5d293 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -29,7 +29,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 8357fbb74..f9fcb446a 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -31,7 +31,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Task - uses: arduino/setup-task@v1 + uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x From 74c580175b50c03bfff844b963ee9f09d4f7eb49 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 6 Feb 2024 23:42:33 -0800 Subject: [PATCH 300/384] Use arduino/setup-task@v1 action for Linux build job Unfortunately the latest v2 version of the arduino/setup-task action used to install the Task task runner tool in the runner machine has a dependency on a higher version of glibc than is provided by the Linux container. For this reason, the workflow is configured to use arduino/setup-task@v1 for the Linux build job. We will receive pull requests from Dependabot offering to update this outdated action dependency at each subsequent major version release of the action (which are not terribly frequent). We must decline the bump of the action in that specific step, but we can accept the bumps of all other usages of the action in the workflows. Dependabot remembers when you decline a bump so this should not be too bothersome. --- .github/workflows/build.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 372f8bd59..eecd06d47 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -320,11 +320,20 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile + if: fromJSON(matrix.config.container) == null uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install Taskfile + # actions/setup-task@v2 has dependency on a higher version of glibc than available in the Linux container. + if: fromJSON(matrix.config.container) != null + uses: arduino/setup-task@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + - name: Package env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ca779e5cf248301d0c2c108559c41312495e00bb Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 8 Feb 2024 10:21:09 +0100 Subject: [PATCH 301/384] fix: debug widget layout updates Use customized `PanelLayout#removeWidget` and `PanelLayout#insertWidget` logic for the layout updates. The customized functions ensure no side effect if adding/removing the widget to/from the layout but it's already present/absent. Unlike the default [`PanelLayout#removeWidget`](https://github.com/phosphorjs/phosphor/blob/9f5e11025b62d2c4a6fb59e2681ae1ed323dcde4/packages/widgets/src/panellayout.ts#L154-L156) behavior, do not try to remove the widget if it's not present (has a negative index). Otherwise, required widgets might be removed based on the default [`ArrayExt#removeAt`](https://github.com/phosphorjs/phosphor/blob/9f5e11025b62d2c4a6fb59e2681ae1ed323dcde4/packages/algorithm/src/array.ts#L1075-L1077) behavior. Closes: arduino/arduino-ide#2354 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/browser/theia/debug/debug-widget.ts | 21 ++- .../src/browser/theia/dialogs/widgets.ts | 51 ++++++++ .../src/test/browser/widgets.test.ts | 121 ++++++++++++++++++ 3 files changed, 182 insertions(+), 11 deletions(-) create mode 100644 arduino-ide-extension/src/browser/theia/dialogs/widgets.ts create mode 100644 arduino-ide-extension/src/test/browser/widgets.test.ts diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts b/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts index cca4d1b06..9f332bbe7 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts @@ -1,8 +1,5 @@ -import { - codicon, - PanelLayout, - Widget, -} from '@theia/core/lib/browser/widgets/widget'; +import { codicon } from '@theia/core/lib/browser/widgets/widget'; +import { Widget } from '@theia/core/shared/@phosphor/widgets'; import { inject, injectable, @@ -10,6 +7,10 @@ import { } from '@theia/core/shared/inversify'; import { DebugWidget as TheiaDebugWidget } from '@theia/debug/lib/browser/view/debug-widget'; import { DebugDisabledStatusMessageSource } from '../../contributions/debug'; +import { + removeWidgetIfPresent, + unshiftWidgetIfNotPresent, +} from '../dialogs/widgets'; @injectable() export class DebugWidget extends TheiaDebugWidget { @@ -38,12 +39,10 @@ export class DebugWidget extends TheiaDebugWidget { this.messageNode.textContent = message ?? ''; const enabled = !message; updateVisibility(enabled, this.toolbar, this.sessionWidget); - if (this.layout instanceof PanelLayout) { - if (enabled) { - this.layout.removeWidget(this.statusMessageWidget); - } else { - this.layout.insertWidget(0, this.statusMessageWidget); - } + if (enabled) { + removeWidgetIfPresent(this.layout, this.statusMessageWidget); + } else { + unshiftWidgetIfNotPresent(this.layout, this.statusMessageWidget); } this.title.iconClass = enabled ? codicon('debug-alt') : 'fa fa-ban'; // TODO: find a better icon? }); diff --git a/arduino-ide-extension/src/browser/theia/dialogs/widgets.ts b/arduino-ide-extension/src/browser/theia/dialogs/widgets.ts new file mode 100644 index 000000000..1b64c0a40 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/dialogs/widgets.ts @@ -0,0 +1,51 @@ +import { + Layout, + PanelLayout, + Widget, +} from '@theia/core/shared/@phosphor/widgets'; + +/** + * + * Removes the widget from the layout if the `layout` is a `PanelLayout` and the widget is present in the layout. + * Otherwise, it's NOOP + * @param layout the layout to remove the widget from. Must be a `PanelLayout`. + * @param toRemove the widget to remove from the layout + */ +export function removeWidgetIfPresent( + layout: Layout | null, + toRemove: Widget +): void { + if (layout instanceof PanelLayout) { + const index = layout.widgets.indexOf(toRemove); + if (index < 0) { + // Unlike the default `PanelLayout#removeWidget` behavior, (https://github.com/phosphorjs/phosphor/blob/9f5e11025b62d2c4a6fb59e2681ae1ed323dcde4/packages/widgets/src/panellayout.ts#L154-L156) + // do not try to remove widget if it's not present (the index is negative). + // Otherwise, required widgets could be removed based on the default ArrayExt behavior (https://github.com/phosphorjs/phosphor/blob/9f5e11025b62d2c4a6fb59e2681ae1ed323dcde4/packages/algorithm/src/array.ts#L1075-L1077) + // See https://github.com/arduino/arduino-ide/issues/2354 for more details. + return; + } + layout.removeWidget(toRemove); + } +} + +/** + * + * Inserts the widget to the `0` index of the layout if the `layout` is a `PanelLayout` and the widget is not yet part of the layout. + * Otherwise, it's NOOP + * @param layout the layout to add the widget to. Must be a `PanelLayout`. + * @param toAdd the widget to add to the layout + */ +export function unshiftWidgetIfNotPresent( + layout: Layout | null, + toAdd: Widget +): void { + if (layout instanceof PanelLayout) { + const index = layout.widgets.indexOf(toAdd); + if (index >= 0) { + // Do not try to add the widget to the layout if it's already present. + // This is the counterpart logic of the `removeWidgetIfPresent` function. + return; + } + layout.insertWidget(0, toAdd); + } +} diff --git a/arduino-ide-extension/src/test/browser/widgets.test.ts b/arduino-ide-extension/src/test/browser/widgets.test.ts new file mode 100644 index 000000000..542cbac97 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/widgets.test.ts @@ -0,0 +1,121 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import type { PanelLayout, Widget } from '@theia/core/shared/@phosphor/widgets'; +import { expect } from 'chai'; +import type { + removeWidgetIfPresent, + unshiftWidgetIfNotPresent, +} from '../../browser/theia/dialogs/widgets'; + +describe('widgets', () => { + let toDispose: DisposableCollection; + + beforeEach(() => { + const disableJSDOM = + require('@theia/core/lib/browser/test/jsdom').enableJSDOM(); + toDispose = new DisposableCollection( + Disposable.create(() => disableJSDOM()) + ); + }); + + afterEach(() => toDispose.dispose()); + + describe('removeWidgetIfPresent', () => { + let testMe: typeof removeWidgetIfPresent; + + beforeEach( + () => + (testMe = + require('../../browser/theia/dialogs/widgets').removeWidgetIfPresent) + ); + + it('should remove the widget if present', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + const toRemoveWidget = newWidget(); + layout.addWidget(toRemoveWidget); + + expect(layout.widgets).to.be.deep.equal([widget, toRemoveWidget]); + + testMe(layout, toRemoveWidget); + + expect(layout.widgets).to.be.deep.equal([widget]); + }); + + it('should be noop if the widget is not part of the layout', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + + expect(layout.widgets).to.be.deep.equal([widget]); + + testMe(layout, newWidget()); + + expect(layout.widgets).to.be.deep.equal([widget]); + }); + }); + + describe('unshiftWidgetIfNotPresent', () => { + let testMe: typeof unshiftWidgetIfNotPresent; + + beforeEach( + () => + (testMe = + require('../../browser/theia/dialogs/widgets').unshiftWidgetIfNotPresent) + ); + + it('should unshift the widget if not present', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + + expect(layout.widgets).to.be.deep.equal([widget]); + + const toAdd = newWidget(); + testMe(layout, toAdd); + + expect(layout.widgets).to.be.deep.equal([toAdd, widget]); + }); + + it('should be NOOP if widget is already part of the layout (at 0 index)', () => { + const layout = newPanelLayout(); + const toAdd = newWidget(); + layout.addWidget(toAdd); + const widget = newWidget(); + layout.addWidget(widget); + + expect(layout.widgets).to.be.deep.equal([toAdd, widget]); + + testMe(layout, toAdd); + + expect(layout.widgets).to.be.deep.equal([toAdd, widget]); + }); + + it('should be NOOP if widget is already part of the layout (at >0 index)', () => { + const layout = newPanelLayout(); + const widget = newWidget(); + layout.addWidget(widget); + const toAdd = newWidget(); + layout.addWidget(toAdd); + + expect(layout.widgets).to.be.deep.equal([widget, toAdd]); + + testMe(layout, toAdd); + + expect(layout.widgets).to.be.deep.equal([widget, toAdd]); + }); + }); + + function newWidget(): Widget { + const { Widget } = require('@theia/core/shared/@phosphor/widgets'); + return new Widget(); + } + + function newPanelLayout(): PanelLayout { + const { PanelLayout } = require('@theia/core/shared/@phosphor/widgets'); + return new PanelLayout(); + } +}); From 316e0fd8beedf6cf239fee757dd9ad8feb5f77db Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 8 Feb 2024 11:21:50 +0100 Subject: [PATCH 302/384] fix(security): update all vulnerable dependencies Resolutions: - `nano@^10.1.3`, - `msgpackr@^1.10.1`, - `axios@^1.6.7` Fixes: - [GHSA-wf5p-g6vw-rhxx](https://github.com/advisories/GHSA-wf5p-g6vw-rhxx) (`CVE-2023-45857`) - [GHSA-jchw-25xp-jwwc](https://github.com/advisories/GHSA-jchw-25xp-jwwc) (`CVE-2023-26159`) - [GHSA-7hpj-7hhx-2fgx](https://github.com/advisories/GHSA-7hpj-7hhx-2fgx) (`CVE-2023-52079`) Ref: nrwl/nx#20493 Ref: eclipse-theia/theia#13365 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- package.json | 5 +- yarn.lock | 208 ++++++++++++++++++++++++--------------------------- 2 files changed, 102 insertions(+), 111 deletions(-) diff --git a/package.json b/package.json index 95a53137f..9a349775d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,10 @@ "node": ">=18.17.0 <21" }, "resolutions": { - "@theia/cli/@babel/traverse": "^7.23.2" + "@theia/cli/@babel/traverse": "^7.23.2", + "@theia/cli/@theia/application-package/nano": "^10.1.3", + "**/@theia/core/msgpackr": "^1.10.1", + "nx/axios": "^1.6.7" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/yarn.lock b/yarn.lock index 7e7f75a09..583a24e6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1280,21 +1280,21 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@lerna/child-process@7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.3.0.tgz#c56488a8a881f22a64793bf9339c5a2450a18559" - integrity sha512-rA+fGUo2j/LEq6w1w8s6oVikLbJTWoIDVpYMc7bUCtwDOUuZKMQiRtjmpavY3fTm7ltu42f4AKflc2A70K4wvA== +"@lerna/child-process@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.4.2.tgz#a2fd013ac2150dc288270d3e0d0b850c06bec511" + integrity sha512-je+kkrfcvPcwL5Tg8JRENRqlbzjdlZXyaR88UcnCdNW0AJ1jX9IfHRys1X7AwSroU2ug8ESNC+suoBw1vX833Q== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.3.0.tgz#5438c231f617b8e825731390d394f8684af471d5" - integrity sha512-fjgiKjg9VXwQ4ZKKsrXICEKRiC3yo6+FprR0mc55uz0s5e9xupoSGLobUTTBdE7ncNB3ibqml8dfaAn/+ESajQ== +"@lerna/create@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.4.2.tgz#f845fad1480e46555af98bd39af29571605dddc9" + integrity sha512-1wplFbQ52K8E/unnqB0Tq39Z4e+NEoNrpovEnl6GpsTUrC6WDp8+w0Le2uCBV0hXyemxChduCkLz4/y1H1wTeg== dependencies: - "@lerna/child-process" "7.3.0" + "@lerna/child-process" "7.4.2" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -1399,35 +1399,35 @@ semver "^7.3.5" tar "^6.1.11" -"@msgpackr-extract/msgpackr-extract-darwin-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz#901c5937e1441572ea23e631fe6deca68482fe76" - integrity sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ== +"@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-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz#fb877fe6bae3c4d3cea29786737840e2ae689066" - integrity sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw== +"@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-linux-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz#986179c38b10ac41fbdaf7d036c825cbc72855d9" - integrity sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA== +"@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-arm@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz#15f2c6fe9e0adc06c21af7e95f484ff4880d79ce" - integrity sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg== +"@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-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz#30cae5c9a202f3e1fa1deb3191b18ffcb2f239a2" - integrity sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw== +"@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-win32-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz#016d855b6bc459fd908095811f6826e45dd4ba64" - integrity sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA== +"@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== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3177,7 +3177,7 @@ dependencies: "@types/node" "*" -"@types/tough-cookie@*", "@types/tough-cookie@^4.0.0": +"@types/tough-cookie@*": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== @@ -4126,27 +4126,12 @@ available-typed-arrays@^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" - resolved "https://registry.yarnpkg.com/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz#7b32af7d932508546c68b1fc5ba8f562884162e1" - integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== - dependencies: - is-redirect "^1.0.0" - pify "^5.0.0" - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" - integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== +axios@^1.0.0, axios@^1.6.2, axios@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.4" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -5097,10 +5082,10 @@ content-type@~1.0.4, content-type@~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@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== +conventional-changelog-angular@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== dependencies: compare-func "^2.0.0" @@ -6835,10 +6820,10 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -follow-redirects@^1.14.0, follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== font-awesome@^4.7.0: version "4.7.0" @@ -7713,9 +7698,9 @@ ignore-walk@^5.0.1: 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== + version "6.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" + integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== dependencies: minimatch "^9.0.0" @@ -8101,11 +8086,6 @@ is-potential-custom-element-name@^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" - integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -8528,12 +8508,12 @@ lazy-val@^1.0.4, lazy-val@^1.0.5: integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== lerna@^7.1.4: - version "7.3.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.3.0.tgz#efecafbdce15694e2f6841256e073a3a2061053e" - integrity sha512-Dt8TH+J+c9+3MhTYcm5OxnNzXb87WG7GPNj3kidjYJjJY7KxIMDNU37qBTYRWA1h3wAeNKBplXVQYUPkGcYgkQ== + version "7.4.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.4.2.tgz#03497125d7b7c8d463eebfe17a701b16bde2ad09" + integrity sha512-gxavfzHfJ4JL30OvMunmlm4Anw7d7Tq6tdVHzUukLdS9nWnxCN/QB21qR+VJYp5tcyXogHKbdUEGh6qmeyzxSA== dependencies: - "@lerna/child-process" "7.3.0" - "@lerna/create" "7.3.0" + "@lerna/child-process" "7.4.2" + "@lerna/create" "7.4.2" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -8543,7 +8523,7 @@ lerna@^7.1.4: clone-deep "4.0.1" cmd-shim "6.0.1" columnify "1.6.0" - conventional-changelog-angular "6.0.0" + conventional-changelog-angular "7.0.0" conventional-changelog-core "5.0.1" conventional-recommended-bump "7.0.1" cosmiconfig "^8.2.0" @@ -9667,26 +9647,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.0.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz#4bb749b58d9764cfdc0d91c7977a007b08e8f262" - integrity sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog== +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.2.0" - "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-arm" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-x64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-win32-x64" "2.2.0" - -msgpackr@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.6.1.tgz#4f3c94d6a5b819b838ffc736eddaf60eba436d20" - integrity sha512-Je+xBEfdjtvA4bKaOv8iRhjC8qX2oJwpYH4f7JrG4uMVJVmnmkAT4pjKdbztKprGj3iwjcxPzb5umVZ02Qq3tA== + "@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, msgpackr@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.10.1.tgz#51953bb4ce4f3494f0c4af3f484f01cfbb306555" + integrity sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ== optionalDependencies: - msgpackr-extract "^2.0.2" + msgpackr-extract "^3.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -9727,16 +9707,14 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nano@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/nano/-/nano-9.0.5.tgz#2b767819f612907a3ac09b21f2929d4097407262" - integrity sha512-fEAhwAdXh4hDDnC8cYJtW6D8ivOmpvFAqT90+zEuQREpRkzA/mJPcI4EKv15JUdajaqiLTXNoKK6PaRF+/06DQ== +nano@^10.1.3, nano@^9.0.5: + version "10.1.3" + resolved "https://registry.yarnpkg.com/nano/-/nano-10.1.3.tgz#5cb1ad14add4c9c82d53a79159848dafa84e7a13" + integrity sha512-q/hKQJJH3FhkkuJ3ojbgDph2StlSXFBPNkpZBZlsvZDbuYfxKJ4VtunEeilthcZtuIplIk1zVX5o2RgKTUTO+Q== dependencies: - "@types/tough-cookie" "^4.0.0" - axios "^0.21.1" - axios-cookiejar-support "^1.0.1" - qs "^6.9.4" - tough-cookie "^4.0.0" + axios "^1.6.2" + node-abort-controller "^3.0.1" + qs "^6.11.0" nanoid@3.3.3: version "3.3.3" @@ -9817,6 +9795,11 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" +node-abort-controller@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" @@ -9867,16 +9850,21 @@ node-fetch@^3.2.10: fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" -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-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: +node-gyp-build@^4.2.1: version "4.6.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== +node-gyp-build@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + 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" @@ -10717,7 +10705,7 @@ 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@5.0.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== @@ -11100,7 +11088,7 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.10.1, qs@^6.10.3, qs@^6.11.0, qs@^6.9.4: +qs@^6.10.1, qs@^6.10.3, qs@^6.11.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -12837,7 +12825,7 @@ token-types@^5.0.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -tough-cookie@^4.0.0, tough-cookie@^4.1.2: +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== From ff8c646cfa8f559c2192d57641dc69a42befc791 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 02:10:37 +0000 Subject: [PATCH 303/384] Updated translation files --- i18n/af.json | 1 + i18n/ar.json | 1 + i18n/az.json | 1 + i18n/bg.json | 1 + i18n/ca_ES.json | 1 + i18n/cs.json | 1 + i18n/de.json | 1 + i18n/el.json | 1 + i18n/es.json | 1 + i18n/eu.json | 1 + i18n/fa.json | 1 + i18n/fil.json | 1 + i18n/fr.json | 1 + i18n/he.json | 1 + i18n/hu.json | 1 + i18n/id.json | 1 + i18n/it.json | 1 + i18n/ja.json | 1 + i18n/ko.json | 1 + i18n/my_MM.json | 1 + i18n/ne.json | 1 + i18n/nl.json | 1 + i18n/pl.json | 1 + i18n/pt.json | 1 + i18n/ro.json | 1 + i18n/ru.json | 1 + i18n/sr.json | 1 + i18n/th.json | 1 + i18n/tr.json | 1 + i18n/uk.json | 1 + i18n/vi.json | 1 + i18n/zh-Hant.json | 1 + i18n/zh.json | 7 ++++--- i18n/zh_TW.json | 5 +++-- 34 files changed, 39 insertions(+), 5 deletions(-) diff --git a/i18n/af.json b/i18n/af.json index 599088bc6..15774de28 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", diff --git a/i18n/ar.json b/i18n/ar.json index bf072b1f6..5bca31e16 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "حجم خط المحرّر غير صالح . يجب ان يكون عدد موجب", "invalid.sketchbook.location": "موقع ملف المشروع غير صالح : {0}", "invalid.theme": "سمة غير صالحة", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "\"True\" اذا كان مخدم اللغات الخاص بArduino يستطيع توليد سجلات الى ملف المشروع , و الا \"False\", و هي كذلك بشكل افتراضي.", "language.realTimeDiagnostics": "اذا تم تفعيله , سيقوم سيرفر اللغة باعطاء تشخيصات للاخطاء خلال الوقت الحقيقي اثناء الكتابة ضمن المحرر . غير مفعل بشكل افتراضي", "manualProxy": "اعدادات الوكيل يدوياً", diff --git a/i18n/az.json b/i18n/az.json index 6ad56476a..a8cfcdb9d 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", diff --git a/i18n/bg.json b/i18n/bg.json index 0a10a6b33..6339fd280 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Невалиден размер на шрифта на редактора. Трябва да е положително цяло число.", "invalid.sketchbook.location": "Невалидно местоположение на скицника: {0}", "invalid.theme": "Невалидна тема.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True, ако езиковият сървър на Arduino трябва да генерира лог файлове в папката за скици. В противен случай false. По подразбиране е false.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Ръчна конфигурация на прокси", diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 5d0d7dabf..51b38011b 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Mida del tipus de lletra de l'editor no vàlida. Ha de ser un nombre enter positiu.", "invalid.sketchbook.location": "La ubicació del quadern de programes no és vàlida: {0}", "invalid.theme": "Tema no vàlid.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "És cert si el servidor d'idiomes Arduino hauria de generar fitxers de registre a la carpeta de programes. En cas contrari, fals. És fals per defecte.", "language.realTimeDiagnostics": "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", diff --git a/i18n/cs.json b/i18n/cs.json index 4af815f13..8469f806f 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Neplatná velikost editoru písem: Toto číslo musí být kladné.", "invalid.sketchbook.location": "Neplatné umístění projektů:{0}", "invalid.theme": "Neplatné téma.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "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", diff --git a/i18n/de.json b/i18n/de.json index 6b5163050..c755c08c8 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Ungültige Editor-Schriftgröße. Wert muss eine Ganzzahl größer 0 (Null) sein.", "invalid.sketchbook.location": "Ungültiger Sketchbook Speicherort: {0}", "invalid.theme": "Ungültiges Erscheinungsbild", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Wenn aktivert, werden Arduino-Sprach-Server-Logdateien in den Sketch-Ordner geschrieben. Standardmäßig deaktivert. ", "language.realTimeDiagnostics": "Wenn aktiviert, bietet der Sprachserver bei der Eingabe im Editor eine Echtzeitdiagnose. Ist standardmäßig deaktiviert.", "manualProxy": "Manuelle Proxy Einstellung", diff --git a/i18n/el.json b/i18n/el.json index aec883d22..76d453b26 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Μη-έγκυρο μέγεθος γραμματοσειράς συντάκτη. Πρέπει να είναι θετικός ακέραιος.", "invalid.sketchbook.location": "Μη-έγκυρη τοποθεσία σχεδίων: {0}", "invalid.theme": "Μη-έγκυρο θέμα.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Σωστό εάν ο διακομιστής γλώσσας Arduino πρέπει να δημιουργήσει αρχεία καταγραφής στο φάκελο σκίτσου. Διαφορετικά, ψευδής. Είναι ψευδές από προεπιλογή.", "language.realTimeDiagnostics": "Εάν ισχύει, ο διακομιστής γλώσσας παρέχει διαγνωστικά σε πραγματικό χρόνο όταν πληκτρολογείτε στον επεξεργαστή. Είναι ψευδές από προεπιλογή.", "manualProxy": "Μη αυτόματη διαμόρφωση proxy διακομιστή μεσολάβησης", diff --git a/i18n/es.json b/i18n/es.json index cdc6369fb..dd0802c4b 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Tamaño de fuente del editor no válido. Debe ser un número entero positivo.", "invalid.sketchbook.location": "Ruta del sketchbook no válida: {0}", "invalid.theme": "Tema no válido.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Verdadero si el Servidor de Lenguaje Arduino debe generar archivos de registro en la carpeta del sketch. En caso contrario, falso. Por defecto es falso.", "language.realTimeDiagnostics": "Si está habilitado, el lenguaje proveerá diagnoticos en tiepo real meintras se teclea en el editor. Deshabilitado por defecto.", "manualProxy": "Configuración manual del proxy", diff --git a/i18n/eu.json b/i18n/eu.json index 8d1287392..5dfc9dbdd 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Editorearen letra-tamaina baliogabea. Osoko zenbaki positibo bat izan behar du.", "invalid.sketchbook.location": "Programa bildumaren kokaleku baliogabea: {0}", "invalid.theme": "Itxura baliogabea.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Egia Arduino Language Server-ek egunkari-fitxategiak sortu behar baditu programaren karpetan. Bestela, gezurra. Lehenetsia gezurra da.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Proxyaren eskuzko konfigurazioa", diff --git a/i18n/fa.json b/i18n/fa.json index addd3ca19..fc6a651bd 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "اندازه فونت ویرایشگر نامعتبر است. باید یک عدد صحیح مثبت باشد.", "invalid.sketchbook.location": "مکان نامعتبر منبع طرح ها: {0}", "invalid.theme": "طرح زمینه موجود نیست", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "اگر سرور زبان آردوینو باید فایل های گزارش را در پوشه طرح ایجاد کند درست می باشد. در غیر این صورت، نادرست است. به طور پیش فرض نادرست است.", "language.realTimeDiagnostics": "اگر درست باشد، سرور زبان هنگام تایپ در ویرایشگر، عیب‌یابی بی‌درنگ ارائه می‌کند. به طور پیش فرض نادرست است.", "manualProxy": "پیکربندی دستی پروکسی", diff --git a/i18n/fil.json b/i18n/fil.json index 540002e5a..da9068f2c 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True, kung dapat na gumawa ng log files ang Arduino Language Server sa mismong sketch folder. False naman kung hindi. Ito ay false, by default. ", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", diff --git a/i18n/fr.json b/i18n/fr.json index 1ce2da3c8..57504c257 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Police de l'éditeur invalide. La taille doit être un entier positif.", "invalid.sketchbook.location": "Localisation invalide du croquis : {0}", "invalid.theme": "Thème invalide.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Vrai si le serveur de langage Arduino devrait générer des fichiers logs dans le dossier du croquis. Si non faux. La valeur par défaut est faux.", "language.realTimeDiagnostics": "Si c'est vrai, le serveur de langue fournit des diagnostics en temps réel lors de la saisie dans l'éditeur. C'est faux par défaut.", "manualProxy": "Configuration manuelle du proxy", diff --git a/i18n/he.json b/i18n/he.json index 80dd5c521..4c22dcd56 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "גודל גופן לא חוקי. חייב להיות מספר חיובי.", "invalid.sketchbook.location": "מיקום סקיצה לא חוקי: {0}", "invalid.theme": "ערכת נושא לא חוקית.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "הגדרת פרוקסי ידנית", diff --git a/i18n/hu.json b/i18n/hu.json index 9323774f3..bb7544c26 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "A szerkesztő betűmérete érvénytelen. Pozitív egész számnak kell lennie. ", "invalid.sketchbook.location": "Érvénytelen elérési út a vázlatfüzethez/sketchbook-hoz: {0} ", "invalid.theme": "Érvénytelen megjelenési felület/téma. ", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Igaz/kipipálva/, ha az Arduino Language Server naplófájlokat generál a vázlat mappába. Ellenkező esetben hamis/nincs kipipálva. Alapértelmezés szerint: hamis. ", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Kézi proxy konfiguráció", diff --git a/i18n/id.json b/i18n/id.json index 3454cf733..5a06a4516 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", diff --git a/i18n/it.json b/i18n/it.json index 61e4d6a4a..8c618632b 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Dimensione del carattere dell'editor non valida. Deve essere un numero intero positivo.", "invalid.sketchbook.location": "Posizione dello sketchbook non valida: {0}", "invalid.theme": "Tema non valido", + "language.asyncWorkers": "Numero di worker async utilizzati da Arduino Language Server (clangd). Anche l'indice di background utilizza questo numero di worker. Il valore minimo è 0 e il massimo è 8. Quando è 0, il server linguistico utilizza tutti i core disponibili. Il valore predefinito è 0.", "language.log": "Imposta su True se vuoi che l'Arduino Language Server generi il file di log all'interno della cartella dello sketch. Diversamente, imposta su false. L'impostazione predefinita è false.", "language.realTimeDiagnostics": "Se vero, il server linguistico fornisce una diagnostica in tempo reale durante la digitazione nell'editor. Per impostazione predefinita è falso.", "manualProxy": "Configurazione manuale del proxy", diff --git a/i18n/ja.json b/i18n/ja.json index 1d852e9b5..cefc471f8 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "エディターのフォントサイズが無効です。正の整数でなければなりません。", "invalid.sketchbook.location": "スケッチブックの場所が無効です: {0}", "invalid.theme": "無効なテーマです。", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Arduino Language Serverがスケッチフォルダにログファイルを生成した方がよい場合はtrue。それ以外はfalse。デフォルトではfalse。", "language.realTimeDiagnostics": "trueの場合、言語サーバーはエディターでの入力時にリアルタイムの診断を提供します。デフォルトはfalseです。", "manualProxy": "手動プロキシ設定", diff --git a/i18n/ko.json b/i18n/ko.json index 4c6d0d8da..3d2c1db2c 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "잘못된 에디터 글꼴크기, 반드시 양의 정수를 사용해야합니다.", "invalid.sketchbook.location": "잘못된 스케치북 위치: {0}", "invalid.theme": "잘못된 테마.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Arduino 언어 서버가 스케치 폴더에 로그 파일을 생성해야 하는 경우 true이고, 그렇지 않으면 false입니다. 기본은 false입니다.", "language.realTimeDiagnostics": "true인 경우 언어 서버는 편집기에 입력할 때 실시간 진단을 제공하며 기본적으로 false입니다.", "manualProxy": "수동 프록시 구성", diff --git a/i18n/my_MM.json b/i18n/my_MM.json index b305a978d..b6620aff2 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "အယ်ဒီတာဖောင့်အရွယ်အစားမမှန်ကန်ပါ။ အပေါင်းကိန်းပြည့်ဖြစ်ရပါမည်။", "invalid.sketchbook.location": "မမှန်ကန်သောကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ-{0}", "invalid.theme": "မမှန်ကန်သောသင်း", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "အမှန်ဖြစ်နေပါက Arduinoဘာသာစကားစစ်ဆေးမှုဆာဗာသည် မှတ်တမ်းဖိုင်လ်များကို ကုတ်ဖိုင်လ်ဖိုလ်ဒါတွင် ထုတ်ပေးမည်။ မူရင်းတန်းဖိုးသည် အမှားဖြစ်သည်။", "language.realTimeDiagnostics": "အမှန်ခြစ်ထားပါက အယ်ဒီတာတွင် စာရေးသောအခါ ဘာသာစကားစစ်ဆေးမှုဆာဗာသည် အချိန်နှင့်တပြေးညီ စစ်ဆေးပေးမည်။ မူလတန်ဖိုးသည် အမှားဖြစ်သည်။", "manualProxy": "ကိုယ်တိုင် ကြားခံကွန်ရက်ပြင်ဆင်ခြင်း", diff --git a/i18n/ne.json b/i18n/ne.json index dfe400c1f..607772940 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "अवैध सम्पादक फन्ट साइज। यो सकारात्मक पूर्णांक हुनुपर्छ।", "invalid.sketchbook.location": "अवैध स्केचबुक स्थान: {0}", "invalid.theme": "अमान्य विषयवस्तु।", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "यदि अर्डुइनो भाषा सर्भरले स्केच फोल्डरमा लग फाइलहरू उत्पन्न गर्नुपर्छ भने सक्षम गर्नुहोस्। अन्यथा, असक्षम। यो पूर्वनिर्धारित रूपमा असक्षम छ।", "language.realTimeDiagnostics": "यदि सक्षम छ भने, सम्पादकमा टाइप गर्दा भाषा सर्भरले वास्तविक समय निदान प्रदान गर्दछ। यो पूर्वनिर्धारित रूपमा असक्षम हुन्छ।", "manualProxy": "म्यानुअल प्रोक्सी कन्फिगरेसन", diff --git a/i18n/nl.json b/i18n/nl.json index 1703b2371..b6d55b419 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Ongeldige lettergrootte voor editor. Het moet een positief geheel getal zijn.", "invalid.sketchbook.location": "Ongeldige schetsboek locatie: {0}", "invalid.theme": "Ongeldig Thema.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Waar als de Arduino Taal Server log bestanden moet genereren in de schets map. Anders onwaar. Standaard ingesteld op onwaar.", "language.realTimeDiagnostics": "Indien waar, geeft de taalserver real-time diagnostiek tijdens het typen in de editor. Standaard is dit onwaar.", "manualProxy": "Manuele proxy configuratie", diff --git a/i18n/pl.json b/i18n/pl.json index 8196ea056..c65a146ce 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Nieprawidłowy rozmiar czcionki edytora. Musi to być dodatnia liczba całkowita.", "invalid.sketchbook.location": "Błędna lokalizacja szkicownika: {0}", "invalid.theme": "Nieprawidłowy schemat.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "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", diff --git a/i18n/pt.json b/i18n/pt.json index 59da2d312..d835f28ee 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Tamanho da fonte do editor inválido. Deve ser um número inteiro positivo.", "invalid.sketchbook.location": "Localização inválida para o caderno de esboços: {0}", "invalid.theme": "Tema inválido", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "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", diff --git a/i18n/ro.json b/i18n/ro.json index 0dbe128a7..6c98e2e4b 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Configurare manuală proxy", diff --git a/i18n/ru.json b/i18n/ru.json index d3fb6ede1..1afe35611 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Неверный размер шрифта редактора. Это должно быть положительное целое число.", "invalid.sketchbook.location": "Неправильный путь к альбому со скетчами: {0}", "invalid.theme": "Неверная тема.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True - сервер Arduino Language будет создавать файлы журнала в папке скетча. В противном случае - false. По умолчанию - false.", "language.realTimeDiagnostics": "Если включено, то языковой сервер проводит диагностику набранного текста в реальном времени. По умолчанию отключено.", "manualProxy": "Ручная настройка параметров прокси-сервера", diff --git a/i18n/sr.json b/i18n/sr.json index bc5406fbe..566978788 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Неважећа величина текста уређивача. Мора да буде позитиван цијели број.", "invalid.sketchbook.location": "Неважећа локација радне свеске: {0}", "invalid.theme": "Неважећа тема.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Тачно ако Ардуино језички сервер треба да генерише датотеке евиденције у фасциклу за скице. Иначе, нетачно. Подразумевано је нетачно.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Ручно подешавање посредника", diff --git a/i18n/th.json b/i18n/th.json index 5f4d161c7..9d3297d79 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", "invalid.sketchbook.location": "Invalid sketchbook location: {0}", "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Manual proxy configuration", diff --git a/i18n/tr.json b/i18n/tr.json index 871f31cdf..389e85989 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Hatalı editör yazı tipi boyutu. Pozitif bir tam sayı olmalı.", "invalid.sketchbook.location": "Hatalı eskiz defteri konumu: {0}", "invalid.theme": "Hatalı tema.", + "language.asyncWorkers": "Arduino Language Server (clangd) tarafından kullanılan asenkron işlem sayısı. Arkaplan dizinleticisi de bu kadar işlem kullanır. Asgari değer 0, azami ise 8. 0 olduğu zaman dil sunucusu mevcut olan tüm çekirdekleri kullanır. Varsayılan değer 0.", "language.log": "Arduino Language Server eskiz klasörüne log dosyaları oluşturacaksa True. Aksi takdirde false. Varsayılan: false.", "language.realTimeDiagnostics": "Açılırsa, dil sunucusu editöre yazarken gerçek zamanlı kontroller sağlar. Varsayılan olarak kapalıdır.", "manualProxy": "Elle vekil ayarlama", diff --git a/i18n/uk.json b/i18n/uk.json index d85fed278..a3f9e0a00 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Хибний розмір шрифта редактора. Значення повинно бути цілим числом.", "invalid.sketchbook.location": "Хибний шлях до книги скетчів: {0}", "invalid.theme": "Недійсна тема.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "\"Так\", якщо треба генерувати log-файли журналу в папці скетча. В іншому випадку \"Ні\". За замовчуванням це \"Ні\". ", "language.realTimeDiagnostics": "Якщо \"Так\", перевірка синтаксису відбувається в режимі реального часу. Під час введення тексту в редакторі. Знчення замовчуванням - \"Ні\".", "manualProxy": "Налаштування проксі вручну", diff --git a/i18n/vi.json b/i18n/vi.json index 95f504efd..97c7bb16f 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "Cỡ chữ trình biên dịch không hợp lệ. Bắt buộc phải là số nguyên dương.", "invalid.sketchbook.location": "Địa điểm sketchbook không hợp lệ: {0}", "invalid.theme": "Chủ đề không hợp lệ.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "'True' nếu như muốn Arduino Language Server tạo tệp log vào trong thư mục chứa sketch. Nếu không thì là 'false'. Mặc định là 'false'.", "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", "manualProxy": "Cấu hình proxy thủ công", diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index de7a26576..65836a9e6 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "無效的編輯器字體大小, 必須是正整數。", "invalid.sketchbook.location": "無效的 sketchbook 位置:{0}", "invalid.theme": "無效的佈景主題。", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", "language.log": "Arduino語言伺服器會自動在 sketch 內產生日誌檔。預設為關閉。", "language.realTimeDiagnostics": "語言服務器提供即時診斷。預設關閉。", "manualProxy": "手動設定代理伺服器", diff --git a/i18n/zh.json b/i18n/zh.json index 9919e0ef2..48c60dad5 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -213,7 +213,7 @@ "debuggingNotSupported": "‘{0}’ 不支持调试", "getDebugInfo": "正在获取调试信息。。。", "noPlatformInstalledFor": "‘{0}’ 平台未安装", - "noProgrammerSelectedFor": "未为'{0}'项目选择任何烧录器。", + "noProgrammerSelectedFor": "未为 '{0}' 项目选择任何编程器。", "optimizeForDebugging": "调试优化", "sketchIsNotCompiled": "项目 '{0}' 在开始调试会话之前必须经过验证。请验证草图并重新开始调试。你现在要验证草图吗?" }, @@ -385,6 +385,7 @@ "invalid.editorFontSize": "编辑器字体大小无效。它必须是正整数。", "invalid.sketchbook.location": "无效的项目文件夹地址:{0}", "invalid.theme": "无效的主题。", + "language.asyncWorkers": "Arduino 语言服务器(clangd)使用的异步工作线程数。 后台索引也使用相同数量的工作线程。 最小值为 0,最大值为 8。 当值为 0 时,语言服务器将使用所有可用的核心。 默认值为 0。", "language.log": "True 则 Arduino Language Server 将日志文件生成到项目文件夹中。默认为 False。", "language.realTimeDiagnostics": " True 则 language server 在编辑器中输入时提供实时诊断。默认为 False。", "manualProxy": "手动配置代理", @@ -464,8 +465,8 @@ "saveSketchAs": "将项目文件夹另存为…", "showFolder": "显示项目文件夹", "sketch": "项目", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "该项目已包含一个名为 '{0}' 的文件。", + "sketchAlreadyContainsThisFileMessage": "保存项目 “{0}” 为 “{1}” 失败。{2}", "sketchbook": "项目文件夹", "titleLocalSketchbook": "本地项目文件夹", "titleSketchbook": "项目文件夹", diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 026bfbd2c..3b304e2a2 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -385,6 +385,7 @@ "invalid.editorFontSize": "無效的編輯器字體大小。它必須是正整數。", "invalid.sketchbook.location": "無效的 sketchbook 位置:{0}", "invalid.theme": "無效的主題。", + "language.asyncWorkers": "Arduino 語言伺服器 (clangd) 執行緒數目. 背景索引也使用相同的數目. 最小為 0, 最大s 8. 當設定為 0 時 , 將使用全部可用核心數. 預設為 0.", "language.log": "Arduino語言伺服器會自動在 sketch 內產生日誌檔。預設為關閉。", "language.realTimeDiagnostics": "語言服務器提供即時診斷。預設關閉。", "manualProxy": "手動設定代理伺服器", @@ -464,8 +465,8 @@ "saveSketchAs": "另存 Sketch 資料夾為", "showFolder": "顯示 Sketch 資料夾", "sketch": "Sketch", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "sketch 已包含 '{0}' 檔", + "sketchAlreadyContainsThisFileMessage": "將 sketch \"{0}\" 存成 \"{1}\". {2} 失敗", "sketchbook": "Sketchbook", "titleLocalSketchbook": "本地端的 Sketchbook", "titleSketchbook": "Sketchbook", From 547a6305982f3e4b79065a7f2520fddcea9cc797 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 14 Feb 2024 13:34:48 +0100 Subject: [PATCH 304/384] chore: switch to version `2.3.2` after the release To produce a correctly versioned nightly build. See the [docs](https://github.com/arduino/arduino-ide/blob/1b9c7e93e029e65765010eb84e1604b5e483a963/docs/internal/release-procedure.md#7-%EF%B8%8F-bump-version-metadata-of-packages) for more details. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index f54ef3017..3614fb73a 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.1", + "version": "2.3.2", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index d0e38cc60..b90c44b8f 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.1", + "version": "2.3.2", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.41.0", "@theia/terminal": "1.41.0", "@theia/workspace": "1.41.0", - "arduino-ide-extension": "2.3.1" + "arduino-ide-extension": "2.3.2" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/package.json b/package.json index 9a349775d..a827b30df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.1", + "version": "2.3.2", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 8fe6a81230d19ad6998b91aa5cfad06386469f4d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 02:10:40 +0000 Subject: [PATCH 305/384] Updated translation files --- i18n/my_MM.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/i18n/my_MM.json b/i18n/my_MM.json index b6620aff2..f6dd4b7c4 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -1,13 +1,13 @@ { "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", + "goToCloudEditor": "Cloudအယ်ဒီတာသို့သွားမည်", + "goToIoTCloud": "IoT Cloudသို့သွားမည်", + "goToProfile": "ပရိုဖိုင်သို့သွားမည်", "menuTitle": "Arduino Cloud" }, "board": { @@ -18,7 +18,7 @@ "configDialog1": "ကုတ်ဖိုင်တစ်ခုကို upload တင်လိုပါက ဘုတ်နှင့်အပေါက် နှစ်ခုလုံးကို ရွေးပေးပါ။", "configDialog2": "သင် ဘုတ်တစ်ခုထဲကိုသာ ရွေးချယ်ထားပါက compile ပြုလုပ်နိုင်သော်လည်း ကုဒ်ဖိုင်ကိုတော့ upload မတင်နိုင်ပါ။", "couldNotFindPreviouslySelected": "တပ်ဆင်ထားသည့် ပလက်ဖောင်း '{1}' ထဲမှာ ယခင်ရွေးချယ်ထားသည့်ဘုတ် '{0}' ကို ရှာမတွေ့ပါ။ ကျေးဇူးပြု၍ မိမိအသုံးပြုလိုသည့် ဘုတ်ကို မိမိကိုယ်တိုင် ပြန်လည်ရွေးချယ်ပေးပါ။ သင်အခု ပြန်လည်ရွေးချယ် လိုပါသလား?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "ဘုတ်နှင့်ကွန်ရက်ဆိပ်ကမ်းများတည်းဖြတ်မည်...", "getBoardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်ရယူမည်", "inSketchbook": " (Sketchbook ဖိုင်တွဲထဲ)", "installNow": "လက်ရှိရွေးချယ်ထားသည့် \"{2}\" ဘုတ်အတွက် \"{0} {1}\" core အား တပ်ဆင်ဖို့လိုပါသည်။ သင်ယခု တပ်ဆင်လိုပါသလား?", @@ -41,8 +41,8 @@ "succesfullyInstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ တပ်ဆင်ပြီးသည် :{1}", "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}", "typeOfPorts": "{0} အပေါက်များ", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" + "unconfirmedBoard": "အတည်မပြုရသေးသောဘုတ်ပြား", + "unknownBoard": "အမျိုးအမည်မသိဘုတ်ပြား" }, "boardsManager": "ဘုတ်မန်နေဂျာ", "boardsType": { @@ -147,7 +147,7 @@ "processing": "အဆင့်ဆင့်ဆောင်ရွက်နေသည်", "recommended": "အသုံးပြုရန်အကြုံပြုထားသည်များ", "retired": "အငြိမ်းစား", - "selectManually": "Select Manually", + "selectManually": "ကိုယ်တိုင်ရွေးချယ်", "selectedOn": "{0}တွင်", "serialMonitor": "အတန်းလိုက်ဆက်သွယ်မှုမော်နီတာ", "type": "အမျိုးအစား", @@ -163,7 +163,7 @@ "clickToOpen": "Click to open in browser: {0}", "filterSearch": "သင်၏ရှာဖွေမှုရလဒ်ကိုစစ်ထုတ်မည်…", "install": "တပ်ဆင်မည်", - "installLatest": "Install Latest", + "installLatest": "နောက်ဆုံးပေါ်များတပ်ဆင်မည်", "installVersion": "Install {0}", "installed": "{0} installed", "moreInfo": "နောက်ထပ်အချက်အလက်များ", @@ -493,7 +493,7 @@ "hc": "Dark High Contrast", "hcLight": "Light High Contrast", "light": "Light", - "user": "{0} (user)" + "user": "{0} (သုံးစွဲသူ)" }, "title": { "cloud": "Cloud" From 1a98485b02f4ca6482f72466cd2d4ae9c7ca0f29 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 19 Feb 2024 08:36:48 +0100 Subject: [PATCH 306/384] fix(security): use `ip@2.0.1` for CVE-2023-42282 Refs: - https://github.com/advisories/GHSA-78xj-cgh5-2h22 - https://github.com/indutny/node-ip/commit/32f468f1245574785ec080705737a579be1223aa Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- package.json | 3 ++- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a827b30df..4519ed5f3 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "@theia/cli/@babel/traverse": "^7.23.2", "@theia/cli/@theia/application-package/nano": "^10.1.3", "**/@theia/core/msgpackr": "^1.10.1", - "nx/axios": "^1.6.7" + "nx/axios": "^1.6.7", + "**/ip": "^2.0.1" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/yarn.lock b/yarn.lock index 583a24e6d..fe12ae342 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7838,10 +7838,10 @@ ip-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ip@^2.0.0, ip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" + integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== ipaddr.js@1.9.1: version "1.9.1" From 4a807ab53837ad602d1d1003de2b3dd646198c76 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 15 Feb 2024 18:34:16 +0100 Subject: [PATCH 307/384] fix: no required `programmer` for `debug --info` Ref: arduino/arduino-cli#2540 Closes: arduino/arduino-ide#2368 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- .../src/browser/contributions/debug.ts | 15 +-------------- .../src/common/protocol/boards-service.ts | 2 +- .../src/node/boards-service-impl.ts | 2 +- .../src/test/browser/debug.test.ts | 15 +++++++-------- electron-app/package.json | 2 +- i18n/en.json | 1 - 7 files changed, 12 insertions(+), 27 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3614fb73a..d6e033829 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -169,7 +169,7 @@ ], "arduino": { "arduino-cli": { - "version": "0.35.2" + "version": "0.35.3" }, "arduino-fwuploader": { "version": "2.4.1" diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index cc49b3809..e94755c46 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -398,12 +398,9 @@ export async function isDebugEnabled( `Failed to append boards config to the FQBN. Original FQBN was: ${fqbn}` ); } - if (!data.selectedProgrammer) { - throw new Error(noProgrammerSelectedFor(board.name)); - } const params = { fqbn: fqbnWithConfig, - programmer: data.selectedProgrammer.id, + programmer: data.selectedProgrammer?.id, }; try { const debugFqbn = await checkDebugEnabled(params); @@ -443,13 +440,3 @@ export function debuggingNotSupported(boardName: string): string { boardName ); } -/** - * (non-API) - */ -export function noProgrammerSelectedFor(boardName: string): string { - return nls.localize( - 'arduino/debug/noProgrammerSelectedFor', - "No programmer selected for '{0}'", - boardName - ); -} diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index a06dffd33..ba1b9f575 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -95,7 +95,7 @@ export interface CheckDebugEnabledParams { * The FQBN might contain custom board config options. For example, `arduino:esp32:nano_nora:USBMode=hwcdc,option2=value2`. */ readonly fqbn: string; - readonly programmer: string; + readonly programmer?: string; } export interface BoardSearch extends Searchable.Options { diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 3b04b18eb..0d1926f9c 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -178,7 +178,7 @@ export class BoardsServiceImpl const req = new IsDebugSupportedRequest() .setInstance(instance) .setFqbn(fqbn) - .setProgrammer(programmer); + .setProgrammer(programmer ?? ''); try { const debugFqbn = await new Promise<string>((resolve, reject) => client.isDebugSupported(req, (err, resp) => { diff --git a/arduino-ide-extension/src/test/browser/debug.test.ts b/arduino-ide-extension/src/test/browser/debug.test.ts index 0f41bad5c..e66cd65a0 100644 --- a/arduino-ide-extension/src/test/browser/debug.test.ts +++ b/arduino-ide-extension/src/test/browser/debug.test.ts @@ -28,7 +28,6 @@ import { debuggingNotSupported, isDebugEnabled, noPlatformInstalledFor, - noProgrammerSelectedFor, } from '../../browser/contributions/debug'; import { NotificationCenter } from '../../browser/notification-center'; import { noBoardSelected } from '../../common/nls'; @@ -117,20 +116,20 @@ describe('debug', () => { ); }); - it('should error when no programmer selected', async () => { + it('should resolve when no programmer is selected (arduino/arduino-cli#2540)', async () => { const copyData: Mutable<BoardsDataStore.Data> = deepClone(data); delete copyData.selectedProgrammer; - await rejects( + await doesNotReject( isDebugEnabled( board, () => boardDetails, () => copyData, (fqbn) => fqbn, - unexpectedCall() - ), - (reason) => - reason instanceof Error && - reason.message === noProgrammerSelectedFor(board.name) + async (params) => { + expect(params.programmer).to.be.undefined; + return params.fqbn; + } + ) ); }); diff --git a/electron-app/package.json b/electron-app/package.json index b90c44b8f..6453e4817 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -196,7 +196,7 @@ "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.1.2.vsix", + "vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.3.vsix", "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.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", diff --git a/i18n/en.json b/i18n/en.json index 841ab3a91..234781e58 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -213,7 +213,6 @@ "debuggingNotSupported": "Debugging is not supported by '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "noProgrammerSelectedFor": "No programmer selected 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?" }, From 95c4399c073a63b62a0133ed6422174d388cdd5f Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 15 Feb 2024 19:00:12 +0100 Subject: [PATCH 308/384] fix(ci): use go 1.21 for the on the fly bin builds Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .github/workflows/build.yml | 2 +- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eecd06d47..54cdcdbbd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: '1.19' + GO_VERSION: '1.21' # See: https://github.com/actions/setup-node/#readme NODE_VERSION: '18.17' JOB_TRANSFER_ARTIFACT: build-artifacts diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index ec80cad86..22426313a 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -2,7 +2,7 @@ name: Check Internationalization env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: '1.19' + GO_VERSION: '1.21' # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 92e8b6eb0..6f401a526 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -2,7 +2,7 @@ name: i18n-nightly-push env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: '1.19' + GO_VERSION: '1.21' on: schedule: diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 7f4c5d293..88157a7fa 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -2,7 +2,7 @@ name: i18n-weekly-pull env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: '1.19' + GO_VERSION: '1.21' on: schedule: diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index f9fcb446a..bd9f845c1 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -8,7 +8,7 @@ on: env: # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml - GO_VERSION: '1.19' + GO_VERSION: '1.21' NODE_VERSION: '18.17' jobs: From 48e7bf6b5d9926896581e9e743cff8541ecbf106 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 19 Feb 2024 17:41:04 +0100 Subject: [PATCH 309/384] chore: switch to version `2.3.3` after the release To produce a correctly versioned nightly build. See the [docs](https://github.com/arduino/arduino-ide/blob/1b9c7e93e029e65765010eb84e1604b5e483a963/docs/internal/release-procedure.md#7-%EF%B8%8F-bump-version-metadata-of-packages) for more details. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index d6e033829..7257b9883 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.2", + "version": "2.3.3", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 6453e4817..3e42fdd0d 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.2", + "version": "2.3.3", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.41.0", "@theia/terminal": "1.41.0", "@theia/workspace": "1.41.0", - "arduino-ide-extension": "2.3.2" + "arduino-ide-extension": "2.3.3" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/package.json b/package.json index 4519ed5f3..2e4dd1a64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.2", + "version": "2.3.3", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 8e099710788d65fe9ec760841613d2a952483462 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Wed, 17 Jan 2024 17:16:00 +0100 Subject: [PATCH 310/384] feat: use Arduino CLI `0.36.0-rc.1` APIs Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 8 +- .../scripts/generate-protocol.js | 6 +- .../src/browser/contributions/ino-language.ts | 8 +- .../src/browser/notification-center.ts | 4 +- .../theia/core/connection-status-service.ts | 10 +- .../src/common/protocol/arduino-daemon.ts | 8 +- .../src/common/protocol/boards-service.ts | 3 + .../common/protocol/notification-service.ts | 2 +- .../src/node/arduino-core-service-client.ts | 53 + .../src/node/arduino-daemon-impl.ts | 30 +- .../src/node/boards-service-impl.ts | 219 +- .../cli/commands/v1/commands_grpc_pb.d.ts | 120 +- .../cli/commands/v1/commands_grpc_pb.js | 239 +- .../arduino/cli/commands/v1/commands_pb.d.ts | 71 +- .../cc/arduino/cli/commands/v1/commands_pb.js | 581 +--- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 241 +- .../cc/arduino/cli/commands/v1/common_pb.js | 2406 +++++++++++++---- .../arduino/cli/commands/v1/compile_pb.d.ts | 185 +- .../cc/arduino/cli/commands/v1/compile_pb.js | 1662 ++++++++++-- .../cc/arduino/cli/commands/v1/core_pb.d.ts | 65 +- .../cc/arduino/cli/commands/v1/core_pb.js | 451 +-- .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 6 +- .../cc/arduino/cli/commands/v1/lib_pb.js | 84 +- .../arduino/cli/commands/v1/monitor_pb.d.ts | 79 +- .../cc/arduino/cli/commands/v1/monitor_pb.js | 495 +++- .../cli/commands/v1/settings_grpc_pb.js | 1 + .../arduino/cli/commands/v1/settings_pb.d.ts | 238 ++ .../{settings => commands}/v1/settings_pb.js | 514 ++-- .../cc/arduino/cli/commands/v1/upload_pb.d.ts | 30 + .../cc/arduino/cli/commands/v1/upload_pb.js | 154 +- .../cli/settings/v1/settings_grpc_pb.d.ts | 126 - .../cli/settings/v1/settings_grpc_pb.js | 231 -- .../arduino/cli/settings/v1/settings_pb.d.ts | 238 -- .../src/node/config-service-impl.ts | 41 +- .../src/node/core-client-provider.ts | 41 +- .../src/node/core-service-impl.ts | 25 +- .../src/node/library-service-impl.ts | 2 +- .../src/node/monitor-service.ts | 71 +- .../src/node/notification-service-server.ts | 2 +- .../src/node/sketches-service-impl.ts | 19 +- .../src/test/node/arduino-daemon-impl.test.ts | 2 +- .../node/boards-service-impl.slow-test.ts | 25 +- .../src/test/node/node-test-bindings.ts | 2 +- 43 files changed, 5530 insertions(+), 3268 deletions(-) create mode 100644 arduino-ide-extension/src/node/arduino-core-service-client.ts create mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js create mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts rename arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/{settings => commands}/v1/settings_pb.js (59%) delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.js delete mode 100644 arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.d.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 7257b9883..89cef04fe 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -169,13 +169,17 @@ ], "arduino": { "arduino-cli": { - "version": "0.35.3" + "version": "0.36.0-rc.1" }, "arduino-fwuploader": { "version": "2.4.1" }, "arduino-language-server": { - "version": "0.7.6" + "version": { + "owner": "arduino", + "repo": "arduino-language-server", + "commitish": "91c2ba8" + } }, "clangd": { "version": "14.0.0" diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index ec15850b3..703407a4f 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -3,7 +3,7 @@ (async () => { const os = require('node:os'); const path = require('node:path'); - const { mkdirSync, promises: fs } = require('node:fs'); + const { mkdirSync, promises: fs, rmSync } = require('node:fs'); const { exec } = require('./utils'); const glob = require('glob'); const { SemVer, gte, valid: validSemVer } = require('semver'); @@ -140,6 +140,10 @@ const rpc = path.join(repository, 'rpc'); const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol'); + // Must wipe the gen output folder. Otherwise, dangling service implementation remain in IDE2 code, + // although it has been removed from the proto file. + // For example, https://github.com/arduino/arduino-cli/commit/50a8bf5c3e61d5b661ccfcd6a055e82eeb510859. + rmSync(out, { recursive: true, maxRetries: 5, force: true }); mkdirSync(out, { recursive: true }); const protos = await new Promise((resolve) => diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index ab54c7ae4..ca3019e1b 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -196,11 +196,7 @@ export class InoLanguage extends SketchContribution { forceStart = false ): Promise<void> { const port = await this.daemon.tryGetPort(); - if (!port) { - return; - } - const portNumber = Number.parseInt(port, 10); // TODO: IDE2 APIs should provide a number and not string - if (Number.isNaN(portNumber)) { + if (typeof port !== 'number') { return; } const release = await this.languageServerStartMutex.acquire(); @@ -280,7 +276,7 @@ export class InoLanguage extends SketchContribution { lsPath, daemonAddress: { hostname: 'localhost', - port: portNumber, + port, instance: 1, // TODO: get it from the backend }, clangdPath, diff --git a/arduino-ide-extension/src/browser/notification-center.ts b/arduino-ide-extension/src/browser/notification-center.ts index e7d5c6676..9bb0e2ae4 100644 --- a/arduino-ide-extension/src/browser/notification-center.ts +++ b/arduino-ide-extension/src/browser/notification-center.ts @@ -46,7 +46,7 @@ export class NotificationCenter new Emitter<ProgressMessage>(); private readonly indexUpdateDidFailEmitter = new Emitter<IndexUpdateDidFailParams>(); - private readonly daemonDidStartEmitter = new Emitter<string>(); + private readonly daemonDidStartEmitter = new Emitter<number>(); private readonly daemonDidStopEmitter = new Emitter<void>(); private readonly configDidChangeEmitter = new Emitter<ConfigState>(); private readonly platformDidInstallEmitter = new Emitter<{ @@ -136,7 +136,7 @@ export class NotificationCenter this.indexUpdateDidFailEmitter.fire(params); } - notifyDaemonDidStart(port: string): void { + notifyDaemonDidStart(port: number): void { this.daemonDidStartEmitter.fire(port); } diff --git a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index 413e50645..f876f7c0a 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -74,8 +74,8 @@ export class DaemonPort implements FrontendApplicationContribution { @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; - private readonly onPortDidChangeEmitter = new Emitter<string | undefined>(); - private _port: string | undefined; + private readonly onPortDidChangeEmitter = new Emitter<number | undefined>(); + private _port: number | undefined; onStart(): void { this.daemon.tryGetPort().then( @@ -91,15 +91,15 @@ export class DaemonPort implements FrontendApplicationContribution { this.onPortDidChangeEmitter.dispose(); } - get port(): string | undefined { + get port(): number | undefined { return this._port; } - get onDidChangePort(): Event<string | undefined> { + get onDidChangePort(): Event<number | undefined> { return this.onPortDidChangeEmitter.event; } - private setPort(port: string | undefined): void { + private setPort(port: number | undefined): void { const oldPort = this._port; this._port = port; if (this._port !== oldPort) { diff --git a/arduino-ide-extension/src/common/protocol/arduino-daemon.ts b/arduino-ide-extension/src/common/protocol/arduino-daemon.ts index b59d4c617..b1b8456d8 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-daemon.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-daemon.ts @@ -5,14 +5,14 @@ export interface ArduinoDaemon { * Returns with a promise that resolves with the port * of the CLI daemon when it's up and running. */ - getPort(): Promise<string>; + getPort(): Promise<number>; /** * Unlike `getPort` this method returns with a promise * that resolves to `undefined` when the daemon is not running. * Otherwise resolves to the CLI daemon port. */ - tryGetPort(): Promise<string | undefined>; - start(): Promise<string>; + tryGetPort(): Promise<number | undefined>; + start(): Promise<number>; stop(): Promise<void>; - restart(): Promise<string>; + restart(): Promise<number>; } diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index ba1b9f575..1ae7c1811 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -75,6 +75,9 @@ export interface BoardsService }): Promise<BoardsPackage | undefined>; searchBoards({ query }: { query?: string }): Promise<BoardWithPackage[]>; getInstalledBoards(): Promise<BoardWithPackage[]>; + /** + * Returns with all installed platforms including the manually installed ones. + */ getInstalledPlatforms(): Promise<BoardsPackage[]>; getBoardUserFields(options: { fqbn: string; diff --git a/arduino-ide-extension/src/common/protocol/notification-service.ts b/arduino-ide-extension/src/common/protocol/notification-service.ts index 9ad5c202d..7b0aea120 100644 --- a/arduino-ide-extension/src/common/protocol/notification-service.ts +++ b/arduino-ide-extension/src/common/protocol/notification-service.ts @@ -51,7 +51,7 @@ export interface NotificationServiceClient { notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void; // Daemon - notifyDaemonDidStart(port: string): void; + notifyDaemonDidStart(port: number): void; notifyDaemonDidStop(): void; // CLI config diff --git a/arduino-ide-extension/src/node/arduino-core-service-client.ts b/arduino-ide-extension/src/node/arduino-core-service-client.ts new file mode 100644 index 000000000..e753e206c --- /dev/null +++ b/arduino-ide-extension/src/node/arduino-core-service-client.ts @@ -0,0 +1,53 @@ +import { credentials, makeClientConstructor } from '@grpc/grpc-js'; +import * as commandsGrpcPb from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; +import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; + +export interface CreateClientOptions { + /** + * The port to the Arduino CLI daemon. + */ + readonly port: number; + /** + * Defaults to `'localhost'`. + */ + readonly host?: string; + + /** + * gRCP channel options. Defaults to `createDefaultChannelOptions` with `'0.0.0'` `appVersion` + */ + readonly channelOptions?: Record<string, unknown>; +} + +export function createDefaultChannelOptions( + appVersion = '0.0.0' +): Record<string, unknown> { + return { + 'grpc.max_send_message_length': 512 * 1024 * 1024, + 'grpc.max_receive_message_length': 512 * 1024 * 1024, + 'grpc.primary_user_agent': `arduino-ide/${appVersion}`, + }; +} + +export function createArduinoCoreServiceClient( + options: CreateClientOptions +): ArduinoCoreServiceClient { + const { + port, + host = 'localhost', + channelOptions = createDefaultChannelOptions(), + } = options; + const address = `${host}:${port}`; + // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/master/doc/grpcjs_support.md#usage + const ArduinoCoreServiceClient = makeClientConstructor( + // @ts-expect-error: ignore + commandsGrpcPb['cc.arduino.cli.commands.v1.ArduinoCoreService'], + 'ArduinoCoreServiceService' + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) as any; + const client = new ArduinoCoreServiceClient( + address, + credentials.createInsecure(), + channelOptions + ) as ArduinoCoreServiceClient; + return client; +} diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 16db90631..13e9bc18e 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -39,11 +39,11 @@ export class ArduinoDaemonImpl private readonly processUtils: ProcessUtils; private readonly toDispose = new DisposableCollection(); - private readonly onDaemonStartedEmitter = new Emitter<string>(); + private readonly onDaemonStartedEmitter = new Emitter<number>(); private readonly onDaemonStoppedEmitter = new Emitter<void>(); private _running = false; - private _port = new Deferred<string>(); + private _port = new Deferred<number>(); // Backend application lifecycle. @@ -53,18 +53,18 @@ export class ArduinoDaemonImpl // Daemon API - async getPort(): Promise<string> { + async getPort(): Promise<number> { return this._port.promise; } - async tryGetPort(): Promise<string | undefined> { + async tryGetPort(): Promise<number | undefined> { if (this._running) { return this._port.promise; } return undefined; } - async start(): Promise<string> { + async start(): Promise<number> { try { this.toDispose.dispose(); // This will `kill` the previously started daemon process, if any. const cliPath = this.getExecPath(); @@ -101,13 +101,13 @@ export class ArduinoDaemonImpl this.toDispose.dispose(); } - async restart(): Promise<string> { + async restart(): Promise<number> { return this.start(); } // Backend only daemon API - get onDaemonStarted(): Event<string> { + get onDaemonStarted(): Event<number> { return this.onDaemonStartedEmitter.event; } @@ -150,11 +150,11 @@ export class ArduinoDaemonImpl protected async spawnDaemonProcess(): Promise<{ daemon: ChildProcess; - port: string; + port: number; }> { const args = await this.getSpawnArgs(); const cliPath = this.getExecPath(); - const ready = new Deferred<{ daemon: ChildProcess; port: string }>(); + const ready = new Deferred<{ daemon: ChildProcess; port: number }>(); const options = { env: { ...deepClone(process.env), NO_COLOR: String(true) }, }; @@ -195,7 +195,13 @@ export class ArduinoDaemonImpl if (port.length && address.length) { grpcServerIsReady = true; - ready.resolve({ daemon, port }); + const portNumber = Number.parseInt(port, 10); + if (Number.isNaN(portNumber)) { + ready.reject( + new Error(`Received a NaN port from the CLI: ${port}`) + ); + } + ready.resolve({ daemon, port: portNumber }); } } }); @@ -225,7 +231,7 @@ export class ArduinoDaemonImpl return ready.promise; } - private fireDaemonStarted(port: string): void { + private fireDaemonStarted(port: number): void { this._running = true; this._port.resolve(port); this.onDaemonStartedEmitter.fire(port); @@ -238,7 +244,7 @@ export class ArduinoDaemonImpl } this._running = false; this._port.reject(); // Reject all pending. - this._port = new Deferred<string>(); + this._port = new Deferred<number>(); this.onDaemonStoppedEmitter.fire(); this.notificationService.notifyDaemonDidStop(); } diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 0d1926f9c..9eefeec9f 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -3,7 +3,6 @@ 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 { - Board, BoardDetails, BoardSearch, BoardUserField, @@ -32,11 +31,9 @@ import { BoardListAllResponse, BoardSearchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; -import { Platform } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; +import { PlatformSummary } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { PlatformInstallRequest, - PlatformListRequest, - PlatformListResponse, PlatformSearchRequest, PlatformSearchResponse, PlatformUninstallRequest, @@ -247,24 +244,22 @@ export class BoardsServiceImpl async getInstalledPlatforms(): Promise<BoardsPackage[]> { const { instance, client } = await this.coreClient; - return new Promise<BoardsPackage[]>((resolve, reject) => { - client.platformList( - new PlatformListRequest().setInstance(instance), - (err, response) => { - if (err) { - reject(err); - return; - } - resolve( - response - .getInstalledPlatformsList() - .map((platform, _, installedPlatforms) => - toBoardsPackage(platform, installedPlatforms) - ) - ); - } - ); - }); + const resp = await new Promise<PlatformSearchResponse>( + (resolve, reject) => { + client.platformSearch( + new PlatformSearchRequest() + .setInstance(instance) + .setManuallyInstalled(true), // include core manually installed to the sketchbook + (err, resp) => (err ? reject(err) : resolve(resp)) + ); + } + ); + const searchOutput = resp.getSearchOutputList(); + return searchOutput + .map((message) => message.toObject(false)) + .filter((summary) => summary.installedVersion) // only installed ones + .map(createBoardsPackage) + .filter(notEmpty); } private async handleListBoards( @@ -287,12 +282,28 @@ export class BoardsServiceImpl for (const board of resp.getBoardsList()) { const platform = board.getPlatform(); if (platform) { - const platformId = platform.getId(); + const metadata = platform.getMetadata(); + if (!metadata) { + console.warn( + `Platform metadata is missing for platform: ${JSON.stringify( + platform.toObject(false) + )}. Skipping` + ); + continue; + } + const platformId = metadata.getId(); + const release = platform.getRelease(); + if (!release) { + console.warn( + `Platform release is missing for platform: ${platformId}. Skipping` + ); + continue; + } const fqbn = board.getFqbn() || undefined; // prefer undefined over empty string const parsedPlatformId = createPlatformIdentifier(platformId); if (!parsedPlatformId) { console.warn( - `Could not create platform identifier from platform ID input: ${platform.getId()}. Skipping` + `Could not create platform identifier from platform ID input: ${platformId}. Skipping` ); continue; } @@ -319,8 +330,8 @@ export class BoardsServiceImpl name: board.getName(), fqbn: board.getFqbn(), packageId: parsedPlatformId, - packageName: platform.getName(), - manuallyInstalled: platform.getManuallyInstalled(), + packageName: release.getName(), + manuallyInstalled: metadata.getManuallyInstalled(), }); } } @@ -375,89 +386,25 @@ export class BoardsServiceImpl const coreClient = await this.coreClient; const { client, instance } = coreClient; - const installedPlatformsReq = new PlatformListRequest(); - installedPlatformsReq.setInstance(instance); - const installedPlatformsResp = await new Promise<PlatformListResponse>( - (resolve, reject) => { - client.platformList(installedPlatformsReq, (err, resp) => { - !!err ? reject(err) : resolve(resp); - }); - } - ); - const installedPlatforms = - installedPlatformsResp.getInstalledPlatformsList(); - - const req = new PlatformSearchRequest(); - req.setSearchArgs(options.query || ''); - req.setAllVersions(true); - req.setInstance(instance); + // `core search` returns with all platform versions when the command is executed via gRPC or with `--format json` + // The `--all` flag is applicable only when filtering for the human-readable (`--format text`) output of the CLI const resp = await new Promise<PlatformSearchResponse>( (resolve, reject) => { - client.platformSearch(req, (err, resp) => { - !!err ? reject(err) : resolve(resp); - }); + client.platformSearch( + new PlatformSearchRequest() + .setInstance(instance) + .setSearchArgs(options.query ?? ''), + (err, resp) => (err ? reject(err) : resolve(resp)) + ); } ); - const packages = new Map<string, BoardsPackage>(); - // We must group the cores by ID, and sort platforms by, first the installed version, then version alphabetical order. - // Otherwise we lose the FQBN information. - const groupedById: Map<string, Platform[]> = new Map(); - for (const platform of resp.getSearchOutputList()) { - const id = platform.getId(); - const idGroup = groupedById.get(id); - if (idGroup) { - idGroup.push(platform); - } else { - groupedById.set(id, [platform]); - } - } - const installedAwareVersionComparator = ( - left: Platform, - right: Platform - ) => { - // XXX: we cannot rely on `platform.getInstalled()`, it is always an empty string. - const leftInstalled = !!installedPlatforms.find( - (ip) => - ip.getId() === left.getId() && ip.getInstalled() === left.getLatest() - ); - const rightInstalled = !!installedPlatforms.find( - (ip) => - ip.getId() === right.getId() && - ip.getInstalled() === right.getLatest() - ); - if (leftInstalled && !rightInstalled) { - return -1; - } - if (!leftInstalled && rightInstalled) { - return 1; - } - - const invertedVersionComparator = - Installable.Version.COMPARATOR(left.getLatest(), right.getLatest()) * - -1; - // Higher version comes first. - - return invertedVersionComparator; - }; - for (const value of groupedById.values()) { - value.sort(installedAwareVersionComparator); - } - - for (const value of groupedById.values()) { - for (const platform of value) { - const id = platform.getId(); - const pkg = packages.get(id); - if (pkg) { - pkg.availableVersions.push(platform.getLatest()); - pkg.availableVersions.sort(Installable.Version.COMPARATOR).reverse(); - } else { - packages.set(id, toBoardsPackage(platform, installedPlatforms)); - } - } - } - - const filter = this.typePredicate(options); - const boardsPackages = [...packages.values()].filter(filter); + const typeFilter = this.typePredicate(options); + const searchOutput = resp.getSearchOutputList(); + const boardsPackages = searchOutput + .map((message) => message.toObject(false)) + .map(createBoardsPackage) + .filter(notEmpty) + .filter(typeFilter); return sortComponents(boardsPackages, boardsPackageSortGroup); } @@ -624,36 +571,48 @@ 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(); +function createBoardsPackage( + summary: PlatformSummary.AsObject +): BoardsPackage | undefined { + if (!isPlatformSummaryWithMetadata(summary)) { + return undefined; + } + const versionReleaseMap = new Map(summary.releasesMap); + const actualRelease = + versionReleaseMap.get(summary.installedVersion) ?? + versionReleaseMap.get(summary.latestVersion); + if (!actualRelease) { + return undefined; + } + const { name, typeList, boardsList, deprecated, compatible } = actualRelease; + if (!compatible) { + return undefined; // never show incompatible platforms } + const { id, website, maintainer } = summary.metadata; + const availableVersions = Array.from(versionReleaseMap.keys()) + .sort(Installable.Version.COMPARATOR) + .reverse(); 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(), + id, + name, summary: nls.localize( 'arduino/component/boardsIncluded', 'Boards included in this package:' ), - installedVersion, - boards: platform - .getBoardsList() - .map((b) => <Board>{ name: b.getName(), fqbn: b.getFqbn() }), - moreInfoLink: platform.getWebsite(), + description: boardsList.map(({ name }) => name).join(', '), + boards: boardsList, + types: typeList, + moreInfoLink: website, + author: maintainer, + deprecated, + availableVersions, }; } + +type PlatformSummaryWithMetadata = PlatformSummary.AsObject & + Required<Pick<PlatformSummary.AsObject, 'metadata'>>; +function isPlatformSummaryWithMetadata( + summary: PlatformSummary.AsObject +): summary is PlatformSummaryWithMetadata { + return Boolean(summary.metadata); +} diff --git a/arduino-ide-extension/src/node/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 d1692362f..651646fd8 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 @@ -15,6 +15,7 @@ import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/ import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; +import * as cc_arduino_cli_commands_v1_settings_pb from "../../../../../cc/arduino/cli/commands/v1/settings_pb"; interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { create: IArduinoCoreServiceService_ICreate; @@ -43,7 +44,6 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped listProgrammersAvailableForUpload: IArduinoCoreServiceService_IListProgrammersAvailableForUpload; burnBootloader: IArduinoCoreServiceService_IBurnBootloader; platformSearch: IArduinoCoreServiceService_IPlatformSearch; - platformList: IArduinoCoreServiceService_IPlatformList; libraryDownload: IArduinoCoreServiceService_ILibraryDownload; libraryInstall: IArduinoCoreServiceService_ILibraryInstall; libraryUpgrade: IArduinoCoreServiceService_ILibraryUpgrade; @@ -59,6 +59,12 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped debug: IArduinoCoreServiceService_IDebug; isDebugSupported: IArduinoCoreServiceService_IIsDebugSupported; getDebugConfig: IArduinoCoreServiceService_IGetDebugConfig; + settingsGetAll: IArduinoCoreServiceService_ISettingsGetAll; + settingsMerge: IArduinoCoreServiceService_ISettingsMerge; + settingsGetValue: IArduinoCoreServiceService_ISettingsGetValue; + settingsSetValue: IArduinoCoreServiceService_ISettingsSetValue; + settingsWrite: IArduinoCoreServiceService_ISettingsWrite; + settingsDelete: IArduinoCoreServiceService_ISettingsDelete; } interface IArduinoCoreServiceService_ICreate extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CreateRequest, cc_arduino_cli_commands_v1_commands_pb.CreateResponse> { @@ -295,15 +301,6 @@ interface IArduinoCoreServiceService_IPlatformSearch extends grpc.MethodDefiniti responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse>; } -interface IArduinoCoreServiceService_IPlatformList extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, cc_arduino_cli_commands_v1_core_pb.PlatformListResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/PlatformList"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_core_pb.PlatformListResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_core_pb.PlatformListResponse>; -} interface IArduinoCoreServiceService_ILibraryDownload extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/LibraryDownload"; requestStream: false; @@ -439,6 +436,60 @@ interface IArduinoCoreServiceService_IGetDebugConfig extends grpc.MethodDefiniti responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; } +interface IArduinoCoreServiceService_ISettingsGetAll extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetAll"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse>; +} +interface IArduinoCoreServiceService_ISettingsMerge extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsMerge"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse>; +} +interface IArduinoCoreServiceService_ISettingsGetValue extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; +} +interface IArduinoCoreServiceService_ISettingsSetValue extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsSetValue"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; +} +interface IArduinoCoreServiceService_ISettingsWrite extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsWrite"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse>; +} +interface IArduinoCoreServiceService_ISettingsDelete extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsDelete"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse>; +} export const ArduinoCoreServiceService: IArduinoCoreServiceService; @@ -469,7 +520,6 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa listProgrammersAvailableForUpload: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_upload_pb.ListProgrammersAvailableForUploadRequest, cc_arduino_cli_commands_v1_upload_pb.ListProgrammersAvailableForUploadResponse>; burnBootloader: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_upload_pb.BurnBootloaderRequest, cc_arduino_cli_commands_v1_upload_pb.BurnBootloaderResponse>; platformSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse>; - platformList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, cc_arduino_cli_commands_v1_core_pb.PlatformListResponse>; libraryDownload: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; libraryInstall: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_lib_pb.LibraryInstallRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryInstallResponse>; libraryUpgrade: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_lib_pb.LibraryUpgradeRequest, cc_arduino_cli_commands_v1_lib_pb.LibraryUpgradeResponse>; @@ -485,6 +535,12 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa debug: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; isDebugSupported: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; + settingsGetAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse>; + settingsMerge: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse>; + settingsGetValue: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; + settingsSetValue: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; + settingsWrite: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse>; + settingsDelete: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse>; } export interface IArduinoCoreServiceClient { @@ -554,9 +610,6 @@ export interface IArduinoCoreServiceClient { platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; - platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; libraryInstall(request: cc_arduino_cli_commands_v1_lib_pb.LibraryInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryInstallResponse>; @@ -595,6 +648,24 @@ export interface IArduinoCoreServiceClient { getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; + settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; + settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; + settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; + settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; + settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; + settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; + settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; + settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; } export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCoreServiceClient { @@ -665,9 +736,6 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; public platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; public platformSearch(request: cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformSearchResponse) => void): grpc.ClientUnaryCall; - public platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - public platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; - public platformList(request: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse) => void): grpc.ClientUnaryCall; public libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; public libraryDownload(request: cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryDownloadResponse>; public libraryInstall(request: cc_arduino_cli_commands_v1_lib_pb.LibraryInstallRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_lib_pb.LibraryInstallResponse>; @@ -704,4 +772,22 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; + public settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; + public settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; + public settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; + public settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + public settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + public settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; + public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; + public settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; + public settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; + public settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; + public settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; + public settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; + public settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => 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 671e361d0..6ea265e3c 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 @@ -27,6 +27,7 @@ var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); +var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/cli/commands/v1/settings_pb.js'); function serialize_cc_arduino_cli_commands_v1_ArchiveSketchRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest)) { @@ -688,28 +689,6 @@ function deserialize_cc_arduino_cli_commands_v1_PlatformInstallResponse(buffer_a return cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_PlatformListRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformListRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformListRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_PlatformListRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_core_pb.PlatformListRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_PlatformListResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformListResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformListResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_PlatformListResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_core_pb.PlatformListResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_PlatformSearchRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_core_pb.PlatformSearchRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.PlatformSearchRequest'); @@ -798,6 +777,138 @@ function deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse(buffer return cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsDeleteRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsDeleteResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetAllRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetAllResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetValueRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetValueResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsMergeRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsMergeRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsMergeRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsMergeResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsMergeResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsMergeResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsSetValueRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsSetValueResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsWriteRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsWriteRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsWriteRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_SettingsWriteResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsWriteResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_SettingsWriteResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse.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'); @@ -1276,18 +1387,6 @@ platformSearch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_PlatformSearchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_PlatformSearchResponse, }, - // List all installed platforms. -platformList: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/PlatformList', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_commands_v1_core_pb.PlatformListRequest, - responseType: cc_arduino_cli_commands_v1_core_pb.PlatformListResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_PlatformListRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_PlatformListRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_PlatformListResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_PlatformListResponse, - }, // Download the archive file of an Arduino library in the libraries index to // the staging directory. libraryDownload: { @@ -1470,5 +1569,77 @@ getDebugConfig: { responseSerialize: serialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, }, + // List all the settings. +settingsGetAll: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetAll', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse, + }, + // Set multiple settings values at once. +settingsMerge: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsMerge', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsMergeRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsMergeRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsMergeResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsMergeResponse, + }, + // Get the value of a specific setting. +settingsGetValue: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, + }, + // Set the value of a specific setting. +settingsSetValue: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsSetValue', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse, + }, + // Writes to file settings currently stored in memory +settingsWrite: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsWrite', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsWriteRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsWriteRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsWriteResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsWriteResponse, + }, + // Deletes an entry and rewrites the file settings +settingsDelete: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsDelete', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse, + }, }; 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 981a4c793..79e01e887 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 @@ -14,6 +14,7 @@ import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/ import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; +import * as cc_arduino_cli_commands_v1_settings_pb from "../../../../../cc/arduino/cli/commands/v1/settings_pb"; export class CreateRequest extends jspb.Message { @@ -421,61 +422,12 @@ export namespace LoadSketchRequest { } } -export class SketchProfile extends jspb.Message { - getName(): string; - setName(value: string): SketchProfile; - getFqbn(): string; - setFqbn(value: string): SketchProfile; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SketchProfile.AsObject; - static toObject(includeInstance: boolean, msg: SketchProfile): SketchProfile.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SketchProfile, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SketchProfile; - static deserializeBinaryFromReader(message: SketchProfile, reader: jspb.BinaryReader): SketchProfile; -} - -export namespace SketchProfile { - export type AsObject = { - name: string, - fqbn: string, - } -} - export class LoadSketchResponse extends jspb.Message { - getMainFile(): string; - setMainFile(value: string): LoadSketchResponse; - getLocationPath(): string; - setLocationPath(value: string): LoadSketchResponse; - clearOtherSketchFilesList(): void; - getOtherSketchFilesList(): Array<string>; - setOtherSketchFilesList(value: Array<string>): LoadSketchResponse; - addOtherSketchFiles(value: string, index?: number): string; - clearAdditionalFilesList(): void; - getAdditionalFilesList(): Array<string>; - setAdditionalFilesList(value: Array<string>): LoadSketchResponse; - addAdditionalFiles(value: string, index?: number): string; - clearRootFolderFilesList(): void; - getRootFolderFilesList(): Array<string>; - setRootFolderFilesList(value: Array<string>): LoadSketchResponse; - addRootFolderFiles(value: string, index?: number): string; - getDefaultFqbn(): string; - setDefaultFqbn(value: string): LoadSketchResponse; - getDefaultPort(): string; - setDefaultPort(value: string): LoadSketchResponse; - getDefaultProtocol(): string; - setDefaultProtocol(value: string): LoadSketchResponse; - clearProfilesList(): void; - getProfilesList(): Array<SketchProfile>; - setProfilesList(value: Array<SketchProfile>): LoadSketchResponse; - addProfiles(value?: SketchProfile, index?: number): SketchProfile; - - hasDefaultProfile(): boolean; - clearDefaultProfile(): void; - getDefaultProfile(): SketchProfile | undefined; - setDefaultProfile(value?: SketchProfile): LoadSketchResponse; + + hasSketch(): boolean; + clearSketch(): void; + getSketch(): cc_arduino_cli_commands_v1_common_pb.Sketch | undefined; + setSketch(value?: cc_arduino_cli_commands_v1_common_pb.Sketch): LoadSketchResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LoadSketchResponse.AsObject; @@ -489,16 +441,7 @@ export class LoadSketchResponse extends jspb.Message { export namespace LoadSketchResponse { export type AsObject = { - mainFile: string, - locationPath: string, - otherSketchFilesList: Array<string>, - additionalFilesList: Array<string>, - rootFolderFilesList: Array<string>, - defaultFqbn: string, - defaultPort: string, - defaultProtocol: string, - profilesList: Array<SketchProfile.AsObject>, - defaultProfile?: SketchProfile.AsObject, + sketch?: cc_arduino_cli_commands_v1_common_pb.Sketch.AsObject, } } 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 7c8f9d694..ebc76506d 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 @@ -39,6 +39,8 @@ var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cl goog.object.extend(proto, cc_arduino_cli_commands_v1_upload_pb); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_lib_pb); +var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/cli/commands/v1/settings_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_settings_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateRequest', null, global); @@ -57,7 +59,6 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.NewSketchRequest', null, glo 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.SketchProfile', 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); @@ -421,27 +422,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.displayName = 'proto.cc.arduino.cli.commands.v1.LoadSketchRequest'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.commands.v1.SketchProfile = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.SketchProfile, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SketchProfile.displayName = 'proto.cc.arduino.cli.commands.v1.SketchProfile'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -453,7 +433,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LoadSketchResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.LoadSketchResponse.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LoadSketchResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -3222,173 +3202,6 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setSketchPath = fun -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SketchProfile.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.SketchProfile} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - 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.SketchProfile} - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SketchProfile; - return proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SketchProfile.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.SketchProfile} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getFqbn(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string fqbn = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getFqbn = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this - */ -proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setFqbn = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.repeatedFields_ = [3,4,5,9]; - - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -3418,17 +3231,7 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = functio */ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeInstance, msg) { var f, obj = { - mainFile: jspb.Message.getFieldWithDefault(msg, 1, ""), - locationPath: jspb.Message.getFieldWithDefault(msg, 2, ""), - otherSketchFilesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, - additionalFilesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, - rootFolderFilesList: (f = jspb.Message.getRepeatedField(msg, 5)) == null ? undefined : f, - defaultFqbn: jspb.Message.getFieldWithDefault(msg, 6, ""), - defaultPort: jspb.Message.getFieldWithDefault(msg, 7, ""), - defaultProtocol: jspb.Message.getFieldWithDefault(msg, 8, ""), - profilesList: jspb.Message.toObjectList(msg.getProfilesList(), - proto.cc.arduino.cli.commands.v1.SketchProfile.toObject, includeInstance), - defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f) + sketch: (f = msg.getSketch()) && cc_arduino_cli_commands_v1_common_pb.Sketch.toObject(includeInstance, f) }; if (includeInstance) { @@ -3466,46 +3269,9 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMainFile(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setLocationPath(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.addOtherSketchFiles(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.addAdditionalFiles(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.addRootFolderFiles(value); - 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; - case 9: - var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); - msg.addProfiles(value); - break; - case 10: - var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); - msg.setDefaultProfile(value); + var value = new cc_arduino_cli_commands_v1_common_pb.Sketch; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Sketch.deserializeBinaryFromReader); + msg.setSketch(value); break; default: reader.skipField(); @@ -3536,336 +3302,33 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = */ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getMainFile(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getLocationPath(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getOtherSketchFilesList(); - if (f.length > 0) { - writer.writeRepeatedString( - 3, - f - ); - } - f = message.getAdditionalFilesList(); - if (f.length > 0) { - writer.writeRepeatedString( - 4, - f - ); - } - f = message.getRootFolderFilesList(); - if (f.length > 0) { - writer.writeRepeatedString( - 5, - 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 - ); - } - f = message.getProfilesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 9, - f, - proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter - ); - } - f = message.getDefaultProfile(); + f = message.getSketch(); if (f != null) { writer.writeMessage( - 10, + 1, f, - proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.Sketch.serializeBinaryToWriter ); } }; /** - * optional string main_file = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getMainFile = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setMainFile = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string location_path = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getLocationPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * optional Sketch sketch = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Sketch} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setLocationPath = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getSketch = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Sketch} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Sketch, 1)); }; /** - * repeated string other_sketch_files = 3; - * @return {!Array<string>} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getOtherSketchFilesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); -}; - - -/** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setOtherSketchFilesList = function(value) { - return jspb.Message.setField(this, 3, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addOtherSketchFiles = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 3, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearOtherSketchFilesList = function() { - return this.setOtherSketchFilesList([]); -}; - - -/** - * repeated string additional_files = 4; - * @return {!Array<string>} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getAdditionalFilesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); -}; - - -/** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setAdditionalFilesList = function(value) { - return jspb.Message.setField(this, 4, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addAdditionalFiles = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearAdditionalFilesList = function() { - return this.setAdditionalFilesList([]); -}; - - -/** - * repeated string root_folder_files = 5; - * @return {!Array<string>} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getRootFolderFilesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); -}; - - -/** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setRootFolderFilesList = function(value) { - return jspb.Message.setField(this, 5, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addRootFolderFiles = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 5, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearRootFolderFilesList = function() { - return this.setRootFolderFilesList([]); -}; - - -/** - * 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); -}; - - -/** - * repeated SketchProfile profiles = 9; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getProfilesList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 9)); -}; - - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} value + * @param {?proto.cc.arduino.cli.commands.v1.Sketch|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setProfilesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 9, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.addProfiles = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 9, opt_value, proto.cc.arduino.cli.commands.v1.SketchProfile, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearProfilesList = function() { - return this.setProfilesList([]); -}; - - -/** - * optional SketchProfile default_profile = 10; - * @return {?proto.cc.arduino.cli.commands.v1.SketchProfile} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getDefaultProfile = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.SketchProfile} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 10)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.SketchProfile|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultProfile = function(value) { - return jspb.Message.setWrapperField(this, 10, value); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setSketch = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; @@ -3873,8 +3336,8 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultProfile * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearDefaultProfile = function() { - return this.setDefaultProfile(undefined); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearSketch = function() { + return this.setSketch(undefined); }; @@ -3882,8 +3345,8 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearDefaultProfil * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.hasDefaultProfile = function() { - return jspb.Message.getField(this, 10) != null; +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.hasSketch = function() { + return jspb.Message.getField(this, 1) != null; }; 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 76437e03f..686aaddc7 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 @@ -213,68 +213,154 @@ export namespace MissingProgrammerError { } export class Platform extends jspb.Message { + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): PlatformMetadata | undefined; + setMetadata(value?: PlatformMetadata): Platform; + + hasRelease(): boolean; + clearRelease(): void; + getRelease(): PlatformRelease | undefined; + setRelease(value?: PlatformRelease): Platform; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Platform.AsObject; + static toObject(includeInstance: boolean, msg: Platform): Platform.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Platform, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Platform; + static deserializeBinaryFromReader(message: Platform, reader: jspb.BinaryReader): Platform; +} + +export namespace Platform { + export type AsObject = { + metadata?: PlatformMetadata.AsObject, + release?: PlatformRelease.AsObject, + } +} + +export class PlatformSummary extends jspb.Message { + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): PlatformMetadata | undefined; + setMetadata(value?: PlatformMetadata): PlatformSummary; + + getReleasesMap(): jspb.Map<string, PlatformRelease>; + clearReleasesMap(): void; + getInstalledVersion(): string; + setInstalledVersion(value: string): PlatformSummary; + getLatestVersion(): string; + setLatestVersion(value: string): PlatformSummary; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PlatformSummary.AsObject; + static toObject(includeInstance: boolean, msg: PlatformSummary): PlatformSummary.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: PlatformSummary, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformSummary; + static deserializeBinaryFromReader(message: PlatformSummary, reader: jspb.BinaryReader): PlatformSummary; +} + +export namespace PlatformSummary { + export type AsObject = { + metadata?: PlatformMetadata.AsObject, + + releasesMap: Array<[string, PlatformRelease.AsObject]>, + installedVersion: string, + latestVersion: string, + } +} + +export class PlatformMetadata 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; + setId(value: string): PlatformMetadata; getMaintainer(): string; - setMaintainer(value: string): Platform; + setMaintainer(value: string): PlatformMetadata; getWebsite(): string; - setWebsite(value: string): Platform; + setWebsite(value: string): PlatformMetadata; getEmail(): string; - setEmail(value: string): Platform; - clearBoardsList(): void; - getBoardsList(): Array<Board>; - setBoardsList(value: Array<Board>): Platform; - addBoards(value?: Board, index?: number): Board; + setEmail(value: string): PlatformMetadata; getManuallyInstalled(): boolean; - setManuallyInstalled(value: boolean): Platform; + setManuallyInstalled(value: boolean): PlatformMetadata; getDeprecated(): boolean; - setDeprecated(value: boolean): Platform; + setDeprecated(value: boolean): PlatformMetadata; + getIndexed(): boolean; + setIndexed(value: boolean): PlatformMetadata; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PlatformMetadata.AsObject; + static toObject(includeInstance: boolean, msg: PlatformMetadata): PlatformMetadata.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: PlatformMetadata, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformMetadata; + static deserializeBinaryFromReader(message: PlatformMetadata, reader: jspb.BinaryReader): PlatformMetadata; +} + +export namespace PlatformMetadata { + export type AsObject = { + id: string, + maintainer: string, + website: string, + email: string, + manuallyInstalled: boolean, + deprecated: boolean, + indexed: boolean, + } +} + +export class PlatformRelease extends jspb.Message { + getName(): string; + setName(value: string): PlatformRelease; + getVersion(): string; + setVersion(value: string): PlatformRelease; clearTypeList(): void; getTypeList(): Array<string>; - setTypeList(value: Array<string>): Platform; + setTypeList(value: Array<string>): PlatformRelease; addType(value: string, index?: number): string; + getInstalled(): boolean; + setInstalled(value: boolean): PlatformRelease; + clearBoardsList(): void; + getBoardsList(): Array<Board>; + setBoardsList(value: Array<Board>): PlatformRelease; + addBoards(value?: Board, index?: number): Board; hasHelp(): boolean; clearHelp(): void; getHelp(): HelpResources | undefined; - setHelp(value?: HelpResources): Platform; - getIndexed(): boolean; - setIndexed(value: boolean): Platform; + setHelp(value?: HelpResources): PlatformRelease; getMissingMetadata(): boolean; - setMissingMetadata(value: boolean): Platform; + setMissingMetadata(value: boolean): PlatformRelease; + getDeprecated(): boolean; + setDeprecated(value: boolean): PlatformRelease; + getCompatible(): boolean; + setCompatible(value: boolean): PlatformRelease; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): Platform.AsObject; - static toObject(includeInstance: boolean, msg: Platform): Platform.AsObject; + toObject(includeInstance?: boolean): PlatformRelease.AsObject; + static toObject(includeInstance: boolean, msg: PlatformRelease): PlatformRelease.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: Platform, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Platform; - static deserializeBinaryFromReader(message: Platform, reader: jspb.BinaryReader): Platform; + static serializeBinaryToWriter(message: PlatformRelease, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PlatformRelease; + static deserializeBinaryFromReader(message: PlatformRelease, reader: jspb.BinaryReader): PlatformRelease; } -export namespace Platform { +export namespace PlatformRelease { export type AsObject = { - id: string, - installed: string, - latest: string, name: string, - maintainer: string, - website: string, - email: string, - boardsList: Array<Board.AsObject>, - manuallyInstalled: boolean, - deprecated: boolean, + version: string, typeList: Array<string>, + installed: boolean, + boardsList: Array<Board.AsObject>, help?: HelpResources.AsObject, - indexed: boolean, missingMetadata: boolean, + deprecated: boolean, + compatible: boolean, } } @@ -372,3 +458,84 @@ export namespace HelpResources { online: string, } } + +export class Sketch extends jspb.Message { + getMainFile(): string; + setMainFile(value: string): Sketch; + getLocationPath(): string; + setLocationPath(value: string): Sketch; + clearOtherSketchFilesList(): void; + getOtherSketchFilesList(): Array<string>; + setOtherSketchFilesList(value: Array<string>): Sketch; + addOtherSketchFiles(value: string, index?: number): string; + clearAdditionalFilesList(): void; + getAdditionalFilesList(): Array<string>; + setAdditionalFilesList(value: Array<string>): Sketch; + addAdditionalFiles(value: string, index?: number): string; + clearRootFolderFilesList(): void; + getRootFolderFilesList(): Array<string>; + setRootFolderFilesList(value: Array<string>): Sketch; + addRootFolderFiles(value: string, index?: number): string; + getDefaultFqbn(): string; + setDefaultFqbn(value: string): Sketch; + getDefaultPort(): string; + setDefaultPort(value: string): Sketch; + getDefaultProtocol(): string; + setDefaultProtocol(value: string): Sketch; + clearProfilesList(): void; + getProfilesList(): Array<SketchProfile>; + setProfilesList(value: Array<SketchProfile>): Sketch; + addProfiles(value?: SketchProfile, index?: number): SketchProfile; + + hasDefaultProfile(): boolean; + clearDefaultProfile(): void; + getDefaultProfile(): SketchProfile | undefined; + setDefaultProfile(value?: SketchProfile): Sketch; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Sketch.AsObject; + static toObject(includeInstance: boolean, msg: Sketch): Sketch.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Sketch, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Sketch; + static deserializeBinaryFromReader(message: Sketch, reader: jspb.BinaryReader): Sketch; +} + +export namespace Sketch { + export type AsObject = { + mainFile: string, + locationPath: string, + otherSketchFilesList: Array<string>, + additionalFilesList: Array<string>, + rootFolderFilesList: Array<string>, + defaultFqbn: string, + defaultPort: string, + defaultProtocol: string, + profilesList: Array<SketchProfile.AsObject>, + defaultProfile?: SketchProfile.AsObject, + } +} + +export class SketchProfile extends jspb.Message { + getName(): string; + setName(value: string): SketchProfile; + getFqbn(): string; + setFqbn(value: string): SketchProfile; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SketchProfile.AsObject; + static toObject(includeInstance: boolean, msg: SketchProfile): SketchProfile.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SketchProfile, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SketchProfile; + static deserializeBinaryFromReader(message: SketchProfile, reader: jspb.BinaryReader): SketchProfile; +} + +export namespace SketchProfile { + export type AsObject = { + name: string, + fqbn: string, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js index 3f7418a1d..d30df0410 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 @@ -32,8 +32,13 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledPlatformReference', goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Instance', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MissingProgrammerError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformMetadata', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformRelease', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSummary', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Profile', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Programmer', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Sketch', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SketchProfile', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.TaskProgress', null, global); /** * Generated by JsPbCodeGenerator. @@ -214,7 +219,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.Platform = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.Platform.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.Platform, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -224,6 +229,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Platform.displayName = 'proto.cc.arduino.cli.commands.v1.Platform'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.PlatformSummary = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformSummary, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformSummary.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSummary'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformMetadata, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformMetadata.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformMetadata'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.PlatformRelease.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformRelease, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformRelease.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformRelease'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -308,6 +376,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.HelpResources.displayName = 'proto.cc.arduino.cli.commands.v1.HelpResources'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Sketch = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.Sketch.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Sketch, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Sketch.displayName = 'proto.cc.arduino.cli.commands.v1.Sketch'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SketchProfile = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SketchProfile, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SketchProfile.displayName = 'proto.cc.arduino.cli.commands.v1.SketchProfile'; +} @@ -1710,13 +1820,6 @@ proto.cc.arduino.cli.commands.v1.MissingProgrammerError.serializeBinaryToWriter -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.Platform.repeatedFields_ = [8,11]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1748,21 +1851,8 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.toObject = function(opt_incl */ proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, msg) { var f, obj = { - id: jspb.Message.getFieldWithDefault(msg, 1, ""), - installed: jspb.Message.getFieldWithDefault(msg, 2, ""), - latest: jspb.Message.getFieldWithDefault(msg, 3, ""), - name: jspb.Message.getFieldWithDefault(msg, 4, ""), - maintainer: jspb.Message.getFieldWithDefault(msg, 5, ""), - website: jspb.Message.getFieldWithDefault(msg, 6, ""), - email: jspb.Message.getFieldWithDefault(msg, 7, ""), - boardsList: jspb.Message.toObjectList(msg.getBoardsList(), - proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), - manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 9, false), - deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - typeList: (f = jspb.Message.getRepeatedField(msg, 11)) == null ? undefined : f, - 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) + metadata: (f = msg.getMetadata()) && proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject(includeInstance, f), + release: (f = msg.getRelease()) && proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject(includeInstance, f) }; if (includeInstance) { @@ -1800,62 +1890,14 @@ proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setId(value); + var value = new proto.cc.arduino.cli.commands.v1.PlatformMetadata; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setInstalled(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setLatest(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setMaintainer(value); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setWebsite(value); - break; - case 7: - var value = /** @type {string} */ (reader.readString()); - msg.setEmail(value); - break; - case 8: - var value = new proto.cc.arduino.cli.commands.v1.Board; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader); - msg.addBoards(value); - break; - case 9: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setManuallyInstalled(value); - break; - case 10: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDeprecated(value); - break; - case 11: - var value = /** @type {string} */ (reader.readString()); - msg.addType(value); - break; - case 12: - var value = new proto.cc.arduino.cli.commands.v1.HelpResources; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader); - msg.setHelp(value); - break; - case 13: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIndexed(value); - break; - case 14: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setMissingMetadata(value); + var value = new proto.cc.arduino.cli.commands.v1.PlatformRelease; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader); + msg.setRelease(value); break; default: reader.skipField(); @@ -1886,416 +1928,340 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.serializeBinary = function() */ proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId(); - if (f.length > 0) { - writer.writeString( + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getInstalled(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getLatest(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getMaintainer(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); - } - f = message.getWebsite(); - if (f.length > 0) { - writer.writeString( - 6, - f - ); - } - f = message.getEmail(); - if (f.length > 0) { - writer.writeString( - 7, - f - ); - } - f = message.getBoardsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 8, f, - proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter - ); - } - f = message.getManuallyInstalled(); - if (f) { - writer.writeBool( - 9, - f - ); - } - f = message.getDeprecated(); - if (f) { - writer.writeBool( - 10, - f + proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter ); } - f = message.getTypeList(); - if (f.length > 0) { - writer.writeRepeatedString( - 11, - f - ); - } - f = message.getHelp(); + f = message.getRelease(); if (f != null) { writer.writeMessage( - 12, + 2, f, - 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 + proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter ); } }; /** - * optional string id = 1; - * @return {string} + * optional PlatformMetadata metadata = 1; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.Platform.prototype.getMetadata = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformMetadata, 1)); }; /** - * @param {string} value + * @param {?proto.cc.arduino.cli.commands.v1.PlatformMetadata|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +*/ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * optional string installed = 2; - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getInstalled = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.Platform.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setInstalled = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.Platform.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional string latest = 3; - * @return {string} + * optional PlatformRelease release = 2; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformRelease} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getLatest = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.Platform.prototype.getRelease = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformRelease} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformRelease, 2)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setLatest = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * optional string name = 4; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * @param {string} value + * @param {?proto.cc.arduino.cli.commands.v1.PlatformRelease|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); -}; - - -/** - * optional string maintainer = 5; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getMaintainer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setMaintainer = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; - - -/** - * optional string website = 6; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getWebsite = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +*/ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setRelease = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** - * @param {string} value + * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setWebsite = function(value) { - return jspb.Message.setProto3StringField(this, 6, value); -}; - - -/** - * optional string email = 7; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getEmail = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +proto.cc.arduino.cli.commands.v1.Platform.prototype.clearRelease = function() { + return this.setRelease(undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setEmail = function(value) { - return jspb.Message.setProto3StringField(this, 7, value); +proto.cc.arduino.cli.commands.v1.Platform.prototype.hasRelease = function() { + return jspb.Message.getField(this, 2) != null; }; -/** - * repeated Board boards = 8; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Board>} - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getBoardsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Board>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.Board, 8)); -}; - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Board>} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this -*/ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setBoardsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 8, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {!proto.cc.arduino.cli.commands.v1.Board=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Board} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.addBoards = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 8, opt_value, proto.cc.arduino.cli.commands.v1.Board, opt_index); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformSummary.toObject(opt_includeInstance, this); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSummary} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.clearBoardsList = function() { - return this.setBoardsList([]); -}; - +proto.cc.arduino.cli.commands.v1.PlatformSummary.toObject = function(includeInstance, msg) { + var f, obj = { + metadata: (f = msg.getMetadata()) && proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject(includeInstance, f), + releasesMap: (f = msg.getReleasesMap()) ? f.toObject(includeInstance, proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject) : [], + installedVersion: jspb.Message.getFieldWithDefault(msg, 3, ""), + latestVersion: jspb.Message.getFieldWithDefault(msg, 4, "") + }; -/** - * optional bool manually_installed = 9; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getManuallyInstalled = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setManuallyInstalled = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.cc.arduino.cli.commands.v1.PlatformSummary.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformSummary; + return proto.cc.arduino.cli.commands.v1.PlatformSummary.deserializeBinaryFromReader(msg, reader); }; /** - * optional bool deprecated = 10; - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSummary} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getDeprecated = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 10, false)); +proto.cc.arduino.cli.commands.v1.PlatformSummary.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.PlatformMetadata; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + case 2: + var value = msg.getReleasesMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader, "", new proto.cc.arduino.cli.commands.v1.PlatformRelease()); + }); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setInstalledVersion(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setLatestVersion(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setDeprecated = function(value) { - return jspb.Message.setProto3BooleanField(this, 10, value); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformSummary.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * repeated string type = 11; - * @return {!Array<string>} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSummary} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getTypeList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 11)); +proto.cc.arduino.cli.commands.v1.PlatformSummary.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter + ); + } + f = message.getReleasesMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(2, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter); + } + f = message.getInstalledVersion(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getLatestVersion(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } }; /** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * optional PlatformMetadata metadata = 1; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setTypeList = function(value) { - return jspb.Message.setField(this, 11, value || []); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getMetadata = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformMetadata, 1)); }; /** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this - */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.addType = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 11, value, opt_index); + * @param {?proto.cc.arduino.cli.commands.v1.PlatformMetadata|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.clearTypeList = function() { - return this.setTypeList([]); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * optional HelpResources help = 12; - * @return {?proto.cc.arduino.cli.commands.v1.HelpResources} + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getHelp = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.HelpResources} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.HelpResources, 12)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.HelpResources|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this -*/ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setHelp = function(value) { - return jspb.Message.setWrapperField(this, 12, value); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * map<string, PlatformRelease> releases = 2; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<string,!proto.cc.arduino.cli.commands.v1.PlatformRelease>} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.clearHelp = function() { - return this.setHelp(undefined); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getReleasesMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<string,!proto.cc.arduino.cli.commands.v1.PlatformRelease>} */ ( + jspb.Message.getMapField(this, 2, opt_noLazyCreate, + proto.cc.arduino.cli.commands.v1.PlatformRelease)); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears values from the map. The map will be non-null. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.hasHelp = function() { - return jspb.Message.getField(this, 12) != null; -}; +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.clearReleasesMap = function() { + this.getReleasesMap().clear(); + return this;}; /** - * optional bool indexed = 13; - * @return {boolean} + * optional string installed_version = 3; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getIndexed = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 13, false)); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getInstalledVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setIndexed = function(value) { - return jspb.Message.setProto3BooleanField(this, 13, value); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.setInstalledVersion = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; /** - * optional bool missing_metadata = 14; - * @return {boolean} + * optional string latest_version = 4; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.getMissingMetadata = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 14, false)); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.getLatestVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} returns this */ -proto.cc.arduino.cli.commands.v1.Platform.prototype.setMissingMetadata = function(value) { - return jspb.Message.setProto3BooleanField(this, 14, value); +proto.cc.arduino.cli.commands.v1.PlatformSummary.prototype.setLatestVersion = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); }; @@ -2315,8 +2281,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject(opt_includeInstance, this); }; @@ -2325,16 +2291,19 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.toObject = function(includeInstance, msg) { var f, obj = { id: jspb.Message.getFieldWithDefault(msg, 1, ""), - version: jspb.Message.getFieldWithDefault(msg, 2, ""), - installDir: jspb.Message.getFieldWithDefault(msg, 3, ""), - packageUrl: jspb.Message.getFieldWithDefault(msg, 4, "") + maintainer: jspb.Message.getFieldWithDefault(msg, 2, ""), + website: jspb.Message.getFieldWithDefault(msg, 3, ""), + email: jspb.Message.getFieldWithDefault(msg, 4, ""), + manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), + deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), + indexed: jspb.Message.getBooleanFieldWithDefault(msg, 7, false) }; if (includeInstance) { @@ -2348,23 +2317,23 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject = function( /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.InstalledPlatformReference; - return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformMetadata; + return proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2377,15 +2346,27 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFro break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setVersion(value); + msg.setMaintainer(value); break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.setInstallDir(value); + msg.setWebsite(value); break; case 4: var value = /** @type {string} */ (reader.readString()); - msg.setPackageUrl(value); + msg.setEmail(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setManuallyInstalled(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDeprecated(value); + break; + case 7: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIndexed(value); break; default: reader.skipField(); @@ -2400,9 +2381,9 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFro * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2410,11 +2391,11 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.serializeB /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} message + * @param {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getId(); if (f.length > 0) { @@ -2423,102 +2404,184 @@ proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWri f ); } - f = message.getVersion(); + f = message.getMaintainer(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getInstallDir(); + f = message.getWebsite(); if (f.length > 0) { writer.writeString( 3, f ); } - f = message.getPackageUrl(); + f = message.getEmail(); if (f.length > 0) { writer.writeString( 4, f ); } -}; - - -/** - * optional string id = 1; - * @return {string} + f = message.getManuallyInstalled(); + if (f) { + writer.writeBool( + 5, + f + ); + } + f = message.getDeprecated(); + if (f) { + writer.writeBool( + 6, + f + ); + } + f = message.getIndexed(); + if (f) { + writer.writeBool( + 7, + f + ); + } +}; + + +/** + * optional string id = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getId = function() { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setId = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setId = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string version = 2; + * optional string maintainer = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getVersion = function() { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getMaintainer = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setVersion = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setMaintainer = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional string install_dir = 3; + * optional string website = 3; * @return {string} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getInstallDir = function() { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getWebsite = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setInstallDir = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setWebsite = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; /** - * optional string package_url = 4; + * optional string email = 4; * @return {string} */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getPackageUrl = function() { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getEmail = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this */ -proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setPackageUrl = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setEmail = function(value) { return jspb.Message.setProto3StringField(this, 4, value); }; +/** + * optional bool manually_installed = 5; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getManuallyInstalled = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setManuallyInstalled = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional bool deprecated = 6; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getDeprecated = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setDeprecated = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); +}; + + +/** + * optional bool indexed = 7; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.getIndexed = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformMetadata} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformMetadata.prototype.setIndexed = function(value) { + return jspb.Message.setProto3BooleanField(this, 7, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.repeatedFields_ = [3,5]; @@ -2535,8 +2598,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Board.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject(opt_includeInstance, this); }; @@ -2545,14 +2608,22 @@ proto.cc.arduino.cli.commands.v1.Board.prototype.toObject = function(opt_include * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.Board} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformRelease} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Board.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject = function(includeInstance, msg) { var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + version: jspb.Message.getFieldWithDefault(msg, 2, ""), + typeList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + installed: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + boardsList: jspb.Message.toObjectList(msg.getBoardsList(), + proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), + help: (f = msg.getHelp()) && proto.cc.arduino.cli.commands.v1.HelpResources.toObject(includeInstance, f), + missingMetadata: jspb.Message.getBooleanFieldWithDefault(msg, 7, false), + deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), + compatible: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -2566,23 +2637,23 @@ proto.cc.arduino.cli.commands.v1.Board.toObject = function(includeInstance, msg) /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Board} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} */ -proto.cc.arduino.cli.commands.v1.Board.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Board; - return proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformRelease; + return proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.Board} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformRelease} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Board} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} */ -proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2595,7 +2666,37 @@ proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(ms break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); + msg.setVersion(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.addType(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setInstalled(value); + break; + case 5: + var value = new proto.cc.arduino.cli.commands.v1.Board; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader); + msg.addBoards(value); + break; + case 6: + var value = new proto.cc.arduino.cli.commands.v1.HelpResources; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader); + msg.setHelp(value); + break; + case 7: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setMissingMetadata(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDeprecated(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setCompatible(value); break; default: reader.skipField(); @@ -2610,9 +2711,9 @@ proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(ms * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2620,11 +2721,11 @@ proto.cc.arduino.cli.commands.v1.Board.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.Board} message + * @param {!proto.cc.arduino.cli.commands.v1.PlatformRelease} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getName(); if (f.length > 0) { @@ -2633,13 +2734,64 @@ proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(messag f ); } - f = message.getFqbn(); + f = message.getVersion(); if (f.length > 0) { writer.writeString( 2, f ); } + f = message.getTypeList(); + if (f.length > 0) { + writer.writeRepeatedString( + 3, + f + ); + } + f = message.getInstalled(); + if (f) { + writer.writeBool( + 4, + f + ); + } + f = message.getBoardsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 5, + f, + proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter + ); + } + f = message.getHelp(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter + ); + } + f = message.getMissingMetadata(); + if (f) { + writer.writeBool( + 7, + f + ); + } + f = message.getDeprecated(); + if (f) { + writer.writeBool( + 8, + f + ); + } + f = message.getCompatible(); + if (f) { + writer.writeBool( + 9, + f + ); + } }; @@ -2647,115 +2799,1019 @@ proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(messag * optional string name = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.getName = function() { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.Board.prototype.setName = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setName = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string fqbn = 2; + * optional string version = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Board.prototype.getFqbn = function() { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getVersion = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.Board.prototype.setFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setVersion = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; +/** + * repeated string type = 3; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getTypeList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Profile.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setTypeList = function(value) { + return jspb.Message.setField(this, 3, value || []); }; /** - * 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.Profile} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") - }; +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addType = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearTypeList = function() { + return this.setTypeList([]); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Profile} + * optional bool installed = 4; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.Profile.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Profile; - return proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader(msg, reader); +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getInstalled = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.Profile} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Profile} + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setInstalled = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * repeated Board boards = 5; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.Board>} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getBoardsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Board>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.Board, 5)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.Board>} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setBoardsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 5, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.Board=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Board} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addBoards = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 5, opt_value, proto.cc.arduino.cli.commands.v1.Board, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearBoardsList = function() { + return this.setBoardsList([]); +}; + + +/** + * optional HelpResources help = 6; + * @return {?proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getHelp = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.HelpResources} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.HelpResources, 6)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.HelpResources|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setHelp = function(value) { + return jspb.Message.setWrapperField(this, 6, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearHelp = function() { + return this.setHelp(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.hasHelp = function() { + return jspb.Message.getField(this, 6) != null; +}; + + +/** + * optional bool missing_metadata = 7; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getMissingMetadata = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setMissingMetadata = function(value) { + return jspb.Message.setProto3BooleanField(this, 7, value); +}; + + +/** + * optional bool deprecated = 8; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getDeprecated = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setDeprecated = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); +}; + + +/** + * optional bool compatible = 9; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getCompatible = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setCompatible = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.toObject = function(includeInstance, msg) { + var f, obj = { + id: jspb.Message.getFieldWithDefault(msg, 1, ""), + version: jspb.Message.getFieldWithDefault(msg, 2, ""), + installDir: jspb.Message.getFieldWithDefault(msg, 3, ""), + packageUrl: jspb.Message.getFieldWithDefault(msg, 4, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.InstalledPlatformReference; + return proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setVersion(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setInstallDir(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setPackageUrl(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getVersion(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getInstallDir(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getPackageUrl(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } +}; + + +/** + * optional string id = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string version = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setVersion = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string install_dir = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getInstallDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setInstallDir = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string package_url = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.getPackageUrl = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} returns this + */ +proto.cc.arduino.cli.commands.v1.InstalledPlatformReference.prototype.setPackageUrl = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Board.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Board} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Board.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Board} + */ +proto.cc.arduino.cli.commands.v1.Board.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Board; + return proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Board} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Board} + */ +proto.cc.arduino.cli.commands.v1.Board.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Board} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Board.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Board} returns this + */ +proto.cc.arduino.cli.commands.v1.Board.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Profile.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Profile.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.Profile} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Profile.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Profile} + */ +proto.cc.arduino.cli.commands.v1.Profile.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Profile; + return proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Profile} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Profile} + */ +proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Profile.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Profile.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.Profile} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Profile.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this + */ +proto.cc.arduino.cli.commands.v1.Profile.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Profile.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this + */ +proto.cc.arduino.cli.commands.v1.Profile.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.HelpResources.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.HelpResources} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.HelpResources.toObject = function(includeInstance, msg) { + var f, obj = { + online: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.HelpResources; + return proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.setOnline(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.HelpResources.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.HelpResources.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.HelpResources} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getOnline(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string online = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.getOnline = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} returns this + */ +proto.cc.arduino.cli.commands.v1.HelpResources.prototype.setOnline = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.Sketch.repeatedFields_ = [3,4,5,9]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Sketch.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Sketch} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Sketch.toObject = function(includeInstance, msg) { + var f, obj = { + mainFile: jspb.Message.getFieldWithDefault(msg, 1, ""), + locationPath: jspb.Message.getFieldWithDefault(msg, 2, ""), + otherSketchFilesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + additionalFilesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, + rootFolderFilesList: (f = jspb.Message.getRepeatedField(msg, 5)) == null ? undefined : f, + defaultFqbn: jspb.Message.getFieldWithDefault(msg, 6, ""), + defaultPort: jspb.Message.getFieldWithDefault(msg, 7, ""), + defaultProtocol: jspb.Message.getFieldWithDefault(msg, 8, ""), + profilesList: jspb.Message.toObjectList(msg.getProfilesList(), + proto.cc.arduino.cli.commands.v1.SketchProfile.toObject, includeInstance), + defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f) + }; + + 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.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Sketch.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Sketch; + return proto.cc.arduino.cli.commands.v1.Sketch.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Sketch} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Sketch.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.setMainFile(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); + msg.setLocationPath(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.addOtherSketchFiles(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.addAdditionalFiles(value); + break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.addRootFolderFiles(value); + 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; + case 9: + var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); + msg.addProfiles(value); + break; + case 10: + var value = new proto.cc.arduino.cli.commands.v1.SketchProfile; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); + msg.setDefaultProfile(value); break; default: reader.skipField(); @@ -2770,9 +3826,9 @@ proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function( * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.Sketch.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2780,65 +3836,363 @@ proto.cc.arduino.cli.commands.v1.Profile.prototype.serializeBinary = function() /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.Profile} message + * @param {!proto.cc.arduino.cli.commands.v1.Sketch} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.Sketch.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getName(); + f = message.getMainFile(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getLocationPath(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getOtherSketchFilesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 3, + f + ); + } + f = message.getAdditionalFilesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 4, + f + ); + } + f = message.getRootFolderFilesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 5, + f + ); + } + f = message.getDefaultFqbn(); if (f.length > 0) { writer.writeString( - 1, + 6, f ); } - f = message.getFqbn(); + f = message.getDefaultPort(); if (f.length > 0) { writer.writeString( - 2, + 7, + f + ); + } + f = message.getDefaultProtocol(); + if (f.length > 0) { + writer.writeString( + 8, f ); } + f = message.getProfilesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 9, + f, + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter + ); + } + f = message.getDefaultProfile(); + if (f != null) { + writer.writeMessage( + 10, + f, + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter + ); + } }; /** - * optional string name = 1; + * optional string main_file = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.getName = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getMainFile = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.setName = function(value) { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setMainFile = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string fqbn = 2; + * optional string location_path = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.getFqbn = function() { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getLocationPath = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.setFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setLocationPath = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; +/** + * repeated string other_sketch_files = 3; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getOtherSketchFilesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setOtherSketchFilesList = function(value) { + return jspb.Message.setField(this, 3, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addOtherSketchFiles = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearOtherSketchFilesList = function() { + return this.setOtherSketchFilesList([]); +}; + + +/** + * repeated string additional_files = 4; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getAdditionalFilesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setAdditionalFilesList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addAdditionalFiles = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearAdditionalFilesList = function() { + return this.setAdditionalFilesList([]); +}; + + +/** + * repeated string root_folder_files = 5; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getRootFolderFilesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setRootFolderFilesList = function(value) { + return jspb.Message.setField(this, 5, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addRootFolderFiles = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 5, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearRootFolderFilesList = function() { + return this.setRootFolderFilesList([]); +}; + + +/** + * optional string default_fqbn = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + +/** + * optional string default_port = 7; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultPort = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultPort = function(value) { + return jspb.Message.setProto3StringField(this, 7, value); +}; + + +/** + * optional string default_protocol = 8; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 8, value); +}; + + +/** + * repeated SketchProfile profiles = 9; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getProfilesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 9)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.SketchProfile>} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this +*/ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setProfilesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 9, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.addProfiles = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 9, opt_value, proto.cc.arduino.cli.commands.v1.SketchProfile, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearProfilesList = function() { + return this.setProfilesList([]); +}; + + +/** + * optional SketchProfile default_profile = 10; + * @return {?proto.cc.arduino.cli.commands.v1.SketchProfile} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultProfile = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.SketchProfile} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.SketchProfile, 10)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.SketchProfile|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this +*/ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProfile = function(value) { + return jspb.Message.setWrapperField(this, 10, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearDefaultProfile = function() { + return this.setDefaultProfile(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.hasDefaultProfile = function() { + return jspb.Message.getField(this, 10) != null; +}; + + @@ -2855,8 +4209,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.HelpResources.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.HelpResources.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(opt_includeInstance, this); }; @@ -2865,13 +4219,14 @@ proto.cc.arduino.cli.commands.v1.HelpResources.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.HelpResources.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SketchProfile.toObject = function(includeInstance, msg) { var f, obj = { - online: jspb.Message.getFieldWithDefault(msg, 1, "") + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -2885,23 +4240,23 @@ proto.cc.arduino.cli.commands.v1.HelpResources.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} */ -proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.HelpResources; - return proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SketchProfile; + return proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} */ -proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2910,7 +4265,11 @@ proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader = fun switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setOnline(value); + msg.setName(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFqbn(value); break; default: reader.skipField(); @@ -2925,9 +4284,9 @@ proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.HelpResources.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2935,38 +4294,63 @@ proto.cc.arduino.cli.commands.v1.HelpResources.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.HelpResources} message + * @param {!proto.cc.arduino.cli.commands.v1.SketchProfile} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOnline(); + f = message.getName(); if (f.length > 0) { writer.writeString( 1, f ); } + f = message.getFqbn(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } }; /** - * optional string online = 1; + * optional string name = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.HelpResources.prototype.getOnline = function() { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.HelpResources} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this */ -proto.cc.arduino.cli.commands.v1.HelpResources.prototype.setOnline = function(value) { +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setName = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; +/** + * optional string fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts index d24160005..b5e832ec0 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 @@ -116,65 +116,110 @@ export namespace CompileRequest { } export class CompileResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): CompileResponse; + + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): CompileResponse; + + hasProgress(): boolean; + clearProgress(): void; + getProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; + setProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): CompileResponse; + + hasResult(): boolean; + clearResult(): void; + getResult(): BuilderResult | undefined; + setResult(value?: BuilderResult): CompileResponse; + + getMessageCase(): CompileResponse.MessageCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileResponse.AsObject; + static toObject(includeInstance: boolean, msg: CompileResponse): CompileResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileResponse; + static deserializeBinaryFromReader(message: CompileResponse, reader: jspb.BinaryReader): CompileResponse; +} + +export namespace CompileResponse { + export type AsObject = { + outStream: Uint8Array | string, + errStream: Uint8Array | string, + progress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: BuilderResult.AsObject, + } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + PROGRESS = 3, + RESULT = 4, + } + +} + +export class BuilderResult extends jspb.Message { getBuildPath(): string; - setBuildPath(value: string): CompileResponse; + setBuildPath(value: string): BuilderResult; clearUsedLibrariesList(): void; getUsedLibrariesList(): Array<cc_arduino_cli_commands_v1_lib_pb.Library>; - setUsedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.Library>): CompileResponse; + setUsedLibrariesList(value: Array<cc_arduino_cli_commands_v1_lib_pb.Library>): BuilderResult; addUsedLibraries(value?: cc_arduino_cli_commands_v1_lib_pb.Library, index?: number): cc_arduino_cli_commands_v1_lib_pb.Library; clearExecutableSectionsSizeList(): void; getExecutableSectionsSizeList(): Array<ExecutableSectionSize>; - setExecutableSectionsSizeList(value: Array<ExecutableSectionSize>): CompileResponse; + setExecutableSectionsSizeList(value: Array<ExecutableSectionSize>): BuilderResult; addExecutableSectionsSize(value?: ExecutableSectionSize, index?: number): ExecutableSectionSize; hasBoardPlatform(): boolean; clearBoardPlatform(): void; getBoardPlatform(): cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference | undefined; - setBoardPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): CompileResponse; + setBoardPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): BuilderResult; hasBuildPlatform(): boolean; clearBuildPlatform(): void; getBuildPlatform(): cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference | undefined; - setBuildPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): CompileResponse; - - hasProgress(): boolean; - clearProgress(): void; - getProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; - setProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): CompileResponse; + setBuildPlatform(value?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference): BuilderResult; clearBuildPropertiesList(): void; getBuildPropertiesList(): Array<string>; - setBuildPropertiesList(value: Array<string>): CompileResponse; + setBuildPropertiesList(value: Array<string>): BuilderResult; addBuildProperties(value: string, index?: number): string; + clearDiagnosticsList(): void; + getDiagnosticsList(): Array<CompileDiagnostic>; + setDiagnosticsList(value: Array<CompileDiagnostic>): BuilderResult; + addDiagnostics(value?: CompileDiagnostic, index?: number): CompileDiagnostic; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): CompileResponse.AsObject; - static toObject(includeInstance: boolean, msg: CompileResponse): CompileResponse.AsObject; + toObject(includeInstance?: boolean): BuilderResult.AsObject; + static toObject(includeInstance: boolean, msg: BuilderResult): BuilderResult.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: CompileResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): CompileResponse; - static deserializeBinaryFromReader(message: CompileResponse, reader: jspb.BinaryReader): CompileResponse; + static serializeBinaryToWriter(message: BuilderResult, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BuilderResult; + static deserializeBinaryFromReader(message: BuilderResult, reader: jspb.BinaryReader): BuilderResult; } -export namespace CompileResponse { +export namespace BuilderResult { export type AsObject = { - outStream: Uint8Array | string, - errStream: Uint8Array | string, buildPath: string, usedLibrariesList: Array<cc_arduino_cli_commands_v1_lib_pb.Library.AsObject>, executableSectionsSizeList: Array<ExecutableSectionSize.AsObject>, boardPlatform?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.AsObject, buildPlatform?: cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.AsObject, - progress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, buildPropertiesList: Array<string>, + diagnosticsList: Array<CompileDiagnostic.AsObject>, } } @@ -203,3 +248,103 @@ export namespace ExecutableSectionSize { maxSize: number, } } + +export class CompileDiagnostic extends jspb.Message { + getSeverity(): string; + setSeverity(value: string): CompileDiagnostic; + getMessage(): string; + setMessage(value: string): CompileDiagnostic; + getFile(): string; + setFile(value: string): CompileDiagnostic; + getLine(): number; + setLine(value: number): CompileDiagnostic; + getColumn(): number; + setColumn(value: number): CompileDiagnostic; + clearContextList(): void; + getContextList(): Array<CompileDiagnosticContext>; + setContextList(value: Array<CompileDiagnosticContext>): CompileDiagnostic; + addContext(value?: CompileDiagnosticContext, index?: number): CompileDiagnosticContext; + clearNotesList(): void; + getNotesList(): Array<CompileDiagnosticNote>; + setNotesList(value: Array<CompileDiagnosticNote>): CompileDiagnostic; + addNotes(value?: CompileDiagnosticNote, index?: number): CompileDiagnosticNote; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileDiagnostic.AsObject; + static toObject(includeInstance: boolean, msg: CompileDiagnostic): CompileDiagnostic.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileDiagnostic, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileDiagnostic; + static deserializeBinaryFromReader(message: CompileDiagnostic, reader: jspb.BinaryReader): CompileDiagnostic; +} + +export namespace CompileDiagnostic { + export type AsObject = { + severity: string, + message: string, + file: string, + line: number, + column: number, + contextList: Array<CompileDiagnosticContext.AsObject>, + notesList: Array<CompileDiagnosticNote.AsObject>, + } +} + +export class CompileDiagnosticContext extends jspb.Message { + getMessage(): string; + setMessage(value: string): CompileDiagnosticContext; + getFile(): string; + setFile(value: string): CompileDiagnosticContext; + getLine(): number; + setLine(value: number): CompileDiagnosticContext; + getColumn(): number; + setColumn(value: number): CompileDiagnosticContext; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileDiagnosticContext.AsObject; + static toObject(includeInstance: boolean, msg: CompileDiagnosticContext): CompileDiagnosticContext.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileDiagnosticContext, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileDiagnosticContext; + static deserializeBinaryFromReader(message: CompileDiagnosticContext, reader: jspb.BinaryReader): CompileDiagnosticContext; +} + +export namespace CompileDiagnosticContext { + export type AsObject = { + message: string, + file: string, + line: number, + column: number, + } +} + +export class CompileDiagnosticNote extends jspb.Message { + getMessage(): string; + setMessage(value: string): CompileDiagnosticNote; + getFile(): string; + setFile(value: string): CompileDiagnosticNote; + getLine(): number; + setLine(value: number): CompileDiagnosticNote; + getColumn(): number; + setColumn(value: number): CompileDiagnosticNote; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CompileDiagnosticNote.AsObject; + static toObject(includeInstance: boolean, msg: CompileDiagnosticNote): CompileDiagnosticNote.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CompileDiagnosticNote, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CompileDiagnosticNote; + static deserializeBinaryFromReader(message: CompileDiagnosticNote, reader: jspb.BinaryReader): CompileDiagnosticNote; +} + +export namespace CompileDiagnosticNote { + export type AsObject = { + message: string, + file: string, + line: number, + column: number, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js index 7dcaad1ee..affc77361 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 @@ -27,8 +27,13 @@ var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cl goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_lib_pb); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BuilderResult', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileDiagnostic', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ExecutableSectionSize', null, global); /** * Generated by JsPbCodeGenerator. @@ -62,7 +67,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.CompileResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.CompileResponse.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.CompileResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -72,6 +77,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.CompileResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CompileResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.BuilderResult = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.BuilderResult.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.BuilderResult, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.BuilderResult.displayName = 'proto.cc.arduino.cli.commands.v1.BuilderResult'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -93,6 +119,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.displayName = 'proto.cc.arduino.cli.commands.v1.ExecutableSectionSize'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.CompileDiagnostic.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CompileDiagnostic, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.displayName = 'proto.cc.arduino.cli.commands.v1.CompileDiagnostic'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.displayName = 'proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.displayName = 'proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote'; +} /** * List of repeated fields within this message type. @@ -1054,11 +1143,32 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setDoNotExpandBuildPro /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.cc.arduino.cli.commands.v1.CompileResponse.repeatedFields_ = [4,5,9]; +proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_ = [[1,2,3,4]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2, + PROGRESS: 3, + RESULT: 4 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0])); +}; @@ -1093,15 +1203,8 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.toObject = function(includeInst var f, obj = { outStream: msg.getOutStream_asB64(), errStream: msg.getErrStream_asB64(), - buildPath: jspb.Message.getFieldWithDefault(msg, 3, ""), - usedLibrariesList: jspb.Message.toObjectList(msg.getUsedLibrariesList(), - cc_arduino_cli_commands_v1_lib_pb.Library.toObject, includeInstance), - executableSectionsSizeList: jspb.Message.toObjectList(msg.getExecutableSectionsSizeList(), - proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject, includeInstance), - boardPlatform: (f = msg.getBoardPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), - buildPlatform: (f = msg.getBuildPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), - buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 9)) == null ? undefined : f + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.BuilderResult.toObject(includeInstance, f) }; if (includeInstance) { @@ -1147,37 +1250,14 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.deserializeBinaryFromReader = f msg.setErrStream(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setBuildPath(value); - break; - case 4: - var value = new cc_arduino_cli_commands_v1_lib_pb.Library; - reader.readMessage(value,cc_arduino_cli_commands_v1_lib_pb.Library.deserializeBinaryFromReader); - msg.addUsedLibraries(value); - break; - case 5: - var value = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader); - msg.addExecutableSectionsSize(value); - break; - case 6: - var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); - msg.setBoardPlatform(value); - break; - case 7: - var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); - msg.setBuildPlatform(value); - break; - case 8: var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setProgress(value); break; - case 9: - var value = /** @type {string} */ (reader.readString()); - msg.addBuildProperties(value); + case 4: + var value = new proto.cc.arduino.cli.commands.v1.BuilderResult; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BuilderResult.deserializeBinaryFromReader); + msg.setResult(value); break; default: reader.skipField(); @@ -1208,72 +1288,34 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.serializeBinary = fun */ proto.cc.arduino.cli.commands.v1.CompileResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f ); } - f = message.getBuildPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getUsedLibrariesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 4, - f, - cc_arduino_cli_commands_v1_lib_pb.Library.serializeBinaryToWriter - ); - } - f = message.getExecutableSectionsSizeList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 5, - f, - proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter - ); - } - f = message.getBoardPlatform(); - if (f != null) { - writer.writeMessage( - 6, - f, - cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter - ); - } - f = message.getBuildPlatform(); + f = message.getProgress(); if (f != null) { writer.writeMessage( - 7, + 3, f, - cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } - f = message.getProgress(); + f = message.getResult(); if (f != null) { writer.writeMessage( - 8, + 4, f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter - ); - } - f = message.getBuildPropertiesList(); - if (f.length > 0) { - writer.writeRepeatedString( - 9, - f + proto.cc.arduino.cli.commands.v1.BuilderResult.serializeBinaryToWriter ); } }; @@ -1317,7 +1359,25 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getOutStream_asU8 = f * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -1359,249 +1419,1319 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getErrStream_asU8 = f * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); }; /** - * optional string build_path = 3; - * @return {string} + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBuildPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], undefined); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBuildPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * repeated Library used_libraries = 4; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Library>} + * optional TaskProgress progress = 3; + * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getUsedLibrariesList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Library>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_lib_pb.Library, 4)); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 3)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Library>} value + * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setUsedLibrariesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 4, value); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.Library=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Library} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.addUsedLibraries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 4, opt_value, proto.cc.arduino.cli.commands.v1.Library, opt_index); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearProgress = function() { + return this.setProgress(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearUsedLibrariesList = function() { - return this.setUsedLibrariesList([]); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasProgress = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * repeated ExecutableSectionSize executable_sections_size = 5; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} + * optional BuilderResult result = 4; + * @return {?proto.cc.arduino.cli.commands.v1.BuilderResult} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getExecutableSectionsSizeList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, 5)); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.BuilderResult} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.BuilderResult, 4)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} value + * @param {?proto.cc.arduino.cli.commands.v1.BuilderResult|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setExecutableSectionsSizeList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 5, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} - */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.addExecutableSectionsSize = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 5, opt_value, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, opt_index); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 4, proto.cc.arduino.cli.commands.v1.CompileResponse.oneofGroups_[0], value); }; /** - * Clears the list making it empty but non-null. + * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearExecutableSectionsSizeList = function() { - return this.setExecutableSectionsSizeList([]); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearResult = function() { + return this.setResult(undefined); }; /** - * optional InstalledPlatformReference board_platform = 6; - * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBoardPlatform = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 6)); +proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 4) != null; }; -/** - * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBoardPlatform = function(value) { - return jspb.Message.setWrapperField(this, 6, value); -}; - /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearBoardPlatform = function() { - return this.setBoardPlatform(undefined); -}; +proto.cc.arduino.cli.commands.v1.BuilderResult.repeatedFields_ = [2,3,7,8]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Returns whether this field is set. - * @return {boolean} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasBoardPlatform = function() { - return jspb.Message.getField(this, 6) != null; +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BuilderResult.toObject(opt_includeInstance, this); }; /** - * optional InstalledPlatformReference build_platform = 7; - * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} - */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBuildPlatform = function() { + * 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.BuilderResult} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.toObject = function(includeInstance, msg) { + var f, obj = { + buildPath: jspb.Message.getFieldWithDefault(msg, 1, ""), + usedLibrariesList: jspb.Message.toObjectList(msg.getUsedLibrariesList(), + cc_arduino_cli_commands_v1_lib_pb.Library.toObject, includeInstance), + executableSectionsSizeList: jspb.Message.toObjectList(msg.getExecutableSectionsSizeList(), + proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject, includeInstance), + boardPlatform: (f = msg.getBoardPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), + buildPlatform: (f = msg.getBuildPlatform()) && cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.toObject(includeInstance, f), + buildPropertiesList: (f = jspb.Message.getRepeatedField(msg, 7)) == null ? undefined : f, + diagnosticsList: jspb.Message.toObjectList(msg.getDiagnosticsList(), + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.toObject, includeInstance) + }; + + if (includeInstance) { + 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.BuilderResult} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.BuilderResult; + return proto.cc.arduino.cli.commands.v1.BuilderResult.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.BuilderResult} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.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.setBuildPath(value); + break; + case 2: + var value = new cc_arduino_cli_commands_v1_lib_pb.Library; + reader.readMessage(value,cc_arduino_cli_commands_v1_lib_pb.Library.deserializeBinaryFromReader); + msg.addUsedLibraries(value); + break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader); + msg.addExecutableSectionsSize(value); + break; + case 4: + var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); + msg.setBoardPlatform(value); + break; + case 5: + var value = new cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.deserializeBinaryFromReader); + msg.setBuildPlatform(value); + break; + case 7: + var value = /** @type {string} */ (reader.readString()); + msg.addBuildProperties(value); + break; + case 8: + var value = new proto.cc.arduino.cli.commands.v1.CompileDiagnostic; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinaryFromReader); + msg.addDiagnostics(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.BuilderResult.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.BuilderResult} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBuildPath(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getUsedLibrariesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + cc_arduino_cli_commands_v1_lib_pb.Library.serializeBinaryToWriter + ); + } + f = message.getExecutableSectionsSizeList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter + ); + } + f = message.getBoardPlatform(); + if (f != null) { + writer.writeMessage( + 4, + f, + cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter + ); + } + f = message.getBuildPlatform(); + if (f != null) { + writer.writeMessage( + 5, + f, + cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference.serializeBinaryToWriter + ); + } + f = message.getBuildPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 7, + f + ); + } + f = message.getDiagnosticsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 8, + f, + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string build_path = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBuildPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBuildPath = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * repeated Library used_libraries = 2; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.Library>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getUsedLibrariesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Library>} */ ( + jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_lib_pb.Library, 2)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.Library>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setUsedLibrariesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.Library=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Library} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addUsedLibraries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.cc.arduino.cli.commands.v1.Library, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearUsedLibrariesList = function() { + return this.setUsedLibrariesList([]); +}; + + +/** + * repeated ExecutableSectionSize executable_sections_size = 3; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getExecutableSectionsSizeList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, 3)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setExecutableSectionsSizeList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addExecutableSectionsSize = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.cc.arduino.cli.commands.v1.ExecutableSectionSize, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearExecutableSectionsSizeList = function() { + return this.setExecutableSectionsSizeList([]); +}; + + +/** + * optional InstalledPlatformReference board_platform = 4; + * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBoardPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBoardPlatform = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearBoardPlatform = function() { + return this.setBoardPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.hasBoardPlatform = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional InstalledPlatformReference build_platform = 5; + * @return {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBuildPlatform = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 7)); + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.InstalledPlatformReference, 5)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBuildPlatform = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearBuildPlatform = function() { + return this.setBuildPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.hasBuildPlatform = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * repeated string build_properties = 7; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getBuildPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 7)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setBuildPropertiesList = function(value) { + return jspb.Message.setField(this, 7, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addBuildProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 7, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearBuildPropertiesList = function() { + return this.setBuildPropertiesList([]); +}; + + +/** + * repeated CompileDiagnostic diagnostics = 8; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnostic>} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.getDiagnosticsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnostic>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.CompileDiagnostic, 8)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnostic>} value + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this +*/ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.setDiagnosticsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 8, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.addDiagnostics = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 8, opt_value, proto.cc.arduino.cli.commands.v1.CompileDiagnostic, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BuilderResult} returns this + */ +proto.cc.arduino.cli.commands.v1.BuilderResult.prototype.clearDiagnosticsList = function() { + return this.setDiagnosticsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject = function(includeInstance, msg) { + var f, obj = { + name: jspb.Message.getFieldWithDefault(msg, 1, ""), + size: jspb.Message.getFieldWithDefault(msg, 2, 0), + maxSize: jspb.Message.getFieldWithDefault(msg, 3, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; + return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt64()); + msg.setSize(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setMaxSize(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getSize(); + if (f !== 0) { + writer.writeInt64( + 2, + f + ); + } + f = message.getMaxSize(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setName = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional int64 size = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setSize = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional int64 max_size = 3; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getMaxSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + */ +proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setMaxSize = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.repeatedFields_ = [6,7]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CompileDiagnostic.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.toObject = function(includeInstance, msg) { + var f, obj = { + severity: jspb.Message.getFieldWithDefault(msg, 1, ""), + message: jspb.Message.getFieldWithDefault(msg, 2, ""), + file: jspb.Message.getFieldWithDefault(msg, 3, ""), + line: jspb.Message.getFieldWithDefault(msg, 4, 0), + column: jspb.Message.getFieldWithDefault(msg, 5, 0), + contextList: jspb.Message.toObjectList(msg.getContextList(), + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.toObject, includeInstance), + notesList: jspb.Message.toObjectList(msg.getNotesList(), + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CompileDiagnostic; + return proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setSeverity(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt64()); + msg.setLine(value); + break; + case 5: + var value = /** @type {number} */ (reader.readInt64()); + msg.setColumn(value); + break; + case 6: + var value = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinaryFromReader); + msg.addContext(value); + break; + case 7: + var value = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinaryFromReader); + msg.addNotes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CompileDiagnostic.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSeverity(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getFile(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getLine(); + if (f !== 0) { + writer.writeInt64( + 4, + f + ); + } + f = message.getColumn(); + if (f !== 0) { + writer.writeInt64( + 5, + f + ); + } + f = message.getContextList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 6, + f, + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.serializeBinaryToWriter + ); + } + f = message.getNotesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 7, + f, + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.serializeBinaryToWriter + ); + } +}; + + +/** + * optional string severity = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getSeverity = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setSeverity = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string file = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setFile = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional int64 line = 4; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getLine = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setLine = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional int64 column = 5; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getColumn = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setColumn = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); +}; + + +/** + * repeated CompileDiagnosticContext context = 6; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext>} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getContextList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext, 6)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext>} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this +*/ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setContextList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 6, value); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.InstalledPlatformReference|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.addContext = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.clearContextList = function() { + return this.setContextList([]); +}; + + +/** + * repeated CompileDiagnosticNote notes = 7; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote>} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.getNotesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote, 7)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote>} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBuildPlatform = function(value) { - return jspb.Message.setWrapperField(this, 7, value); +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.setNotesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 7, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearBuildPlatform = function() { - return this.setBuildPlatform(undefined); +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.addNotes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 7, opt_value, proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnostic} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasBuildPlatform = function() { - return jspb.Message.getField(this, 7) != null; +proto.cc.arduino.cli.commands.v1.CompileDiagnostic.prototype.clearNotesList = function() { + return this.setNotesList([]); }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional TaskProgress progress = 8; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 8)); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.toObject(opt_includeInstance, this); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 8, value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.toObject = function(includeInstance, msg) { + var f, obj = { + message: jspb.Message.getFieldWithDefault(msg, 1, ""), + file: jspb.Message.getFieldWithDefault(msg, 2, ""), + line: jspb.Message.getFieldWithDefault(msg, 3, 0), + column: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext; + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 8) != null; +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setLine(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt64()); + msg.setColumn(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * repeated string build_properties = 9; - * @return {!Array<string>} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.getBuildPropertiesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 9)); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!Array<string>} value - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFile(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getLine(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } + f = message.getColumn(); + if (f !== 0) { + writer.writeInt64( + 4, + f + ); + } +}; + + +/** + * optional string message = 1; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.setBuildPropertiesList = function(value) { - return jspb.Message.setField(this, 9, value || []); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.addBuildProperties = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 9, value, opt_index); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.CompileResponse} returns this + * optional string file = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.clearBuildPropertiesList = function() { - return this.setBuildPropertiesList([]); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setFile = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional int64 line = 3; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getLine = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setLine = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional int64 column = 4; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.getColumn = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticContext.prototype.setColumn = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); }; @@ -1621,8 +2751,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.toObject(opt_includeInstance, this); }; @@ -1631,15 +2761,16 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.toObject = function(includeInstance, msg) { var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - size: jspb.Message.getFieldWithDefault(msg, 2, 0), - maxSize: jspb.Message.getFieldWithDefault(msg, 3, 0) + message: jspb.Message.getFieldWithDefault(msg, 1, ""), + file: jspb.Message.getFieldWithDefault(msg, 2, ""), + line: jspb.Message.getFieldWithDefault(msg, 3, 0), + column: jspb.Message.getFieldWithDefault(msg, 4, 0) }; if (includeInstance) { @@ -1653,23 +2784,23 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.ExecutableSectionSize; - return proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote; + return proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1678,15 +2809,19 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromRead switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setName(value); + msg.setMessage(value); break; case 2: - var value = /** @type {number} */ (reader.readInt64()); - msg.setSize(value); + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); break; case 3: var value = /** @type {number} */ (reader.readInt64()); - msg.setMaxSize(value); + msg.setLine(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt64()); + msg.setColumn(value); break; default: reader.skipField(); @@ -1701,9 +2836,9 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1711,88 +2846,113 @@ proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} message + * @param {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getName(); + f = message.getMessage(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getSize(); - if (f !== 0) { - writer.writeInt64( + f = message.getFile(); + if (f.length > 0) { + writer.writeString( 2, f ); } - f = message.getMaxSize(); + f = message.getLine(); if (f !== 0) { writer.writeInt64( 3, f ); } + f = message.getColumn(); + if (f !== 0) { + writer.writeInt64( + 4, + f + ); + } }; /** - * optional string name = 1; + * optional string message = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getName = function() { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getMessage = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setName = function(value) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setMessage = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional int64 size = 2; - * @return {number} + * optional string file = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getSize = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setSize = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setFile = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional int64 max_size = 3; + * optional int64 line = 3; * @return {number} */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.getMaxSize = function() { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getLine = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.cc.arduino.cli.commands.v1.ExecutableSectionSize} returns this + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this */ -proto.cc.arduino.cli.commands.v1.ExecutableSectionSize.prototype.setMaxSize = function(value) { +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setLine = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; +/** + * optional int64 column = 4; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.getColumn = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileDiagnosticNote.prototype.setColumn = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts index 99b25cb15..89b28e6ee 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 @@ -299,8 +299,8 @@ export class PlatformSearchRequest extends jspb.Message { setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformSearchRequest; getSearchArgs(): string; setSearchArgs(value: string): PlatformSearchRequest; - getAllVersions(): boolean; - setAllVersions(value: boolean): PlatformSearchRequest; + getManuallyInstalled(): boolean; + setManuallyInstalled(value: boolean): PlatformSearchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchRequest.AsObject; @@ -316,15 +316,15 @@ export namespace PlatformSearchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, searchArgs: string, - allVersions: boolean, + manuallyInstalled: boolean, } } export class PlatformSearchResponse extends jspb.Message { clearSearchOutputList(): void; - getSearchOutputList(): Array<cc_arduino_cli_commands_v1_common_pb.Platform>; - setSearchOutputList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): PlatformSearchResponse; - addSearchOutput(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; + getSearchOutputList(): Array<cc_arduino_cli_commands_v1_common_pb.PlatformSummary>; + setSearchOutputList(value: Array<cc_arduino_cli_commands_v1_common_pb.PlatformSummary>): PlatformSearchResponse; + addSearchOutput(value?: cc_arduino_cli_commands_v1_common_pb.PlatformSummary, index?: number): cc_arduino_cli_commands_v1_common_pb.PlatformSummary; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchResponse.AsObject; @@ -338,57 +338,6 @@ export class PlatformSearchResponse extends jspb.Message { export namespace PlatformSearchResponse { export type AsObject = { - searchOutputList: Array<cc_arduino_cli_commands_v1_common_pb.Platform.AsObject>, - } -} - -export class PlatformListRequest extends jspb.Message { - - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): PlatformListRequest; - getUpdatableOnly(): boolean; - setUpdatableOnly(value: boolean): PlatformListRequest; - getAll(): boolean; - setAll(value: boolean): PlatformListRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PlatformListRequest.AsObject; - static toObject(includeInstance: boolean, msg: PlatformListRequest): PlatformListRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: PlatformListRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PlatformListRequest; - static deserializeBinaryFromReader(message: PlatformListRequest, reader: jspb.BinaryReader): PlatformListRequest; -} - -export namespace PlatformListRequest { - export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - updatableOnly: boolean, - all: boolean, - } -} - -export class PlatformListResponse extends jspb.Message { - clearInstalledPlatformsList(): void; - getInstalledPlatformsList(): Array<cc_arduino_cli_commands_v1_common_pb.Platform>; - setInstalledPlatformsList(value: Array<cc_arduino_cli_commands_v1_common_pb.Platform>): PlatformListResponse; - addInstalledPlatforms(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PlatformListResponse.AsObject; - static toObject(includeInstance: boolean, msg: PlatformListResponse): PlatformListResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: PlatformListResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PlatformListResponse; - static deserializeBinaryFromReader(message: PlatformListResponse, reader: jspb.BinaryReader): PlatformListResponse; -} - -export namespace PlatformListResponse { - export type AsObject = { - installedPlatformsList: Array<cc_arduino_cli_commands_v1_common_pb.Platform.AsObject>, + searchOutputList: Array<cc_arduino_cli_commands_v1_common_pb.PlatformSummary.AsObject>, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js index 9e49ed462..00fe8d64a 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 @@ -28,8 +28,6 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest', nu goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformListRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformListResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformLoadingError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchResponse', null, global); @@ -289,48 +287,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformSearchResponse'; } -/** - * 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.PlatformListRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformListRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.PlatformListRequest.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformListRequest'; -} -/** - * 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.PlatformListResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.PlatformListResponse.repeatedFields_, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformListResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.PlatformListResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformListResponse'; -} @@ -2408,7 +2364,7 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.toObject = function(inclu var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), searchArgs: jspb.Message.getFieldWithDefault(msg, 2, ""), - allVersions: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -2456,7 +2412,7 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.deserializeBinaryFromRead break; case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setAllVersions(value); + msg.setManuallyInstalled(value); break; default: reader.skipField(); @@ -2502,7 +2458,7 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.serializeBinaryToWriter = f ); } - f = message.getAllVersions(); + f = message.getManuallyInstalled(); if (f) { writer.writeBool( 3, @@ -2568,10 +2524,10 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setSearchArgs = /** - * optional bool all_versions = 3; + * optional bool manually_installed = 3; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getAllVersions = function() { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getManuallyInstalled = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; @@ -2580,7 +2536,7 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.getAllVersions * @param {boolean} value * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setAllVersions = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformSearchRequest.prototype.setManuallyInstalled = function(value) { return jspb.Message.setProto3BooleanField(this, 3, value); }; @@ -2625,7 +2581,7 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.toObject = fun proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.toObject = function(includeInstance, msg) { var f, obj = { searchOutputList: jspb.Message.toObjectList(msg.getSearchOutputList(), - cc_arduino_cli_commands_v1_common_pb.Platform.toObject, includeInstance) + cc_arduino_cli_commands_v1_common_pb.PlatformSummary.toObject, includeInstance) }; if (includeInstance) { @@ -2663,8 +2619,8 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); + var value = new cc_arduino_cli_commands_v1_common_pb.PlatformSummary; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.PlatformSummary.deserializeBinaryFromReader); msg.addSearchOutput(value); break; default: @@ -2701,24 +2657,24 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.serializeBinaryToWriter writer.writeRepeatedMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.PlatformSummary.serializeBinaryToWriter ); } }; /** - * repeated Platform search_output = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} + * repeated PlatformSummary search_output = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.PlatformSummary>} */ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.getSearchOutputList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Platform>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 1)); + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.PlatformSummary>} */ ( + jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.PlatformSummary, 1)); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} value + * @param {!Array<!proto.cc.arduino.cli.commands.v1.PlatformSummary>} value * @return {!proto.cc.arduino.cli.commands.v1.PlatformSearchResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.setSearchOutputList = function(value) { @@ -2727,12 +2683,12 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.setSearchOutpu /** - * @param {!proto.cc.arduino.cli.commands.v1.Platform=} opt_value + * @param {!proto.cc.arduino.cli.commands.v1.PlatformSummary=} opt_value * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} + * @return {!proto.cc.arduino.cli.commands.v1.PlatformSummary} */ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.addSearchOutput = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.Platform, opt_index); + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.PlatformSummary, opt_index); }; @@ -2745,375 +2701,4 @@ proto.cc.arduino.cli.commands.v1.PlatformSearchResponse.prototype.clearSearchOut }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformListRequest.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.PlatformListRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.toObject = function(includeInstance, msg) { - var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - updatableOnly: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), - all: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) - }; - - 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.PlatformListRequest} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformListRequest; - return proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setUpdatableOnly(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAll(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.PlatformListRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.PlatformListRequest.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.PlatformListRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } - f = message.getUpdatableOnly(); - if (f) { - writer.writeBool( - 2, - f - ); - } - f = message.getAll(); - if (f) { - writer.writeBool( - 3, - f - ); - } -}; - - -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.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.PlatformListRequest} returns this -*/ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional bool updatable_only = 2; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.getUpdatableOnly = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setUpdatableOnly = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional bool all = 3; - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.getAll = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformListRequest.prototype.setAll = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.PlatformListResponse.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.PlatformListResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.toObject = function(includeInstance, msg) { - var f, obj = { - installedPlatformsList: jspb.Message.toObjectList(msg.getInstalledPlatformsList(), - cc_arduino_cli_commands_v1_common_pb.Platform.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.PlatformListResponse; - return proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Platform; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); - msg.addInstalledPlatforms(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.PlatformListResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.PlatformListResponse.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.PlatformListResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getInstalledPlatformsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter - ); - } -}; - - -/** - * repeated Platform installed_platforms = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.getInstalledPlatformsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.Platform>} */ ( - jspb.Message.getRepeatedWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 1)); -}; - - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.Platform>} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.setInstalledPlatformsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.Platform=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.Platform} - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.addInstalledPlatforms = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.Platform, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.PlatformListResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.PlatformListResponse.prototype.clearInstalledPlatformsList = function() { - return this.setInstalledPlatformsList([]); -}; - - goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts index e0b50ba58..ae018a7a3 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 @@ -298,6 +298,8 @@ export class LibraryResolveDependenciesRequest extends jspb.Message { setName(value: string): LibraryResolveDependenciesRequest; getVersion(): string; setVersion(value: string): LibraryResolveDependenciesRequest; + getDoNotUpdateInstalledLibraries(): boolean; + setDoNotUpdateInstalledLibraries(value: boolean): LibraryResolveDependenciesRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryResolveDependenciesRequest.AsObject; @@ -314,6 +316,7 @@ export namespace LibraryResolveDependenciesRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, name: string, version: string, + doNotUpdateInstalledLibraries: boolean, } } @@ -371,8 +374,6 @@ 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; @@ -391,7 +392,6 @@ export class LibrarySearchRequest extends jspb.Message { export namespace LibrarySearchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, - query: string, omitReleasesDetails: boolean, searchArgs: string, } 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 7ec2e0bbf..53d6a21b0 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 @@ -2648,7 +2648,8 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.toObject = fu var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), name: jspb.Message.getFieldWithDefault(msg, 2, ""), - version: jspb.Message.getFieldWithDefault(msg, 3, "") + version: jspb.Message.getFieldWithDefault(msg, 3, ""), + doNotUpdateInstalledLibraries: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -2698,6 +2699,10 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.deserializeBi var value = /** @type {string} */ (reader.readString()); msg.setVersion(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDoNotUpdateInstalledLibraries(value); + break; default: reader.skipField(); break; @@ -2749,6 +2754,13 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.serializeBina f ); } + f = message.getDoNotUpdateInstalledLibraries(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -2825,6 +2837,24 @@ proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.prototype.set }; +/** + * optional bool do_not_update_installed_libraries = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.prototype.getDoNotUpdateInstalledLibraries = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryResolveDependenciesRequest.prototype.setDoNotUpdateInstalledLibraries = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + /** * List of repeated fields within this message type. @@ -3208,9 +3238,8 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.toObject = funct proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - query: jspb.Message.getFieldWithDefault(msg, 2, ""), - omitReleasesDetails: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - searchArgs: jspb.Message.getFieldWithDefault(msg, 4, "") + omitReleasesDetails: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), + searchArgs: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -3253,14 +3282,10 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.deserializeBinaryFromReade msg.setInstance(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setQuery(value); - break; - case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setOmitReleasesDetails(value); break; - case 4: + case 3: var value = /** @type {string} */ (reader.readString()); msg.setSearchArgs(value); break; @@ -3301,24 +3326,17 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.serializeBinaryToWriter = cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } - f = message.getQuery(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } f = message.getOmitReleasesDetails(); if (f) { writer.writeBool( - 3, + 2, f ); } f = message.getSearchArgs(); if (f.length > 0) { writer.writeString( - 4, + 3, f ); } @@ -3363,29 +3381,11 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.hasInstance = fu /** - * optional string query = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getQuery = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LibrarySearchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setQuery = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional bool omit_releases_details = 3; + * optional bool omit_releases_details = 2; * @return {boolean} */ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getOmitReleasesDetails = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; @@ -3394,16 +3394,16 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getOmitReleasesD * @return {!proto.cc.arduino.cli.commands.v1.LibrarySearchRequest} returns this */ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setOmitReleasesDetails = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional string search_args = 4; + * optional string search_args = 3; * @return {string} */ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getSearchArgs = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; @@ -3412,7 +3412,7 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getSearchArgs = * @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); + return jspb.Message.setProto3StringField(this, 3, value); }; 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 49140fcb5..2e298b4c8 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts @@ -10,26 +10,29 @@ import * as cc_arduino_cli_commands_v1_port_pb from "../../../../../cc/arduino/c export class MonitorRequest extends jspb.Message { - hasInstance(): boolean; - clearInstance(): void; - getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; - setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): MonitorRequest; + hasOpenRequest(): boolean; + clearOpenRequest(): void; + getOpenRequest(): MonitorPortOpenRequest | undefined; + setOpenRequest(value?: MonitorPortOpenRequest): 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; + hasTxData(): boolean; + clearTxData(): void; 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; + hasUpdatedConfiguration(): boolean; + clearUpdatedConfiguration(): void; + getUpdatedConfiguration(): MonitorPortConfiguration | undefined; + setUpdatedConfiguration(value?: MonitorPortConfiguration): MonitorRequest; + + hasClose(): boolean; + clearClose(): void; + getClose(): boolean; + setClose(value: boolean): MonitorRequest; + + getMessageCase(): MonitorRequest.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorRequest.AsObject; @@ -42,11 +45,57 @@ export class MonitorRequest extends jspb.Message { } export namespace MonitorRequest { + export type AsObject = { + openRequest?: MonitorPortOpenRequest.AsObject, + txData: Uint8Array | string, + updatedConfiguration?: MonitorPortConfiguration.AsObject, + close: boolean, + } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OPEN_REQUEST = 1, + TX_DATA = 2, + UPDATED_CONFIGURATION = 3, + CLOSE = 4, + } + +} + +export class MonitorPortOpenRequest extends jspb.Message { + + hasInstance(): boolean; + clearInstance(): void; + getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; + setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): MonitorPortOpenRequest; + + hasPort(): boolean; + clearPort(): void; + getPort(): cc_arduino_cli_commands_v1_port_pb.Port | undefined; + setPort(value?: cc_arduino_cli_commands_v1_port_pb.Port): MonitorPortOpenRequest; + getFqbn(): string; + setFqbn(value: string): MonitorPortOpenRequest; + + hasPortConfiguration(): boolean; + clearPortConfiguration(): void; + getPortConfiguration(): MonitorPortConfiguration | undefined; + setPortConfiguration(value?: MonitorPortConfiguration): MonitorPortOpenRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MonitorPortOpenRequest.AsObject; + static toObject(includeInstance: boolean, msg: MonitorPortOpenRequest): MonitorPortOpenRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MonitorPortOpenRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MonitorPortOpenRequest; + static deserializeBinaryFromReader(message: MonitorPortOpenRequest, reader: jspb.BinaryReader): MonitorPortOpenRequest; +} + +export namespace MonitorPortOpenRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, fqbn: string, - txData: Uint8Array | string, portConfiguration?: MonitorPortConfiguration.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 db4445ce3..24f22a3fb 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 @@ -28,9 +28,11 @@ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.EnumerateMonitorPortSettingsRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.EnumerateMonitorPortSettingsResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSetting', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse', null, global); /** * Generated by JsPbCodeGenerator. @@ -43,7 +45,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse', null, glob * @constructor */ proto.cc.arduino.cli.commands.v1.MonitorRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -53,6 +55,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.MonitorRequest.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorRequest'; } +/** + * 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.MonitorPortOpenRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -180,6 +203,34 @@ if (goog.DEBUG && !COMPILED) { proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor'; } +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_ = [[1,2,3,4]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase = { + MESSAGE_NOT_SET: 0, + OPEN_REQUEST: 1, + TX_DATA: 2, + UPDATED_CONFIGURATION: 3, + CLOSE: 4 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -211,11 +262,10 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.toObject = function(op */ proto.cc.arduino.cli.commands.v1.MonitorRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), - fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), + openRequest: (f = msg.getOpenRequest()) && proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject(includeInstance, f), txData: msg.getTxData_asB64(), - portConfiguration: (f = msg.getPortConfiguration()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f) + updatedConfiguration: (f = msg.getUpdatedConfiguration()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f), + close: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -246,6 +296,328 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.deserializeBinary = function(byt * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} */ proto.cc.arduino.cli.commands.v1.MonitorRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinaryFromReader); + msg.setOpenRequest(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTxData(value); + break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setUpdatedConfiguration(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setClose(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.MonitorRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.MonitorRequest.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.MonitorRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getOpenRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( + 2, + f + ); + } + f = message.getUpdatedConfiguration(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + ); + } + f = /** @type {boolean} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeBool( + 4, + f + ); + } +}; + + +/** + * optional MonitorPortOpenRequest open_request = 1; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getOpenRequest = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setOpenRequest = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearOpenRequest = function() { + return this.setOpenRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasOpenRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional bytes tx_data = 2; + * @return {!(string|Uint8Array)} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes tx_data = 2; + * This is a type-conversion wrapper around `getTxData()` + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTxData())); +}; + + +/** + * optional bytes tx_data = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTxData()` + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTxData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setTxData = function(value) { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearTxData = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasTxData = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional MonitorPortConfiguration updated_configuration = 3; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getUpdatedConfiguration = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setUpdatedConfiguration = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearUpdatedConfiguration = function() { + return this.setUpdatedConfiguration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasUpdatedConfiguration = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bool close = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getClose = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setClose = function(value) { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearClose = function() { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorRequest.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasClose = function() { + return jspb.Message.getField(this, 4) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.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.MonitorPortOpenRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), + fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), + portConfiguration: (f = msg.getPortConfiguration()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.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.MonitorPortOpenRequest} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest; + return proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -267,10 +639,6 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.deserializeBinaryFromReader = fu msg.setFqbn(value); break; case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setTxData(value); - break; - case 5: var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); msg.setPortConfiguration(value); @@ -288,9 +656,9 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -298,11 +666,11 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.serializeBinary = func /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getInstance(); if (f != null) { @@ -327,17 +695,10 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter = functi f ); } - f = message.getTxData_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } f = message.getPortConfiguration(); if (f != null) { writer.writeMessage( - 5, + 4, f, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter ); @@ -349,7 +710,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter = functi * optional Instance instance = 1; * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getInstance = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getInstance = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); }; @@ -357,18 +718,18 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getInstance = function /** * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setInstance = function(value) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.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.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearInstance = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.clearInstance = function() { return this.setInstance(undefined); }; @@ -377,7 +738,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearInstance = functi * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasInstance = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; @@ -386,7 +747,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasInstance = function * optional Port port = 2; * @return {?proto.cc.arduino.cli.commands.v1.Port} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getPort = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getPort = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.Port} */ ( jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_port_pb.Port, 2)); }; @@ -394,18 +755,18 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getPort = function() { /** * @param {?proto.cc.arduino.cli.commands.v1.Port|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setPort = function(value) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setPort = function(value) { return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPort = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.clearPort = function() { return this.setPort(undefined); }; @@ -414,7 +775,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPort = function() * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasPort = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasPort = function() { return jspb.Message.getField(this, 2) != null; }; @@ -423,86 +784,44 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasPort = function() { * optional string fqbn = 3; * @return {string} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getFqbn = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getFqbn = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setFqbn = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; /** - * optional bytes tx_data = 4; - * @return {!(string|Uint8Array)} - */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData = function() { - return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * optional bytes tx_data = 4; - * This is a type-conversion wrapper around `getTxData()` - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getTxData())); -}; - - -/** - * optional bytes tx_data = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getTxData()` - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getTxData_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getTxData())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setTxData = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); -}; - - -/** - * optional MonitorPortConfiguration port_configuration = 5; + * optional MonitorPortConfiguration port_configuration = 4; * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getPortConfiguration = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getPortConfiguration = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 5)); + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 4)); }; /** * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.setPortConfiguration = function(value) { - return jspb.Message.setWrapperField(this, 5, value); +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setPortConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPortConfiguration = function() { +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.clearPortConfiguration = function() { return this.setPortConfiguration(undefined); }; @@ -511,8 +830,8 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.clearPortConfiguration * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasPortConfiguration = function() { - return jspb.Message.getField(this, 5) != null; +proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasPortConfiguration = function() { + return jspb.Message.getField(this, 4) != null; }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js new file mode 100644 index 000000000..97b3a2461 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts new file mode 100644 index 000000000..b960375a5 --- /dev/null +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts @@ -0,0 +1,238 @@ +// package: cc.arduino.cli.commands.v1 +// file: cc/arduino/cli/commands/v1/settings.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; + +export class SettingsGetAllResponse extends jspb.Message { + getJsonData(): string; + setJsonData(value: string): SettingsGetAllResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsGetAllResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetAllResponse): SettingsGetAllResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsGetAllResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetAllResponse; + static deserializeBinaryFromReader(message: SettingsGetAllResponse, reader: jspb.BinaryReader): SettingsGetAllResponse; +} + +export namespace SettingsGetAllResponse { + export type AsObject = { + jsonData: string, + } +} + +export class SettingsMergeRequest extends jspb.Message { + getJsonData(): string; + setJsonData(value: string): SettingsMergeRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsMergeRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsMergeRequest): SettingsMergeRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsMergeRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsMergeRequest; + static deserializeBinaryFromReader(message: SettingsMergeRequest, reader: jspb.BinaryReader): SettingsMergeRequest; +} + +export namespace SettingsMergeRequest { + export type AsObject = { + jsonData: string, + } +} + +export class SettingsGetValueResponse extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsGetValueResponse; + getJsonData(): string; + setJsonData(value: string): SettingsGetValueResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsGetValueResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetValueResponse): SettingsGetValueResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsGetValueResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetValueResponse; + static deserializeBinaryFromReader(message: SettingsGetValueResponse, reader: jspb.BinaryReader): SettingsGetValueResponse; +} + +export namespace SettingsGetValueResponse { + export type AsObject = { + key: string, + jsonData: string, + } +} + +export class SettingsSetValueRequest extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsSetValueRequest; + getJsonData(): string; + setJsonData(value: string): SettingsSetValueRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsSetValueRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsSetValueRequest): SettingsSetValueRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsSetValueRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsSetValueRequest; + static deserializeBinaryFromReader(message: SettingsSetValueRequest, reader: jspb.BinaryReader): SettingsSetValueRequest; +} + +export namespace SettingsSetValueRequest { + export type AsObject = { + key: string, + jsonData: string, + } +} + +export class SettingsGetAllRequest extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsGetAllRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetAllRequest): SettingsGetAllRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsGetAllRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetAllRequest; + static deserializeBinaryFromReader(message: SettingsGetAllRequest, reader: jspb.BinaryReader): SettingsGetAllRequest; +} + +export namespace SettingsGetAllRequest { + export type AsObject = { + } +} + +export class SettingsGetValueRequest extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsGetValueRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsGetValueRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetValueRequest): SettingsGetValueRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsGetValueRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetValueRequest; + static deserializeBinaryFromReader(message: SettingsGetValueRequest, reader: jspb.BinaryReader): SettingsGetValueRequest; +} + +export namespace SettingsGetValueRequest { + export type AsObject = { + key: string, + } +} + +export class SettingsMergeResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsMergeResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsMergeResponse): SettingsMergeResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsMergeResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsMergeResponse; + static deserializeBinaryFromReader(message: SettingsMergeResponse, reader: jspb.BinaryReader): SettingsMergeResponse; +} + +export namespace SettingsMergeResponse { + export type AsObject = { + } +} + +export class SettingsSetValueResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsSetValueResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsSetValueResponse): SettingsSetValueResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsSetValueResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsSetValueResponse; + static deserializeBinaryFromReader(message: SettingsSetValueResponse, reader: jspb.BinaryReader): SettingsSetValueResponse; +} + +export namespace SettingsSetValueResponse { + export type AsObject = { + } +} + +export class SettingsWriteRequest extends jspb.Message { + getFilePath(): string; + setFilePath(value: string): SettingsWriteRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsWriteRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsWriteRequest): SettingsWriteRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsWriteRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsWriteRequest; + static deserializeBinaryFromReader(message: SettingsWriteRequest, reader: jspb.BinaryReader): SettingsWriteRequest; +} + +export namespace SettingsWriteRequest { + export type AsObject = { + filePath: string, + } +} + +export class SettingsWriteResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsWriteResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsWriteResponse): SettingsWriteResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsWriteResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsWriteResponse; + static deserializeBinaryFromReader(message: SettingsWriteResponse, reader: jspb.BinaryReader): SettingsWriteResponse; +} + +export namespace SettingsWriteResponse { + export type AsObject = { + } +} + +export class SettingsDeleteRequest extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsDeleteRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsDeleteRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsDeleteRequest): SettingsDeleteRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsDeleteRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsDeleteRequest; + static deserializeBinaryFromReader(message: SettingsDeleteRequest, reader: jspb.BinaryReader): SettingsDeleteRequest; +} + +export namespace SettingsDeleteRequest { + export type AsObject = { + key: string, + } +} + +export class SettingsDeleteResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SettingsDeleteResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsDeleteResponse): SettingsDeleteResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SettingsDeleteResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsDeleteResponse; + static deserializeBinaryFromReader(message: SettingsDeleteResponse, reader: jspb.BinaryReader): SettingsDeleteResponse; +} + +export namespace SettingsDeleteResponse { + 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/commands/v1/settings_pb.js similarity index 59% rename from arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.js rename to arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js index a00c4ffe8..cabb89ab0 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/commands/v1/settings_pb.js @@ -1,4 +1,4 @@ -// source: cc/arduino/cli/settings/v1/settings.proto +// source: cc/arduino/cli/commands/v1/settings.proto /** * @fileoverview * @enhanceable @@ -21,18 +21,18 @@ var global = (function() { 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); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.GetValueResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.MergeRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.MergeResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.SetValueRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.SetValueResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.WriteRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.settings.v1.WriteResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsMergeRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsMergeResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsWriteRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsWriteResponse', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -43,16 +43,16 @@ goog.exportSymbol('proto.cc.arduino.cli.settings.v1.WriteResponse', null, global * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.GetAllResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetAllResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.GetAllResponse.displayName = 'proto.cc.arduino.cli.settings.v1.GetAllResponse'; + proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse'; } /** * Generated by JsPbCodeGenerator. @@ -64,16 +64,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.MergeRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.MergeRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsMergeRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.MergeRequest.displayName = 'proto.cc.arduino.cli.settings.v1.MergeRequest'; + proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsMergeRequest'; } /** * Generated by JsPbCodeGenerator. @@ -85,16 +85,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.GetValueResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetValueResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.GetValueResponse.displayName = 'proto.cc.arduino.cli.settings.v1.GetValueResponse'; + proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse'; } /** * Generated by JsPbCodeGenerator. @@ -106,16 +106,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.SetValueRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.SetValueRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.SetValueRequest.displayName = 'proto.cc.arduino.cli.settings.v1.SetValueRequest'; + proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest'; } /** * Generated by JsPbCodeGenerator. @@ -127,16 +127,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.GetAllRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetAllRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.GetAllRequest.displayName = 'proto.cc.arduino.cli.settings.v1.GetAllRequest'; + proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest'; } /** * Generated by JsPbCodeGenerator. @@ -148,16 +148,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.GetValueRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.GetValueRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.GetValueRequest.displayName = 'proto.cc.arduino.cli.settings.v1.GetValueRequest'; + proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest'; } /** * Generated by JsPbCodeGenerator. @@ -169,16 +169,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.MergeResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.MergeResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsMergeResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.MergeResponse.displayName = 'proto.cc.arduino.cli.settings.v1.MergeResponse'; + proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsMergeResponse'; } /** * Generated by JsPbCodeGenerator. @@ -190,16 +190,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.SetValueResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.SetValueResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.SetValueResponse.displayName = 'proto.cc.arduino.cli.settings.v1.SetValueResponse'; + proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse'; } /** * Generated by JsPbCodeGenerator. @@ -211,16 +211,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.WriteRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.WriteRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsWriteRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.WriteRequest.displayName = 'proto.cc.arduino.cli.settings.v1.WriteRequest'; + proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsWriteRequest'; } /** * Generated by JsPbCodeGenerator. @@ -232,16 +232,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.WriteResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.WriteResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsWriteResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.WriteResponse.displayName = 'proto.cc.arduino.cli.settings.v1.WriteResponse'; + proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsWriteResponse'; } /** * Generated by JsPbCodeGenerator. @@ -253,16 +253,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.DeleteRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.DeleteRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.DeleteRequest.displayName = 'proto.cc.arduino.cli.settings.v1.DeleteRequest'; + proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest'; } /** * Generated by JsPbCodeGenerator. @@ -274,16 +274,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.settings.v1.DeleteResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.settings.v1.DeleteResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.settings.v1.DeleteResponse.displayName = 'proto.cc.arduino.cli.settings.v1.DeleteResponse'; + proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse'; } @@ -301,8 +301,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetAllResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.toObject(opt_includeInstance, this); }; @@ -311,11 +311,11 @@ proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.toObject = function(op * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.GetAllResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.toObject = function(includeInstance, msg) { var f, obj = { jsonData: jspb.Message.getFieldWithDefault(msg, 1, "") }; @@ -331,23 +331,23 @@ proto.cc.arduino.cli.settings.v1.GetAllResponse.toObject = function(includeInsta /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.GetAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetAllResponse; - return proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse; + return proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetAllResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -371,9 +371,9 @@ proto.cc.arduino.cli.settings.v1.GetAllResponse.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetAllResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -381,11 +381,11 @@ proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.serializeBinary = func /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.GetAllResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getJsonData(); if (f.length > 0) { @@ -401,16 +401,16 @@ proto.cc.arduino.cli.settings.v1.GetAllResponse.serializeBinaryToWriter = functi * optional string json_data = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.getJsonData = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetAllResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} returns this */ -proto.cc.arduino.cli.settings.v1.GetAllResponse.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.setJsonData = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -431,8 +431,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.MergeRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.toObject(opt_includeInstance, this); }; @@ -441,11 +441,11 @@ proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.toObject = function(opt_ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.MergeRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.MergeRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.toObject = function(includeInstance, msg) { var f, obj = { jsonData: jspb.Message.getFieldWithDefault(msg, 1, "") }; @@ -461,23 +461,23 @@ proto.cc.arduino.cli.settings.v1.MergeRequest.toObject = function(includeInstanc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.MergeRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} */ -proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.MergeRequest; - return proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsMergeRequest; + return proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.MergeRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.MergeRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} */ -proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -501,9 +501,9 @@ proto.cc.arduino.cli.settings.v1.MergeRequest.deserializeBinaryFromReader = func * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.MergeRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -511,11 +511,11 @@ proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.serializeBinary = functi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.MergeRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.MergeRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getJsonData(); if (f.length > 0) { @@ -531,16 +531,16 @@ proto.cc.arduino.cli.settings.v1.MergeRequest.serializeBinaryToWriter = function * optional string json_data = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.getJsonData = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.MergeRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} returns this */ -proto.cc.arduino.cli.settings.v1.MergeRequest.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.setJsonData = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -561,8 +561,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetValueResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject(opt_includeInstance, this); }; @@ -571,11 +571,11 @@ proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.GetValueResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject = function(includeInstance, msg) { var f, obj = { key: jspb.Message.getFieldWithDefault(msg, 1, ""), jsonData: jspb.Message.getFieldWithDefault(msg, 2, "") @@ -592,23 +592,23 @@ proto.cc.arduino.cli.settings.v1.GetValueResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetValueResponse; - return proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse; + return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetValueResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -636,9 +636,9 @@ proto.cc.arduino.cli.settings.v1.GetValueResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetValueResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -646,11 +646,11 @@ proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.GetValueResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getKey(); if (f.length > 0) { @@ -673,16 +673,16 @@ proto.cc.arduino.cli.settings.v1.GetValueResponse.serializeBinaryToWriter = func * optional string key = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.getKey = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} returns this */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.setKey = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -691,16 +691,16 @@ proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.setKey = function(va * optional string json_data = 2; * @return {string} */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.getJsonData = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetValueResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} returns this */ -proto.cc.arduino.cli.settings.v1.GetValueResponse.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.setJsonData = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; @@ -721,8 +721,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.SetValueRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject(opt_includeInstance, this); }; @@ -731,11 +731,11 @@ proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.SetValueRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject = function(includeInstance, msg) { var f, obj = { key: jspb.Message.getFieldWithDefault(msg, 1, ""), jsonData: jspb.Message.getFieldWithDefault(msg, 2, "") @@ -752,23 +752,23 @@ proto.cc.arduino.cli.settings.v1.SetValueRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.SetValueRequest; - return proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest; + return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.SetValueRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -796,9 +796,9 @@ proto.cc.arduino.cli.settings.v1.SetValueRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.SetValueRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -806,11 +806,11 @@ proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.SetValueRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getKey(); if (f.length > 0) { @@ -833,16 +833,16 @@ proto.cc.arduino.cli.settings.v1.SetValueRequest.serializeBinaryToWriter = funct * optional string key = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getKey = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setKey = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -851,16 +851,16 @@ proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.setKey = function(val * optional string json_data = 2; * @return {string} */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getJsonData = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.SetValueRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this */ -proto.cc.arduino.cli.settings.v1.SetValueRequest.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setJsonData = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; @@ -881,8 +881,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetAllRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.toObject(opt_includeInstance, this); }; @@ -891,11 +891,11 @@ proto.cc.arduino.cli.settings.v1.GetAllRequest.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.GetAllRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -911,23 +911,23 @@ proto.cc.arduino.cli.settings.v1.GetAllRequest.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.GetAllRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetAllRequest; - return proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest; + return proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetAllRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetAllRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -947,9 +947,9 @@ proto.cc.arduino.cli.settings.v1.GetAllRequest.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetAllRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -957,11 +957,11 @@ proto.cc.arduino.cli.settings.v1.GetAllRequest.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.GetAllRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetAllRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; @@ -982,8 +982,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.GetValueRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject(opt_includeInstance, this); }; @@ -992,11 +992,11 @@ proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.GetValueRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject = function(includeInstance, msg) { var f, obj = { key: jspb.Message.getFieldWithDefault(msg, 1, "") }; @@ -1012,23 +1012,23 @@ proto.cc.arduino.cli.settings.v1.GetValueRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.GetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.GetValueRequest; - return proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest; + return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.GetValueRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.GetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1052,9 +1052,9 @@ proto.cc.arduino.cli.settings.v1.GetValueRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.GetValueRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1062,11 +1062,11 @@ proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.GetValueRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getKey(); if (f.length > 0) { @@ -1082,16 +1082,16 @@ proto.cc.arduino.cli.settings.v1.GetValueRequest.serializeBinaryToWriter = funct * optional string key = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.getKey = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.GetValueRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} returns this */ -proto.cc.arduino.cli.settings.v1.GetValueRequest.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.setKey = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1112,8 +1112,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.MergeResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.MergeResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.toObject(opt_includeInstance, this); }; @@ -1122,11 +1122,11 @@ proto.cc.arduino.cli.settings.v1.MergeResponse.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.MergeResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.MergeResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -1142,23 +1142,23 @@ proto.cc.arduino.cli.settings.v1.MergeResponse.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.MergeResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} */ -proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.MergeResponse; - return proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsMergeResponse; + return proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.MergeResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.MergeResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} */ -proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1178,9 +1178,9 @@ proto.cc.arduino.cli.settings.v1.MergeResponse.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.MergeResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.MergeResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1188,11 +1188,11 @@ proto.cc.arduino.cli.settings.v1.MergeResponse.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.MergeResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.MergeResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; @@ -1213,8 +1213,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.SetValueResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.toObject(opt_includeInstance, this); }; @@ -1223,11 +1223,11 @@ proto.cc.arduino.cli.settings.v1.SetValueResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.SetValueResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -1243,23 +1243,23 @@ proto.cc.arduino.cli.settings.v1.SetValueResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.SetValueResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse} */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.SetValueResponse; - return proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse; + return proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.SetValueResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.SetValueResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse} */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1279,9 +1279,9 @@ proto.cc.arduino.cli.settings.v1.SetValueResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.SetValueResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1289,11 +1289,11 @@ proto.cc.arduino.cli.settings.v1.SetValueResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.SetValueResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.SetValueResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; @@ -1314,8 +1314,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.WriteRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.toObject(opt_includeInstance, this); }; @@ -1324,11 +1324,11 @@ proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.toObject = function(opt_ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.WriteRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.WriteRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.toObject = function(includeInstance, msg) { var f, obj = { filePath: jspb.Message.getFieldWithDefault(msg, 1, "") }; @@ -1344,23 +1344,23 @@ proto.cc.arduino.cli.settings.v1.WriteRequest.toObject = function(includeInstanc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.WriteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} */ -proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.WriteRequest; - return proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsWriteRequest; + return proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.WriteRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.WriteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} */ -proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1384,9 +1384,9 @@ proto.cc.arduino.cli.settings.v1.WriteRequest.deserializeBinaryFromReader = func * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.WriteRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1394,11 +1394,11 @@ proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.serializeBinary = functi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.WriteRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.WriteRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getFilePath(); if (f.length > 0) { @@ -1414,16 +1414,16 @@ proto.cc.arduino.cli.settings.v1.WriteRequest.serializeBinaryToWriter = function * optional string file_path = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.getFilePath = function() { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.getFilePath = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.WriteRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} returns this */ -proto.cc.arduino.cli.settings.v1.WriteRequest.prototype.setFilePath = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.setFilePath = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1444,8 +1444,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.settings.v1.WriteResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.settings.v1.WriteResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.toObject(opt_includeInstance, this); }; @@ -1454,11 +1454,11 @@ proto.cc.arduino.cli.settings.v1.WriteResponse.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.WriteResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.WriteResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -1474,23 +1474,23 @@ proto.cc.arduino.cli.settings.v1.WriteResponse.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.WriteResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} */ -proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.settings.v1.WriteResponse; - return proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsWriteResponse; + return proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.settings.v1.WriteResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.WriteResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} */ -proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1510,9 +1510,9 @@ proto.cc.arduino.cli.settings.v1.WriteResponse.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.WriteResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.WriteResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1520,11 +1520,11 @@ proto.cc.arduino.cli.settings.v1.WriteResponse.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.settings.v1.WriteResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.settings.v1.WriteResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; @@ -1545,8 +1545,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * 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); +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.toObject(opt_includeInstance, this); }; @@ -1555,11 +1555,11 @@ proto.cc.arduino.cli.settings.v1.DeleteRequest.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.DeleteRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} 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) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.toObject = function(includeInstance, msg) { var f, obj = { key: jspb.Message.getFieldWithDefault(msg, 1, "") }; @@ -1575,23 +1575,23 @@ proto.cc.arduino.cli.settings.v1.DeleteRequest.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.DeleteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} */ -proto.cc.arduino.cli.settings.v1.DeleteRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.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); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest; + return proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.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 {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.DeleteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} */ -proto.cc.arduino.cli.settings.v1.DeleteRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1615,9 +1615,9 @@ proto.cc.arduino.cli.settings.v1.DeleteRequest.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.DeleteRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.DeleteRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1625,11 +1625,11 @@ proto.cc.arduino.cli.settings.v1.DeleteRequest.prototype.serializeBinary = funct /** * 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 {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} 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) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getKey(); if (f.length > 0) { @@ -1645,16 +1645,16 @@ proto.cc.arduino.cli.settings.v1.DeleteRequest.serializeBinaryToWriter = functio * optional string key = 1; * @return {string} */ -proto.cc.arduino.cli.settings.v1.DeleteRequest.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.getKey = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.settings.v1.DeleteRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} returns this */ -proto.cc.arduino.cli.settings.v1.DeleteRequest.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.setKey = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1675,8 +1675,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * 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); +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.toObject(opt_includeInstance, this); }; @@ -1685,11 +1685,11 @@ proto.cc.arduino.cli.settings.v1.DeleteResponse.prototype.toObject = function(op * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.settings.v1.DeleteResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} 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) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -1705,23 +1705,23 @@ proto.cc.arduino.cli.settings.v1.DeleteResponse.toObject = function(includeInsta /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.settings.v1.DeleteResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} */ -proto.cc.arduino.cli.settings.v1.DeleteResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.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); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse; + return proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.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 {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.settings.v1.DeleteResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} */ -proto.cc.arduino.cli.settings.v1.DeleteResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1741,9 +1741,9 @@ proto.cc.arduino.cli.settings.v1.DeleteResponse.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.settings.v1.DeleteResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.settings.v1.DeleteResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1751,13 +1751,13 @@ proto.cc.arduino.cli.settings.v1.DeleteResponse.prototype.serializeBinary = func /** * 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 {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} 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) { +proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; -goog.object.extend(exports, proto.cc.arduino.cli.settings.v1); +goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts index 6c82e5557..b16f167e2 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 @@ -214,15 +214,23 @@ export namespace UploadUsingProgrammerRequest { } export class UploadUsingProgrammerResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): UploadUsingProgrammerResponse; + + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): UploadUsingProgrammerResponse; + getMessageCase(): UploadUsingProgrammerResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadUsingProgrammerResponse.AsObject; static toObject(includeInstance: boolean, msg: UploadUsingProgrammerResponse): UploadUsingProgrammerResponse.AsObject; @@ -238,6 +246,13 @@ export namespace UploadUsingProgrammerResponse { outStream: Uint8Array | string, errStream: Uint8Array | string, } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + } + } export class BurnBootloaderRequest extends jspb.Message { @@ -290,15 +305,23 @@ export namespace BurnBootloaderRequest { } export class BurnBootloaderResponse extends jspb.Message { + + hasOutStream(): boolean; + clearOutStream(): void; getOutStream(): Uint8Array | string; getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): BurnBootloaderResponse; + + hasErrStream(): boolean; + clearErrStream(): void; getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): BurnBootloaderResponse; + getMessageCase(): BurnBootloaderResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BurnBootloaderResponse.AsObject; static toObject(includeInstance: boolean, msg: BurnBootloaderResponse): BurnBootloaderResponse.AsObject; @@ -314,6 +337,13 @@ export namespace BurnBootloaderResponse { outStream: Uint8Array | string, errStream: Uint8Array | string, } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + OUT_STREAM = 1, + ERR_STREAM = 2, + } + } export class ListProgrammersAvailableForUploadRequest extends jspb.Message { 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 937a819c4..3ff6946e1 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 @@ -27,6 +27,7 @@ var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ListProgrammersAvailableForUploadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ListProgrammersAvailableForUploadResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', null, global); @@ -38,6 +39,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadResponse.MessageCase', goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadResult', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UserField', null, global); /** * Generated by JsPbCodeGenerator. @@ -155,7 +157,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -197,7 +199,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -1837,6 +1839,32 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.clearUse +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1943,15 +1971,15 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.seriali */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -1998,7 +2026,25 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.getOutS * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -2040,7 +2086,25 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.getErrS * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; }; @@ -2430,6 +2494,32 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.clearUserFields +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + OUT_STREAM: 1, + ERR_STREAM: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2536,15 +2626,15 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.serializeBinar */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getOutStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getErrStream_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -2591,7 +2681,25 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.getOutStream_a * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.setOutStream = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.clearOutStream = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.hasOutStream = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -2633,7 +2741,25 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.getErrStream_a * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this */ proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.setErrStream = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.clearErrStream = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderResponse.prototype.hasErrStream = function() { + return jspb.Message.getField(this, 2) != null; }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts deleted file mode 100644 index c5284c159..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.d.ts +++ /dev/null @@ -1,126 +0,0 @@ -// package: cc.arduino.cli.settings.v1 -// file: cc/arduino/cli/settings/v1/settings.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "@grpc/grpc-js"; -import * as cc_arduino_cli_settings_v1_settings_pb from "../../../../../cc/arduino/cli/settings/v1/settings_pb"; - -interface ISettingsServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { - getAll: ISettingsServiceService_IGetAll; - merge: ISettingsServiceService_IMerge; - getValue: ISettingsServiceService_IGetValue; - setValue: ISettingsServiceService_ISetValue; - write: ISettingsServiceService_IWrite; - delete: ISettingsServiceService_IDelete; -} - -interface ISettingsServiceService_IGetAll extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, cc_arduino_cli_settings_v1_settings_pb.GetAllResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/GetAll"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; -} -interface ISettingsServiceService_IMerge extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.MergeRequest, cc_arduino_cli_settings_v1_settings_pb.MergeResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/Merge"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.MergeRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.MergeRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; -} -interface ISettingsServiceService_IGetValue extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, cc_arduino_cli_settings_v1_settings_pb.GetValueResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/GetValue"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; -} -interface ISettingsServiceService_ISetValue extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, cc_arduino_cli_settings_v1_settings_pb.SetValueResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/SetValue"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; -} -interface ISettingsServiceService_IWrite extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.WriteRequest, cc_arduino_cli_settings_v1_settings_pb.WriteResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/Write"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.WriteRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.WriteRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; -} -interface ISettingsServiceService_IDelete extends grpc.MethodDefinition<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, cc_arduino_cli_settings_v1_settings_pb.DeleteResponse> { - path: "/cc.arduino.cli.settings.v1.SettingsService/Delete"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_settings_v1_settings_pb.DeleteResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_settings_v1_settings_pb.DeleteResponse>; -} - -export const SettingsServiceService: ISettingsServiceService; - -export interface ISettingsServiceServer extends grpc.UntypedServiceImplementation { - getAll: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, cc_arduino_cli_settings_v1_settings_pb.GetAllResponse>; - merge: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.MergeRequest, cc_arduino_cli_settings_v1_settings_pb.MergeResponse>; - getValue: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, cc_arduino_cli_settings_v1_settings_pb.GetValueResponse>; - setValue: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, cc_arduino_cli_settings_v1_settings_pb.SetValueResponse>; - write: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.WriteRequest, cc_arduino_cli_settings_v1_settings_pb.WriteResponse>; - delete: grpc.handleUnaryCall<cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, cc_arduino_cli_settings_v1_settings_pb.DeleteResponse>; -} - -export interface ISettingsServiceClient { - getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - 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<grpc.CallOptions>, 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 { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: Partial<grpc.ClientOptions>); - public getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - public getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - public getAll(request: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse) => void): grpc.ClientUnaryCall; - public merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - public merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - public merge(request: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.MergeResponse) => void): grpc.ClientUnaryCall; - public getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - public getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - public getValue(request: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse) => void): grpc.ClientUnaryCall; - public setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - public setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - public setValue(request: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse) => void): grpc.ClientUnaryCall; - public write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - public write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - public write(request: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; - 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<grpc.CallOptions>, 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 deleted file mode 100644 index 76c399866..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb.js +++ /dev/null @@ -1,231 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// This file is part of arduino-cli. -// -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. -// -'use strict'; -var cc_arduino_cli_settings_v1_settings_pb = require('../../../../../cc/arduino/cli/settings/v1/settings_pb.js'); - -function serialize_cc_arduino_cli_settings_v1_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'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetAllRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetAllRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_GetAllResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetAllResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetAllResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetAllResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetAllResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_GetValueRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetValueRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetValueRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetValueRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_GetValueResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.GetValueResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.GetValueResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_GetValueResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.GetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_MergeRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.MergeRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.MergeRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_MergeRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.MergeRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_MergeResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.MergeResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.MergeResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_MergeResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.MergeResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_SetValueRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.SetValueRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.SetValueRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_SetValueRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.SetValueRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_SetValueResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.SetValueResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.SetValueResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_SetValueResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.SetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_WriteRequest(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.WriteRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.WriteRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_WriteRequest(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.WriteRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_settings_v1_WriteResponse(arg) { - if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.WriteResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.settings.v1.WriteResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_settings_v1_WriteResponse(buffer_arg) { - return cc_arduino_cli_settings_v1_settings_pb.WriteResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -// The SettingsService provides an interface to Arduino CLI configuration -// options -var SettingsServiceService = exports['cc.arduino.cli.settings.v1.SettingsService'] = { - // List all the settings. -getAll: { - path: '/cc.arduino.cli.settings.v1.SettingsService/GetAll', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.GetAllRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.GetAllResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_GetAllRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_GetAllRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_GetAllResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_GetAllResponse, - }, - // Set multiple settings values at once. -merge: { - path: '/cc.arduino.cli.settings.v1.SettingsService/Merge', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.MergeRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.MergeResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_MergeRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_MergeRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_MergeResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_MergeResponse, - }, - // Get the value of a specific setting. -getValue: { - path: '/cc.arduino.cli.settings.v1.SettingsService/GetValue', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.GetValueRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.GetValueResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_GetValueRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_GetValueRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_GetValueResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_GetValueResponse, - }, - // Set the value of a specific setting. -setValue: { - path: '/cc.arduino.cli.settings.v1.SettingsService/SetValue', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.SetValueRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.SetValueResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_SetValueRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_SetValueRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_SetValueResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_SetValueResponse, - }, - // Writes to file settings currently stored in memory -write: { - path: '/cc.arduino.cli.settings.v1.SettingsService/Write', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_settings_v1_settings_pb.WriteRequest, - responseType: cc_arduino_cli_settings_v1_settings_pb.WriteResponse, - requestSerialize: serialize_cc_arduino_cli_settings_v1_WriteRequest, - requestDeserialize: deserialize_cc_arduino_cli_settings_v1_WriteRequest, - responseSerialize: serialize_cc_arduino_cli_settings_v1_WriteResponse, - responseDeserialize: deserialize_cc_arduino_cli_settings_v1_WriteResponse, - }, - // 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 deleted file mode 100644 index 03fdbf449..000000000 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/settings/v1/settings_pb.d.ts +++ /dev/null @@ -1,238 +0,0 @@ -// package: cc.arduino.cli.settings.v1 -// file: cc/arduino/cli/settings/v1/settings.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; - -export class GetAllResponse extends jspb.Message { - getJsonData(): string; - setJsonData(value: string): GetAllResponse; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetAllResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetAllResponse): GetAllResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetAllResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetAllResponse; - static deserializeBinaryFromReader(message: GetAllResponse, reader: jspb.BinaryReader): GetAllResponse; -} - -export namespace GetAllResponse { - export type AsObject = { - jsonData: string, - } -} - -export class MergeRequest extends jspb.Message { - getJsonData(): string; - setJsonData(value: string): MergeRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MergeRequest.AsObject; - static toObject(includeInstance: boolean, msg: MergeRequest): MergeRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MergeRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MergeRequest; - static deserializeBinaryFromReader(message: MergeRequest, reader: jspb.BinaryReader): MergeRequest; -} - -export namespace MergeRequest { - export type AsObject = { - jsonData: string, - } -} - -export class GetValueResponse extends jspb.Message { - getKey(): string; - setKey(value: string): GetValueResponse; - getJsonData(): string; - setJsonData(value: string): GetValueResponse; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetValueResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetValueResponse): GetValueResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetValueResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetValueResponse; - static deserializeBinaryFromReader(message: GetValueResponse, reader: jspb.BinaryReader): GetValueResponse; -} - -export namespace GetValueResponse { - export type AsObject = { - key: string, - jsonData: string, - } -} - -export class SetValueRequest extends jspb.Message { - getKey(): string; - setKey(value: string): SetValueRequest; - getJsonData(): string; - setJsonData(value: string): SetValueRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SetValueRequest.AsObject; - static toObject(includeInstance: boolean, msg: SetValueRequest): SetValueRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SetValueRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SetValueRequest; - static deserializeBinaryFromReader(message: SetValueRequest, reader: jspb.BinaryReader): SetValueRequest; -} - -export namespace SetValueRequest { - export type AsObject = { - key: string, - jsonData: string, - } -} - -export class GetAllRequest extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetAllRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetAllRequest): GetAllRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetAllRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetAllRequest; - static deserializeBinaryFromReader(message: GetAllRequest, reader: jspb.BinaryReader): GetAllRequest; -} - -export namespace GetAllRequest { - export type AsObject = { - } -} - -export class GetValueRequest extends jspb.Message { - getKey(): string; - setKey(value: string): GetValueRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetValueRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetValueRequest): GetValueRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: GetValueRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetValueRequest; - static deserializeBinaryFromReader(message: GetValueRequest, reader: jspb.BinaryReader): GetValueRequest; -} - -export namespace GetValueRequest { - export type AsObject = { - key: string, - } -} - -export class MergeResponse extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MergeResponse.AsObject; - static toObject(includeInstance: boolean, msg: MergeResponse): MergeResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MergeResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MergeResponse; - static deserializeBinaryFromReader(message: MergeResponse, reader: jspb.BinaryReader): MergeResponse; -} - -export namespace MergeResponse { - export type AsObject = { - } -} - -export class SetValueResponse extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SetValueResponse.AsObject; - static toObject(includeInstance: boolean, msg: SetValueResponse): SetValueResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SetValueResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SetValueResponse; - static deserializeBinaryFromReader(message: SetValueResponse, reader: jspb.BinaryReader): SetValueResponse; -} - -export namespace SetValueResponse { - export type AsObject = { - } -} - -export class WriteRequest extends jspb.Message { - getFilePath(): string; - setFilePath(value: string): WriteRequest; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): WriteRequest.AsObject; - static toObject(includeInstance: boolean, msg: WriteRequest): WriteRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: WriteRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): WriteRequest; - static deserializeBinaryFromReader(message: WriteRequest, reader: jspb.BinaryReader): WriteRequest; -} - -export namespace WriteRequest { - export type AsObject = { - filePath: string, - } -} - -export class WriteResponse extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): WriteResponse.AsObject; - static toObject(includeInstance: boolean, msg: WriteResponse): WriteResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: WriteResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): WriteResponse; - static deserializeBinaryFromReader(message: WriteResponse, reader: jspb.BinaryReader): WriteResponse; -} - -export namespace WriteResponse { - export type AsObject = { - } -} - -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<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - 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<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - 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/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index 1f56748cc..1a83d8a6a 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -1,7 +1,6 @@ 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'; import { ILogger } from '@theia/core/lib/common/logger'; @@ -16,18 +15,17 @@ import { ConfigState, } from '../common/protocol'; import { spawnCommand } from './exec-util'; -import { - MergeRequest, - WriteRequest, -} from './cli-protocol/cc/arduino/cli/settings/v1/settings_pb'; -import { SettingsServiceClient } from './cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb'; -import * as serviceGrpcPb from './cli-protocol/cc/arduino/cli/settings/v1/settings_grpc_pb'; import { ArduinoDaemonImpl } from './arduino-daemon-impl'; import { DefaultCliConfig, CLI_CONFIG } from './cli-config'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { deepClone, nls } from '@theia/core'; import { ErrnoException } from './utils/errors'; +import { + SettingsMergeRequest, + SettingsWriteRequest, +} from './cli-protocol/cc/arduino/cli/commands/v1/settings_pb'; +import { createArduinoCoreServiceClient } from './arduino-core-service-client'; const deepmerge = require('deepmerge'); @@ -293,16 +291,16 @@ export class ConfigServiceImpl } private async updateDaemon( - port: string | number, + port: number | number, config: DefaultCliConfig ): Promise<void> { - const client = this.createClient(port); - const req = new MergeRequest(); + const client = createArduinoCoreServiceClient({ port }); + const req = new SettingsMergeRequest(); const json = JSON.stringify(config, null, 2); req.setJsonData(json); this.logger.info(`Updating daemon with 'data': ${json}`); return new Promise<void>((resolve, reject) => { - client.merge(req, (error) => { + client.settingsMerge(req, (error) => { try { if (error) { reject(error); @@ -316,14 +314,14 @@ export class ConfigServiceImpl }); } - private async writeDaemonState(port: string | number): Promise<void> { - const client = this.createClient(port); - const req = new WriteRequest(); + private async writeDaemonState(port: number | number): Promise<void> { + const client = createArduinoCoreServiceClient({ port }); + const req = new SettingsWriteRequest(); const cliConfigUri = await this.getCliConfigFileUri(); const cliConfigPath = FileUri.fsPath(cliConfigUri); req.setFilePath(cliConfigPath); return new Promise<void>((resolve, reject) => { - client.write(req, (error) => { + client.settingsWrite(req, (error) => { try { if (error) { reject(error); @@ -337,19 +335,6 @@ export class ConfigServiceImpl }); } - private createClient(port: string | number): SettingsServiceClient { - // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/master/doc/grpcjs_support.md#usage - const SettingsServiceClient = grpc.makeClientConstructor( - // @ts-expect-error: ignore - serviceGrpcPb['cc.arduino.cli.settings.v1.SettingsService'], - 'SettingsServiceService' - ) as any; - return new SettingsServiceClient( - `localhost:${port}`, - grpc.credentials.createInsecure() - ) as SettingsServiceClient; - } - // #1445 private async ensureUserDirExists( cliConfig: DefaultCliConfig diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 28e8f028c..f113b96c5 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -17,7 +17,6 @@ import { UpdateLibrariesIndexRequest, UpdateLibrariesIndexResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/commands_pb'; -import * as commandsGrpcPb from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; import { IndexType, IndexUpdateDidCompleteParams, @@ -43,6 +42,10 @@ import { } from './grpc-progressible'; import type { DefaultCliConfig } from './cli-config'; import { ServiceError } from './service-error'; +import { + createArduinoCoreServiceClient, + createDefaultChannelOptions, +} from './arduino-core-service-client'; @injectable() export class CoreClientProvider { @@ -128,10 +131,9 @@ export class CoreClientProvider { /** * Encapsulates both the gRPC core client creation (`CreateRequest`) and initialization (`InitRequest`). */ - private async create(port: string): Promise<CoreClientProvider.Client> { + private async create(port: number): Promise<CoreClientProvider.Client> { this.closeClient(); - const address = this.address(port); - const client = await this.createClient(address); + const client = await this.createClient(port); this.toDisposeOnCloseClient.pushAll([ Disposable.create(() => client.client.close()), ]); @@ -195,22 +197,9 @@ export class CoreClientProvider { return this.toDisposeOnCloseClient.dispose(); } - private async createClient( - address: string - ): Promise<CoreClientProvider.Client> { - // https://github.com/agreatfool/grpc_tools_node_protoc_ts/blob/master/doc/grpcjs_support.md#usage - const ArduinoCoreServiceClient = grpc.makeClientConstructor( - // @ts-expect-error: ignore - commandsGrpcPb['cc.arduino.cli.commands.v1.ArduinoCoreService'], - 'ArduinoCoreServiceService' - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) as any; - const client = new ArduinoCoreServiceClient( - address, - grpc.credentials.createInsecure(), - this.channelOptions - ) as ArduinoCoreServiceClient; - + private async createClient(port: number): Promise<CoreClientProvider.Client> { + const channelOptions = createDefaultChannelOptions(this.version); + const client = createArduinoCoreServiceClient({ port, channelOptions }); const instance = await new Promise<Instance>((resolve, reject) => { client.create(new CreateRequest(), (err, resp) => { if (err) { @@ -407,18 +396,6 @@ export class CoreClientProvider { }); } - private address(port: string): string { - return `localhost:${port}`; - } - - private get channelOptions(): Record<string, unknown> { - return { - 'grpc.max_send_message_length': 512 * 1024 * 1024, - 'grpc.max_receive_message_length': 512 * 1024 * 1024, - 'grpc.primary_user_agent': `arduino-ide/${this.version}`, - }; - } - private _version: string | undefined; private get version(): string { if (this._version) { diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index a8dfab98b..3a9677c18 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -535,18 +535,31 @@ function updateCompileSummary( compileSummary: CompileSummaryFragment, response: CompileResponse ): CompileSummaryFragment { - const buildPath = response.getBuildPath(); + const messageCase = response.getMessageCase(); + if (messageCase !== CompileResponse.MessageCase.RESULT) { + return compileSummary; + } + const result = response.getResult(); + if (!result) { + console.warn( + `Build result is missing from response: ${JSON.stringify( + response.toObject(false) + )}` + ); + return compileSummary; + } + const buildPath = result.getBuildPath(); if (buildPath) { compileSummary.buildPath = buildPath; compileSummary.buildOutputUri = FileUri.create(buildPath).toString(); } - const executableSectionsSize = response.getExecutableSectionsSizeList(); + const executableSectionsSize = result.getExecutableSectionsSizeList(); if (executableSectionsSize) { compileSummary.executableSectionsSize = executableSectionsSize.map((item) => item.toObject(false) ); } - const usedLibraries = response.getUsedLibrariesList(); + const usedLibraries = result.getUsedLibrariesList(); if (usedLibraries) { compileSummary.usedLibraries = usedLibraries.map((item) => { const object = item.toObject(false); @@ -575,15 +588,15 @@ function updateCompileSummary( return library; }); } - const boardPlatform = response.getBoardPlatform(); + const boardPlatform = result.getBoardPlatform(); if (boardPlatform) { compileSummary.buildPlatform = boardPlatform.toObject(false); } - const buildPlatform = response.getBuildPlatform(); + const buildPlatform = result.getBuildPlatform(); if (buildPlatform) { compileSummary.buildPlatform = buildPlatform.toObject(false); } - const buildProperties = response.getBuildPropertiesList(); + const buildProperties = result.getBuildPropertiesList(); if (buildProperties) { compileSummary.buildProperties = buildProperties.slice(); } diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index afdfae052..1b447bb4c 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -81,7 +81,7 @@ export class LibraryServiceImpl } const req = new LibrarySearchRequest(); - req.setQuery(options.query || ''); + req.setSearchArgs(options.query || ''); req.setInstance(instance); req.setOmitReleasesDetails(true); const resp = await new Promise<LibrarySearchResponse>((resolve, reject) => diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index e6c3172f1..2e48f7f79 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -23,6 +23,7 @@ import { EnumerateMonitorPortSettingsRequest, EnumerateMonitorPortSettingsResponse, MonitorPortConfiguration, + MonitorPortOpenRequest, MonitorPortSetting, MonitorRequest, MonitorResponse, @@ -229,16 +230,16 @@ export class MonitorService extends CoreClientAware implements Disposable { const coreClient = await this.coreClient; const { instance } = coreClient; - const monitorRequest = new MonitorRequest(); - monitorRequest.setInstance(instance); + const openPortRequest = new MonitorPortOpenRequest(); + openPortRequest.setInstance(instance); if (this.board?.fqbn) { - monitorRequest.setFqbn(this.board.fqbn); + openPortRequest.setFqbn(this.board.fqbn); } if (this.port?.address && this.port?.protocol) { const rpcPort = new RpcPort(); rpcPort.setAddress(this.port.address); rpcPort.setProtocol(this.port.protocol); - monitorRequest.setPort(rpcPort); + openPortRequest.setPort(rpcPort); } const config = new MonitorPortConfiguration(); for (const id in this.settings.pluggableMonitorSettings) { @@ -247,9 +248,9 @@ export class MonitorService extends CoreClientAware implements Disposable { s.setValue(this.settings.pluggableMonitorSettings[id].selectedValue); config.addSettings(s); } - monitorRequest.setPortConfiguration(config); + openPortRequest.setPortConfiguration(config); - await this.pollWriteToStream(monitorRequest); + await this.pollWriteToStream(openPortRequest); // Only store the config, if the monitor has successfully started. this.currentPortConfigSnapshot = MonitorPortConfiguration.toObject( false, @@ -344,7 +345,7 @@ export class MonitorService extends CoreClientAware implements Disposable { } } - pollWriteToStream(request: MonitorRequest): Promise<void> { + pollWriteToStream(request: MonitorPortOpenRequest): Promise<void> { const createWriteToStreamExecutor = (duplex: ClientDuplexStream<MonitorRequest, MonitorResponse>) => (resolve: () => void, reject: (reason?: unknown) => void) => { @@ -380,7 +381,7 @@ export class MonitorService extends CoreClientAware implements Disposable { ]; this.setDuplexHandlers(duplex, resolvingDuplexHandlers); - duplex.write(request); + duplex.write(new MonitorRequest().setOpenRequest(request)); }; return Promise.race([ @@ -409,6 +410,8 @@ export class MonitorService extends CoreClientAware implements Disposable { ]) as Promise<unknown> as Promise<void>; } + private endingDuplex: Promise<void> | undefined; + /** * Pauses the currently running monitor, it still closes the gRPC connection * with the underlying monitor process but it doesn't stop the message handlers @@ -418,29 +421,43 @@ export class MonitorService extends CoreClientAware implements Disposable { * @returns */ async pause(): Promise<void> { - return new Promise(async (resolve) => { - if (!this.duplex) { - this.logger.warn( - `monitor to ${this.port?.address} using ${this.port?.protocol} already stopped` - ); - return resolve(); - } - // It's enough to close the connection with the client - // to stop the monitor process - this.duplex.end(); - this.logger.info( - `stopped monitor to ${this.port?.address} using ${this.port?.protocol}` + const duplex = this.duplex; + if (!duplex) { + this.logger.warn( + `monitor to ${this.port?.address} using ${this.port?.protocol} already stopped` ); + return; + } + if (this.endingDuplex) { + return this.endingDuplex; + } + const deferredEnd = new Deferred<void>(); + this.endingDuplex = deferredEnd.promise; - this.duplex.on('end', resolve); + // to terminate the monitor connection, send a close request, and wait for the end event + duplex.once('end', () => { + deferredEnd.resolve(); }); + try { + await new Promise((resolve) => + duplex.write(new MonitorRequest().setClose(true), resolve) + ); + await this.endingDuplex; + } finally { + this.endingDuplex = undefined; + } + // Sanity check + // Duplexes are allowed to be half open, check whether the monitor server (the readable) has ended + if (!duplex.readableEnded) { + throw new Error('Could not end the monitor connection'); + } } /** * Stop the monitor currently running */ async stop(): Promise<void> { - return this.pause().finally(this.stopMessagesHandlers.bind(this)); + return this.pause().finally(() => this.stopMessagesHandlers()); } /** @@ -454,11 +471,7 @@ export class MonitorService extends CoreClientAware implements Disposable { if (!this.duplex) { throw createNotConnectedError(this.port); } - const coreClient = await this.coreClient; - const { instance } = coreClient; - const req = new MonitorRequest(); - req.setInstance(instance); req.setTxData(new TextEncoder().encode(message)); return new Promise<void>((resolve, reject) => { if (this.duplex) { @@ -588,17 +601,13 @@ export class MonitorService extends CoreClientAware implements Disposable { return; } - const coreClient = await this.coreClient; - const { instance } = coreClient; - this.logger.info( `Sending monitor request with new port configuration: ${JSON.stringify( MonitorPortConfiguration.toObject(false, diffConfig) )}` ); const req = new MonitorRequest(); - req.setInstance(instance); - req.setPortConfiguration(diffConfig); + req.setUpdatedConfiguration(diffConfig); this.duplex.write(req); } diff --git a/arduino-ide-extension/src/node/notification-service-server.ts b/arduino-ide-extension/src/node/notification-service-server.ts index cd3cac91e..bcbdb99d8 100644 --- a/arduino-ide-extension/src/node/notification-service-server.ts +++ b/arduino-ide-extension/src/node/notification-service-server.ts @@ -43,7 +43,7 @@ export class NotificationServiceServerImpl this.clients.forEach((client) => client.notifyIndexUpdateDidFail(params)); } - notifyDaemonDidStart(port: string): void { + notifyDaemonDidStart(port: number): void { this.clients.forEach((client) => client.notifyDaemonDidStart(port)); } diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 6e1b987bc..21320000e 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -167,7 +167,16 @@ export class SketchesServiceImpl reject(rejectWith); return; } - const responseSketchPath = maybeNormalizeDrive(resp.getLocationPath()); + const sketch = resp.getSketch(); + if (!sketch) { + reject( + new Error(`Incomplete LoadSketch response. Sketch is missing.`) + ); + return; + } + const responseSketchPath = maybeNormalizeDrive( + sketch.getLocationPath() + ); if (requestSketchPath !== responseSketchPath) { this.logger.warn( `Warning! The request sketch path was different than the response sketch path from the CLI. This could be a potential bug. Request: <${requestSketchPath}>, response: <${responseSketchPath}>.` @@ -185,14 +194,14 @@ export class SketchesServiceImpl resolve({ name: path.basename(responseSketchPath), uri: FileUri.create(responseSketchPath).toString(), - mainFileUri: FileUri.create(resp.getMainFile()).toString(), - otherSketchFileUris: resp + mainFileUri: FileUri.create(sketch.getMainFile()).toString(), + otherSketchFileUris: sketch .getOtherSketchFilesList() .map((p) => FileUri.create(p).toString()), - additionalFileUris: resp + additionalFileUris: sketch .getAdditionalFilesList() .map((p) => FileUri.create(p).toString()), - rootFolderFileUris: resp + rootFolderFileUris: sketch .getRootFolderFilesList() .map((p) => FileUri.create(p).toString()), mtimeMs, 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 635bbeeb3..ed5149102 100644 --- a/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts +++ b/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts @@ -21,7 +21,7 @@ class SilentArduinoDaemonImpl extends ArduinoDaemonImpl { override async spawnDaemonProcess(): Promise<{ daemon: ChildProcess; - port: string; + port: number; }> { return super.spawnDaemonProcess(); } 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 fbd5aeb4d..767bb9d6e 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 @@ -1,7 +1,7 @@ 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 { BoardSearch, BoardsService, Installable } from '../../common/protocol'; import { createBaseContainer, startDaemon } from './node-test-bindings'; describe('boards-service-impl', () => { @@ -24,6 +24,29 @@ describe('boards-service-impl', () => { expect(result).is.not.empty; }); + it('should order the available platform release versions in descending order', async function () { + const result = await boardService.search({}); + result.forEach((platform) => + platform.availableVersions.forEach( + (currentVersion, index, versions) => { + if (index < versions.length - 2) { + const nextArrayElement = versions[index + 1]; + const actual = Installable.Version.COMPARATOR( + currentVersion, + nextArrayElement + ); + expect(actual).to.be.greaterThan( + 0, + `Expected '${currentVersion}' to be gt '${nextArrayElement}'. All versions: ${JSON.stringify( + versions + )}` + ); + } + } + ) + ); + }); + it("should boost a result when 'types' includes 'arduino', and lower the score if deprecated", async () => { const result = await boardService.search({}); const arduinoIndexes: number[] = []; diff --git a/arduino-ide-extension/src/test/node/node-test-bindings.ts b/arduino-ide-extension/src/test/node/node-test-bindings.ts index 29ff09f52..0f2ca5e35 100644 --- a/arduino-ide-extension/src/test/node/node-test-bindings.ts +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -111,7 +111,7 @@ class TestNotificationServiceServer implements NotificationServiceServer { notifyIndexUpdateDidFail(params: IndexUpdateDidFailParams): void { this.events.push(`notifyIndexUpdateDidFail:${JSON.stringify(params)}`); } - notifyDaemonDidStart(port: string): void { + notifyDaemonDidStart(port: number): void { this.events.push(`notifyDaemonDidStart:${port}`); } notifyDaemonDidStop(): void { From 347e3d81186ed110ee618578485f5d6110f39fed Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 22 Aug 2023 13:17:22 +0200 Subject: [PATCH 311/384] fix: can unset `network#proxy` in the CLI config An empty object (`{}`) must be used to correctly unset the CLI config value to its default. Closes arduino/arduino-ide#2184 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/config-service-impl.ts | 2 +- .../node/config-service-impl.slow-test.ts | 178 ++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index 1a83d8a6a..f112f7206 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -95,7 +95,7 @@ export class ConfigServiceImpl }; copyDefaultCliConfig.locale = locale || 'en'; const proxy = Network.stringify(network); - copyDefaultCliConfig.network = { proxy }; + copyDefaultCliConfig.network = proxy ? { proxy } : {}; // must be an empty object to unset the default prop with the `WriteRequest`. // always use the port of the daemon const port = await this.daemon.getPort(); diff --git a/arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts new file mode 100644 index 000000000..fe585bb7d --- /dev/null +++ b/arduino-ide-extension/src/test/node/config-service-impl.slow-test.ts @@ -0,0 +1,178 @@ +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { deepClone } from '@theia/core/lib/common/objects'; +import type { MaybePromise, Mutable } from '@theia/core/lib/common/types'; +import type { Container } from '@theia/core/shared/inversify'; +import { expect } from 'chai'; +import { load as parseYaml } from 'js-yaml'; +import { promises as fs } from 'node:fs'; +import { join } from 'node:path'; +import temp from 'temp'; +import { + Config, + Network, + ProxySettings, +} from '../../common/protocol/config-service'; +import { CLI_CONFIG, DefaultCliConfig } from '../../node/cli-config'; +import { ConfigServiceImpl } from '../../node/config-service-impl'; +import { ConfigDirUriProvider } from '../../node/theia/env-variables/env-variables-server'; +import { + createBaseContainer, + createCliConfig, + startDaemon, +} from './node-test-bindings'; + +describe('config-service-impl', () => { + const noProxy = 'none'; + const manualProxy: ProxySettings = { + protocol: 'http', + hostname: 'hostname', + password: 'secret', + username: 'username', + port: '1234', + }; + + describe('setConfiguration', () => { + let configService: ConfigServiceImpl; + let toDispose: DisposableCollection; + let cliConfigPath: string; + + beforeEach(async () => { + const container = await createBaseContainer(); + toDispose = new DisposableCollection(); + await startDaemon(container, toDispose); + configService = container.get<ConfigServiceImpl>(ConfigServiceImpl); + cliConfigPath = getCliConfigPath(container); + }); + + afterEach(() => toDispose.dispose()); + + it("should detect 'none' proxy with th default config", async () => { + const state = await configService.getConfiguration(); + expect(state.config).to.be.not.undefined; + const config = <Config>state.config; + expect(config.network).to.be.equal(noProxy); + expect(Network.stringify(config.network)).is.undefined; + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network).to.be.undefined; + }); + }); + + it('should ignore noop changes', async () => { + const beforeState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(beforeState).config; + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + await configService.setConfiguration(config); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.deep.equal(afterState.config); + expect(eventCounter).to.be.equal(0); + }); + + it('should set the manual proxy', async () => { + const beforeState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(beforeState).config; + config.network = manualProxy; + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + await configService.setConfiguration(config); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.not.deep.equal(afterState.config); + expect(afterState.config?.network).to.be.deep.equal(manualProxy); + expect(eventCounter).to.be.equal(1); + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network?.proxy).to.be.equal( + Network.stringify(manualProxy) + ); + }); + }); + + it('should unset the manual proxy', async () => { + const initialState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(initialState).config; + config.network = manualProxy; + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + await configService.setConfiguration(config); + const beforeState = await configService.getConfiguration(); + const config2 = <Mutable<Config>>deepClone(config); + config2.network = noProxy; + await configService.setConfiguration(config2); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.not.deep.equal(afterState.config); + expect(afterState.config?.network).to.be.deep.equal(noProxy); + expect(eventCounter).to.be.equal(2); + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network?.proxy).to.be.undefined; + }); + }); + }); + + describe('setConfiguration (multiple CLI daemon sessions)', () => { + let tracked: typeof temp; + let toDispose: DisposableCollection; + + before(() => { + tracked = temp.track(); + toDispose = new DisposableCollection( + Disposable.create(() => tracked.cleanupSync()) + ); + }); + + after(() => toDispose.dispose()); + + it("should unset the 'network#proxy' config value between daemon sessions", async () => { + const configDirPath = tracked.mkdirSync(); + const cliConfigPath = join(configDirPath, CLI_CONFIG); + const cliConfig = await createCliConfig(configDirPath); + const setupContainer = await createBaseContainer({ + cliConfig, + configDirPath, + }); + const toDisposeAfterFirstStart = new DisposableCollection(); + toDispose.push(toDisposeAfterFirstStart); + await startDaemon(setupContainer, toDisposeAfterFirstStart); + toDisposeAfterFirstStart.dispose(); + + // second startup when the indexes are all downloaded and the daemon is initialized with the network#proxy + cliConfig.network = { proxy: Network.stringify(manualProxy) }; + const container = await createBaseContainer({ cliConfig, configDirPath }); + await startDaemon(container, toDispose); + const configService = container.get<ConfigServiceImpl>(ConfigServiceImpl); + let eventCounter = 0; + toDispose.push(configService.onConfigChange(() => eventCounter++)); + + const beforeState = await configService.getConfiguration(); + const config = <Mutable<Config>>deepClone(beforeState.config); + config.network = noProxy; + await configService.setConfiguration(config); + const afterState = await configService.getConfiguration(); + expect(beforeState.config).to.be.not.deep.equal(afterState.config); + expect(afterState.config?.network).to.be.deep.equal(noProxy); + expect(eventCounter).to.be.equal(1); + await assertRawConfigModel(cliConfigPath, (actualModel) => { + expect(actualModel.network?.proxy).to.be.undefined; // currently fails due to arduino/arduino-cli#2275 + }); + }); + }); + + async function assertRawConfigModel( + cliConfigPath: string, + assert: (actual: DefaultCliConfig) => MaybePromise<void> + ): Promise<void> { + const raw = await fs.readFile(cliConfigPath, { encoding: 'utf8' }); + const model = parseYaml(raw); + await assert(model); + } + + function getCliConfigPath(container: Container): string { + const configDirUriProvider = + container.get<ConfigDirUriProvider>(ConfigDirUriProvider); + return configDirUriProvider + .configDirUri() + .resolve(CLI_CONFIG) + .path.fsPath(); + } +}); From 2a325a5b74a7ea80645cd2da74588f706292f4ff Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Mon, 5 Feb 2024 13:17:00 +0100 Subject: [PATCH 312/384] feat: cancelable verify+upload Closes arduino/arduino-ide#1199 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../browser/contributions/burn-bootloader.ts | 14 +- .../src/browser/contributions/contribution.ts | 124 ++++++---- .../browser/contributions/upload-sketch.ts | 5 +- .../browser/contributions/verify-sketch.ts | 26 +- .../browser/library/library-list-widget.ts | 6 +- .../component-list/component-list-item.tsx | 2 +- .../filterable-list-container.tsx | 7 +- .../widgets/component-list/list-widget.tsx | 7 - arduino-ide-extension/src/common/nls.ts | 2 + .../src/common/protocol/core-service.ts | 18 +- .../src/common/protocol/progressible.ts | 43 +++- .../src/node/core-service-impl.ts | 230 +++++++++++------- i18n/en.json | 3 +- 13 files changed, 307 insertions(+), 180 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts b/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts index 2ad150784..e951ac2f9 100644 --- a/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts +++ b/arduino-ide-extension/src/browser/contributions/burn-bootloader.ts @@ -37,11 +37,15 @@ export class BurnBootloader extends CoreServiceContribution { 'arduino/bootloader/burningBootloader', 'Burning bootloader...' ), - task: (progressId, coreService) => - coreService.burnBootloader({ - ...options, - progressId, - }), + task: (progressId, coreService, token) => + coreService.burnBootloader( + { + ...options, + progressId, + }, + token + ), + cancelable: true, }); this.messageService.info( nls.localize( diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 8de4d8ff4..1a8ff5798 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -1,83 +1,89 @@ +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; import { - inject, - injectable, - interfaces, - postConstruct, -} from '@theia/core/shared/inversify'; -import URI from '@theia/core/lib/common/uri'; -import { ILogger } from '@theia/core/lib/common/logger'; -import { - Disposable, - DisposableCollection, -} from '@theia/core/lib/common/disposable'; -import { Saveable } from '@theia/core/lib/browser/saveable'; -import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { MaybePromise } from '@theia/core/lib/common/types'; -import { LabelProvider } from '@theia/core/lib/browser/label-provider'; -import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; -import { MessageService } from '@theia/core/lib/common/message-service'; -import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { open, OpenerService } from '@theia/core/lib/browser/opener-service'; -import { - MenuModelRegistry, - MenuContribution, -} from '@theia/core/lib/common/menu'; + FrontendApplication, + FrontendApplicationContribution, +} from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { - KeybindingRegistry, KeybindingContribution, + KeybindingRegistry, } from '@theia/core/lib/browser/keybinding'; +import { LabelProvider } from '@theia/core/lib/browser/label-provider'; +import { OpenerService, open } from '@theia/core/lib/browser/opener-service'; +import { Saveable } from '@theia/core/lib/browser/saveable'; +import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { TabBarToolbarContribution, TabBarToolbarRegistry, } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; -import { - FrontendApplicationContribution, - FrontendApplication, -} from '@theia/core/lib/browser/frontend-application'; +import { CancellationToken } from '@theia/core/lib/common/cancellation'; import { Command, - CommandRegistry, CommandContribution, + CommandRegistry, CommandService, } from '@theia/core/lib/common/command'; -import { SettingsService } from '../dialogs/settings/settings'; import { - CurrentSketch, - SketchesServiceClientImpl, -} from '../sketches-service-client-impl'; + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; +import { ILogger } from '@theia/core/lib/common/logger'; +import { + MenuContribution, + MenuModelRegistry, +} from '@theia/core/lib/common/menu'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { MessageType } from '@theia/core/lib/common/message-service-protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { MaybePromise, isObject } from '@theia/core/lib/common/types'; +import URI from '@theia/core/lib/common/uri'; +import { + inject, + injectable, + interfaces, + postConstruct, +} from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; +import { OutputChannelSeverity } from '@theia/output/lib/browser/output-channel'; +import { MainMenuManager } from '../../common/main-menu-manager'; +import { userAbort } from '../../common/nls'; import { - SketchesService, - FileSystemExt, - Sketch, - CoreService, CoreError, + CoreService, + FileSystemExt, ResponseServiceClient, + Sketch, + SketchesService, } from '../../common/protocol'; +import { + ExecuteWithProgress, + UserAbortApplicationError, +} from '../../common/protocol/progressible'; import { ArduinoPreferences } from '../arduino-preferences'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; -import { nls } from '@theia/core'; -import { OutputChannelManager } from '../theia/output/output-channel'; -import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; -import { ExecuteWithProgress } from '../../common/protocol/progressible'; -import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { BoardsDataStore } from '../boards/boards-data-store'; -import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager'; -import { MessageType } from '@theia/core/lib/common/message-service-protocol'; -import { WorkspaceService } from '../theia/workspace/workspace-service'; -import { MainMenuManager } from '../../common/main-menu-manager'; +import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ConfigServiceClient } from '../config/config-service-client'; -import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { DialogService } from '../dialog-service'; +import { SettingsService } from '../dialogs/settings/settings'; +import { + CurrentSketch, + SketchesServiceClientImpl, +} from '../sketches-service-client-impl'; import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; +import { OutputChannelManager } from '../theia/output/output-channel'; +import { WorkspaceService } from '../theia/workspace/workspace-service'; export { Command, CommandRegistry, - MenuModelRegistry, KeybindingRegistry, + MenuModelRegistry, + Sketch, TabBarToolbarRegistry, URI, - Sketch, open, }; @@ -247,6 +253,12 @@ export abstract class CoreServiceContribution extends SketchContribution { } protected handleError(error: unknown): void { + if (isObject(error) && UserAbortApplicationError.is(error)) { + this.outputChannelManager + .getChannel('Arduino') + .appendLine(userAbort, OutputChannelSeverity.Warning); + return; + } this.tryToastErrorMessage(error); } @@ -293,7 +305,13 @@ export abstract class CoreServiceContribution extends SketchContribution { protected async doWithProgress<T>(options: { progressText: string; keepOutput?: boolean; - task: (progressId: string, coreService: CoreService) => Promise<T>; + task: ( + progressId: string, + coreService: CoreService, + cancellationToken?: CancellationToken + ) => Promise<T>; + // false by default + cancelable?: boolean; }): Promise<T> { const toDisposeOnComplete = new DisposableCollection( this.maybeActivateMonitorWidget() @@ -306,8 +324,10 @@ export abstract class CoreServiceContribution extends SketchContribution { messageService: this.messageService, responseService: this.responseService, progressText, - run: ({ progressId }) => task(progressId, this.coreService), + run: ({ progressId, cancellationToken }) => + task(progressId, this.coreService, cancellationToken), keepOutput, + cancelable: options.cancelable, }); toDisposeOnComplete.dispose(); return result; diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index 75c591dba..d6745d232 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -136,9 +136,10 @@ export class UploadSketch extends CoreServiceContribution { const uploadResponse = await this.doWithProgress({ progressText: nls.localize('arduino/sketch/uploading', 'Uploading...'), - task: (progressId, coreService) => - coreService.upload({ ...uploadOptions, progressId }), + task: (progressId, coreService, token) => + coreService.upload({ ...uploadOptions, progressId }, token), keepOutput: true, + cancelable: true, }); // the port update is NOOP if nothing has changed this.boardsServiceProvider.updateConfig(uploadResponse.portAfterUpload); diff --git a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts index bd6b60ff8..999c3ec5c 100644 --- a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts @@ -1,18 +1,18 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; import { Emitter } from '@theia/core/lib/common/event'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import type { CoreService } from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; +import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { - CoreServiceContribution, Command, CommandRegistry, - MenuModelRegistry, + CoreServiceContribution, KeybindingRegistry, + MenuModelRegistry, TabBarToolbarRegistry, } from './contribution'; -import { nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../sketches-service-client-impl'; -import { CoreService } from '../../common/protocol'; import { CoreErrorHandler } from './core-error-handler'; export interface VerifySketchParams { @@ -131,11 +131,15 @@ export class VerifySketch extends CoreServiceContribution { 'arduino/sketch/compile', 'Compiling sketch...' ), - task: (progressId, coreService) => - coreService.compile({ - ...options, - progressId, - }), + task: (progressId, coreService, token) => + coreService.compile( + { + ...options, + progressId, + }, + token + ), + cancelable: true, }); this.messageService.info( nls.localize('arduino/sketch/doneCompiling', 'Done compiling.'), diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index 690799923..660bcec06 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -12,15 +12,13 @@ import { LibrarySearch, LibraryService, } from '../../common/protocol/library-service'; -import { - ListWidget, - UserAbortError, -} from '../widgets/component-list/list-widget'; +import { ListWidget } from '../widgets/component-list/list-widget'; import { Installable } from '../../common/protocol'; import { ListItemRenderer } from '../widgets/component-list/list-item-renderer'; import { nls } from '@theia/core/lib/common'; import { LibraryFilterRenderer } from '../widgets/component-list/filter-renderer'; import { findChildTheiaButton, splitByBoldTag } from '../utils/dom'; +import { UserAbortError } from '../../common/protocol/progressible'; @injectable() export class LibraryListWidget extends ListWidget< 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 1e13b1417..d5e320ee1 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx @@ -2,7 +2,7 @@ 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'; -import { UserAbortError } from './list-widget'; +import { UserAbortError } from '../../../common/protocol/progressible'; export class ComponentListItem< T extends ArduinoComponent 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 0039d76d1..086ffbf4f 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx @@ -5,7 +5,10 @@ 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 { + ExecuteWithProgress, + UserAbortError, +} from '../../../common/protocol/progressible'; import { Installable, libraryInstallFailed, @@ -13,7 +16,7 @@ import { } from '../../../common/protocol/installable'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { SearchBar } from './search-bar'; -import { ListWidget, UserAbortError } from './list-widget'; +import { ListWidget } from './list-widget'; import { ComponentList } from './component-list'; import { ListItemRenderer } from './list-item-renderer'; import { 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 7603f44c0..d13d4ac7d 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -192,10 +192,3 @@ export namespace ListWidget { readonly defaultSearchOptions: S; } } - -export class UserAbortError extends Error { - constructor(message = 'User abort') { - super(message); - Object.setPrototypeOf(this, UserAbortError.prototype); - } -} diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index d824f1751..7514a45c8 100644 --- a/arduino-ide-extension/src/common/nls.ts +++ b/arduino-ide-extension/src/common/nls.ts @@ -39,3 +39,5 @@ export const noSketchOpened = nls.localize( 'arduino/common/noSketchOpened', 'No sketch opened' ); + +export const userAbort = nls.localize('arduino/common/userAbort', 'User abort'); diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 9104df01e..f3a681d48 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -1,4 +1,5 @@ import { ApplicationError } from '@theia/core/lib/common/application-error'; +import type { CancellationToken } from '@theia/core/lib/common/cancellation'; import { nls } from '@theia/core/lib/common/nls'; import type { Location, @@ -7,7 +8,7 @@ import type { } from '@theia/core/shared/vscode-languageserver-protocol'; import type { CompileSummary as ApiCompileSummary } from 'vscode-arduino-api'; import type { BoardUserField, Installable } from '../../common/protocol/'; -import { isPortIdentifier, PortIdentifier, Programmer } from './boards-service'; +import { PortIdentifier, Programmer, isPortIdentifier } from './boards-service'; import type { IndexUpdateSummary } from './notification-service'; import type { Sketch } from './sketches-service'; @@ -162,9 +163,18 @@ export function isUploadResponse(arg: unknown): arg is UploadResponse { export const CoreServicePath = '/services/core-service'; export const CoreService = Symbol('CoreService'); export interface CoreService { - compile(options: CoreService.Options.Compile): Promise<void>; - upload(options: CoreService.Options.Upload): Promise<UploadResponse>; - burnBootloader(options: CoreService.Options.Bootloader): Promise<void>; + compile( + options: CoreService.Options.Compile, + cancellationToken?: CancellationToken + ): Promise<void>; + upload( + options: CoreService.Options.Upload, + cancellationToken?: CancellationToken + ): Promise<UploadResponse>; + burnBootloader( + options: CoreService.Options.Bootloader, + cancellationToken?: CancellationToken + ): Promise<void>; /** * Refreshes the underling core gRPC client for the Arduino CLI. */ diff --git a/arduino-ide-extension/src/common/protocol/progressible.ts b/arduino-ide-extension/src/common/protocol/progressible.ts index c27737ccc..d01bc270d 100644 --- a/arduino-ide-extension/src/common/protocol/progressible.ts +++ b/arduino-ide-extension/src/common/protocol/progressible.ts @@ -1,22 +1,48 @@ +import { ApplicationError } from '@theia/core/lib/common/application-error'; import type { CancellationToken } from '@theia/core/lib/common/cancellation'; import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; import type { MessageService } from '@theia/core/lib/common/message-service'; import type { Progress } from '@theia/core/lib/common/message-service-protocol'; +import { userAbort } from '../nls'; import type { ResponseServiceClient } from './response-service'; +export const UserAbortApplicationError = ApplicationError.declare( + 9999, + (message: string, uri: string) => { + return { + message, + data: { uri }, + }; + } +); + +export class UserAbortError extends Error { + constructor() { + super(userAbort); + Object.setPrototypeOf(this, UserAbortError.prototype); + } +} + export namespace ExecuteWithProgress { export async function doWithProgress<T>(options: { - run: ({ progressId }: { progressId: string }) => Promise<T>; + run: ({ + progressId, + cancellationToken, + }: { + progressId: string; + cancellationToken?: CancellationToken; + }) => Promise<T>; messageService: MessageService; responseService: ResponseServiceClient; progressText: string; keepOutput?: boolean; + cancelable?: boolean; }): Promise<T> { return withProgress( options.progressText, options.messageService, // eslint-disable-next-line @typescript-eslint/no-unused-vars - async (progress, _token) => { + async (progress, token) => { const progressId = progress.id; const toDispose = options.responseService.onProgressDidChange( (progressMessage) => { @@ -30,24 +56,29 @@ export namespace ExecuteWithProgress { if (!options.keepOutput) { options.responseService.clearOutput(); } - const result = await options.run({ progressId }); + const result = await options.run({ + progressId, + cancellationToken: token, + }); return result; } finally { toDispose.dispose(); } - } + }, + options.cancelable ); } export async function withProgress<T>( text: string, messageService: MessageService, - cb: (progress: Progress, token: CancellationToken) => Promise<T> + cb: (progress: Progress, token: CancellationToken) => Promise<T>, + cancelable = false ): Promise<T> { const cancellationSource = new CancellationTokenSource(); const { token } = cancellationSource; const progress = await messageService.showProgress( - { text, options: { cancelable: false } }, + { text, options: { cancelable } }, () => cancellationSource.cancel() ); try { diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 3a9677c18..9cb1c4584 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,22 +1,44 @@ +import type { ClientReadableStream } from '@grpc/grpc-js'; +import { ApplicationError } from '@theia/core/lib/common/application-error'; +import type { CancellationToken } from '@theia/core/lib/common/cancellation'; +import { CommandService } from '@theia/core/lib/common/command'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import type { Mutable } from '@theia/core/lib/common/types'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { relative } from 'node:path'; import * as jspb from 'google-protobuf'; import { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb'; -import type { ClientReadableStream } from '@grpc/grpc-js'; +import path from 'node:path'; import { + UploadResponse as ApiUploadResponse, + OutputMessage, + Port, + PortIdentifier, + resolveDetectedPort, +} from '../common/protocol'; +import { + CompileSummary, CompilerWarnings, - CoreService, CoreError, - CompileSummary, + CoreService, isCompileSummary, isUploadResponse, } from '../common/protocol/core-service'; +import { ResponseService } from '../common/protocol/response-service'; +import { firstToUpperCase, notEmpty } from '../common/utils'; +import { BoardDiscovery, createApiPort } from './board-discovery'; +import { tryParseError } from './cli-error-parser'; +import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; +import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CompileRequest, CompileResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; -import { CoreClientAware } from './core-client-provider'; +import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; import { BurnBootloaderRequest, BurnBootloaderResponse, @@ -25,26 +47,13 @@ import { UploadUsingProgrammerRequest, UploadUsingProgrammerResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; -import { ResponseService } from '../common/protocol/response-service'; -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'; +import { CoreClientAware } from './core-client-provider'; +import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible'; import { MonitorManager } from './monitor-manager'; -import { AutoFlushingBuffer } from './utils/buffers'; -import { tryParseError } from './cli-error-parser'; -import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; -import { firstToUpperCase, notEmpty } from '../common/utils'; import { ServiceError } from './service-error'; -import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible'; -import type { Mutable } from '@theia/core/lib/common/types'; -import { BoardDiscovery, createApiPort } from './board-discovery'; +import { AutoFlushingBuffer } from './utils/buffers'; +import { userAbort } from '../common/nls'; +import { UserAbortApplicationError } from '../common/protocol/progressible'; namespace Uploadable { export type Request = UploadRequest | UploadUsingProgrammerRequest; @@ -64,9 +73,13 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { @inject(BoardDiscovery) private readonly boardDiscovery: BoardDiscovery; - async compile(options: CoreService.Options.Compile): Promise<void> { + async compile( + options: CoreService.Options.Compile, + cancellationToken?: CancellationToken + ): Promise<void> { const coreClient = await this.coreClient; const { client, instance } = coreClient; + const request = this.compileRequest(options, instance); const compileSummary = <CompileSummaryFragment>{}; const progressHandler = this.createProgressHandler(options); const compileSummaryHandler = (response: CompileResponse) => @@ -75,10 +88,15 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { progressHandler, compileSummaryHandler ); - const request = this.compileRequest(options, instance); + const toDisposeOnFinally = new DisposableCollection(handler); return new Promise<void>((resolve, reject) => { - client - .compile(request) + const call = client.compile(request); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) + ); + } + call .on('data', handler.onData) .on('error', (error) => { if (!ServiceError.is(error)) { @@ -87,30 +105,39 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { error ); reject(error); - } else { - const compilerErrors = tryParseError({ - content: handler.content, - sketch: options.sketch, - }); - const message = nls.localize( - 'arduino/compile/error', - 'Compilation error: {0}', - compilerErrors - .map(({ message }) => message) - .filter(notEmpty) - .shift() ?? error.details - ); - this.sendResponse( - error.details + '\n\n' + message, - OutputMessage.Severity.Error - ); - reject(CoreError.VerifyFailed(message, compilerErrors)); + return; } + if (ServiceError.isCancel(error)) { + console.log(userAbort); + reject(UserAbortApplicationError()); + return; + } + const compilerErrors = tryParseError({ + content: handler.content, + sketch: options.sketch, + }); + const message = nls.localize( + 'arduino/compile/error', + 'Compilation error: {0}', + compilerErrors + .map(({ message }) => message) + .filter(notEmpty) + .shift() ?? error.details + ); + this.sendResponse( + error.details + '\n\n' + message, + OutputMessage.Severity.Error + ); + reject(CoreError.VerifyFailed(message, compilerErrors)); }) .on('end', resolve); }).finally(() => { - handler.dispose(); + toDisposeOnFinally.dispose(); if (!isCompileSummary(compileSummary)) { + if (cancellationToken && cancellationToken.isCancellationRequested) { + // NOOP + return; + } console.error( `Have not received the full compile summary from the CLI while running the compilation. ${JSON.stringify( compileSummary @@ -176,7 +203,10 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { return request; } - upload(options: CoreService.Options.Upload): Promise<ApiUploadResponse> { + upload( + options: CoreService.Options.Upload, + cancellationToken?: CancellationToken + ): Promise<ApiUploadResponse> { const { usingProgrammer } = options; return this.doUpload( options, @@ -190,7 +220,8 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { usingProgrammer ? CoreError.UploadUsingProgrammerFailed : CoreError.UploadFailed, - `upload${usingProgrammer ? ' using programmer' : ''}` + `upload${usingProgrammer ? ' using programmer' : ''}`, + cancellationToken ); } @@ -204,7 +235,8 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { client: ArduinoCoreServiceClient ) => (request: REQ) => ClientReadableStream<RESP>, errorCtor: ApplicationError.Constructor<number, CoreError.ErrorLocation[]>, - task: string + task: string, + cancellationToken?: CancellationToken ): Promise<ApiUploadResponse> { const portBeforeUpload = options.port; const uploadResponseFragment: Mutable<Partial<ApiUploadResponse>> = { @@ -241,33 +273,47 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { progressHandler, updateUploadResponseFragmentHandler ); + const toDisposeOnFinally = new DisposableCollection(handler); const grpcCall = responseFactory(client); return this.notifyUploadWillStart(options).then(() => new Promise<ApiUploadResponse>((resolve, reject) => { - grpcCall(this.initUploadRequest(request, options, instance)) + const call = grpcCall( + this.initUploadRequest(request, options, instance) + ); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) + ); + } + call .on('data', handler.onData) .on('error', (error) => { if (!ServiceError.is(error)) { console.error(`Unexpected error occurred while ${task}.`, error); reject(error); - } else { - const message = nls.localize( - 'arduino/upload/error', - '{0} error: {1}', - firstToUpperCase(task), - error.details - ); - this.sendResponse(error.details, OutputMessage.Severity.Error); - reject( - errorCtor( - message, - tryParseError({ - content: handler.content, - sketch: options.sketch, - }) - ) - ); + return; + } + if (ServiceError.isCancel(error)) { + console.log(userAbort); + reject(UserAbortApplicationError()); + return; } + const message = nls.localize( + 'arduino/upload/error', + '{0} error: {1}', + firstToUpperCase(task), + error.details + ); + this.sendResponse(error.details, OutputMessage.Severity.Error); + reject( + errorCtor( + message, + tryParseError({ + content: handler.content, + sketch: options.sketch, + }) + ) + ); }) .on('end', () => { if (isUploadResponse(uploadResponseFragment)) { @@ -285,7 +331,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { } }); }).finally(async () => { - handler.dispose(); + toDisposeOnFinally.dispose(); await this.notifyUploadDidFinish( Object.assign(options, { afterPort: uploadResponseFragment.portAfterUpload, @@ -320,16 +366,25 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { return request; } - async burnBootloader(options: CoreService.Options.Bootloader): Promise<void> { + async burnBootloader( + options: CoreService.Options.Bootloader, + cancellationToken?: CancellationToken + ): Promise<void> { const coreClient = await this.coreClient; const { client, instance } = coreClient; const progressHandler = this.createProgressHandler(options); const handler = this.createOnDataHandler(progressHandler); const request = this.burnBootloaderRequest(options, instance); + const toDisposeOnFinally = new DisposableCollection(handler); return this.notifyUploadWillStart(options).then(() => new Promise<void>((resolve, reject) => { - client - .burnBootloader(request) + const call = client.burnBootloader(request); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) + ); + } + call .on('data', handler.onData) .on('error', (error) => { if (!ServiceError.is(error)) { @@ -338,23 +393,28 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { error ); reject(error); - } else { - this.sendResponse(error.details, OutputMessage.Severity.Error); - reject( - CoreError.BurnBootloaderFailed( - nls.localize( - 'arduino/burnBootloader/error', - 'Error while burning the bootloader: {0}', - error.details - ), - tryParseError({ content: handler.content }) - ) - ); + return; } + if (ServiceError.isCancel(error)) { + console.log(userAbort); + reject(UserAbortApplicationError()); + return; + } + this.sendResponse(error.details, OutputMessage.Severity.Error); + reject( + CoreError.BurnBootloaderFailed( + nls.localize( + 'arduino/burnBootloader/error', + 'Error while burning the bootloader: {0}', + error.details + ), + tryParseError({ content: handler.content }) + ) + ); }) .on('end', resolve); }).finally(async () => { - handler.dispose(); + toDisposeOnFinally.dispose(); await this.notifyUploadDidFinish( Object.assign(options, { afterPort: options.port }) ); @@ -463,7 +523,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { for (const uri of Object.keys(options.sourceOverride)) { const content = options.sourceOverride[uri]; if (content) { - const relativePath = relative(sketchPath, FileUri.fsPath(uri)); + const relativePath = path.relative(sketchPath, FileUri.fsPath(uri)); req.getSourceOverrideMap().set(relativePath, content); } } diff --git a/i18n/en.json b/i18n/en.json index 234781e58..c83d280c1 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -152,7 +152,8 @@ "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Unknown", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" From a088ba99f550708655b6b17bc3aa1b8cc2e15ec4 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 8 Feb 2024 16:30:09 +0100 Subject: [PATCH 313/384] fix: invalid custom board option handling in FQBN Closes arduino/arduino-ide#1588 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- arduino-ide-extension/package.json | 1 + .../src/browser/boards/boards-data-store.ts | 107 +++++--- .../browser/boards/boards-service-provider.ts | 60 ++++- .../contributions/boards-data-menu-updater.ts | 3 +- .../src/browser/contributions/ino-language.ts | 13 +- .../browser/contributions/upload-sketch.ts | 9 +- .../src/common/protocol/boards-service.ts | 58 +--- .../src/node/board-discovery.ts | 20 +- .../browser/board-service-provider.test.ts | 30 +++ .../test/browser/boards-data-store.test.ts | 248 +++++++++++++++++- yarn.lock | 176 ++++++++++++- 11 files changed, 586 insertions(+), 139 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 89cef04fe..8963b4f5a 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -72,6 +72,7 @@ "fast-json-stable-stringify": "^2.1.0", "fast-safe-stringify": "^2.1.1", "filename-reserved-regex": "^2.0.0", + "fqbn": "^1.0.5", "glob": "^7.1.6", "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", 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 e78f5b74b..1c23fb38f 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -12,6 +12,7 @@ import { ILogger } from '@theia/core/lib/common/logger'; import { deepClone, deepFreeze } from '@theia/core/lib/common/objects'; import type { Mutable } from '@theia/core/lib/common/types'; import { inject, injectable, named } from '@theia/core/shared/inversify'; +import { FQBN } from 'fqbn'; import { BoardDetails, BoardsService, @@ -20,6 +21,7 @@ import { Programmer, isBoardIdentifierChangeEvent, isProgrammer, + sanitizeFqbn, } from '../../common/protocol'; import { notEmpty } from '../../common/utils'; import type { @@ -29,6 +31,14 @@ import type { import { NotificationCenter } from '../notification-center'; import { BoardsServiceProvider } from './boards-service-provider'; +export interface SelectConfigOptionParams { + readonly fqbn: string; + readonly optionsToUpdate: readonly Readonly<{ + option: string; + selectedValue: string; + }>[]; +} + @injectable() export class BoardsDataStore implements @@ -64,7 +74,12 @@ export class BoardsDataStore this.toDispose.pushAll([ this.boardsServiceProvider.onBoardsConfigDidChange((event) => { if (isBoardIdentifierChangeEvent(event)) { - this.updateSelectedBoardData(event.selectedBoard?.fqbn); + this.updateSelectedBoardData( + event.selectedBoard?.fqbn, + // If the change event comes from toolbar and the FQBN contains custom board options, change the currently selected options + // https://github.com/arduino/arduino-ide/issues/1588 + event.reason === 'toolbar' + ); } }), this.notificationCenter.onPlatformDidInstall(async ({ item }) => { @@ -116,7 +131,7 @@ export class BoardsDataStore if (!fqbn) { return undefined; } else { - const data = await this.getData(fqbn); + const data = await this.getData(sanitizeFqbn(fqbn)); if (data === BoardsDataStore.Data.EMPTY) { return undefined; } @@ -125,9 +140,22 @@ export class BoardsDataStore } private async updateSelectedBoardData( - fqbn: string | undefined + fqbn: string | undefined, + updateConfigOptions = false ): Promise<void> { this._selectedBoardData = await this.getSelectedBoardData(fqbn); + if (fqbn && updateConfigOptions) { + const { options } = new FQBN(fqbn); + if (options) { + const optionsToUpdate = Object.entries(options).map(([key, value]) => ({ + option: key, + selectedValue: value, + })); + const params = { fqbn, optionsToUpdate }; + await this.selectConfigOption(params); + this._selectedBoardData = await this.getSelectedBoardData(fqbn); // reload the updated data + } + } } onStop(): void { @@ -168,7 +196,7 @@ export class BoardsDataStore return undefined; } const { configOptions } = await this.getData(fqbn); - return ConfigOption.decorate(fqbn, configOptions); + return new FQBN(fqbn).withConfigOptions(...configOptions).toString(); } async getData(fqbn: string | undefined): Promise<BoardsDataStore.Data> { @@ -201,48 +229,63 @@ export class BoardsDataStore fqbn: string; selectedProgrammer: Programmer; }): Promise<boolean> { - const storedData = deepClone(await this.getData(fqbn)); + const sanitizedFQBN = sanitizeFqbn(fqbn); + const storedData = deepClone(await this.getData(sanitizedFQBN)); const { programmers } = storedData; if (!programmers.find((p) => Programmer.equals(selectedProgrammer, p))) { return false; } - const data = { ...storedData, selectedProgrammer }; - await this.setData({ fqbn, data }); - this.fireChanged({ fqbn, data }); + const change: BoardsDataStoreChange = { + fqbn: sanitizedFQBN, + data: { ...storedData, selectedProgrammer }, + }; + await this.setData(change); + this.fireChanged(change); return true; } - async selectConfigOption({ - fqbn, - option, - selectedValue, - }: { - fqbn: string; - option: string; - selectedValue: string; - }): Promise<boolean> { - const data = deepClone(await this.getData(fqbn)); - const { configOptions } = data; - const configOption = configOptions.find((c) => c.option === option); - if (!configOption) { + async selectConfigOption(params: SelectConfigOptionParams): Promise<boolean> { + const { fqbn, optionsToUpdate } = params; + if (!optionsToUpdate.length) { return false; } - let updated = false; - for (const value of configOption.values) { - const mutable: Mutable<ConfigValue> = value; - if (mutable.value === selectedValue) { - mutable.selected = true; - updated = true; - } else { - mutable.selected = false; + + const sanitizedFQBN = sanitizeFqbn(fqbn); + const mutableData = deepClone(await this.getData(sanitizedFQBN)); + let didChange = false; + + for (const { option, selectedValue } of optionsToUpdate) { + const { configOptions } = mutableData; + const configOption = configOptions.find((c) => c.option === option); + if (configOption) { + const configOptionValueIndex = configOption.values.findIndex( + (configOptionValue) => configOptionValue.value === selectedValue + ); + if (configOptionValueIndex >= 0) { + // unselect all + configOption.values + .map((value) => value as Mutable<ConfigValue>) + .forEach((value) => (value.selected = false)); + const mutableConfigValue: Mutable<ConfigValue> = + configOption.values[configOptionValueIndex]; + // make the new value `selected` + mutableConfigValue.selected = true; + didChange = true; + } } } - if (!updated) { + + if (!didChange) { return false; } - await this.setData({ fqbn, data }); - this.fireChanged({ fqbn, data }); + + const change: BoardsDataStoreChange = { + fqbn: sanitizedFQBN, + data: mutableData, + }; + await this.setData(change); + this.fireChanged(change); return true; } 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 f1182adbf..29bccb242 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -12,6 +12,7 @@ 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 { nls } from '@theia/core/lib/common/nls'; +import { deepClone } from '@theia/core/lib/common/objects'; import { Deferred } from '@theia/core/lib/common/promise-util'; import type { Mutable } from '@theia/core/lib/common/types'; import { inject, injectable, optional } from '@theia/core/shared/inversify'; @@ -21,31 +22,32 @@ import { } from '@theia/output/lib/browser/output-channel'; import { BoardIdentifier, - boardIdentifierEquals, + BoardUserField, + BoardWithPackage, BoardsConfig, BoardsConfigChangeEvent, BoardsPackage, BoardsService, - BoardUserField, - BoardWithPackage, DetectedPorts, + Port, + PortIdentifier, + boardIdentifierEquals, emptyBoardsConfig, isBoardIdentifier, isBoardIdentifierChangeEvent, isPortIdentifier, isPortIdentifierChangeEvent, - Port, - PortIdentifier, portIdentifierEquals, + sanitizeFqbn, serializePlatformIdentifier, } from '../../common/protocol'; import { BoardList, BoardListHistory, - createBoardList, EditBoardsConfigActionParams, - isBoardListHistory, SelectBoardsConfigActionParams, + createBoardList, + isBoardListHistory, } from '../../common/protocol/board-list'; import type { Defined } from '../../common/types'; import type { @@ -104,6 +106,21 @@ type BoardListHistoryUpdateResult = type BoardToSelect = BoardIdentifier | undefined | 'ignore-board'; type PortToSelect = PortIdentifier | undefined | 'ignore-port'; +function sanitizeBoardToSelectFQBN(board: BoardToSelect): BoardToSelect { + if (isBoardIdentifier(board)) { + return sanitizeBoardIdentifierFQBN(board); + } + return board; +} +function sanitizeBoardIdentifierFQBN(board: BoardIdentifier): BoardIdentifier { + if (board.fqbn) { + const copy: Mutable<BoardIdentifier> = deepClone(board); + copy.fqbn = sanitizeFqbn(board.fqbn); + return copy; + } + return board; +} + interface UpdateBoardListHistoryParams { readonly portToSelect: PortToSelect; readonly boardToSelect: BoardToSelect; @@ -136,6 +153,9 @@ export interface BoardListUIActions { } export type BoardListUI = BoardList & BoardListUIActions; +export type BoardsConfigChangeEventUI = BoardsConfigChangeEvent & + Readonly<{ reason?: UpdateBoardsConfigReason }>; + @injectable() export class BoardListDumper implements Disposable { @inject(OutputChannelManager) @@ -190,7 +210,7 @@ export class BoardsServiceProvider private _ready = new Deferred<void>(); private readonly boardsConfigDidChangeEmitter = - new Emitter<BoardsConfigChangeEvent>(); + new Emitter<BoardsConfigChangeEventUI>(); readonly onBoardsConfigDidChange = this.boardsConfigDidChangeEmitter.event; private readonly boardListDidChangeEmitter = new Emitter<BoardListUI>(); @@ -353,7 +373,8 @@ export class BoardsServiceProvider portToSelect !== 'ignore-port' && !portIdentifierEquals(portToSelect, previousSelectedPort); const boardDidChangeEvent = boardDidChange - ? { selectedBoard: boardToSelect, previousSelectedBoard } + ? // The change event must always contain any custom board options. Hence the board to select is not sanitized. + { selectedBoard: boardToSelect, previousSelectedBoard } : undefined; const portDidChangeEvent = portDidChange ? { selectedPort: portToSelect, previousSelectedPort } @@ -374,16 +395,31 @@ export class BoardsServiceProvider return false; } - this.maybeUpdateBoardListHistory({ portToSelect, boardToSelect }); - this.maybeUpdateBoardsData({ boardToSelect, reason }); + // unlike for the board change event, every persistent state must not contain custom board config options in the FQBN + const sanitizedBoardToSelect = sanitizeBoardToSelectFQBN(boardToSelect); + + this.maybeUpdateBoardListHistory({ + portToSelect, + boardToSelect: sanitizedBoardToSelect, + }); + this.maybeUpdateBoardsData({ + boardToSelect: sanitizedBoardToSelect, + reason, + }); if (isBoardIdentifierChangeEvent(event)) { - this._boardsConfig.selectedBoard = event.selectedBoard; + this._boardsConfig.selectedBoard = event.selectedBoard + ? sanitizeBoardIdentifierFQBN(event.selectedBoard) + : event.selectedBoard; } if (isPortIdentifierChangeEvent(event)) { this._boardsConfig.selectedPort = event.selectedPort; } + if (reason) { + event = Object.assign(event, { reason }); + } + this.boardsConfigDidChangeEmitter.fire(event); this.refreshBoardList(); this.saveState(); diff --git a/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts b/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts index ea085f5ba..382e0f2ef 100644 --- a/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts +++ b/arduino-ide-extension/src/browser/contributions/boards-data-menu-updater.ts @@ -87,8 +87,7 @@ export class BoardsDataMenuUpdater extends Contribution { execute: () => this.boardsDataStore.selectConfigOption({ fqbn, - option, - selectedValue: value.value, + optionsToUpdate: [{ option, selectedValue: value.value }], }), isToggled: () => value.selected, }; diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index ca3019e1b..4f336ef3d 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -9,7 +9,6 @@ import { BoardIdentifier, BoardsService, ExecutableService, - assertSanitizedFqbn, isBoardIdentifierChangeEvent, sanitizeFqbn, } from '../../common/protocol'; @@ -159,14 +158,11 @@ export class InoLanguage extends SketchContribution { this.notificationCenter.onDidReinitialize(() => forceRestart()), this.boardDataStore.onDidChange((event) => { if (this.languageServerFqbn) { - const sanitizedFqbn = sanitizeFqbn(this.languageServerFqbn); - if (!sanitizeFqbn) { - throw new Error( - `Failed to sanitize the FQBN of the running language server. FQBN with the board settings was: ${this.languageServerFqbn}` - ); - } + const sanitizedFQBN = sanitizeFqbn(this.languageServerFqbn); + // The incoming FQBNs might contain custom boards configs, sanitize them before the comparison. + // https://github.com/arduino/arduino-ide/pull/2113#pullrequestreview-1499998328 const matchingChange = event.changes.find( - (change) => change.fqbn === sanitizedFqbn + (change) => sanitizedFQBN === sanitizeFqbn(change.fqbn) ); const { boardsConfig } = this.boardsServiceProvider; if ( @@ -228,7 +224,6 @@ export class InoLanguage extends SketchContribution { } return; } - assertSanitizedFqbn(fqbn); const fqbnWithConfig = await this.boardDataStore.appendConfigToFqbn(fqbn); if (!fqbnWithConfig) { throw new Error( diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index d6745d232..9cee46abb 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -1,7 +1,8 @@ import { Emitter } from '@theia/core/lib/common/event'; import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { CoreService, sanitizeFqbn } from '../../common/protocol'; +import { FQBN } from 'fqbn'; +import { CoreService } from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; @@ -173,7 +174,11 @@ export class UploadSketch extends CoreServiceContribution { const [fqbn, { selectedProgrammer: programmer }, verify, verbose] = await Promise.all([ verifyOptions.fqbn, // already decorated FQBN - this.boardsDataStore.getData(sanitizeFqbn(verifyOptions.fqbn)), + this.boardsDataStore.getData( + verifyOptions.fqbn + ? new FQBN(verifyOptions.fqbn).toString(true) + : undefined + ), this.preferences.get('arduino.upload.verify'), this.preferences.get('arduino.upload.verbose'), ]); diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index 1ae7c1811..d76406216 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -1,4 +1,5 @@ import { nls } from '@theia/core/lib/common/nls'; +import { FQBN } from 'fqbn'; import type { MaybePromise } from '@theia/core/lib/common/types'; import type URI from '@theia/core/lib/common/uri'; import { @@ -367,40 +368,6 @@ export interface ConfigOption { readonly values: ConfigValue[]; } export namespace ConfigOption { - /** - * Appends the configuration options to the `fqbn` argument. - * Throws an error if the `fqbn` does not have the `segment(':'segment)*` format. - * The provided output format is always segment(':'segment)*(':'option'='value(','option'='value)*)? - */ - export function decorate( - fqbn: string, - configOptions: ConfigOption[] - ): string { - if (!configOptions.length) { - return fqbn; - } - - const toValue = (values: ConfigValue[]) => { - const selectedValue = values.find(({ selected }) => selected); - if (!selectedValue) { - console.warn( - `None of the config values was selected. Values were: ${JSON.stringify( - values - )}` - ); - return undefined; - } - return selectedValue.value; - }; - const options = configOptions - .map(({ option, values }) => [option, toValue(values)]) - .filter(([, value]) => !!value) - .map(([option, value]) => `${option}=${value}`) - .join(','); - - return `${fqbn}:${options}`; - } - export class ConfigOptionError extends Error { constructor(message: string) { super(message); @@ -574,28 +541,13 @@ export namespace Board { } } -/** - * Throws an error if the `fqbn` argument is not sanitized. A sanitized FQBN has the `VENDOR:ARCHITECTURE:BOARD_ID` construct. - */ -export function assertSanitizedFqbn(fqbn: string): void { - if (fqbn.split(':').length !== 3) { - throw new Error( - `Expected a sanitized FQBN with three segments in the following format: 'VENDOR:ARCHITECTURE:BOARD_ID'. Got ${fqbn} instead.` - ); - } -} - /** * Converts the `VENDOR:ARCHITECTURE:BOARD_ID[:MENU_ID=OPTION_ID[,MENU2_ID=OPTION_ID ...]]` FQBN to * `VENDOR:ARCHITECTURE:BOARD_ID` format. * See the details of the `{build.fqbn}` entry in the [specs](https://arduino.github.io/arduino-cli/latest/platform-specification/#global-predefined-properties). */ -export function sanitizeFqbn(fqbn: string | undefined): string | undefined { - if (!fqbn) { - return undefined; - } - const [vendor, arch, id] = fqbn.split(':'); - return `${vendor}:${arch}:${id}`; +export function sanitizeFqbn(fqbn: string): string { + return new FQBN(fqbn).sanitize().toString(); } export type PlatformIdentifier = Readonly<{ vendorId: string; arch: string }>; @@ -752,8 +704,8 @@ export function boardIdentifierEquals( 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; + const leftFqbn = new FQBN(left.fqbn).toString(options.looseFqbn); + const rightFqbn = new FQBN(right.fqbn).toString(options.looseFqbn); return leftFqbn === rightFqbn; } // No more Genuino hack. diff --git a/arduino-ide-extension/src/node/board-discovery.ts b/arduino-ide-extension/src/node/board-discovery.ts index 628ed97ec..44a84ec38 100644 --- a/arduino-ide-extension/src/node/board-discovery.ts +++ b/arduino-ide-extension/src/node/board-discovery.ts @@ -267,24 +267,12 @@ export class BoardDiscovery 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)}` - ); - } + // Note that, the serial discovery might detect port details (such as addressLabel) in chunks. + // For example, first, the Teensy 4.1 port is detected with the `[no_device] Triple Serial` address label, + // Then, when more refinements are available, the same port is detected with `/dev/cu.usbmodem127902301 Triple Serial` address label. + // In such cases, an `add` event is received from the CLI, and the the detected port is overridden in the state. newState[key] = { port, boards }; } else if (eventType === EventType.Remove) { - 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]; } } 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 index 54d3aa8ba..dd733a2c6 100644 --- a/arduino-ide-extension/src/test/browser/board-service-provider.test.ts +++ b/arduino-ide-extension/src/test/browser/board-service-provider.test.ts @@ -170,6 +170,36 @@ describe('board-service-provider', () => { expect(events).deep.equals([expectedEvent]); }); + it('should ignore custom board configs from the FQBN', () => { + boardsServiceProvider['_boardsConfig'] = { + selectedBoard: uno, + selectedPort: unoSerialPort, + }; + const events: BoardsConfigChangeEvent[] = []; + toDisposeAfterEach.push( + boardsServiceProvider.onBoardsConfigDidChange((event) => + events.push(event) + ) + ); + const mkr1000WithCustomOptions = { + ...mkr1000, + fqbn: `${mkr1000.fqbn}:c1=v1`, + }; + const didUpdate = boardsServiceProvider.updateConfig( + mkr1000WithCustomOptions + ); + expect(didUpdate).to.be.true; + const expectedEvent: BoardIdentifierChangeEvent = { + previousSelectedBoard: uno, + selectedBoard: mkr1000WithCustomOptions, // the even has the custom board options + }; + expect(events).deep.equals([expectedEvent]); + // the persisted state does not have the config options property + expect(boardsServiceProvider.boardsConfig.selectedBoard?.fqbn).to.equal( + mkr1000.fqbn + ); + }); + it('should not update the board if did not change (board identifier)', () => { boardsServiceProvider['_boardsConfig'] = { selectedBoard: uno, diff --git a/arduino-ide-extension/src/test/browser/boards-data-store.test.ts b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts index 791c74e72..2ed808ad1 100644 --- a/arduino-ide-extension/src/test/browser/boards-data-store.test.ts +++ b/arduino-ide-extension/src/test/browser/boards-data-store.test.ts @@ -15,11 +15,14 @@ import { DisposableCollection, } from '@theia/core/lib/common/disposable'; import { MessageService } from '@theia/core/lib/common/message-service'; -import { wait } from '@theia/core/lib/common/promise-util'; +import { wait, waitForEvent } from '@theia/core/lib/common/promise-util'; import { Container, ContainerModule } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { BoardsDataStore } from '../../browser/boards/boards-data-store'; -import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { + BoardsServiceProvider, + UpdateBoardsConfigParams, +} from '../../browser/boards/boards-service-provider'; import { NotificationCenter } from '../../browser/notification-center'; import { BoardDetails, @@ -30,6 +33,7 @@ import { } from '../../common/protocol/boards-service'; import { NotificationServiceServer } from '../../common/protocol/notification-service'; import { bindBrowser } from './browser-test-bindings'; +import { unoSerialPort } from '../common/fixtures'; disableJSDOM(); @@ -256,8 +260,12 @@ describe('boards-data-store', function () { const result = await boardsDataStore.selectConfigOption({ fqbn, - option: configOption1.option, - selectedValue: configOption1.values[1].value, + optionsToUpdate: [ + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + ], }); expect(result).to.be.ok; @@ -409,8 +417,129 @@ describe('boards-data-store', function () { ); const result = await boardsDataStore.selectConfigOption({ fqbn, - option: configOption1.option, - selectedValue: configOption1.values[1].value, + optionsToUpdate: [ + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + ], + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + }); + + it('should select multiple config options', async () => { + // reconfigure the board details mock for this test case to have multiple config options + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption1, configOption2], + }, + ]) + ); + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1, configOption2], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + { + option: configOption2.option, + selectedValue: configOption2.values[1].value, + }, + ], + }); + expect(result).to.be.ok; + expect(didChangeCounter).to.be.equal(1); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + { + ...configOption2, + values: [ + { label: 'C2V1', selected: false, value: 'v1' }, + { label: 'C2V2', selected: true, value: 'v2' }, + ], + }, + ], + programmers: [edbg, jlink], + }); + }); + + it('should emit a did change event when updating with multiple config options and at least one of them is known (valid option + valid value)', async () => { + // reconfigure the board details mock for this test case to have multiple config options + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption1, configOption2], + }, + ]) + ); + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1, configOption2], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: 'an unknown option', + selectedValue: configOption1.values[1].value, + }, + { + option: configOption1.option, + selectedValue: configOption1.values[1].value, + }, + { + option: configOption2.option, + selectedValue: 'an unknown value', + }, + ], }); expect(result).to.be.ok; expect(didChangeCounter).to.be.equal(1); @@ -425,6 +554,103 @@ describe('boards-data-store', function () { { label: 'C1V2', selected: true, value: 'v2' }, ], }, + configOption2, + ], + programmers: [edbg, jlink], + }); + }); + + it('should not emit a did change event when updating with multiple config options and all of the are unknown', async () => { + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + const result = await boardsDataStore.selectConfigOption({ + fqbn, + optionsToUpdate: [ + { + option: 'an unknown option', + selectedValue: configOption1.values[1].value, + }, + { + option: configOption1.option, + selectedValue: 'an unknown value', + }, + ], + }); + expect(result).to.be.not.ok; + expect(didChangeCounter).to.be.equal(0); + + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1], + programmers: [edbg, jlink], + }); + }); + + it("should automatically update the selected config options if the boards config change 'reason' is the 'toolbar' and the (CLI) detected FQBN has config options", async () => { + // reconfigure the board details mock for this test case to have multiple config options + toDisposeAfterEach.push( + mockBoardDetails([ + { + fqbn, + ...baseDetails, + configOptions: [configOption1, configOption2], + }, + ]) + ); + + let data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [configOption1, configOption2], + programmers: [edbg, jlink], + }); + + let didChangeCounter = 0; + toDisposeAfterEach.push( + boardsDataStore.onDidChange(() => didChangeCounter++) + ); + + const boardsConfig = { + selectedPort: unoSerialPort, // the port value does not matter here, but the change must come from a toolbar as a boards config: with port+board, + selectedBoard: { + fqbn: `${board.fqbn}:${configOption1.option}=${configOption1.values[1].value},${configOption2.option}=${configOption2.values[1].value}`, + name: board.name, + }, + }; + const params: UpdateBoardsConfigParams = { + ...boardsConfig, + reason: 'toolbar', + }; + const updated = boardsServiceProvider.updateConfig(params); + expect(updated).to.be.ok; + + await waitForEvent(boardsDataStore.onDidChange, 100); + + expect(didChangeCounter).to.be.equal(1); + data = await boardsDataStore.getData(fqbn); + expect(data).to.be.deep.equal({ + configOptions: [ + { + ...configOption1, + values: [ + { label: 'C1V1', selected: false, value: 'v1' }, + { label: 'C1V2', selected: true, value: 'v2' }, + ], + }, + { + ...configOption2, + values: [ + { label: 'C2V1', selected: false, value: 'v1' }, + { label: 'C2V2', selected: true, value: 'v2' }, + ], + }, ], programmers: [edbg, jlink], }); @@ -444,8 +670,9 @@ describe('boards-data-store', function () { ); const result = await boardsDataStore.selectConfigOption({ fqbn, - option: 'missing', - selectedValue: configOption1.values[1].value, + optionsToUpdate: [ + { option: 'missing', selectedValue: configOption1.values[1].value }, + ], }); expect(result).to.be.not.ok; expect(didChangeCounter).to.be.equal(0); @@ -470,8 +697,9 @@ describe('boards-data-store', function () { ); const result = await boardsDataStore.selectConfigOption({ fqbn, - option: configOption1.option, - selectedValue: 'missing', + optionsToUpdate: [ + { option: configOption1.option, selectedValue: 'missing' }, + ], }); expect(result).to.be.not.ok; expect(didChangeCounter).to.be.equal(0); diff --git a/yarn.lock b/yarn.lock index fe12ae342..71a0d2acb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3885,6 +3885,14 @@ ardunno-cli@^0.1.2: nice-grpc-common "^2.0.2" protobufjs "^7.2.3" +ardunno-cli@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.8.tgz#c70b11b2ee0256227689079d01b828328bb1bfb6" + integrity sha512-DfyI98EFHdpc26nPYq2IXK6ZNypwBY0Fg+CAjYeGI/mjgQ1O9QUjNgz6NADwr+pcQ/ikhvLc88Ud9qR08CFTyg== + 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" @@ -4126,6 +4134,11 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" + integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== + axios@^1.0.0, axios@^1.6.2, axios@^1.6.7: version "1.6.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" @@ -4557,6 +4570,16 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.6.tgz#6c46675fc7a5e9de82d75a233d586c8b7ac0d931" + integrity sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + set-function-length "^1.2.0" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5513,6 +5536,30 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" +deep-equal@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -5554,6 +5601,16 @@ define-data-property@^1.0.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +define-data-property@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.2.tgz#f3c33b4f0102360cd7c0f5f28700f5678510b63a" + integrity sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -6102,6 +6159,26 @@ es-abstract@^1.22.1: unbox-primitive "^1.0.2" which-typed-array "^1.1.11" +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-iterator-helpers@^1.0.12: version "1.0.15" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" @@ -6881,6 +6958,15 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fqbn@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fqbn/-/fqbn-1.0.5.tgz#4a4ea6babadeffc12c4637d5a4f5ef57c7ef317b" + integrity sha512-ImcK5biXDRSQHsvC8XXhEZH/YPmW7lRrmTABv6m5D7HQz3Xzi5foHZxTxmeXekcrRkZOfIrDWWtpk2wtUJgPPA== + dependencies: + ardunno-cli "^0.1.7" + clone "^2.1.2" + deep-equal "^2.2.3" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6981,6 +7067,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" @@ -7069,6 +7160,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.2, get-intrinsic@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -7443,6 +7545,13 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" @@ -7460,6 +7569,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + 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" @@ -7478,6 +7594,13 @@ hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + hast-util-whitespace@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" @@ -7814,6 +7937,15 @@ inspect-with-kind@^1.0.5: dependencies: kind-of "^6.0.2" +internal-slot@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -7848,7 +7980,7 @@ ipaddr.js@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-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -8002,7 +8134,7 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1: +is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== @@ -8099,7 +8231,7 @@ 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-set@^2.0.1: +is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== @@ -10207,6 +10339,14 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -11914,6 +12054,18 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -12273,6 +12425,13 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -13711,6 +13870,17 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +which-typed-array@^1.1.13: + version "1.1.14" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" + integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== + dependencies: + available-typed-arrays "^1.0.6" + call-bind "^1.0.5" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.1" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" From 4217c0001db6b1b05eb0ad232cfe414158e0d4ec Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Tue, 20 Feb 2024 18:24:03 +0100 Subject: [PATCH 314/384] fix: add missing installed version to the platform Closes arduino/arduino-ide#2378 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/boards-service-impl.ts | 7 ++- .../node/boards-service-impl.slow-test.ts | 62 +++++++++++++++++-- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 9eefeec9f..8345f43fe 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -1,6 +1,7 @@ import { ILogger } from '@theia/core/lib/common/logger'; import { nls } from '@theia/core/lib/common/nls'; import { notEmpty } from '@theia/core/lib/common/objects'; +import { Mutable } from '@theia/core/lib/common/types'; import { inject, injectable } from '@theia/core/shared/inversify'; import { BoardDetails, @@ -592,7 +593,7 @@ function createBoardsPackage( const availableVersions = Array.from(versionReleaseMap.keys()) .sort(Installable.Version.COMPARATOR) .reverse(); - return { + const boardsPackage: Mutable<BoardsPackage> = { id, name, summary: nls.localize( @@ -607,6 +608,10 @@ function createBoardsPackage( deprecated, availableVersions, }; + if (summary.installedVersion) { + boardsPackage.installedVersion = summary.installedVersion; + } + return boardsPackage; } type PlatformSummaryWithMetadata = PlatformSummary.AsObject & 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 767bb9d6e..aa893a34f 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 @@ -1,7 +1,18 @@ -import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; -import { BoardSearch, BoardsService, Installable } from '../../common/protocol'; +import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import temp from 'temp'; +import { + BoardSearch, + BoardsPackage, + BoardsService, + Installable, +} from '../../common/protocol'; import { createBaseContainer, startDaemon } from './node-test-bindings'; describe('boards-service-impl', () => { @@ -10,8 +21,12 @@ describe('boards-service-impl', () => { before(async function () { this.timeout(20_000); - toDispose = new DisposableCollection(); - const container = await createContainer(); + const tracked = temp.track(); + toDispose = new DisposableCollection( + Disposable.create(() => tracked.cleanupSync()) + ); + const testDirPath = tracked.mkdirSync(); + const container = await createContainer(testDirPath); await start(container, toDispose); boardService = container.get<BoardsService>(BoardsService); }); @@ -110,10 +125,45 @@ describe('boards-service-impl', () => { expect(first.deprecated).to.be.false; }); }); + + it('should have the installed version set', async function () { + const timeout = 5 * 60 * 1_000; // five minutes to install/uninstall the core + this.timeout(timeout); + + // ensure installed + let result = await boardService.search({ query: 'arduino:avr' }); + let avr = result.find( + (boardsPackage) => boardsPackage.id === 'arduino:avr' + ); + expect(avr).to.be.not.undefined; + await boardService.install({ + item: <BoardsPackage>avr, + skipPostInstall: true, + }); + + // when installed the version is set + result = await boardService.search({ query: 'arduino:avr' }); + avr = result.find((boardsPackage) => boardsPackage.id === 'arduino:avr'); + expect(avr).to.be.not.undefined; + expect(avr?.installedVersion).to.be.not.undefined; + + // uninstall the core + await boardService.uninstall({ item: <BoardsPackage>avr }); + result = await boardService.search({ query: 'arduino:avr' }); + avr = result.find((boardsPackage) => boardsPackage.id === 'arduino:avr'); + expect(avr).to.be.not.undefined; + expect(avr?.installedVersion).to.be.undefined; + }); }); -async function createContainer(): Promise<Container> { - return createBaseContainer(); +async function createContainer(testDirPath: string): Promise<Container> { + const data = path.join(testDirPath, 'data'); + const user = path.join(testDirPath, 'user'); + await Promise.all([ + fs.mkdir(data, { recursive: true }), + fs.mkdir(user, { recursive: true }), + ]); + return createBaseContainer({ cliConfig: { directories: { data, user } } }); } async function start( From aa9b10d68e6653b7f40ab920173c7964aaefbfa4 Mon Sep 17 00:00:00 2001 From: Akos Kitta <a.kitta@arduino.cc> Date: Thu, 22 Feb 2024 12:27:43 +0100 Subject: [PATCH 315/384] fix: copy example with `.pde` main sketch file Closes arduino/arduino-ide#2377 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> --- .../src/node/sketches-service-impl.ts | 6 ++- .../node/sketches-service-impl.slow-test.ts | 38 +++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 21320000e..3a72c31d7 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -609,9 +609,13 @@ export class SketchesServiceImpl force: true, }); + const sourceMainSketchFilePath = FileUri.fsPath(sketch.mainFileUri); + // Can copy sketch with pde main sketch file: https://github.com/arduino/arduino-ide/issues/2377 + const ext = path.extname(sourceMainSketchFilePath); + // rename the main sketch file await fs.rename( - join(temp, `${sourceFolderBasename}.ino`), + join(temp, `${sourceFolderBasename}${ext}`), join(temp, `${destinationFolderBasename}.ino`) ); 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 37b839507..802c546cd 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 @@ -3,18 +3,19 @@ import { DisposableCollection, } from '@theia/core/lib/common/disposable'; import { isWindows } from '@theia/core/lib/common/os'; +import { URI } from '@theia/core/lib/common/uri'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; -import { promises as fs } from 'node:fs'; -import { basename, join } from 'node:path'; import { rejects } from 'node:assert/strict'; +import { promises as fs } from 'node:fs'; +import path, { basename, join } from 'node:path'; import { sync as rimrafSync } from 'rimraf'; import temp from 'temp'; import { Sketch, SketchesError, SketchesService } from '../../common/protocol'; import { - isAccessibleSketchPath, SketchesServiceImpl, + isAccessibleSketchPath, } from '../../node/sketches-service-impl'; import { ErrnoException } from '../../node/utils/errors'; import { createBaseContainer, startDaemon } from './node-test-bindings'; @@ -332,6 +333,37 @@ describe('sketches-service-impl', () => { ); }); + it('should copy sketch if the main sketch file has pde extension (#2377)', async () => { + const sketchesService = + container.get<SketchesServiceImpl>(SketchesService); + let sketch = await sketchesService.createNewSketch(); + toDispose.push(disposeSketch(sketch)); + expect(sketch.mainFileUri.endsWith('.ino')).to.be.true; + + // Create a sketch and rename the main sketch file to .pde + const mainSketchFilePathIno = FileUri.fsPath(new URI(sketch.mainFileUri)); + const sketchFolderPath = path.dirname(mainSketchFilePathIno); + const mainSketchFilePathPde = path.join( + sketchFolderPath, + `${basename(sketchFolderPath)}.pde` + ); + await fs.rename(mainSketchFilePathIno, mainSketchFilePathPde); + + sketch = await sketchesService.loadSketch(sketch.uri); + expect(sketch.mainFileUri.endsWith('.pde')).to.be.true; + + const tempDirPath = await sketchesService['createTempFolder'](); + const destinationPath = join(tempDirPath, 'GH-2377'); + const destinationUri = FileUri.create(destinationPath).toString(); + + await sketchesService.copy(sketch, { + destinationUri, + }); + + const copiedSketch = await sketchesService.loadSketch(destinationUri); + expect(copiedSketch.mainFileUri.endsWith('.ino')).to.be.true; + }); + it('should copy sketch inside the sketch folder', async () => { const sketchesService = container.get<SketchesServiceImpl>(SketchesService); From 2e78e96b75b8c8c3971f6b115eec558ba84d0317 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Wed, 3 Jul 2024 09:42:10 +0200 Subject: [PATCH 316/384] [chore] Update Windows signing Cert to eToken (#2452) --- .github/workflows/build.yml | 56 ++++++++++++++----- .github/workflows/check-certificates.yml | 65 +++++++++++++++-------- electron-app/package.json | 3 +- electron-app/scripts/windowsCustomSign.js | 30 +++++++++++ 4 files changed, 117 insertions(+), 37 deletions(-) create mode 100644 electron-app/scripts/windowsCustomSign.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 54cdcdbbd..e38211dda 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,21 +55,28 @@ env: - config: # Human identifier for the job. name: Windows - runs-on: windows-2019 + runs-on: [self-hosted, windows-sign-pc] # The value is a string representing a JSON document. # Setting this to null causes the job to run directly in the runner machine instead of in a container. container: | null # Name of the secret that contains the certificate. - certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX + certificate-secret: INSTALLER_CERT_WINDOWS_CER # Name of the secret that contains the certificate password. - certificate-password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD + certificate-password-secret: INSTALLER_CERT_WINDOWS_PASSWORD # File extension for the certificate. certificate-extension: pfx + # Container for windows cert signing + certificate-container: INSTALLER_CERT_WINDOWS_CONTAINER # Quoting on the value is required here to allow the same comparison expression syntax to be used for this # and the companion needs.select-targets.outputs.merge-channel-files property (output values always have string # type). mergeable-channel-file: 'false' + # as this runs on a self hosted runner, we need to avoid building with the default working directory path, + # otherwise paths in the build job will be too long for `light.exe` + # we use the below as a Symbolic link (just changing the wd will break the checkout action) + # this is a work around (see: https://github.com/actions/checkout/issues/197). + working-directory: 'C:\a' artifacts: - path: '*Windows_64bit.exe' name: Windows_X86-64_interactive_installer @@ -270,6 +277,14 @@ jobs: env: # Location of artifacts generated by build. BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts + # to skip passing signing credentials to electron-builder + IS_WINDOWS_CONFIG: ${{ matrix.config.name == 'Windows' }} + INSTALLER_CERT_WINDOWS_CER: "/tmp/cert.cer" + # We are hardcoding the path for signtool because is not present on the windows PATH env var by default. + # Keep in mind that this path could change when upgrading to a new runner version + SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" + WIN_CERT_PASSWORD: ${{ secrets.INSTALLER_CERT_WINDOWS_PASSWORD }} + WIN_CERT_CONTAINER_NAME: ${{ secrets.INSTALLER_CERT_WINDOWS_CONTAINER }} strategy: matrix: config: ${{ fromJson(needs.select-targets.outputs.build-matrix) }} @@ -283,6 +298,12 @@ jobs: timeout-minutes: 90 steps: + - name: Symlink custom working directory + shell: cmd + if: runner.os == 'Windows' && matrix.config.working-directory + run: | + if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide" + - name: Checkout if: fromJSON(matrix.config.container) == null uses: actions/checkout@v4 @@ -293,7 +314,7 @@ jobs: uses: actions/checkout@v3 - name: Install Node.js - if: fromJSON(matrix.config.container) == null + if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} @@ -301,26 +322,26 @@ jobs: cache: 'yarn' - name: Install Python 3.x - if: fromJSON(matrix.config.container) == null + if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' uses: actions/setup-python@v5 with: python-version: '3.11.x' - name: Install Go - if: fromJSON(matrix.config.container) == null + if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Go # actions/setup-go@v5 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null + if: fromJSON(matrix.config.container) != null && runner.os != 'Windows' uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile - if: fromJSON(matrix.config.container) == null + if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} @@ -328,7 +349,7 @@ jobs: - name: Install Taskfile # actions/setup-task@v2 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null + if: fromJSON(matrix.config.container) != null && runner.os != 'Windows' uses: arduino/setup-task@v1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} @@ -350,9 +371,10 @@ jobs: CREATE_USERNAME: ${{ secrets.CREATE_USERNAME }} CREATE_PASSWORD: ${{ secrets.CREATE_PASSWORD }} CREATE_CLIENT_SECRET: ${{ secrets.CREATE_CLIENT_SECRET }} + working-directory: ${{ runner.os == 'Windows' && matrix.config.working-directory || './' }} run: | # See: https://www.electron.build/code-signing - if [ $CAN_SIGN = false ]; then + if [ $CAN_SIGN = false ] || [ $IS_WINDOWS_CONFIG = true ]; then echo "Skipping the app signing: certificate not provided." else export CSC_LINK="${{ runner.temp }}/signing_certificate.${{ matrix.config.certificate-extension }}" @@ -372,13 +394,14 @@ jobs: yarn --cwd electron-app rebuild yarn --cwd electron-app build yarn --cwd electron-app package - + # Both macOS jobs generate a "channel update info file" with same path and name. The second job to complete would # overwrite the file generated by the first in the workflow artifact. - name: Stage channel file for merge if: > needs.select-targets.outputs.merge-channel-files == 'true' && matrix.config.mergeable-channel-file == 'true' + working-directory: ${{ runner.os == 'Windows' && matrix.config.working-directory || './' }} run: | staged_channel_files_path="${{ runner.temp }}/staged-channel-files" mkdir "$staged_channel_files_path" @@ -398,13 +421,20 @@ jobs: with: if-no-files-found: error name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} - path: ${{ env.STAGED_CHANNEL_FILES_PATH }} + path: ${{ runner.os == 'Windows' && matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} + - name: Upload [GitHub Actions] uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.BUILD_ARTIFACTS_PATH }} + path: ${{ runner.os == 'Windows' && matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} + + - name: Manual Clean up for self-hosted runners + if: runner.os == 'Windows' && matrix.config.working-directory + shell: cmd + run: | + rmdir /s /q "${{ matrix.config.working-directory }}\${{ env.BUILD_ARTIFACTS_PATH }}" merge-channel-files: needs: diff --git a/.github/workflows/check-certificates.yml b/.github/workflows/check-certificates.yml index db5ffc09b..adf4052be 100644 --- a/.github/workflows/check-certificates.yml +++ b/.github/workflows/check-certificates.yml @@ -74,9 +74,11 @@ jobs: - identifier: macOS signing certificate # Text used to identify certificate in notifications. certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 # Name of the secret that contains the certificate. password-secret: KEYCHAIN_PASSWORD # Name of the secret that contains the certificate password. + type: pkcs12 - identifier: Windows signing certificate - certificate-secret: WINDOWS_SIGNING_CERTIFICATE_PFX - password-secret: WINDOWS_SIGNING_CERTIFICATE_PASSWORD + certificate-secret: INSTALLER_CERT_WINDOWS_CER + # The password for the Windows certificate is not needed, because its not a container, but a single certificate. + type: x509 steps: - name: Set certificate path environment variable @@ -95,7 +97,7 @@ jobs: CERTIFICATE_PASSWORD: ${{ secrets[matrix.certificate.password-secret] }} run: | ( - openssl pkcs12 \ + openssl ${{ matrix.certificate.type }} \ -in "${{ env.CERTIFICATE_PATH }}" \ -legacy \ -noout \ @@ -122,26 +124,43 @@ jobs: CERTIFICATE_PASSWORD: ${{ secrets[matrix.certificate.password-secret] }} id: get-days-before-expiration run: | - EXPIRATION_DATE="$( - ( - openssl pkcs12 \ - -in "${{ env.CERTIFICATE_PATH }}" \ - -clcerts \ - -legacy \ - -nodes \ - -passin env:CERTIFICATE_PASSWORD - ) | ( - openssl x509 \ - -noout \ - -enddate - ) | ( - grep \ - --max-count=1 \ - --only-matching \ - --perl-regexp \ - 'notAfter=(\K.*)' - ) - )" + if [[ ${{ matrix.certificate.type }} == "pkcs12" ]]; then + EXPIRATION_DATE="$( + ( + openssl pkcs12 \ + -in "${{ env.CERTIFICATE_PATH }}" \ + -clcerts \ + -legacy \ + -nodes \ + -passin env:CERTIFICATE_PASSWORD + ) | ( + openssl x509 \ + -noout \ + -enddate + ) | ( + grep \ + --max-count=1 \ + --only-matching \ + --perl-regexp \ + 'notAfter=(\K.*)' + ) + )" + elif [[ ${{ matrix.certificate.type }} == "x509" ]]; then + EXPIRATION_DATE="$( + ( + openssl x509 \ + -in ${{ env.CERTIFICATE_PATH }} \ + -noout \ + -enddate + ) | ( + grep \ + --max-count=1 \ + --only-matching \ + --perl-regexp \ + 'notAfter=(\K.*)' + ) + )" + fi DAYS_BEFORE_EXPIRATION="$((($(date --utc --date="$EXPIRATION_DATE" +%s) - $(date --utc +%s)) / 60 / 60 / 24))" diff --git a/electron-app/package.json b/electron-app/package.json index 3e42fdd0d..0451107f1 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -133,7 +133,8 @@ "msi", "nsis", "zip" - ] + ], + "sign": "./scripts/windowsCustomSign.js" }, "mac": { "darkModeSupport": true, diff --git a/electron-app/scripts/windowsCustomSign.js b/electron-app/scripts/windowsCustomSign.js new file mode 100644 index 000000000..29fbc5fad --- /dev/null +++ b/electron-app/scripts/windowsCustomSign.js @@ -0,0 +1,30 @@ +const childProcess = require('child_process'); + +exports.default = async function (configuration) { + if (!process.env.GITHUB_ACTIONS) { + return; + } + + const SIGNTOOL_PATH = process.env.SIGNTOOL_PATH; + const INSTALLER_CERT_WINDOWS_CER = process.env.INSTALLER_CERT_WINDOWS_CER; + const CERT_PASSWORD = process.env.WIN_CERT_PASSWORD; + const CONTAINER_NAME = process.env.WIN_CERT_CONTAINER_NAME; + const filePath = configuration.path; + + if ( + SIGNTOOL_PATH && + INSTALLER_CERT_WINDOWS_CER && + CERT_PASSWORD && + CONTAINER_NAME + ) { + childProcess.execSync( + `"${SIGNTOOL_PATH}" sign -d "Arduino IDE" -f "${INSTALLER_CERT_WINDOWS_CER}" -csp "eToken Base Cryptographic Provider" -k "[{{${CERT_PASSWORD}}}]=${CONTAINER_NAME}" -fd sha256 -tr http://timestamp.digicert.com -td SHA256 -v "${filePath}"`, + { stdio: 'inherit' } + ); + } else { + console.warn( + `Custom windows signing was no performed one of the following variables was not provided: SIGNTOOL_PATH (${SIGNTOOL_PATH}), INSTALLER_CERT_WINDOWS_CERT (${INSTALLER_CERT_WINDOWS_CER}), CERT_PASSWORD (${CERT_PASSWORD}), CONTAINER_NAME (${CONTAINER_NAME})` + ); + process.exit(1); + } +}; From c3adde54606b42dd63af4e81579fc7376249c274 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:29:31 +0200 Subject: [PATCH 317/384] feat: add shared space support (#2486) --- .github/workflows/build.yml | 2 ++ .../src/browser/arduino-preferences.ts | 9 +++++++++ arduino-ide-extension/src/browser/create/create-api.ts | 10 +++++++++- .../widgets/sketchbook/sketchbook-tree-model.ts | 3 +++ .../src/test/node/boards-service-impl.slow-test.ts | 10 +++++----- i18n/en.json | 1 + 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e38211dda..058f081f7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -275,6 +275,8 @@ jobs: - build-type-determination - select-targets env: + # https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/ + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true # Location of artifacts generated by build. BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts # to skip passing signing credentials to electron-builder diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index bc9cdb099..c7e1698a5 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -228,6 +228,14 @@ const properties: ArduinoPreferenceSchemaProperties = { ), default: 'https://api2.arduino.cc/create', }, + 'arduino.cloud.sharedSpaceID': { + type: 'string', + description: nls.localize( + 'arduino/preferences/cloud.sharedSpaceId', + 'The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.' + ), + default: '', + }, 'arduino.auth.clientID': { type: 'string', description: nls.localize( @@ -329,6 +337,7 @@ export interface ArduinoConfiguration { 'arduino.cloud.push.warn': boolean; 'arduino.cloud.pushpublic.warn': boolean; 'arduino.cloud.sketchSyncEndpoint': string; + 'arduino.cloud.sharedSpaceID': string; 'arduino.auth.clientID': string; 'arduino.auth.domain': string; 'arduino.auth.audience': string; diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 7f4cfed22..db777b35a 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -509,11 +509,19 @@ export class CreateApi { private async headers(): Promise<Record<string, string>> { const token = await this.token(); - return { + const headers: Record<string, string> = { 'content-type': 'application/json', accept: 'application/json', authorization: `Bearer ${token}`, }; + + const sharedSpaceID = + this.arduinoPreferences['arduino.cloud.sharedSpaceID']; + if (sharedSpaceID) { + headers['x-organization'] = sharedSpaceID; + } + + return headers; } private domain(apiVersion = 'v2'): string { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts index df1d52964..89a013547 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-tree-model.ts @@ -127,6 +127,9 @@ export class SketchbookTreeModel extends FileTreeModel { if (preferenceName === 'arduino.sketchbook.showAllFiles') { this.updateRoot(); } + if (preferenceName === 'arduino.cloud.sharedSpaceID') { + this.updateRoot(); + } }) ); 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 aa893a34f..f5b29a5bf 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 @@ -113,13 +113,13 @@ describe('boards-service-impl', () => { expect(result.length).greaterThan(1); const lastIndex = result.length - 1; const last = result[lastIndex]; - expect(last.id).to.be.equal('arduino:mbed'); + expect(last.id).to.be.equal('Microsoft:win10'); expect(last.deprecated).to.be.true; - const windowsIoTCoreIndex = result.findIndex( - (platform) => platform.id === 'Microsoft:win10' + const arduinoMbedCoreIndex = result.findIndex( + (platform) => platform.id === 'arduino:mbed' ); - expect(windowsIoTCoreIndex).to.be.greaterThanOrEqual(0); - expect(windowsIoTCoreIndex).to.be.lessThan(lastIndex); + expect(arduinoMbedCoreIndex).to.be.greaterThanOrEqual(0); + expect(arduinoMbedCoreIndex).to.be.lessThan(lastIndex); const first = result[0]; expect(typeof first.deprecated).to.be.equal('boolean'); expect(first.deprecated).to.be.false; diff --git a/i18n/en.json b/i18n/en.json index c83d280c1..22babc740 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", From 1ec0a8cc77c2741ef380f682fa95273615dda06f Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 6 Sep 2024 11:38:55 +0200 Subject: [PATCH 318/384] feat: use Arduino CLI 1.0.4 (#2457) * fix: use `@pingghost/protoc` to compile proto files The npm package previously used (`protoc`) is still lacking apple arm32 support, see https://github.com/YePpHa/node-protoc/pull/10 * feat: use Arduino CLI 1.0.4 * fix: allow use of node16 in github actions * chore: update `arduino-language-server` version for cli-1.0.0 * fix: deprecated platform order test Arduino deprecated platforms should have more priority then other deprecated ones --- arduino-ide-extension/package.json | 6 +- .../scripts/generate-protocol.js | 5 +- .../src/node/boards-service-impl.ts | 4 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 5 + .../cc/arduino/cli/commands/v1/board_pb.js | 53 +- .../cli/commands/v1/commands_grpc_pb.d.ts | 158 +- .../cli/commands/v1/commands_grpc_pb.js | 328 +- .../arduino/cli/commands/v1/commands_pb.d.ts | 209 +- .../cc/arduino/cli/commands/v1/commands_pb.js | 2503 ++++++++--- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 39 +- .../cc/arduino/cli/commands/v1/common_pb.js | 264 +- .../arduino/cli/commands/v1/compile_pb.d.ts | 29 +- .../cc/arduino/cli/commands/v1/compile_pb.js | 207 +- .../cc/arduino/cli/commands/v1/core_pb.d.ts | 148 +- .../cc/arduino/cli/commands/v1/core_pb.js | 883 +++- .../cc/arduino/cli/commands/v1/debug_pb.d.ts | 43 +- .../cc/arduino/cli/commands/v1/debug_pb.js | 248 +- .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 241 + .../cc/arduino/cli/commands/v1/lib_pb.js | 1760 +++++++- .../arduino/cli/commands/v1/monitor_pb.d.ts | 31 +- .../cc/arduino/cli/commands/v1/monitor_pb.js | 152 +- .../arduino/cli/commands/v1/settings_pb.d.ts | 603 ++- .../cc/arduino/cli/commands/v1/settings_pb.js | 3994 +++++++++++++++-- .../src/node/config-service-impl.ts | 89 +- .../src/node/core-service-impl.ts | 5 +- .../src/test/node/exec-util.test.ts | 2 +- .../src/test/node/node-test-bindings.ts | 1 - yarn.lock | 26 +- 28 files changed, 10139 insertions(+), 1897 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 8963b4f5a..bef1f07b7 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -128,7 +128,7 @@ }, "optionalDependencies": { "grpc-tools": "^1.12.4", - "protoc": "^1.0.4" + "@pingghost/protoc": "^1.0.2" }, "mocha": { "require": [ @@ -170,7 +170,7 @@ ], "arduino": { "arduino-cli": { - "version": "0.36.0-rc.1" + "version": "1.0.4" }, "arduino-fwuploader": { "version": "2.4.1" @@ -179,7 +179,7 @@ "version": { "owner": "arduino", "repo": "arduino-language-server", - "commitish": "91c2ba8" + "commitish": "05ec308" } }, "clangd": { diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index 703407a4f..f2b1ce8e8 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -7,8 +7,9 @@ const { exec } = require('./utils'); const glob = require('glob'); const { SemVer, gte, valid: validSemVer } = require('semver'); - const protoc = path.dirname(require('protoc/protoc')); - + // Use a node-protoc fork until apple arm32 is supported + // https://github.com/YePpHa/node-protoc/pull/10 + const protoc = path.dirname(require('@pingghost/protoc/protoc')); const repository = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); const { owner, repo, commitish } = (() => { diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 8345f43fe..ea77f8a5f 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -585,7 +585,7 @@ function createBoardsPackage( if (!actualRelease) { return undefined; } - const { name, typeList, boardsList, deprecated, compatible } = actualRelease; + const { name, typesList, boardsList, deprecated, compatible } = actualRelease; if (!compatible) { return undefined; // never show incompatible platforms } @@ -602,7 +602,7 @@ function createBoardsPackage( ), description: boardsList.map(({ name }) => name).join(', '), boards: boardsList, - types: typeList, + types: typesList, moreInfoLink: website, author: maintainer, deprecated, 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 0cd416a54..74c87488c 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 @@ -384,6 +384,10 @@ export class BoardListResponse extends jspb.Message { getPortsList(): Array<DetectedPort>; setPortsList(value: Array<DetectedPort>): BoardListResponse; addPorts(value?: DetectedPort, index?: number): DetectedPort; + clearWarningsList(): void; + getWarningsList(): Array<string>; + setWarningsList(value: Array<string>): BoardListResponse; + addWarnings(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListResponse.AsObject; @@ -398,6 +402,7 @@ export class BoardListResponse extends jspb.Message { export namespace BoardListResponse { export type AsObject = { portsList: Array<DetectedPort.AsObject>, + warningsList: Array<string>, } } 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 12119bd31..2625f2e0a 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 @@ -3387,7 +3387,7 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setFqbn = function(v * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.BoardListResponse.repeatedFields_ = [1]; +proto.cc.arduino.cli.commands.v1.BoardListResponse.repeatedFields_ = [1,2]; @@ -3421,7 +3421,8 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.toObject = function proto.cc.arduino.cli.commands.v1.BoardListResponse.toObject = function(includeInstance, msg) { var f, obj = { portsList: jspb.Message.toObjectList(msg.getPortsList(), - proto.cc.arduino.cli.commands.v1.DetectedPort.toObject, includeInstance) + proto.cc.arduino.cli.commands.v1.DetectedPort.toObject, includeInstance), + warningsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f }; if (includeInstance) { @@ -3463,6 +3464,10 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.deserializeBinaryFromReader = reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DetectedPort.deserializeBinaryFromReader); msg.addPorts(value); break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.addWarnings(value); + break; default: reader.skipField(); break; @@ -3500,6 +3505,13 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.serializeBinaryToWriter = fun proto.cc.arduino.cli.commands.v1.DetectedPort.serializeBinaryToWriter ); } + f = message.getWarningsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 2, + f + ); + } }; @@ -3541,6 +3553,43 @@ proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.clearPortsList = fu }; +/** + * repeated string warnings = 2; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.getWarningsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.setWarningsList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.addWarnings = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardListResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListResponse.prototype.clearWarningsList = function() { + return this.setWarningsList([]); +}; + + /** * List of repeated fields within this message type. 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 651646fd8..993a3cd0f 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 @@ -59,12 +59,14 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped debug: IArduinoCoreServiceService_IDebug; isDebugSupported: IArduinoCoreServiceService_IIsDebugSupported; getDebugConfig: IArduinoCoreServiceService_IGetDebugConfig; - settingsGetAll: IArduinoCoreServiceService_ISettingsGetAll; - settingsMerge: IArduinoCoreServiceService_ISettingsMerge; + checkForArduinoCLIUpdates: IArduinoCoreServiceService_ICheckForArduinoCLIUpdates; + cleanDownloadCacheDirectory: IArduinoCoreServiceService_ICleanDownloadCacheDirectory; + configurationSave: IArduinoCoreServiceService_IConfigurationSave; + configurationOpen: IArduinoCoreServiceService_IConfigurationOpen; + configurationGet: IArduinoCoreServiceService_IConfigurationGet; + settingsEnumerate: IArduinoCoreServiceService_ISettingsEnumerate; settingsGetValue: IArduinoCoreServiceService_ISettingsGetValue; settingsSetValue: IArduinoCoreServiceService_ISettingsSetValue; - settingsWrite: IArduinoCoreServiceService_ISettingsWrite; - settingsDelete: IArduinoCoreServiceService_ISettingsDelete; } interface IArduinoCoreServiceService_ICreate extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CreateRequest, cc_arduino_cli_commands_v1_commands_pb.CreateResponse> { @@ -436,23 +438,59 @@ interface IArduinoCoreServiceService_IGetDebugConfig extends grpc.MethodDefiniti responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; } -interface IArduinoCoreServiceService_ISettingsGetAll extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetAll"; +interface IArduinoCoreServiceService_ICheckForArduinoCLIUpdates extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/CheckForArduinoCLIUpdates"; requestStream: false; responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse>; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse>; } -interface IArduinoCoreServiceService_ISettingsMerge extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsMerge"; +interface IArduinoCoreServiceService_ICleanDownloadCacheDirectory extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/CleanDownloadCacheDirectory"; requestStream: false; responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse>; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse>; +} +interface IArduinoCoreServiceService_IConfigurationSave extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationSave"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse>; +} +interface IArduinoCoreServiceService_IConfigurationOpen extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationOpen"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse>; +} +interface IArduinoCoreServiceService_IConfigurationGet extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationGet"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse>; +} +interface IArduinoCoreServiceService_ISettingsEnumerate extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsEnumerate"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse>; } interface IArduinoCoreServiceService_ISettingsGetValue extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue"; @@ -472,24 +510,6 @@ interface IArduinoCoreServiceService_ISettingsSetValue extends grpc.MethodDefini responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; } -interface IArduinoCoreServiceService_ISettingsWrite extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsWrite"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse>; -} -interface IArduinoCoreServiceService_ISettingsDelete extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse> { - path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsDelete"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest>; - requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest>; - responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse>; - responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse>; -} export const ArduinoCoreServiceService: IArduinoCoreServiceService; @@ -535,12 +555,14 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa debug: grpc.handleBidiStreamingCall<cc_arduino_cli_commands_v1_debug_pb.DebugRequest, cc_arduino_cli_commands_v1_debug_pb.DebugResponse>; isDebugSupported: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedRequest, cc_arduino_cli_commands_v1_debug_pb.IsDebugSupportedResponse>; getDebugConfig: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse>; - settingsGetAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse>; - settingsMerge: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse>; + checkForArduinoCLIUpdates: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse>; + cleanDownloadCacheDirectory: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse>; + configurationSave: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse>; + configurationOpen: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse>; + configurationGet: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse>; + settingsEnumerate: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse>; settingsGetValue: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse>; settingsSetValue: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse>; - settingsWrite: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse>; - settingsDelete: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse>; } export interface IArduinoCoreServiceClient { @@ -648,24 +670,30 @@ export interface IArduinoCoreServiceClient { getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; - settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; - settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; - settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; - settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; - settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; - settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; - settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; - settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; - settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; - settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; - settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; } export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCoreServiceClient { @@ -772,22 +800,28 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; public getDebugConfig(request: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_debug_pb.GetDebugConfigResponse) => void): grpc.ClientUnaryCall; - public settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; - public settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; - public settingsGetAll(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse) => void): grpc.ClientUnaryCall; - public settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; - public settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; - public settingsMerge(request: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse) => void): grpc.ClientUnaryCall; + public checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + public checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + public checkForArduinoCLIUpdates(request: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse) => void): grpc.ClientUnaryCall; + public cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + public cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + public cleanDownloadCacheDirectory(request: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse) => void): grpc.ClientUnaryCall; + public configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + public configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + public configurationSave(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse) => void): grpc.ClientUnaryCall; + public configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + public configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + public configurationOpen(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse) => void): grpc.ClientUnaryCall; + public configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + public configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + public configurationGet(request: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse) => void): grpc.ClientUnaryCall; + public settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + public settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; + public settingsEnumerate(request: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse) => void): grpc.ClientUnaryCall; public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; public settingsGetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse) => void): grpc.ClientUnaryCall; public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; public settingsSetValue(request: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse) => void): grpc.ClientUnaryCall; - public settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; - public settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; - public settingsWrite(request: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse) => void): grpc.ClientUnaryCall; - public settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; - public settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => void): grpc.ClientUnaryCall; - public settingsDelete(request: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse) => 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 6ea265e3c..4decb58e0 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js @@ -3,18 +3,19 @@ // Original file comments: // This file is part of arduino-cli. // -// Copyright 2020 ARDUINO SA (http://www.arduino.cc/) +// Copyright 2024 ARDUINO SA (https://www.arduino.cc/) // -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at // -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // 'use strict'; var cc_arduino_cli_commands_v1_commands_pb = require('../../../../../cc/arduino/cli/commands/v1/commands_pb.js'); @@ -183,6 +184,50 @@ function deserialize_cc_arduino_cli_commands_v1_BurnBootloaderResponse(buffer_ar return cc_arduino_cli_commands_v1_upload_pb.BurnBootloaderResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_CompileRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_compile_pb.CompileRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CompileRequest'); @@ -205,6 +250,72 @@ function deserialize_cc_arduino_cli_commands_v1_CompileResponse(buffer_arg) { return cc_arduino_cli_commands_v1_compile_pb.CompileResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationGetRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationGetResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationOpenRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationOpenResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationSaveRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.ConfigurationSaveResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_CreateRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.CreateRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.CreateRequest'); @@ -777,48 +888,26 @@ function deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse(buffer return cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsDeleteRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsDeleteResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetAllRequest'); +function serialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsEnumerateRequest'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsGetAllResponse'); +function serialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsEnumerateResponse'); } return Buffer.from(arg.serializeBinary()); } -function deserialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse.deserializeBinary(new Uint8Array(buffer_arg)); +function deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse.deserializeBinary(new Uint8Array(buffer_arg)); } function serialize_cc_arduino_cli_commands_v1_SettingsGetValueRequest(arg) { @@ -843,28 +932,6 @@ function deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse(buffer_ return cc_arduino_cli_commands_v1_settings_pb.SettingsGetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_SettingsMergeRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsMergeRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_SettingsMergeRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_SettingsMergeResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsMergeResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_SettingsMergeResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse.deserializeBinary(new Uint8Array(buffer_arg)); -} - function serialize_cc_arduino_cli_commands_v1_SettingsSetValueRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsSetValueRequest'); @@ -887,28 +954,6 @@ function deserialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse(buffer_ return cc_arduino_cli_commands_v1_settings_pb.SettingsSetValueResponse.deserializeBinary(new Uint8Array(buffer_arg)); } -function serialize_cc_arduino_cli_commands_v1_SettingsWriteRequest(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsWriteRequest'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_SettingsWriteRequest(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_cc_arduino_cli_commands_v1_SettingsWriteResponse(arg) { - if (!(arg instanceof cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse)) { - throw new Error('Expected argument of type cc.arduino.cli.commands.v1.SettingsWriteResponse'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_cc_arduino_cli_commands_v1_SettingsWriteResponse(buffer_arg) { - return cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse.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'); @@ -1569,31 +1614,78 @@ getDebugConfig: { responseSerialize: serialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_GetDebugConfigResponse, }, - // List all the settings. -settingsGetAll: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetAll', + // Check for updates to the Arduino CLI. +checkForArduinoCLIUpdates: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/CheckForArduinoCLIUpdates', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesRequest, + responseType: cc_arduino_cli_commands_v1_commands_pb.CheckForArduinoCLIUpdatesResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CheckForArduinoCLIUpdatesResponse, + }, + // Clean the download cache directory (where archives are downloaded). +cleanDownloadCacheDirectory: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/CleanDownloadCacheDirectory', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryRequest, + responseType: cc_arduino_cli_commands_v1_commands_pb.CleanDownloadCacheDirectoryResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse, + }, + // Writes the settings currently stored in memory in a YAML file +configurationSave: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationSave', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationSaveResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse, + }, + // Read the settings from a YAML file +configurationOpen: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationOpen', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationOpenResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse, + }, + configurationGet: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationGet', requestStream: false, responseStream: false, - requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllRequest, - responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsGetAllResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetAllRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetAllResponse, + requestType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.ConfigurationGetResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationGetRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse, }, - // Set multiple settings values at once. -settingsMerge: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsMerge', + // Enumerate all the keys/values pairs available in the configuration +settingsEnumerate: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsEnumerate', requestStream: false, responseStream: false, - requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeRequest, - responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsMergeResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsMergeRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsMergeRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsMergeResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsMergeResponse, + requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateRequest, + responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsEnumerateResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse, }, - // Get the value of a specific setting. + // Get a single configuration value settingsGetValue: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue', requestStream: false, @@ -1605,7 +1697,7 @@ settingsGetValue: { responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, }, - // Set the value of a specific setting. + // Set a single configuration value settingsSetValue: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsSetValue', requestStream: false, @@ -1617,29 +1709,5 @@ settingsSetValue: { responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsSetValueResponse, }, - // Writes to file settings currently stored in memory -settingsWrite: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsWrite', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteRequest, - responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsWriteResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsWriteRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsWriteRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsWriteResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsWriteResponse, - }, - // Deletes an entry and rewrites the file settings -settingsDelete: { - path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsDelete', - requestStream: false, - responseStream: false, - requestType: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteRequest, - responseType: cc_arduino_cli_commands_v1_settings_pb.SettingsDeleteResponse, - requestSerialize: serialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest, - requestDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsDeleteRequest, - responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse, - responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsDeleteResponse, - }, }; 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 79e01e887..53107cc5a 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 @@ -99,8 +99,8 @@ export class InitResponse extends jspb.Message { hasProfile(): boolean; clearProfile(): void; - getProfile(): cc_arduino_cli_commands_v1_common_pb.Profile | undefined; - setProfile(value?: cc_arduino_cli_commands_v1_common_pb.Profile): InitResponse; + getProfile(): cc_arduino_cli_commands_v1_common_pb.SketchProfile | undefined; + setProfile(value?: cc_arduino_cli_commands_v1_common_pb.SketchProfile): InitResponse; getMessageCase(): InitResponse.MessageCase; @@ -118,7 +118,7 @@ export namespace InitResponse { export type AsObject = { initProgress?: InitResponse.Progress.AsObject, error?: google_rpc_status_pb.Status.AsObject, - profile?: cc_arduino_cli_commands_v1_common_pb.Profile.AsObject, + profile?: cc_arduino_cli_commands_v1_common_pb.SketchProfile.AsObject, } @@ -232,6 +232,8 @@ export class UpdateIndexRequest extends jspb.Message { setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateIndexRequest; getIgnoreCustomPackageIndexes(): boolean; setIgnoreCustomPackageIndexes(value: boolean): UpdateIndexRequest; + getUpdateIfOlderThanSecs(): number; + setUpdateIfOlderThanSecs(value: number): UpdateIndexRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateIndexRequest.AsObject; @@ -247,6 +249,7 @@ export namespace UpdateIndexRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, ignoreCustomPackageIndexes: boolean, + updateIfOlderThanSecs: number, } } @@ -257,6 +260,13 @@ export class UpdateIndexResponse extends jspb.Message { getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateIndexResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): UpdateIndexResponse.Result | undefined; + setResult(value?: UpdateIndexResponse.Result): UpdateIndexResponse; + + getMessageCase(): UpdateIndexResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateIndexResponse.AsObject; static toObject(includeInstance: boolean, msg: UpdateIndexResponse): UpdateIndexResponse.AsObject; @@ -270,7 +280,39 @@ export class UpdateIndexResponse extends jspb.Message { export namespace UpdateIndexResponse { export type AsObject = { downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: UpdateIndexResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + clearUpdatedIndexesList(): void; + getUpdatedIndexesList(): Array<IndexUpdateReport>; + setUpdatedIndexesList(value: Array<IndexUpdateReport>): Result; + addUpdatedIndexes(value?: IndexUpdateReport, index?: number): IndexUpdateReport; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + updatedIndexesList: Array<IndexUpdateReport.AsObject>, + } } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + DOWNLOAD_PROGRESS = 1, + RESULT = 2, + } + } export class UpdateLibrariesIndexRequest extends jspb.Message { @@ -279,6 +321,8 @@ export class UpdateLibrariesIndexRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateLibrariesIndexRequest; + getUpdateIfOlderThanSecs(): number; + setUpdateIfOlderThanSecs(value: number): UpdateLibrariesIndexRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateLibrariesIndexRequest.AsObject; @@ -293,6 +337,7 @@ export class UpdateLibrariesIndexRequest extends jspb.Message { export namespace UpdateLibrariesIndexRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + updateIfOlderThanSecs: number, } } @@ -303,6 +348,13 @@ export class UpdateLibrariesIndexResponse extends jspb.Message { getDownloadProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setDownloadProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): UpdateLibrariesIndexResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): UpdateLibrariesIndexResponse.Result | undefined; + setResult(value?: UpdateLibrariesIndexResponse.Result): UpdateLibrariesIndexResponse; + + getMessageCase(): UpdateLibrariesIndexResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateLibrariesIndexResponse.AsObject; static toObject(includeInstance: boolean, msg: UpdateLibrariesIndexResponse): UpdateLibrariesIndexResponse.AsObject; @@ -316,7 +368,72 @@ export class UpdateLibrariesIndexResponse extends jspb.Message { export namespace UpdateLibrariesIndexResponse { export type AsObject = { downloadProgress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: UpdateLibrariesIndexResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + hasLibrariesIndex(): boolean; + clearLibrariesIndex(): void; + getLibrariesIndex(): IndexUpdateReport | undefined; + setLibrariesIndex(value?: IndexUpdateReport): Result; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + librariesIndex?: IndexUpdateReport.AsObject, + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + DOWNLOAD_PROGRESS = 1, + RESULT = 2, + } + +} + +export class IndexUpdateReport extends jspb.Message { + getIndexUrl(): string; + setIndexUrl(value: string): IndexUpdateReport; + getStatus(): IndexUpdateReport.Status; + setStatus(value: IndexUpdateReport.Status): IndexUpdateReport; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IndexUpdateReport.AsObject; + static toObject(includeInstance: boolean, msg: IndexUpdateReport): IndexUpdateReport.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IndexUpdateReport, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IndexUpdateReport; + static deserializeBinaryFromReader(message: IndexUpdateReport, reader: jspb.BinaryReader): IndexUpdateReport; +} + +export namespace IndexUpdateReport { + export type AsObject = { + indexUrl: string, + status: IndexUpdateReport.Status, + } + + export enum Status { + STATUS_UNSPECIFIED = 0, + STATUS_UPDATED = 1, + STATUS_ALREADY_UP_TO_DATE = 2, + STATUS_FAILED = 3, + STATUS_SKIPPED = 4, + } + } export class VersionRequest extends jspb.Message { @@ -500,6 +617,8 @@ export class SetSketchDefaultsRequest extends jspb.Message { setDefaultPortAddress(value: string): SetSketchDefaultsRequest; getDefaultPortProtocol(): string; setDefaultPortProtocol(value: string): SetSketchDefaultsRequest; + getDefaultProgrammer(): string; + setDefaultProgrammer(value: string): SetSketchDefaultsRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SetSketchDefaultsRequest.AsObject; @@ -517,6 +636,7 @@ export namespace SetSketchDefaultsRequest { defaultFqbn: string, defaultPortAddress: string, defaultPortProtocol: string, + defaultProgrammer: string, } } @@ -527,6 +647,8 @@ export class SetSketchDefaultsResponse extends jspb.Message { setDefaultPortAddress(value: string): SetSketchDefaultsResponse; getDefaultPortProtocol(): string; setDefaultPortProtocol(value: string): SetSketchDefaultsResponse; + getDefaultProgrammer(): string; + setDefaultProgrammer(value: string): SetSketchDefaultsResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SetSketchDefaultsResponse.AsObject; @@ -543,6 +665,87 @@ export namespace SetSketchDefaultsResponse { defaultFqbn: string, defaultPortAddress: string, defaultPortProtocol: string, + defaultProgrammer: string, + } +} + +export class CheckForArduinoCLIUpdatesRequest extends jspb.Message { + getForceCheck(): boolean; + setForceCheck(value: boolean): CheckForArduinoCLIUpdatesRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CheckForArduinoCLIUpdatesRequest.AsObject; + static toObject(includeInstance: boolean, msg: CheckForArduinoCLIUpdatesRequest): CheckForArduinoCLIUpdatesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CheckForArduinoCLIUpdatesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CheckForArduinoCLIUpdatesRequest; + static deserializeBinaryFromReader(message: CheckForArduinoCLIUpdatesRequest, reader: jspb.BinaryReader): CheckForArduinoCLIUpdatesRequest; +} + +export namespace CheckForArduinoCLIUpdatesRequest { + export type AsObject = { + forceCheck: boolean, + } +} + +export class CheckForArduinoCLIUpdatesResponse extends jspb.Message { + getNewestVersion(): string; + setNewestVersion(value: string): CheckForArduinoCLIUpdatesResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CheckForArduinoCLIUpdatesResponse.AsObject; + static toObject(includeInstance: boolean, msg: CheckForArduinoCLIUpdatesResponse): CheckForArduinoCLIUpdatesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CheckForArduinoCLIUpdatesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CheckForArduinoCLIUpdatesResponse; + static deserializeBinaryFromReader(message: CheckForArduinoCLIUpdatesResponse, reader: jspb.BinaryReader): CheckForArduinoCLIUpdatesResponse; +} + +export namespace CheckForArduinoCLIUpdatesResponse { + export type AsObject = { + newestVersion: string, + } +} + +export class CleanDownloadCacheDirectoryRequest extends jspb.Message { + + hasInstance(): boolean; + clearInstance(): void; + getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; + setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): CleanDownloadCacheDirectoryRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CleanDownloadCacheDirectoryRequest.AsObject; + static toObject(includeInstance: boolean, msg: CleanDownloadCacheDirectoryRequest): CleanDownloadCacheDirectoryRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CleanDownloadCacheDirectoryRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CleanDownloadCacheDirectoryRequest; + static deserializeBinaryFromReader(message: CleanDownloadCacheDirectoryRequest, reader: jspb.BinaryReader): CleanDownloadCacheDirectoryRequest; +} + +export namespace CleanDownloadCacheDirectoryRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + } +} + +export class CleanDownloadCacheDirectoryResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CleanDownloadCacheDirectoryResponse.AsObject; + static toObject(includeInstance: boolean, msg: CleanDownloadCacheDirectoryResponse): CleanDownloadCacheDirectoryResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: CleanDownloadCacheDirectoryResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CleanDownloadCacheDirectoryResponse; + static deserializeBinaryFromReader(message: CleanDownloadCacheDirectoryResponse, reader: jspb.BinaryReader): CleanDownloadCacheDirectoryResponse; +} + +export namespace CleanDownloadCacheDirectoryResponse { + export type AsObject = { } } 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 ebc76506d..b3ba4786b 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 @@ -43,12 +43,18 @@ var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/ goog.object.extend(proto, cc_arduino_cli_commands_v1_settings_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CreateResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DestroyRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DestroyResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.FailedInstanceInitError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.FailedInstanceInitReason', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IndexUpdateReport', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InitResponse.MessageCase', null, global); @@ -61,8 +67,12 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest', n goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.VersionRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.VersionResponse', null, global); /** @@ -265,7 +275,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateIndexResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -275,6 +285,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateIndexResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -307,7 +338,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -317,6 +348,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse'; } +/** + * 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.UpdateLibrariesIndexResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.IndexUpdateReport = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.IndexUpdateReport, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.displayName = 'proto.cc.arduino.cli.commands.v1.IndexUpdateReport'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -527,6 +600,90 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse'; } +/** + * 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.CheckForArduinoCLIUpdatesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.displayName = 'proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest'; +} +/** + * 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.CheckForArduinoCLIUpdatesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.displayName = 'proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse'; +} @@ -1051,7 +1208,7 @@ proto.cc.arduino.cli.commands.v1.InitResponse.toObject = function(includeInstanc var f, obj = { initProgress: (f = msg.getInitProgress()) && proto.cc.arduino.cli.commands.v1.InitResponse.Progress.toObject(includeInstance, f), error: (f = msg.getError()) && google_rpc_status_pb.Status.toObject(includeInstance, f), - profile: (f = msg.getProfile()) && cc_arduino_cli_commands_v1_common_pb.Profile.toObject(includeInstance, f) + profile: (f = msg.getProfile()) && cc_arduino_cli_commands_v1_common_pb.SketchProfile.toObject(includeInstance, f) }; if (includeInstance) { @@ -1099,8 +1256,8 @@ proto.cc.arduino.cli.commands.v1.InitResponse.deserializeBinaryFromReader = func msg.setError(value); break; case 3: - var value = new cc_arduino_cli_commands_v1_common_pb.Profile; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Profile.deserializeBinaryFromReader); + var value = new cc_arduino_cli_commands_v1_common_pb.SketchProfile; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.SketchProfile.deserializeBinaryFromReader); msg.setProfile(value); break; default: @@ -1153,7 +1310,7 @@ proto.cc.arduino.cli.commands.v1.InitResponse.serializeBinaryToWriter = function writer.writeMessage( 3, f, - cc_arduino_cli_commands_v1_common_pb.Profile.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.SketchProfile.serializeBinaryToWriter ); } }; @@ -1436,17 +1593,17 @@ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.hasError = function() { /** - * optional Profile profile = 3; - * @return {?proto.cc.arduino.cli.commands.v1.Profile} + * optional SketchProfile profile = 3; + * @return {?proto.cc.arduino.cli.commands.v1.SketchProfile} */ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.getProfile = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Profile} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Profile, 3)); + return /** @type{?proto.cc.arduino.cli.commands.v1.SketchProfile} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.SketchProfile, 3)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Profile|undefined} value + * @param {?proto.cc.arduino.cli.commands.v1.SketchProfile|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.InitResponse} returns this */ proto.cc.arduino.cli.commands.v1.InitResponse.prototype.setProfile = function(value) { @@ -1917,7 +2074,8 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.toObject = functio proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.toObject = function(includeInstance, msg) { var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - ignoreCustomPackageIndexes: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + ignoreCustomPackageIndexes: jspb.Message.getBooleanFieldWithDefault(msg, 2, false), + updateIfOlderThanSecs: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -1963,6 +2121,10 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.deserializeBinaryFromReader var value = /** @type {boolean} */ (reader.readBool()); msg.setIgnoreCustomPackageIndexes(value); break; + case 3: + var value = /** @type {number} */ (reader.readInt64()); + msg.setUpdateIfOlderThanSecs(value); + break; default: reader.skipField(); break; @@ -2007,6 +2169,13 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.serializeBinaryToWriter = fu f ); } + f = message.getUpdateIfOlderThanSecs(); + if (f !== 0) { + writer.writeInt64( + 3, + f + ); + } }; @@ -2065,6 +2234,50 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.setIgnoreCustomPac }; +/** + * optional int64 update_if_older_than_secs = 3; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.getUpdateIfOlderThanSecs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexRequest.prototype.setUpdateIfOlderThanSecs = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + DOWNLOAD_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_[0])); +}; @@ -2097,7 +2310,8 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.toObject = functi */ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.toObject = function(includeInstance, msg) { var f, obj = { - downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2139,6 +2353,11 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.deserializeBinaryFromReader reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); msg.setDownloadProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -2176,46 +2395,24 @@ proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.serializeBinaryToWriter = f cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.serializeBinaryToWriter + ); + } }; -/** - * optional DownloadProgress download_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getDownloadProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.setDownloadProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.clearDownloadProgress = function() { - return this.setDownloadProgress(undefined); -}; - /** - * Returns whether this field is set. - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.hasDownloadProgress = function() { - return jspb.Message.getField(this, 1) != null; -}; - - +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.repeatedFields_ = [1]; @@ -2232,8 +2429,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.toObject(opt_includeInstance, this); }; @@ -2242,13 +2439,14 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + updatedIndexesList: jspb.Message.toObjectList(msg.getUpdatedIndexesList(), + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject, includeInstance) }; if (includeInstance) { @@ -2262,23 +2460,23 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest; - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result; + return proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2286,9 +2484,9 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); + var value = new proto.cc.arduino.cli.commands.v1.IndexUpdateReport; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader); + msg.addUpdatedIndexes(value); break; default: reader.skipField(); @@ -2303,9 +2501,9 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2313,57 +2511,132 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( + f = message.getUpdatedIndexesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter ); } }; /** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} + * repeated IndexUpdateReport updated_indexes = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.IndexUpdateReport>} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.getInstance = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.getUpdatedIndexesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.IndexUpdateReport>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.IndexUpdateReport, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this + * @param {!Array<!proto.cc.arduino.cli.commands.v1.IndexUpdateReport>} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.setInstance = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.setUpdatedIndexesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.addUpdatedIndexes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.IndexUpdateReport, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result.prototype.clearUpdatedIndexesList = function() { + return this.setUpdatedIndexesList([]); +}; + + +/** + * optional DownloadProgress download_progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getDownloadProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.setDownloadProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.clearDownloadProgress = function() { + return this.setDownloadProgress(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.hasDownloadProgress = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateIndexResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateIndexResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; }; @@ -2383,8 +2656,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject(opt_includeInstance, this); }; @@ -2393,13 +2666,14 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.toObject = function(includeInstance, msg) { var f, obj = { - downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + updateIfOlderThanSecs: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -2413,23 +2687,23 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse; - return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest; + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2437,9 +2711,13 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); - msg.setDownloadProgress(value); + var value = new cc_arduino_cli_commands_v1_common_pb.Instance; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); + msg.setInstance(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt64()); + msg.setUpdateIfOlderThanSecs(value); break; default: reader.skipField(); @@ -2454,9 +2732,9 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2464,48 +2742,55 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDownloadProgress(); + f = message.getInstance(); if (f != null) { writer.writeMessage( 1, f, - cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getUpdateIfOlderThanSecs(); + if (f !== 0) { + writer.writeInt64( + 2, + f ); } }; /** - * optional DownloadProgress download_progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getDownloadProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.getInstance = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.setDownloadProgress = function(value) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.setInstance = function(value) { return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearDownloadProgress = function() { - return this.setDownloadProgress(undefined); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); }; @@ -2513,11 +2798,55 @@ proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearDow * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasDownloadProgress = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.hasInstance = function() { return jspb.Message.getField(this, 1) != null; }; +/** + * optional int64 update_if_older_than_secs = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.getUpdateIfOlderThanSecs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexRequest.prototype.setUpdateIfOlderThanSecs = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + DOWNLOAD_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_[0])); +}; @@ -2534,8 +2863,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.VersionRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject(opt_includeInstance, this); }; @@ -2544,13 +2873,14 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.toObject = function(op * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.toObject = function(includeInstance, msg) { var f, obj = { - + downloadProgress: (f = msg.getDownloadProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2564,29 +2894,39 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.toObject = function(includeInsta /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.VersionRequest; - return proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse; + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.DownloadProgress; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); + msg.setDownloadProgress(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -2600,9 +2940,9 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader = fu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2610,12 +2950,28 @@ proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.serializeBinary = func /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getDownloadProgress(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter + ); + } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.serializeBinaryToWriter + ); + } }; @@ -2635,8 +2991,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.VersionResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.toObject(opt_includeInstance, this); }; @@ -2645,13 +3001,13 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - version: jspb.Message.getFieldWithDefault(msg, 1, "") + librariesIndex: (f = msg.getLibrariesIndex()) && proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject(includeInstance, f) }; if (includeInstance) { @@ -2665,23 +3021,23 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.VersionResponse; - return proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result; + return proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -2689,8 +3045,9 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setVersion(value); + var value = new proto.cc.arduino.cli.commands.v1.IndexUpdateReport; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader); + msg.setLibrariesIndex(value); break; default: reader.skipField(); @@ -2705,9 +3062,9 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2715,44 +3072,138 @@ proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVersion(); - if (f.length > 0) { - writer.writeString( + f = message.getLibrariesIndex(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter ); } }; /** - * optional string version = 1; - * @return {string} + * optional IndexUpdateReport libraries_index = 1; + * @return {?proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.getVersion = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.getLibrariesIndex = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.IndexUpdateReport, 1)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.setVersion = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + * @param {?proto.cc.arduino.cli.commands.v1.IndexUpdateReport|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.setLibrariesIndex = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.clearLibrariesIndex = function() { + return this.setLibrariesIndex(undefined); +}; + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result.prototype.hasLibrariesIndex = function() { + return jspb.Message.getField(this, 1) != null; +}; -if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * optional DownloadProgress download_progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getDownloadProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.setDownloadProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearDownloadProgress = function() { + return this.setDownloadProgress(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasDownloadProgress = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.UpdateLibrariesIndexResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. * Field names that are reserved in JavaScript and will be renamed to pb_name. @@ -2765,8 +3216,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject(opt_includeInstance, this); }; @@ -2775,15 +3226,14 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.toObject = function(includeInstance, msg) { var f, obj = { - sketchName: jspb.Message.getFieldWithDefault(msg, 2, ""), - sketchDir: jspb.Message.getFieldWithDefault(msg, 3, ""), - overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + indexUrl: jspb.Message.getFieldWithDefault(msg, 1, ""), + status: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -2797,40 +3247,36 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.NewSketchRequest; - return proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.IndexUpdateReport; + return proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setSketchName(value); - break; - case 3: + case 1: var value = /** @type {string} */ (reader.readString()); - msg.setSketchDir(value); + msg.setIndexUrl(value); break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOverwrite(value); + case 2: + var value = /** @type {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} */ (reader.readEnum()); + msg.setStatus(value); break; default: reader.skipField(); @@ -2845,9 +3291,9 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2855,30 +3301,23 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSketchName(); + f = message.getIndexUrl(); if (f.length > 0) { writer.writeString( - 2, - f - ); - } - f = message.getSketchDir(); - if (f.length > 0) { - writer.writeString( - 3, + 1, f ); } - f = message.getOverwrite(); - if (f) { - writer.writeBool( - 4, + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 2, f ); } @@ -2886,56 +3325,49 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = func /** - * optional string sketch_name = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + * @enum {number} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status = { + STATUS_UNSPECIFIED: 0, + STATUS_UPDATED: 1, + STATUS_ALREADY_UP_TO_DATE: 2, + STATUS_FAILED: 3, + STATUS_SKIPPED: 4 }; - /** - * optional string sketch_dir = 3; + * optional string index_url = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchDir = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.getIndexUrl = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} returns this */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchDir = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.setIndexUrl = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional bool overwrite = 4; - * @return {boolean} + * optional Status status = 2; + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getOverwrite = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.getStatus = function() { + return /** @type {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + * @param {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport.Status} value + * @return {!proto.cc.arduino.cli.commands.v1.IndexUpdateReport} returns this */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setOverwrite = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); +proto.cc.arduino.cli.commands.v1.IndexUpdateReport.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); }; @@ -2955,8 +3387,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.VersionRequest.toObject(opt_includeInstance, this); }; @@ -2965,13 +3397,13 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.toObject = function * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.VersionRequest.toObject = function(includeInstance, msg) { var f, obj = { - mainFile: jspb.Message.getFieldWithDefault(msg, 1, "") + }; if (includeInstance) { @@ -2985,33 +3417,29 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject = function(includeIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.NewSketchResponse; - return proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.VersionRequest; + return proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.VersionRequest} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.VersionRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMainFile(value); - break; default: reader.skipField(); break; @@ -3025,9 +3453,9 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.VersionRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3035,37 +3463,12 @@ proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.serializeBinary = f /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.VersionRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.VersionRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getMainFile(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string main_file = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.getMainFile = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.setMainFile = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); }; @@ -3085,8 +3488,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.VersionResponse.toObject(opt_includeInstance, this); }; @@ -3095,13 +3498,13 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.VersionResponse.toObject = function(includeInstance, msg) { var f, obj = { - sketchPath: jspb.Message.getFieldWithDefault(msg, 2, "") + version: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -3115,32 +3518,32 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject = function(includeIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchRequest; - return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.VersionResponse; + return proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.VersionResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 2: + case 1: var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); + msg.setVersion(value); break; default: reader.skipField(); @@ -3155,9 +3558,9 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3165,16 +3568,16 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = f /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.VersionResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.VersionResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSketchPath(); + f = message.getVersion(); if (f.length > 0) { writer.writeString( - 2, + 1, f ); } @@ -3182,20 +3585,20 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter = fun /** - * optional string sketch_path = 2; + * optional string version = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.getSketchPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.getVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.VersionResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setSketchPath = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.VersionResponse.prototype.setVersion = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; @@ -3215,8 +3618,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject(opt_includeInstance, this); }; @@ -3225,13 +3628,15 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.toObject = function(includeInstance, msg) { var f, obj = { - sketch: (f = msg.getSketch()) && cc_arduino_cli_commands_v1_common_pb.Sketch.toObject(includeInstance, f) + sketchName: jspb.Message.getFieldWithDefault(msg, 2, ""), + sketchDir: jspb.Message.getFieldWithDefault(msg, 3, ""), + overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3245,33 +3650,40 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchResponse; - return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.NewSketchRequest; + return proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Sketch; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Sketch.deserializeBinaryFromReader); - msg.setSketch(value); + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchDir(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOverwrite(value); break; default: reader.skipField(); @@ -3286,9 +3698,9 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3296,57 +3708,87 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSketch(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Sketch.serializeBinaryToWriter + f = message.getSketchName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSketchDir(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getOverwrite(); + if (f) { + writer.writeBool( + 4, + f ); } }; /** - * optional Sketch sketch = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Sketch} + * optional string sketch_name = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getSketch = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.Sketch} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Sketch, 1)); +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Sketch|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setSketch = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + * optional string sketch_dir = 3; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearSketch = function() { - return this.setSketch(undefined); +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getSketchDir = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * Returns whether this field is set. + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setSketchDir = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional bool overwrite = 4; * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.hasSketch = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.getOverwrite = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.setOverwrite = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; @@ -3366,8 +3808,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject(opt_includeInstance, this); }; @@ -3376,16 +3818,13 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.toObject = function(includeInstance, msg) { var f, obj = { - sketchPath: jspb.Message.getFieldWithDefault(msg, 1, ""), - archivePath: jspb.Message.getFieldWithDefault(msg, 2, ""), - includeBuildDir: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + mainFile: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -3399,23 +3838,23 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest; - return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.NewSketchResponse; + return proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3424,19 +3863,7 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReade switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setSketchPath(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setArchivePath(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIncludeBuildDir(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOverwrite(value); + msg.setMainFile(value); break; default: reader.skipField(); @@ -3451,9 +3878,9 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3461,112 +3888,167 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSketchPath(); + f = message.getMainFile(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getArchivePath(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIncludeBuildDir(); - if (f) { - writer.writeBool( - 3, - f - ); - } - f = message.getOverwrite(); - if (f) { - writer.writeBool( - 4, - f - ); - } }; /** - * optional string sketch_path = 1; + * optional string main_file = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getSketchPath = function() { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.getMainFile = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.NewSketchResponse} returns this */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setSketchPath = function(value) { +proto.cc.arduino.cli.commands.v1.NewSketchResponse.prototype.setMainFile = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; -/** - * optional string archive_path = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getArchivePath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setArchivePath = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject(opt_includeInstance, this); }; /** - * optional bool include_build_dir = 3; - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getIncludeBuildDir = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.toObject = function(includeInstance, msg) { + var f, obj = { + sketchPath: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setIncludeBuildDir = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchRequest; + return proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader(msg, reader); }; /** - * optional bool overwrite = 4; - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getOverwrite = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setSketchPath(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {boolean} value - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setOverwrite = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LoadSketchRequest.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.LoadSketchRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSketchPath(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string sketch_path = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.setSketchPath = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; @@ -3586,8 +4068,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject(opt_includeInstance, this); }; @@ -3596,13 +4078,13 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeInstance, msg) { var f, obj = { - + sketch: (f = msg.getSketch()) && cc_arduino_cli_commands_v1_common_pb.Sketch.toObject(includeInstance, f) }; if (includeInstance) { @@ -3616,29 +4098,34 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse; - return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.LoadSketchResponse; + return proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Sketch; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Sketch.deserializeBinaryFromReader); + msg.setSketch(value); + break; default: reader.skipField(); break; @@ -3652,9 +4139,9 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3662,12 +4149,57 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getSketch(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Sketch.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Sketch sketch = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Sketch} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getSketch = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Sketch} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Sketch, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Sketch|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setSketch = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearSketch = function() { + return this.setSketch(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.hasSketch = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -3687,8 +4219,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * 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); +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.toObject(opt_includeInstance, this); }; @@ -3697,16 +4229,16 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.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, "") + archivePath: jspb.Message.getFieldWithDefault(msg, 2, ""), + includeBuildDir: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3720,23 +4252,23 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest; - return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest; + return proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3749,15 +4281,15 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinaryFromR break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setDefaultFqbn(value); + msg.setArchivePath(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setDefaultPortAddress(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIncludeBuildDir(value); break; case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setDefaultPortProtocol(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOverwrite(value); break; default: reader.skipField(); @@ -3772,9 +4304,9 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3782,11 +4314,11 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getSketchPath(); if (f.length > 0) { @@ -3795,23 +4327,23 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWrite f ); } - f = message.getDefaultFqbn(); + f = message.getArchivePath(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getDefaultPortAddress(); - if (f.length > 0) { - writer.writeString( + f = message.getIncludeBuildDir(); + if (f) { + writer.writeBool( 3, f ); } - f = message.getDefaultPortProtocol(); - if (f.length > 0) { - writer.writeString( + f = message.getOverwrite(); + if (f) { + writer.writeBool( 4, f ); @@ -3823,71 +4355,71 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWrite * optional string sketch_path = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getSketchPath = function() { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getSketchPath = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setSketchPath = function(value) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setSketchPath = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string default_fqbn = 2; + * optional string archive_path = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultFqbn = function() { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getArchivePath = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setArchivePath = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional string default_port_address = 3; - * @return {string} + * optional bool include_build_dir = 3; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultPortAddress = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getIncludeBuildDir = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultPortAddress = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setIncludeBuildDir = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional string default_port_protocol = 4; - * @return {string} + * optional bool overwrite = 4; + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultPortProtocol = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.getOverwrite = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultPortProtocol = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); +proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest.prototype.setOverwrite = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; @@ -3907,8 +4439,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * 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); +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.toObject(opt_includeInstance, this); }; @@ -3917,15 +4449,13 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.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) { @@ -3939,23 +4469,128 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse; - return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse; + return proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.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, ""), + defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 5, "") + }; + + 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; @@ -3964,16 +4599,24 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinaryFrom switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setDefaultFqbn(value); + msg.setSketchPath(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setDefaultPortAddress(value); + msg.setDefaultFqbn(value); break; case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultPortAddress(value); + break; + case 4: var value = /** @type {string} */ (reader.readString()); msg.setDefaultPortProtocol(value); break; + case 5: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProgrammer(value); + break; default: reader.skipField(); break; @@ -3987,9 +4630,9 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.deserializeBinaryFrom * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3997,90 +4640,872 @@ proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.serializeBi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDefaultFqbn(); + f = message.getSketchPath(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getDefaultPortAddress(); + f = message.getDefaultFqbn(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getDefaultPortProtocol(); + f = message.getDefaultPortAddress(); if (f.length > 0) { writer.writeString( 3, f ); } + f = message.getDefaultPortProtocol(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getDefaultProgrammer(); + if (f.length > 0) { + writer.writeString( + 5, + f + ); + } }; /** - * optional string default_fqbn = 1; + * optional string sketch_path = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultFqbn = function() { +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.SetSketchDefaultsResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultFqbn = function(value) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setSketchPath = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string default_port_address = 2; + * optional string default_fqbn = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultPortAddress = function() { +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.SetSketchDefaultsResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultPortAddress = function(value) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultFqbn = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional string default_port_protocol = 3; + * optional string default_port_address = 3; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultPortProtocol = function() { +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.SetSketchDefaultsResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultPortProtocol = function(value) { +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultPortAddress = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; +/** + * optional string default_port_protocol = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultPortProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultPortProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional string default_programmer = 5; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.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, ""), + defaultProgrammer: 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.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; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProgrammer(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 + ); + } + f = message.getDefaultProgrammer(); + if (f.length > 0) { + writer.writeString( + 4, + 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); +}; + + +/** + * optional string default_programmer = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.getDefaultProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.prototype.setDefaultProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.toObject = function(includeInstance, msg) { + var f, obj = { + forceCheck: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest; + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setForceCheck(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getForceCheck(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool force_check = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.getForceCheck = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest.prototype.setForceCheck = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.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.CheckForArduinoCLIUpdatesResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.toObject = function(includeInstance, msg) { + var f, obj = { + newestVersion: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse; + return proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setNewestVersion(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getNewestVersion(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string newest_version = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.getNewestVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesResponse.prototype.setNewestVersion = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.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.CleanDownloadCacheDirectoryRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest; + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Instance; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); + msg.setInstance(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.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.CleanDownloadCacheDirectoryRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getInstance(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.getInstance = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.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.CleanDownloadCacheDirectoryResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse; + return proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.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.CleanDownloadCacheDirectoryResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.CleanDownloadCacheDirectoryResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + /** * @enum {number} */ 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 686aaddc7..5cfa42a8a 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 @@ -318,10 +318,10 @@ export class PlatformRelease extends jspb.Message { setName(value: string): PlatformRelease; getVersion(): string; setVersion(value: string): PlatformRelease; - clearTypeList(): void; - getTypeList(): Array<string>; - setTypeList(value: Array<string>): PlatformRelease; - addType(value: string, index?: number): string; + clearTypesList(): void; + getTypesList(): Array<string>; + setTypesList(value: Array<string>): PlatformRelease; + addTypes(value: string, index?: number): string; getInstalled(): boolean; setInstalled(value: boolean): PlatformRelease; clearBoardsList(): void; @@ -354,7 +354,7 @@ export namespace PlatformRelease { export type AsObject = { name: string, version: string, - typeList: Array<string>, + typesList: Array<string>, installed: boolean, boardsList: Array<Board.AsObject>, help?: HelpResources.AsObject, @@ -416,29 +416,6 @@ 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; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: Profile, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Profile; - static deserializeBinaryFromReader(message: Profile, reader: jspb.BinaryReader): Profile; -} - -export namespace Profile { - export type AsObject = { - name: string, - fqbn: string, - } -} - export class HelpResources extends jspb.Message { getOnline(): string; setOnline(value: string): HelpResources; @@ -491,6 +468,8 @@ export class Sketch extends jspb.Message { clearDefaultProfile(): void; getDefaultProfile(): SketchProfile | undefined; setDefaultProfile(value?: SketchProfile): Sketch; + getDefaultProgrammer(): string; + setDefaultProgrammer(value: string): Sketch; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Sketch.AsObject; @@ -514,6 +493,7 @@ export namespace Sketch { defaultProtocol: string, profilesList: Array<SketchProfile.AsObject>, defaultProfile?: SketchProfile.AsObject, + defaultProgrammer: string, } } @@ -522,6 +502,8 @@ export class SketchProfile extends jspb.Message { setName(value: string): SketchProfile; getFqbn(): string; setFqbn(value: string): SketchProfile; + getProgrammer(): string; + setProgrammer(value: string): SketchProfile; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SketchProfile.AsObject; @@ -537,5 +519,6 @@ export namespace SketchProfile { export type AsObject = { name: string, fqbn: string, + programmer: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js index d30df0410..79d1e7660 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 @@ -35,7 +35,6 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformMetadata', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformRelease', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSummary', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Profile', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Programmer', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Sketch', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SketchProfile', null, global); @@ -334,27 +333,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Board.displayName = 'proto.cc.arduino.cli.commands.v1.Board'; } -/** - * 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.Profile = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.Profile, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.Profile.displayName = 'proto.cc.arduino.cli.commands.v1.Profile'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -2616,7 +2594,7 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.toObject = function(includeInst var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), version: jspb.Message.getFieldWithDefault(msg, 2, ""), - typeList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + typesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, installed: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), boardsList: jspb.Message.toObjectList(msg.getBoardsList(), proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), @@ -2670,7 +2648,7 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.deserializeBinaryFromReader = f break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.addType(value); + msg.addTypes(value); break; case 4: var value = /** @type {boolean} */ (reader.readBool()); @@ -2741,7 +2719,7 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.serializeBinaryToWriter = funct f ); } - f = message.getTypeList(); + f = message.getTypesList(); if (f.length > 0) { writer.writeRepeatedString( 3, @@ -2832,10 +2810,10 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setVersion = function /** - * repeated string type = 3; + * repeated string types = 3; * @return {!Array<string>} */ -proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getTypeList = function() { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getTypesList = function() { return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); }; @@ -2844,7 +2822,7 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.getTypeList = functio * @param {!Array<string>} value * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setTypeList = function(value) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setTypesList = function(value) { return jspb.Message.setField(this, 3, value || []); }; @@ -2854,7 +2832,7 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.setTypeList = functio * @param {number=} opt_index * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addType = function(value, opt_index) { +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addTypes = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 3, value, opt_index); }; @@ -2863,8 +2841,8 @@ proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.addType = function(va * Clears the list making it empty but non-null. * @return {!proto.cc.arduino.cli.commands.v1.PlatformRelease} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearTypeList = function() { - return this.setTypeList([]); +proto.cc.arduino.cli.commands.v1.PlatformRelease.prototype.clearTypesList = function() { + return this.setTypesList([]); }; @@ -3398,166 +3376,6 @@ proto.cc.arduino.cli.commands.v1.Board.prototype.setFqbn = function(value) { -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.Profile.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.Profile} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.Profile.toObject = function(includeInstance, msg) { - var f, obj = { - name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.Profile} - */ -proto.cc.arduino.cli.commands.v1.Profile.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.Profile; - return proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.Profile} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.Profile} - */ -proto.cc.arduino.cli.commands.v1.Profile.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setFqbn(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.Profile.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.Profile} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.Profile.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getFqbn(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional string name = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.getName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this - */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.setName = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string fqbn = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.getFqbn = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.Profile} returns this - */ -proto.cc.arduino.cli.commands.v1.Profile.prototype.setFqbn = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -3734,7 +3552,8 @@ proto.cc.arduino.cli.commands.v1.Sketch.toObject = function(includeInstance, msg defaultProtocol: jspb.Message.getFieldWithDefault(msg, 8, ""), profilesList: jspb.Message.toObjectList(msg.getProfilesList(), proto.cc.arduino.cli.commands.v1.SketchProfile.toObject, includeInstance), - defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f) + defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f), + defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 11, "") }; if (includeInstance) { @@ -3813,6 +3632,10 @@ proto.cc.arduino.cli.commands.v1.Sketch.deserializeBinaryFromReader = function(m reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader); msg.setDefaultProfile(value); break; + case 11: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProgrammer(value); + break; default: reader.skipField(); break; @@ -3914,6 +3737,13 @@ proto.cc.arduino.cli.commands.v1.Sketch.serializeBinaryToWriter = function(messa proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter ); } + f = message.getDefaultProgrammer(); + if (f.length > 0) { + writer.writeString( + 11, + f + ); + } }; @@ -4193,6 +4023,24 @@ proto.cc.arduino.cli.commands.v1.Sketch.prototype.hasDefaultProfile = function() }; +/** + * optional string default_programmer = 11; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 11, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 11, value); +}; + + @@ -4226,7 +4074,8 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.toObject = function(opt proto.cc.arduino.cli.commands.v1.SketchProfile.toObject = function(includeInstance, msg) { var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), - fqbn: jspb.Message.getFieldWithDefault(msg, 2, "") + fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + programmer: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -4271,6 +4120,10 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader = fun var value = /** @type {string} */ (reader.readString()); msg.setFqbn(value); break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setProgrammer(value); + break; default: reader.skipField(); break; @@ -4314,6 +4167,13 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter = functio f ); } + f = message.getProgrammer(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } }; @@ -4353,4 +4213,22 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setFqbn = function(valu }; +/** + * optional string programmer = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getProgrammer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setProgrammer = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts index b5e832ec0..f9c202c98 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts @@ -5,7 +5,6 @@ /* eslint-disable */ import * as jspb from "google-protobuf"; -import * as google_protobuf_wrappers_pb from "google-protobuf/google/protobuf/wrappers_pb"; import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; @@ -57,8 +56,8 @@ export class CompileRequest extends jspb.Message { hasExportBinaries(): boolean; clearExportBinaries(): void; - getExportBinaries(): google_protobuf_wrappers_pb.BoolValue | undefined; - setExportBinaries(value?: google_protobuf_wrappers_pb.BoolValue): CompileRequest; + getExportBinaries(): boolean | undefined; + setExportBinaries(value: boolean): CompileRequest; clearLibraryList(): void; getLibraryList(): Array<string>; setLibraryList(value: Array<string>): CompileRequest; @@ -73,6 +72,10 @@ export class CompileRequest extends jspb.Message { setSkipLibrariesDiscovery(value: boolean): CompileRequest; getDoNotExpandBuildProperties(): boolean; setDoNotExpandBuildProperties(value: boolean): CompileRequest; + clearBuildCacheExtraPathsList(): void; + getBuildCacheExtraPathsList(): Array<string>; + setBuildCacheExtraPathsList(value: Array<string>): CompileRequest; + addBuildCacheExtraPaths(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -105,13 +108,14 @@ export namespace CompileRequest { createCompilationDatabaseOnly: boolean, sourceOverrideMap: Array<[string, string]>, - exportBinaries?: google_protobuf_wrappers_pb.BoolValue.AsObject, + exportBinaries?: boolean, libraryList: Array<string>, keysKeychain: string, signKey: string, encryptKey: string, skipLibrariesDiscovery: boolean, doNotExpandBuildProperties: boolean, + buildCacheExtraPathsList: Array<string>, } } @@ -171,6 +175,23 @@ export namespace CompileResponse { } +export class InstanceNeedsReinitializationError extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): InstanceNeedsReinitializationError.AsObject; + static toObject(includeInstance: boolean, msg: InstanceNeedsReinitializationError): InstanceNeedsReinitializationError.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: InstanceNeedsReinitializationError, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): InstanceNeedsReinitializationError; + static deserializeBinaryFromReader(message: InstanceNeedsReinitializationError, reader: jspb.BinaryReader): InstanceNeedsReinitializationError; +} + +export namespace InstanceNeedsReinitializationError { + export type AsObject = { + } +} + export class BuilderResult extends jspb.Message { getBuildPath(): string; setBuildPath(value: string): BuilderResult; 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 affc77361..0e1782705 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js @@ -21,8 +21,6 @@ var global = (function() { return Function('return this')(); }.call(null)); -var google_protobuf_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js'); -goog.object.extend(proto, google_protobuf_wrappers_pb); var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); @@ -35,6 +33,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileRequest', null, globa goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CompileResponse.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ExecutableSectionSize', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -77,6 +76,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.CompileResponse.displayName = 'proto.cc.arduino.cli.commands.v1.CompileResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.displayName = 'proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -188,7 +208,7 @@ if (goog.DEBUG && !COMPILED) { * @private {!Array<number>} * @const */ -proto.cc.arduino.cli.commands.v1.CompileRequest.repeatedFields_ = [8,15,24]; +proto.cc.arduino.cli.commands.v1.CompileRequest.repeatedFields_ = [8,15,24,30]; @@ -239,13 +259,14 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.toObject = function(includeInsta clean: jspb.Message.getBooleanFieldWithDefault(msg, 19, false), createCompilationDatabaseOnly: jspb.Message.getBooleanFieldWithDefault(msg, 21, false), sourceOverrideMap: (f = msg.getSourceOverrideMap()) ? f.toObject(includeInstance, undefined) : [], - exportBinaries: (f = msg.getExportBinaries()) && google_protobuf_wrappers_pb.BoolValue.toObject(includeInstance, f), + exportBinaries: jspb.Message.getBooleanFieldWithDefault(msg, 23, false), libraryList: (f = jspb.Message.getRepeatedField(msg, 24)) == null ? undefined : f, keysKeychain: jspb.Message.getFieldWithDefault(msg, 25, ""), signKey: jspb.Message.getFieldWithDefault(msg, 26, ""), encryptKey: jspb.Message.getFieldWithDefault(msg, 27, ""), skipLibrariesDiscovery: jspb.Message.getBooleanFieldWithDefault(msg, 28, false), - doNotExpandBuildProperties: jspb.Message.getBooleanFieldWithDefault(msg, 29, false) + doNotExpandBuildProperties: jspb.Message.getBooleanFieldWithDefault(msg, 29, false), + buildCacheExtraPathsList: (f = jspb.Message.getRepeatedField(msg, 30)) == null ? undefined : f }; if (includeInstance) { @@ -358,8 +379,7 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu }); break; case 23: - var value = new google_protobuf_wrappers_pb.BoolValue; - reader.readMessage(value,google_protobuf_wrappers_pb.BoolValue.deserializeBinaryFromReader); + var value = /** @type {boolean} */ (reader.readBool()); msg.setExportBinaries(value); break; case 24: @@ -386,6 +406,10 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu var value = /** @type {boolean} */ (reader.readBool()); msg.setDoNotExpandBuildProperties(value); break; + case 30: + var value = /** @type {string} */ (reader.readString()); + msg.addBuildCacheExtraPaths(value); + break; default: reader.skipField(); break; @@ -539,12 +563,11 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi if (f && f.getLength() > 0) { f.serializeBinary(22, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } - f = message.getExportBinaries(); + f = /** @type {boolean} */ (jspb.Message.getField(message, 23)); if (f != null) { - writer.writeMessage( + writer.writeBool( 23, - f, - google_protobuf_wrappers_pb.BoolValue.serializeBinaryToWriter + f ); } f = message.getLibraryList(); @@ -589,6 +612,13 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } + f = message.getBuildCacheExtraPathsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 30, + f + ); + } }; @@ -978,30 +1008,29 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearSourceOverrideMap /** - * optional google.protobuf.BoolValue export_binaries = 23; - * @return {?proto.google.protobuf.BoolValue} + * optional bool export_binaries = 23; + * @return {boolean} */ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getExportBinaries = function() { - return /** @type{?proto.google.protobuf.BoolValue} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BoolValue, 23)); + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 23, false)); }; /** - * @param {?proto.google.protobuf.BoolValue|undefined} value + * @param {boolean} value * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this -*/ + */ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setExportBinaries = function(value) { - return jspb.Message.setWrapperField(this, 23, value); + return jspb.Message.setField(this, 23, value); }; /** - * Clears the message field making it undefined. + * Clears the field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this */ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearExportBinaries = function() { - return this.setExportBinaries(undefined); + return jspb.Message.setField(this, 23, undefined); }; @@ -1141,6 +1170,43 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setDoNotExpandBuildPro }; +/** + * repeated string build_cache_extra_paths = 30; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getBuildCacheExtraPathsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 30)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setBuildCacheExtraPathsList = function(value) { + return jspb.Message.setField(this, 30, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.addBuildCacheExtraPaths = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 30, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearBuildCacheExtraPathsList = function() { + return this.setBuildCacheExtraPathsList([]); +}; + + /** * Oneof group definitions for this message. Each group defines the field @@ -1516,6 +1582,107 @@ proto.cc.arduino.cli.commands.v1.CompileResponse.prototype.hasResult = function( + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.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.InstanceNeedsReinitializationError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError; + return proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError} + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.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.InstanceNeedsReinitializationError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + /** * List of repeated fields within this message type. * @private {!Array<number>} 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 89b28e6ee..cd50946ed 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.d.ts @@ -60,6 +60,13 @@ export class PlatformInstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): PlatformInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformInstallResponse.Result | undefined; + setResult(value?: PlatformInstallResponse.Result): PlatformInstallResponse; + + getMessageCase(): PlatformInstallResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformInstallResponse): PlatformInstallResponse.AsObject; @@ -74,7 +81,35 @@ export namespace PlatformInstallResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: PlatformInstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class PlatformLoadingError extends jspb.Message { @@ -133,6 +168,13 @@ export class PlatformDownloadResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): PlatformDownloadResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformDownloadResponse.Result | undefined; + setResult(value?: PlatformDownloadResponse.Result): PlatformDownloadResponse; + + getMessageCase(): PlatformDownloadResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformDownloadResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformDownloadResponse): PlatformDownloadResponse.AsObject; @@ -146,7 +188,34 @@ export class PlatformDownloadResponse extends jspb.Message { export namespace PlatformDownloadResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: PlatformDownloadResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + RESULT = 2, + } + } export class PlatformUninstallRequest extends jspb.Message { @@ -188,6 +257,13 @@ export class PlatformUninstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): PlatformUninstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformUninstallResponse.Result | undefined; + setResult(value?: PlatformUninstallResponse.Result): PlatformUninstallResponse; + + getMessageCase(): PlatformUninstallResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUninstallResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformUninstallResponse): PlatformUninstallResponse.AsObject; @@ -201,7 +277,34 @@ export class PlatformUninstallResponse extends jspb.Message { export namespace PlatformUninstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: PlatformUninstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export class AlreadyAtLatestVersionError extends jspb.Message { @@ -268,10 +371,12 @@ export class PlatformUpgradeResponse extends jspb.Message { 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; + hasResult(): boolean; + clearResult(): void; + getResult(): PlatformUpgradeResponse.Result | undefined; + setResult(value?: PlatformUpgradeResponse.Result): PlatformUpgradeResponse; + + getMessageCase(): PlatformUpgradeResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUpgradeResponse.AsObject; @@ -287,8 +392,41 @@ export namespace PlatformUpgradeResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, - platform?: cc_arduino_cli_commands_v1_common_pb.Platform.AsObject, + result?: PlatformUpgradeResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + hasPlatform(): boolean; + clearPlatform(): void; + getPlatform(): cc_arduino_cli_commands_v1_common_pb.Platform | undefined; + setPlatform(value?: cc_arduino_cli_commands_v1_common_pb.Platform): Result; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + platform?: cc_arduino_cli_commands_v1_common_pb.Platform.AsObject, + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class PlatformSearchRequest extends jspb.Message { 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 00fe8d64a..86d02942a 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/core_pb.js @@ -26,15 +26,23 @@ goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.AlreadyAtLatestVersionError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformLoadingError', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformSearchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -67,7 +75,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -77,6 +85,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformInstallResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -130,7 +159,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -140,6 +169,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -172,7 +222,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -182,6 +232,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse'; } +/** + * 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.PlatformUninstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -235,7 +306,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse = 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.PlatformUpgradeResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -245,6 +316,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse'; } +/** + * 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.PlatformUpgradeResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -619,6 +711,33 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallRequest.prototype.setSkipPreUnin +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -651,7 +770,8 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.toObject = fu proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -698,6 +818,11 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.deserializeBinaryFromRe reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -743,6 +868,115 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -761,7 +995,7 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getProgress = * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0], value); }; @@ -798,7 +1032,7 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getTaskProgre * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0], value); }; @@ -820,6 +1054,43 @@ proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.hasTaskProgre }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -1163,6 +1434,32 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadRequest.prototype.setVersion = +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1194,7 +1491,8 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.toObject = f */ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.toObject = function(includeInstance, msg) { var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1236,6 +1534,11 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.deserializeBinaryFromR reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); msg.setProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1273,26 +1576,135 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.serializeBinaryToWrite cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.serializeBinaryToWriter + ); + } }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional DownloadProgress progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.toObject(opt_includeInstance, this); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + +/** + * optional DownloadProgress progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_[0], value); +}; /** @@ -1313,6 +1725,43 @@ proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.hasProgress }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformDownloadResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -1555,6 +2004,32 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallRequest.prototype.setSkipPreUn +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1586,7 +2061,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.toObject = */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1628,6 +2104,11 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1665,6 +2146,115 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1683,7 +2273,7 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_[0], value); }; @@ -1705,6 +2295,43 @@ proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.hasTaskProg }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUninstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -2078,6 +2705,33 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeRequest.prototype.setSkipPreUnin +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2111,7 +2765,7 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.toObject = function(inc 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), - platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.toObject(includeInstance, f) + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2159,9 +2813,9 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.deserializeBinaryFromRe 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); + var value = new proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); break; default: reader.skipField(); @@ -2208,17 +2862,168 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } - f = message.getPlatform(); + f = message.getResult(); if (f != null) { writer.writeMessage( 3, f, + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.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.PlatformUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result; + return proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Platform; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Platform.deserializeBinaryFromReader); + msg.setPlatform(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.PlatformUpgradeResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPlatform(); + if (f != null) { + writer.writeMessage( + 1, + f, cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter ); } }; +/** + * optional Platform platform = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Platform} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.getPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Platform} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Platform|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.setPlatform = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} returns this + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.clearPlatform = function() { + return this.setPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result.prototype.hasPlatform = function() { + return jspb.Message.getField(this, 1) != null; +}; + + /** * optional DownloadProgress progress = 1; * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} @@ -2234,7 +3039,7 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getProgress = * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0], value); }; @@ -2271,7 +3076,7 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getTaskProgre * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0], value); }; @@ -2294,21 +3099,21 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasTaskProgre /** - * optional Platform platform = 3; - * @return {?proto.cc.arduino.cli.commands.v1.Platform} + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} */ -proto.cc.arduino.cli.commands.v1.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)); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result, 3)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.Platform|undefined} value + * @param {?proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.Result|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setPlatform = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.oneofGroups_[0], value); }; @@ -2316,8 +3121,8 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setPlatform = * 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); +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearResult = function() { + return this.setResult(undefined); }; @@ -2325,7 +3130,7 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.clearPlatform * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasPlatform = function() { +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasResult = function() { return jspb.Message.getField(this, 3) != null; }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts index b37a9d558..d36f20ec2 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts @@ -41,12 +41,20 @@ export namespace DebugRequest { } export class DebugResponse extends jspb.Message { + + hasData(): boolean; + clearData(): void; getData(): Uint8Array | string; getData_asU8(): Uint8Array; getData_asB64(): string; setData(value: Uint8Array | string): DebugResponse; - getError(): string; - setError(value: string): DebugResponse; + + hasResult(): boolean; + clearResult(): void; + getResult(): DebugResponse.Result | undefined; + setResult(value?: DebugResponse.Result): DebugResponse; + + getMessageCase(): DebugResponse.MessageCase; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): DebugResponse.AsObject; @@ -61,8 +69,37 @@ export class DebugResponse extends jspb.Message { export namespace DebugResponse { export type AsObject = { data: Uint8Array | string, - error: string, + result?: DebugResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + getError(): string; + setError(value: string): Result; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + error: string, + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + DATA = 1, + RESULT = 2, + } + } export class IsDebugSupportedRequest extends jspb.Message { diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js index 125c03f2d..e0d781543 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js @@ -31,6 +31,8 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugGCCToolchainConfigurati goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugOpenOCDServerConfiguration', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DebugResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GetDebugConfigResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest', null, global); @@ -67,7 +69,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.DebugResponse = 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.DebugResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.DebugResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -77,6 +79,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.DebugResponse.displayName = 'proto.cc.arduino.cli.commands.v1.DebugResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.DebugResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.DebugResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.DebugResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -439,6 +462,32 @@ proto.cc.arduino.cli.commands.v1.DebugRequest.prototype.setSendInterrupt = funct +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + DATA: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.DebugResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -471,7 +520,7 @@ proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.toObject = function(opt proto.cc.arduino.cli.commands.v1.DebugResponse.toObject = function(includeInstance, msg) { var f, obj = { data: msg.getData_asB64(), - error: jspb.Message.getFieldWithDefault(msg, 2, "") + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.DebugResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -513,8 +562,9 @@ proto.cc.arduino.cli.commands.v1.DebugResponse.deserializeBinaryFromReader = fun msg.setData(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setError(value); + var value = new proto.cc.arduino.cli.commands.v1.DebugResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); break; default: reader.skipField(); @@ -545,23 +595,154 @@ proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.serializeBinary = funct */ proto.cc.arduino.cli.commands.v1.DebugResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getData_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.DebugResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.DebugResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + error: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.DebugResponse.Result; + return proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setError(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.DebugResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; f = message.getError(); if (f.length > 0) { writer.writeString( - 2, + 1, f ); } }; +/** + * optional string error = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.prototype.getError = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse.Result} returns this + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.Result.prototype.setError = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + /** * optional bytes data = 1; * @return {!(string|Uint8Array)} @@ -600,25 +781,62 @@ proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getData_asU8 = function * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this */ proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setData = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0], value); }; /** - * optional string error = 2; - * @return {string} + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this */ -proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getError = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.clearData = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0], undefined); }; /** - * @param {string} value + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.hasData = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.DebugResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DebugResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.DebugResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DebugResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.DebugResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.DebugResponse} returns this */ -proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.setError = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; }; 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 ae018a7a3..c5401953e 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts @@ -43,6 +43,13 @@ export class LibraryDownloadResponse extends jspb.Message { getProgress(): cc_arduino_cli_commands_v1_common_pb.DownloadProgress | undefined; setProgress(value?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress): LibraryDownloadResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryDownloadResponse.Result | undefined; + setResult(value?: LibraryDownloadResponse.Result): LibraryDownloadResponse; + + getMessageCase(): LibraryDownloadResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryDownloadResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryDownloadResponse): LibraryDownloadResponse.AsObject; @@ -56,7 +63,34 @@ export class LibraryDownloadResponse extends jspb.Message { export namespace LibraryDownloadResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, + result?: LibraryDownloadResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + RESULT = 2, } + } export class LibraryInstallRequest extends jspb.Message { @@ -109,6 +143,13 @@ export class LibraryInstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryInstallResponse.Result | undefined; + setResult(value?: LibraryInstallResponse.Result): LibraryInstallResponse; + + getMessageCase(): LibraryInstallResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryInstallResponse): LibraryInstallResponse.AsObject; @@ -123,7 +164,35 @@ export namespace LibraryInstallResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryInstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, } + } export class LibraryUpgradeRequest extends jspb.Message { @@ -167,6 +236,13 @@ export class LibraryUpgradeResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryUpgradeResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryUpgradeResponse.Result | undefined; + setResult(value?: LibraryUpgradeResponse.Result): LibraryUpgradeResponse; + + getMessageCase(): LibraryUpgradeResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryUpgradeResponse): LibraryUpgradeResponse.AsObject; @@ -181,7 +257,35 @@ export namespace LibraryUpgradeResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryUpgradeResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class LibraryUninstallRequest extends jspb.Message { @@ -220,6 +324,13 @@ export class LibraryUninstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryUninstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryUninstallResponse.Result | undefined; + setResult(value?: LibraryUninstallResponse.Result): LibraryUninstallResponse; + + getMessageCase(): LibraryUninstallResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUninstallResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryUninstallResponse): LibraryUninstallResponse.AsObject; @@ -233,7 +344,34 @@ export class LibraryUninstallResponse extends jspb.Message { export namespace LibraryUninstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryUninstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export class LibraryUpgradeAllRequest extends jspb.Message { @@ -271,6 +409,13 @@ export class LibraryUpgradeAllResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): LibraryUpgradeAllResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): LibraryUpgradeAllResponse.Result | undefined; + setResult(value?: LibraryUpgradeAllResponse.Result): LibraryUpgradeAllResponse; + + getMessageCase(): LibraryUpgradeAllResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeAllResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryUpgradeAllResponse): LibraryUpgradeAllResponse.AsObject; @@ -285,7 +430,35 @@ export namespace LibraryUpgradeAllResponse { export type AsObject = { progress?: cc_arduino_cli_commands_v1_common_pb.DownloadProgress.AsObject, taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: LibraryUpgradeAllResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + PROGRESS = 1, + TASK_PROGRESS = 2, + RESULT = 3, + } + } export class LibraryResolveDependenciesRequest extends jspb.Message { @@ -809,6 +982,13 @@ export class ZipLibraryInstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): ZipLibraryInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): ZipLibraryInstallResponse.Result | undefined; + setResult(value?: ZipLibraryInstallResponse.Result): ZipLibraryInstallResponse; + + getMessageCase(): ZipLibraryInstallResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ZipLibraryInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: ZipLibraryInstallResponse): ZipLibraryInstallResponse.AsObject; @@ -822,7 +1002,34 @@ export class ZipLibraryInstallResponse extends jspb.Message { export namespace ZipLibraryInstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: ZipLibraryInstallResponse.Result.AsObject, + } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export class GitLibraryInstallRequest extends jspb.Message { @@ -861,6 +1068,13 @@ export class GitLibraryInstallResponse extends jspb.Message { getTaskProgress(): cc_arduino_cli_commands_v1_common_pb.TaskProgress | undefined; setTaskProgress(value?: cc_arduino_cli_commands_v1_common_pb.TaskProgress): GitLibraryInstallResponse; + hasResult(): boolean; + clearResult(): void; + getResult(): GitLibraryInstallResponse.Result | undefined; + setResult(value?: GitLibraryInstallResponse.Result): GitLibraryInstallResponse; + + getMessageCase(): GitLibraryInstallResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GitLibraryInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: GitLibraryInstallResponse): GitLibraryInstallResponse.AsObject; @@ -874,7 +1088,34 @@ export class GitLibraryInstallResponse extends jspb.Message { export namespace GitLibraryInstallResponse { export type AsObject = { taskProgress?: cc_arduino_cli_commands_v1_common_pb.TaskProgress.AsObject, + result?: GitLibraryInstallResponse.Result.AsObject, } + + + export class Result extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Result.AsObject; + static toObject(includeInstance: boolean, msg: Result): Result.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Result, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Result; + static deserializeBinaryFromReader(message: Result, reader: jspb.BinaryReader): Result; + } + + export namespace Result { + export type AsObject = { + } + } + + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + TASK_PROGRESS = 1, + RESULT = 2, + } + } export enum LibraryInstallLocation { diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js index 53d6a21b0..74e4f2818 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js @@ -26,15 +26,21 @@ goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadResource', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledLibrary', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Library', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDependency', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDependencyStatus', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallLocation', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryLayout', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryListRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryListResponse', null, global); @@ -47,13 +53,21 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibrarySearchResponse', null goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibrarySearchStatus', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SearchedLibrary', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -86,7 +100,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -96,6 +110,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -128,7 +163,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -138,6 +173,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryInstallResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -170,7 +226,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -180,6 +236,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -212,7 +289,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -222,6 +299,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -254,7 +352,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -264,6 +362,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -569,7 +688,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -579,6 +698,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -611,7 +751,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -621,6 +761,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.displayName = 'proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.displayName = 'proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result'; +} @@ -833,6 +994,32 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadRequest.prototype.setVersion = f +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -864,7 +1051,8 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.toObject = fu */ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.toObject = function(includeInstance, msg) { var f, obj = { - progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f) + progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -906,6 +1094,11 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.deserializeBinaryFromRe reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.DownloadProgress.deserializeBinaryFromReader); msg.setProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -943,43 +1136,14 @@ proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.DownloadProgress.serializeBinaryToWriter ); } -}; - - -/** - * optional DownloadProgress progress = 1; - * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} - */ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); -}; - - -/** - * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value - * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this -*/ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this - */ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 1) != null; + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.serializeBinaryToWriter + ); + } }; @@ -999,8 +1163,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.toObject(opt_includeInstance, this); }; @@ -1009,18 +1173,13 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), - name: jspb.Message.getFieldWithDefault(msg, 2, ""), - version: jspb.Message.getFieldWithDefault(msg, 3, ""), - noDeps: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), - noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), - installLocation: jspb.Message.getFieldWithDefault(msg, 6, 0) + }; if (includeInstance) { @@ -1034,54 +1193,29 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LibraryInstallRequest; - return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.Instance; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); - msg.setInstance(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setVersion(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setNoDeps(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setNoOverwrite(value); - break; - case 6: - var value = /** @type {!proto.cc.arduino.cli.commands.v1.LibraryInstallLocation} */ (reader.readEnum()); - msg.setInstallLocation(value); - break; default: reader.skipField(); break; @@ -1095,9 +1229,9 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1105,29 +1239,234 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getInstance(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter - ); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getVersion(); - if (f.length > 0) { +}; + + +/** + * optional DownloadProgress progress = 1; + * @return {?proto.cc.arduino.cli.commands.v1.DownloadProgress} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.DownloadProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.DownloadProgress, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.clearProgress = function() { + return this.setProgress(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.hasProgress = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryDownloadResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + name: jspb.Message.getFieldWithDefault(msg, 2, ""), + version: jspb.Message.getFieldWithDefault(msg, 3, ""), + noDeps: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + noOverwrite: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), + installLocation: jspb.Message.getFieldWithDefault(msg, 6, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryInstallRequest; + return proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Instance; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); + msg.setInstance(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setVersion(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setNoDeps(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setNoOverwrite(value); + break; + case 6: + var value = /** @type {!proto.cc.arduino.cli.commands.v1.LibraryInstallLocation} */ (reader.readEnum()); + msg.setInstallLocation(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getInstance(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getVersion(); + if (f.length > 0) { writer.writeString( 3, f @@ -1285,6 +1624,33 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallRequest.prototype.setInstallLocat +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1317,7 +1683,8 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.toObject = fun proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1364,6 +1731,11 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.deserializeBinaryFromRea reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1409,6 +1781,115 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1426,8 +1907,45 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getProgress = * @param {?proto.cc.arduino.cli.commands.v1.DownloadProgress|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearProgress = function() { + return this.setProgress(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasProgress = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional TaskProgress task_progress = 2; + * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} + */ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getTaskProgress = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setTaskProgress = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0], value); }; @@ -1435,8 +1953,8 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setProgress = * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearProgress = function() { - return this.setProgress(undefined); +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearTaskProgress = function() { + return this.setTaskProgress(undefined); }; @@ -1444,27 +1962,27 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearProgress * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasProgress = function() { - return jspb.Message.getField(this, 1) != null; +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasTaskProgress = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional TaskProgress task_progress = 2; - * @return {?proto.cc.arduino.cli.commands.v1.TaskProgress} + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getTaskProgress = function() { - return /** @type{?proto.cc.arduino.cli.commands.v1.TaskProgress} */ ( - jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.TaskProgress, 2)); +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result, 3)); }; /** - * @param {?proto.cc.arduino.cli.commands.v1.TaskProgress|undefined} value + * @param {?proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.Result|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.oneofGroups_[0], value); }; @@ -1472,8 +1990,8 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.setTaskProgres * Clears the message field making it undefined. * @return {!proto.cc.arduino.cli.commands.v1.LibraryInstallResponse} returns this */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearTaskProgress = function() { - return this.setTaskProgress(undefined); +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); }; @@ -1481,8 +1999,8 @@ proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.clearTaskProgr * Returns whether this field is set. * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasTaskProgress = function() { - return jspb.Message.getField(this, 2) != null; +proto.cc.arduino.cli.commands.v1.LibraryInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; }; @@ -1698,6 +2216,33 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeRequest.prototype.setNoDeps = fun +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1730,7 +2275,8 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.toObject = fun proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -1777,6 +2323,11 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.deserializeBinaryFromRea reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -1822,6 +2373,115 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -1840,7 +2500,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getProgress = * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0], value); }; @@ -1877,7 +2537,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getTaskProgres * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0], value); }; @@ -1899,6 +2559,43 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.hasTaskProgres }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -2093,20 +2790,174 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest.prototype.setName = fun /** - * optional string version = 3; - * @return {string} + * optional string version = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest.prototype.getVersion = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest.prototype.setVersion = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.toObject = function(includeInstance, msg) { + var f, obj = { + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse; + return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); + msg.setTaskProgress(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest.prototype.getVersion = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallRequest.prototype.setVersion = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTaskProgress(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter + ); + } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.serializeBinaryToWriter + ); + } }; @@ -2126,8 +2977,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.toObject(opt_includeInstance, this); }; @@ -2136,13 +2987,13 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + }; if (includeInstance) { @@ -2156,34 +3007,29 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse; - return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = new cc_arduino_cli_commands_v1_common_pb.TaskProgress; - reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); - msg.setTaskProgress(value); - break; default: reader.skipField(); break; @@ -2197,9 +3043,9 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2207,20 +3053,12 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getTaskProgress(); - if (f != null) { - writer.writeMessage( - 1, - f, - cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter - ); - } }; @@ -2239,7 +3077,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.getTaskProgr * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_[0], value); }; @@ -2261,6 +3099,43 @@ proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.hasTaskProgr }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUninstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -2413,6 +3288,33 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllRequest.prototype.hasInstance +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + PROGRESS: 1, + TASK_PROGRESS: 2, + RESULT: 3 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2445,7 +3347,8 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.toObject = proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.toObject = function(includeInstance, msg) { var f, obj = { progress: (f = msg.getProgress()) && cc_arduino_cli_commands_v1_common_pb.DownloadProgress.toObject(includeInstance, f), - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -2492,6 +3395,11 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -2537,6 +3445,115 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result; + return proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -2555,7 +3572,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getProgress * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.setProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0], value); }; @@ -2592,7 +3609,7 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this */ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0], value); }; @@ -2614,6 +3631,43 @@ proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.hasTaskProg }; +/** + * optional Result result = 3; + * @return {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.LibraryUpgradeAllResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 3) != null; +}; + + @@ -6698,6 +7752,32 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallRequest.prototype.setOverwrite +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -6729,7 +7809,8 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.toObject = */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -6771,6 +7852,11 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -6808,6 +7894,115 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -6826,7 +8021,7 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_[0], value); }; @@ -6848,6 +8043,43 @@ proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.hasTaskProg }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.ZipLibraryInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -7060,6 +8292,32 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallRequest.prototype.setOverwrite +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + TASK_PROGRESS: 1, + RESULT: 2 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -7091,7 +8349,8 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.toObject = */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.toObject = function(includeInstance, msg) { var f, obj = { - taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f) + taskProgress: (f = msg.getTaskProgress()) && cc_arduino_cli_commands_v1_common_pb.TaskProgress.toObject(includeInstance, f), + result: (f = msg.getResult()) && proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.toObject(includeInstance, f) }; if (includeInstance) { @@ -7133,6 +8392,11 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.deserializeBinaryFrom reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.TaskProgress.deserializeBinaryFromReader); msg.setTaskProgress(value); break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinaryFromReader); + msg.setResult(value); + break; default: reader.skipField(); break; @@ -7170,6 +8434,115 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.serializeBinaryToWrit cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getResult(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result; + return proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; @@ -7188,7 +8561,7 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.getTaskProg * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse} returns this */ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.setTaskProgress = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + return jspb.Message.setOneofWrapperField(this, 1, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_[0], value); }; @@ -7210,6 +8583,43 @@ proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.hasTaskProg }; +/** + * optional Result result = 2; + * @return {?proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.getResult = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.Result|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.setResult = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.clearResult = function() { + return this.setResult(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.GitLibraryInstallResponse.prototype.hasResult = function() { + return jspb.Message.getField(this, 2) != null; +}; + + /** * @enum {number} */ diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts index 2e298b4c8..8f6fefdd7 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 @@ -123,19 +123,31 @@ export namespace MonitorPortConfiguration { } export class MonitorResponse extends jspb.Message { + + hasError(): boolean; + clearError(): void; getError(): string; setError(value: string): MonitorResponse; + + hasRxData(): boolean; + clearRxData(): void; getRxData(): Uint8Array | string; getRxData_asU8(): Uint8Array; getRxData_asB64(): string; setRxData(value: Uint8Array | string): MonitorResponse; - clearAppliedSettingsList(): void; - getAppliedSettingsList(): Array<MonitorPortSetting>; - setAppliedSettingsList(value: Array<MonitorPortSetting>): MonitorResponse; - addAppliedSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; + + hasAppliedSettings(): boolean; + clearAppliedSettings(): void; + getAppliedSettings(): MonitorPortConfiguration | undefined; + setAppliedSettings(value?: MonitorPortConfiguration): MonitorResponse; + + hasSuccess(): boolean; + clearSuccess(): void; getSuccess(): boolean; setSuccess(value: boolean): MonitorResponse; + getMessageCase(): MonitorResponse.MessageCase; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorResponse.AsObject; static toObject(includeInstance: boolean, msg: MonitorResponse): MonitorResponse.AsObject; @@ -150,9 +162,18 @@ export namespace MonitorResponse { export type AsObject = { error: string, rxData: Uint8Array | string, - appliedSettingsList: Array<MonitorPortSetting.AsObject>, + appliedSettings?: MonitorPortConfiguration.AsObject, success: boolean, } + + export enum MessageCase { + MESSAGE_NOT_SET = 0, + ERROR = 1, + RX_DATA = 2, + APPLIED_SETTINGS = 3, + SUCCESS = 4, + } + } export class MonitorPortSetting extends jspb.Message { 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 24f22a3fb..893592ea4 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 @@ -34,6 +34,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -108,7 +109,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.MonitorResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.MonitorResponse.repeatedFields_, null); + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_); }; goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -997,11 +998,32 @@ proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.clearSetting /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.repeatedFields_ = [3]; +proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_ = [[1,2,3,4]]; + +/** + * @enum {number} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase = { + MESSAGE_NOT_SET: 0, + ERROR: 1, + RX_DATA: 2, + APPLIED_SETTINGS: 3, + SUCCESS: 4 +}; + +/** + * @return {proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getMessageCase = function() { + return /** @type {proto.cc.arduino.cli.commands.v1.MonitorResponse.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0])); +}; @@ -1036,8 +1058,7 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.toObject = function(includeInst var f, obj = { error: jspb.Message.getFieldWithDefault(msg, 1, ""), rxData: msg.getRxData_asB64(), - appliedSettingsList: jspb.Message.toObjectList(msg.getAppliedSettingsList(), - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject, includeInstance), + appliedSettings: (f = msg.getAppliedSettings()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f), success: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; @@ -1084,9 +1105,9 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.deserializeBinaryFromReader = f msg.setRxData(value); break; case 3: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader); - msg.addAppliedSettings(value); + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setAppliedSettings(value); break; case 4: var value = /** @type {boolean} */ (reader.readBool()); @@ -1121,30 +1142,30 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.serializeBinary = fun */ proto.cc.arduino.cli.commands.v1.MonitorResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getError(); - if (f.length > 0) { + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeString( 1, f ); } - f = message.getRxData_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f ); } - f = message.getAppliedSettingsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getAppliedSettings(); + if (f != null) { + writer.writeMessage( 3, f, - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter ); } - f = message.getSuccess(); - if (f) { + f = /** @type {boolean} */ (jspb.Message.getField(message, 4)); + if (f != null) { writer.writeBool( 4, f @@ -1167,7 +1188,25 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getError = function() * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setError = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearError = function() { + return jspb.Message.setOneofField(this, 1, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasError = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -1209,45 +1248,62 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getRxData_asU8 = func * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setRxData = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); }; /** - * repeated MonitorPortSetting applied_settings = 3; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getAppliedSettingsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, 3)); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearRxData = function() { + return jspb.Message.setOneofField(this, 2, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], undefined); }; /** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} value + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasRxData = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional MonitorPortConfiguration applied_settings = 3; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getAppliedSettings = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setAppliedSettingsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setAppliedSettings = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); }; /** - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.addAppliedSettings = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, opt_index); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearAppliedSettings = function() { + return this.setAppliedSettings(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearAppliedSettingsList = function() { - return this.setAppliedSettingsList([]); +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasAppliedSettings = function() { + return jspb.Message.getField(this, 3) != null; }; @@ -1265,7 +1321,25 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getSuccess = function * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this */ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.setSuccess = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.clearSuccess = function() { + return jspb.Message.setOneofField(this, 4, proto.cc.arduino.cli.commands.v1.MonitorResponse.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasSuccess = function() { + return jspb.Message.getField(this, 4) != null; }; diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts index b960375a5..0ce3d8a8e 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.d.ts @@ -6,112 +6,481 @@ import * as jspb from "google-protobuf"; -export class SettingsGetAllResponse extends jspb.Message { - getJsonData(): string; - setJsonData(value: string): SettingsGetAllResponse; +export class Configuration extends jspb.Message { + + hasDirectories(): boolean; + clearDirectories(): void; + getDirectories(): Configuration.Directories | undefined; + setDirectories(value?: Configuration.Directories): Configuration; + + hasNetwork(): boolean; + clearNetwork(): void; + getNetwork(): Configuration.Network | undefined; + setNetwork(value?: Configuration.Network): Configuration; + + hasSketch(): boolean; + clearSketch(): void; + getSketch(): Configuration.Sketch | undefined; + setSketch(value?: Configuration.Sketch): Configuration; + + hasBuildCache(): boolean; + clearBuildCache(): void; + getBuildCache(): Configuration.BuildCache | undefined; + setBuildCache(value?: Configuration.BuildCache): Configuration; + + hasBoardManager(): boolean; + clearBoardManager(): void; + getBoardManager(): Configuration.BoardManager | undefined; + setBoardManager(value?: Configuration.BoardManager): Configuration; + + hasDaemon(): boolean; + clearDaemon(): void; + getDaemon(): Configuration.Daemon | undefined; + setDaemon(value?: Configuration.Daemon): Configuration; + + hasOutput(): boolean; + clearOutput(): void; + getOutput(): Configuration.Output | undefined; + setOutput(value?: Configuration.Output): Configuration; + + hasLogging(): boolean; + clearLogging(): void; + getLogging(): Configuration.Logging | undefined; + setLogging(value?: Configuration.Logging): Configuration; + + hasLibrary(): boolean; + clearLibrary(): void; + getLibrary(): Configuration.Library | undefined; + setLibrary(value?: Configuration.Library): Configuration; + + hasUpdater(): boolean; + clearUpdater(): void; + getUpdater(): Configuration.Updater | undefined; + setUpdater(value?: Configuration.Updater): Configuration; + + hasLocale(): boolean; + clearLocale(): void; + getLocale(): string | undefined; + setLocale(value: string): Configuration; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsGetAllResponse.AsObject; - static toObject(includeInstance: boolean, msg: SettingsGetAllResponse): SettingsGetAllResponse.AsObject; + toObject(includeInstance?: boolean): Configuration.AsObject; + static toObject(includeInstance: boolean, msg: Configuration): Configuration.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsGetAllResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsGetAllResponse; - static deserializeBinaryFromReader(message: SettingsGetAllResponse, reader: jspb.BinaryReader): SettingsGetAllResponse; + static serializeBinaryToWriter(message: Configuration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Configuration; + static deserializeBinaryFromReader(message: Configuration, reader: jspb.BinaryReader): Configuration; } -export namespace SettingsGetAllResponse { +export namespace Configuration { export type AsObject = { - jsonData: string, + directories?: Configuration.Directories.AsObject, + network?: Configuration.Network.AsObject, + sketch?: Configuration.Sketch.AsObject, + buildCache?: Configuration.BuildCache.AsObject, + boardManager?: Configuration.BoardManager.AsObject, + daemon?: Configuration.Daemon.AsObject, + output?: Configuration.Output.AsObject, + logging?: Configuration.Logging.AsObject, + library?: Configuration.Library.AsObject, + updater?: Configuration.Updater.AsObject, + locale?: string, } + + + export class Directories extends jspb.Message { + getData(): string; + setData(value: string): Directories; + getUser(): string; + setUser(value: string): Directories; + getDownloads(): string; + setDownloads(value: string): Directories; + + hasBuiltin(): boolean; + clearBuiltin(): void; + getBuiltin(): Configuration.Directories.Builtin | undefined; + setBuiltin(value?: Configuration.Directories.Builtin): Directories; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Directories.AsObject; + static toObject(includeInstance: boolean, msg: Directories): Directories.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Directories, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Directories; + static deserializeBinaryFromReader(message: Directories, reader: jspb.BinaryReader): Directories; + } + + export namespace Directories { + export type AsObject = { + data: string, + user: string, + downloads: string, + builtin?: Configuration.Directories.Builtin.AsObject, + } + + + export class Builtin extends jspb.Message { + + hasLibraries(): boolean; + clearLibraries(): void; + getLibraries(): string | undefined; + setLibraries(value: string): Builtin; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Builtin.AsObject; + static toObject(includeInstance: boolean, msg: Builtin): Builtin.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Builtin, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Builtin; + static deserializeBinaryFromReader(message: Builtin, reader: jspb.BinaryReader): Builtin; + } + + export namespace Builtin { + export type AsObject = { + libraries?: string, + } + } + + } + + export class Network extends jspb.Message { + + hasExtraUserAgent(): boolean; + clearExtraUserAgent(): void; + getExtraUserAgent(): string | undefined; + setExtraUserAgent(value: string): Network; + + hasProxy(): boolean; + clearProxy(): void; + getProxy(): string | undefined; + setProxy(value: string): Network; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Network.AsObject; + static toObject(includeInstance: boolean, msg: Network): Network.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Network, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Network; + static deserializeBinaryFromReader(message: Network, reader: jspb.BinaryReader): Network; + } + + export namespace Network { + export type AsObject = { + extraUserAgent?: string, + proxy?: string, + } + } + + export class Sketch extends jspb.Message { + getAlwaysExportBinaries(): boolean; + setAlwaysExportBinaries(value: boolean): Sketch; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Sketch.AsObject; + static toObject(includeInstance: boolean, msg: Sketch): Sketch.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Sketch, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Sketch; + static deserializeBinaryFromReader(message: Sketch, reader: jspb.BinaryReader): Sketch; + } + + export namespace Sketch { + export type AsObject = { + alwaysExportBinaries: boolean, + } + } + + export class BuildCache extends jspb.Message { + getCompilationsBeforePurge(): number; + setCompilationsBeforePurge(value: number): BuildCache; + getTtlSecs(): number; + setTtlSecs(value: number): BuildCache; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BuildCache.AsObject; + static toObject(includeInstance: boolean, msg: BuildCache): BuildCache.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BuildCache, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BuildCache; + static deserializeBinaryFromReader(message: BuildCache, reader: jspb.BinaryReader): BuildCache; + } + + export namespace BuildCache { + export type AsObject = { + compilationsBeforePurge: number, + ttlSecs: number, + } + } + + export class BoardManager extends jspb.Message { + clearAdditionalUrlsList(): void; + getAdditionalUrlsList(): Array<string>; + setAdditionalUrlsList(value: Array<string>): BoardManager; + addAdditionalUrls(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BoardManager.AsObject; + static toObject(includeInstance: boolean, msg: BoardManager): BoardManager.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BoardManager, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BoardManager; + static deserializeBinaryFromReader(message: BoardManager, reader: jspb.BinaryReader): BoardManager; + } + + export namespace BoardManager { + export type AsObject = { + additionalUrlsList: Array<string>, + } + } + + export class Daemon extends jspb.Message { + getPort(): string; + setPort(value: string): Daemon; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Daemon.AsObject; + static toObject(includeInstance: boolean, msg: Daemon): Daemon.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Daemon, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Daemon; + static deserializeBinaryFromReader(message: Daemon, reader: jspb.BinaryReader): Daemon; + } + + export namespace Daemon { + export type AsObject = { + port: string, + } + } + + export class Output extends jspb.Message { + getNoColor(): boolean; + setNoColor(value: boolean): Output; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Output.AsObject; + static toObject(includeInstance: boolean, msg: Output): Output.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Output, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Output; + static deserializeBinaryFromReader(message: Output, reader: jspb.BinaryReader): Output; + } + + export namespace Output { + export type AsObject = { + noColor: boolean, + } + } + + export class Logging extends jspb.Message { + getLevel(): string; + setLevel(value: string): Logging; + getFormat(): string; + setFormat(value: string): Logging; + + hasFile(): boolean; + clearFile(): void; + getFile(): string | undefined; + setFile(value: string): Logging; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Logging.AsObject; + static toObject(includeInstance: boolean, msg: Logging): Logging.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Logging, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Logging; + static deserializeBinaryFromReader(message: Logging, reader: jspb.BinaryReader): Logging; + } + + export namespace Logging { + export type AsObject = { + level: string, + format: string, + file?: string, + } + } + + export class Library extends jspb.Message { + getEnableUnsafeInstall(): boolean; + setEnableUnsafeInstall(value: boolean): Library; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Library.AsObject; + static toObject(includeInstance: boolean, msg: Library): Library.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Library, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Library; + static deserializeBinaryFromReader(message: Library, reader: jspb.BinaryReader): Library; + } + + export namespace Library { + export type AsObject = { + enableUnsafeInstall: boolean, + } + } + + export class Updater extends jspb.Message { + getEnableNotification(): boolean; + setEnableNotification(value: boolean): Updater; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Updater.AsObject; + static toObject(includeInstance: boolean, msg: Updater): Updater.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Updater, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Updater; + static deserializeBinaryFromReader(message: Updater, reader: jspb.BinaryReader): Updater; + } + + export namespace Updater { + export type AsObject = { + enableNotification: boolean, + } + } + } -export class SettingsMergeRequest extends jspb.Message { - getJsonData(): string; - setJsonData(value: string): SettingsMergeRequest; +export class ConfigurationGetRequest extends jspb.Message { serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsMergeRequest.AsObject; - static toObject(includeInstance: boolean, msg: SettingsMergeRequest): SettingsMergeRequest.AsObject; + toObject(includeInstance?: boolean): ConfigurationGetRequest.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationGetRequest): ConfigurationGetRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsMergeRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsMergeRequest; - static deserializeBinaryFromReader(message: SettingsMergeRequest, reader: jspb.BinaryReader): SettingsMergeRequest; + static serializeBinaryToWriter(message: ConfigurationGetRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationGetRequest; + static deserializeBinaryFromReader(message: ConfigurationGetRequest, reader: jspb.BinaryReader): ConfigurationGetRequest; } -export namespace SettingsMergeRequest { +export namespace ConfigurationGetRequest { export type AsObject = { - jsonData: string, } } -export class SettingsGetValueResponse extends jspb.Message { - getKey(): string; - setKey(value: string): SettingsGetValueResponse; - getJsonData(): string; - setJsonData(value: string): SettingsGetValueResponse; +export class ConfigurationGetResponse extends jspb.Message { + + hasConfiguration(): boolean; + clearConfiguration(): void; + getConfiguration(): Configuration | undefined; + setConfiguration(value?: Configuration): ConfigurationGetResponse; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsGetValueResponse.AsObject; - static toObject(includeInstance: boolean, msg: SettingsGetValueResponse): SettingsGetValueResponse.AsObject; + toObject(includeInstance?: boolean): ConfigurationGetResponse.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationGetResponse): ConfigurationGetResponse.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsGetValueResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsGetValueResponse; - static deserializeBinaryFromReader(message: SettingsGetValueResponse, reader: jspb.BinaryReader): SettingsGetValueResponse; + static serializeBinaryToWriter(message: ConfigurationGetResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationGetResponse; + static deserializeBinaryFromReader(message: ConfigurationGetResponse, reader: jspb.BinaryReader): ConfigurationGetResponse; } -export namespace SettingsGetValueResponse { +export namespace ConfigurationGetResponse { export type AsObject = { - key: string, - jsonData: string, + configuration?: Configuration.AsObject, } } -export class SettingsSetValueRequest extends jspb.Message { - getKey(): string; - setKey(value: string): SettingsSetValueRequest; - getJsonData(): string; - setJsonData(value: string): SettingsSetValueRequest; +export class ConfigurationSaveRequest extends jspb.Message { + getSettingsFormat(): string; + setSettingsFormat(value: string): ConfigurationSaveRequest; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsSetValueRequest.AsObject; - static toObject(includeInstance: boolean, msg: SettingsSetValueRequest): SettingsSetValueRequest.AsObject; + toObject(includeInstance?: boolean): ConfigurationSaveRequest.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationSaveRequest): ConfigurationSaveRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsSetValueRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsSetValueRequest; - static deserializeBinaryFromReader(message: SettingsSetValueRequest, reader: jspb.BinaryReader): SettingsSetValueRequest; + static serializeBinaryToWriter(message: ConfigurationSaveRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationSaveRequest; + static deserializeBinaryFromReader(message: ConfigurationSaveRequest, reader: jspb.BinaryReader): ConfigurationSaveRequest; } -export namespace SettingsSetValueRequest { +export namespace ConfigurationSaveRequest { export type AsObject = { - key: string, - jsonData: string, + settingsFormat: string, + } +} + +export class ConfigurationSaveResponse extends jspb.Message { + getEncodedSettings(): string; + setEncodedSettings(value: string): ConfigurationSaveResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationSaveResponse.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationSaveResponse): ConfigurationSaveResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationSaveResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationSaveResponse; + static deserializeBinaryFromReader(message: ConfigurationSaveResponse, reader: jspb.BinaryReader): ConfigurationSaveResponse; +} + +export namespace ConfigurationSaveResponse { + export type AsObject = { + encodedSettings: string, } } -export class SettingsGetAllRequest extends jspb.Message { +export class ConfigurationOpenRequest extends jspb.Message { + getEncodedSettings(): string; + setEncodedSettings(value: string): ConfigurationOpenRequest; + getSettingsFormat(): string; + setSettingsFormat(value: string): ConfigurationOpenRequest; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsGetAllRequest.AsObject; - static toObject(includeInstance: boolean, msg: SettingsGetAllRequest): SettingsGetAllRequest.AsObject; + toObject(includeInstance?: boolean): ConfigurationOpenRequest.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationOpenRequest): ConfigurationOpenRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsGetAllRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsGetAllRequest; - static deserializeBinaryFromReader(message: SettingsGetAllRequest, reader: jspb.BinaryReader): SettingsGetAllRequest; + static serializeBinaryToWriter(message: ConfigurationOpenRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationOpenRequest; + static deserializeBinaryFromReader(message: ConfigurationOpenRequest, reader: jspb.BinaryReader): ConfigurationOpenRequest; } -export namespace SettingsGetAllRequest { +export namespace ConfigurationOpenRequest { export type AsObject = { + encodedSettings: string, + settingsFormat: string, + } +} + +export class ConfigurationOpenResponse extends jspb.Message { + clearWarningsList(): void; + getWarningsList(): Array<string>; + setWarningsList(value: Array<string>): ConfigurationOpenResponse; + addWarnings(value: string, index?: number): string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ConfigurationOpenResponse.AsObject; + static toObject(includeInstance: boolean, msg: ConfigurationOpenResponse): ConfigurationOpenResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ConfigurationOpenResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ConfigurationOpenResponse; + static deserializeBinaryFromReader(message: ConfigurationOpenResponse, reader: jspb.BinaryReader): ConfigurationOpenResponse; +} + +export namespace ConfigurationOpenResponse { + export type AsObject = { + warningsList: Array<string>, } } export class SettingsGetValueRequest extends jspb.Message { getKey(): string; setKey(value: string): SettingsGetValueRequest; + getValueFormat(): string; + setValueFormat(value: string): SettingsGetValueRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SettingsGetValueRequest.AsObject; @@ -126,113 +495,133 @@ export class SettingsGetValueRequest extends jspb.Message { export namespace SettingsGetValueRequest { export type AsObject = { key: string, + valueFormat: string, } } -export class SettingsMergeResponse extends jspb.Message { +export class SettingsGetValueResponse extends jspb.Message { + getEncodedValue(): string; + setEncodedValue(value: string): SettingsGetValueResponse; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsMergeResponse.AsObject; - static toObject(includeInstance: boolean, msg: SettingsMergeResponse): SettingsMergeResponse.AsObject; + toObject(includeInstance?: boolean): SettingsGetValueResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsGetValueResponse): SettingsGetValueResponse.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsMergeResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsMergeResponse; - static deserializeBinaryFromReader(message: SettingsMergeResponse, reader: jspb.BinaryReader): SettingsMergeResponse; + static serializeBinaryToWriter(message: SettingsGetValueResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsGetValueResponse; + static deserializeBinaryFromReader(message: SettingsGetValueResponse, reader: jspb.BinaryReader): SettingsGetValueResponse; } -export namespace SettingsMergeResponse { +export namespace SettingsGetValueResponse { export type AsObject = { + encodedValue: string, } } -export class SettingsSetValueResponse extends jspb.Message { +export class SettingsSetValueRequest extends jspb.Message { + getKey(): string; + setKey(value: string): SettingsSetValueRequest; + getEncodedValue(): string; + setEncodedValue(value: string): SettingsSetValueRequest; + getValueFormat(): string; + setValueFormat(value: string): SettingsSetValueRequest; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsSetValueResponse.AsObject; - static toObject(includeInstance: boolean, msg: SettingsSetValueResponse): SettingsSetValueResponse.AsObject; + toObject(includeInstance?: boolean): SettingsSetValueRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsSetValueRequest): SettingsSetValueRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsSetValueResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsSetValueResponse; - static deserializeBinaryFromReader(message: SettingsSetValueResponse, reader: jspb.BinaryReader): SettingsSetValueResponse; + static serializeBinaryToWriter(message: SettingsSetValueRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsSetValueRequest; + static deserializeBinaryFromReader(message: SettingsSetValueRequest, reader: jspb.BinaryReader): SettingsSetValueRequest; } -export namespace SettingsSetValueResponse { +export namespace SettingsSetValueRequest { export type AsObject = { + key: string, + encodedValue: string, + valueFormat: string, } } -export class SettingsWriteRequest extends jspb.Message { - getFilePath(): string; - setFilePath(value: string): SettingsWriteRequest; +export class SettingsSetValueResponse extends jspb.Message { serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsWriteRequest.AsObject; - static toObject(includeInstance: boolean, msg: SettingsWriteRequest): SettingsWriteRequest.AsObject; + toObject(includeInstance?: boolean): SettingsSetValueResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsSetValueResponse): SettingsSetValueResponse.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsWriteRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsWriteRequest; - static deserializeBinaryFromReader(message: SettingsWriteRequest, reader: jspb.BinaryReader): SettingsWriteRequest; + static serializeBinaryToWriter(message: SettingsSetValueResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsSetValueResponse; + static deserializeBinaryFromReader(message: SettingsSetValueResponse, reader: jspb.BinaryReader): SettingsSetValueResponse; } -export namespace SettingsWriteRequest { +export namespace SettingsSetValueResponse { export type AsObject = { - filePath: string, } } -export class SettingsWriteResponse extends jspb.Message { +export class SettingsEnumerateRequest extends jspb.Message { serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsWriteResponse.AsObject; - static toObject(includeInstance: boolean, msg: SettingsWriteResponse): SettingsWriteResponse.AsObject; + toObject(includeInstance?: boolean): SettingsEnumerateRequest.AsObject; + static toObject(includeInstance: boolean, msg: SettingsEnumerateRequest): SettingsEnumerateRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsWriteResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsWriteResponse; - static deserializeBinaryFromReader(message: SettingsWriteResponse, reader: jspb.BinaryReader): SettingsWriteResponse; + static serializeBinaryToWriter(message: SettingsEnumerateRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsEnumerateRequest; + static deserializeBinaryFromReader(message: SettingsEnumerateRequest, reader: jspb.BinaryReader): SettingsEnumerateRequest; } -export namespace SettingsWriteResponse { +export namespace SettingsEnumerateRequest { export type AsObject = { } } -export class SettingsDeleteRequest extends jspb.Message { - getKey(): string; - setKey(value: string): SettingsDeleteRequest; +export class SettingsEnumerateResponse extends jspb.Message { + clearEntriesList(): void; + getEntriesList(): Array<SettingsEnumerateResponse.Entry>; + setEntriesList(value: Array<SettingsEnumerateResponse.Entry>): SettingsEnumerateResponse; + addEntries(value?: SettingsEnumerateResponse.Entry, index?: number): SettingsEnumerateResponse.Entry; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsDeleteRequest.AsObject; - static toObject(includeInstance: boolean, msg: SettingsDeleteRequest): SettingsDeleteRequest.AsObject; + toObject(includeInstance?: boolean): SettingsEnumerateResponse.AsObject; + static toObject(includeInstance: boolean, msg: SettingsEnumerateResponse): SettingsEnumerateResponse.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsDeleteRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsDeleteRequest; - static deserializeBinaryFromReader(message: SettingsDeleteRequest, reader: jspb.BinaryReader): SettingsDeleteRequest; + static serializeBinaryToWriter(message: SettingsEnumerateResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SettingsEnumerateResponse; + static deserializeBinaryFromReader(message: SettingsEnumerateResponse, reader: jspb.BinaryReader): SettingsEnumerateResponse; } -export namespace SettingsDeleteRequest { +export namespace SettingsEnumerateResponse { export type AsObject = { - key: string, + entriesList: Array<SettingsEnumerateResponse.Entry.AsObject>, } -} -export class SettingsDeleteResponse extends jspb.Message { - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): SettingsDeleteResponse.AsObject; - static toObject(includeInstance: boolean, msg: SettingsDeleteResponse): SettingsDeleteResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: SettingsDeleteResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): SettingsDeleteResponse; - static deserializeBinaryFromReader(message: SettingsDeleteResponse, reader: jspb.BinaryReader): SettingsDeleteResponse; -} + export class Entry extends jspb.Message { + getKey(): string; + setKey(value: string): Entry; + getType(): string; + setType(value: string): Entry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Entry.AsObject; + static toObject(includeInstance: boolean, msg: Entry): Entry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: Entry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Entry; + static deserializeBinaryFromReader(message: Entry, reader: jspb.BinaryReader): Entry; + } -export namespace SettingsDeleteResponse { - export type AsObject = { + export namespace Entry { + export type AsObject = { + key: string, + type: string, + } } + } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js index cabb89ab0..1740aba5b 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/settings_pb.js @@ -21,18 +21,31 @@ var global = (function() { return Function('return this')(); }.call(null)); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.BoardManager', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.BuildCache', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Daemon', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Directories', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Library', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Logging', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Network', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Output', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Sketch', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Configuration.Updater', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsMergeRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsMergeResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsWriteRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsWriteResponse', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -43,16 +56,16 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.SettingsWriteResponse', null * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.Configuration = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse'; + proto.cc.arduino.cli.commands.v1.Configuration.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration'; } /** * Generated by JsPbCodeGenerator. @@ -64,16 +77,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.Configuration.Directories = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsMergeRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Directories, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsMergeRequest'; + proto.cc.arduino.cli.commands.v1.Configuration.Directories.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Directories'; } /** * Generated by JsPbCodeGenerator. @@ -85,16 +98,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse = function(opt_data) { +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse'; + proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin'; } /** * Generated by JsPbCodeGenerator. @@ -106,16 +119,268 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.Configuration.Network = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Network, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest'; + proto.cc.arduino.cli.commands.v1.Configuration.Network.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Network'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Sketch, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Sketch.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Sketch'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.BuildCache, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.BuildCache'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.BoardManager, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.BoardManager'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Daemon, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Daemon.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Daemon'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Output, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Output.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Output'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Logging, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Logging.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Logging'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Library, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Library.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Library'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.Configuration.Updater, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.Configuration.Updater.displayName = 'proto.cc.arduino.cli.commands.v1.Configuration.Updater'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse'; } /** * Generated by JsPbCodeGenerator. @@ -127,16 +392,37 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest = function(opt_data) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest, jspb.Message); +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest'; + proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse'; } /** * Generated by JsPbCodeGenerator. @@ -169,122 +455,2791 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.toObject = function(includeInstance, msg) { + var f, obj = { + directories: (f = msg.getDirectories()) && proto.cc.arduino.cli.commands.v1.Configuration.Directories.toObject(includeInstance, f), + network: (f = msg.getNetwork()) && proto.cc.arduino.cli.commands.v1.Configuration.Network.toObject(includeInstance, f), + sketch: (f = msg.getSketch()) && proto.cc.arduino.cli.commands.v1.Configuration.Sketch.toObject(includeInstance, f), + buildCache: (f = msg.getBuildCache()) && proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.toObject(includeInstance, f), + boardManager: (f = msg.getBoardManager()) && proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.toObject(includeInstance, f), + daemon: (f = msg.getDaemon()) && proto.cc.arduino.cli.commands.v1.Configuration.Daemon.toObject(includeInstance, f), + output: (f = msg.getOutput()) && proto.cc.arduino.cli.commands.v1.Configuration.Output.toObject(includeInstance, f), + logging: (f = msg.getLogging()) && proto.cc.arduino.cli.commands.v1.Configuration.Logging.toObject(includeInstance, f), + library: (f = msg.getLibrary()) && proto.cc.arduino.cli.commands.v1.Configuration.Library.toObject(includeInstance, f), + updater: (f = msg.getUpdater()) && proto.cc.arduino.cli.commands.v1.Configuration.Updater.toObject(includeInstance, f), + locale: jspb.Message.getFieldWithDefault(msg, 100, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} + */ +proto.cc.arduino.cli.commands.v1.Configuration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration; + return proto.cc.arduino.cli.commands.v1.Configuration.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} + */ +proto.cc.arduino.cli.commands.v1.Configuration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Directories; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinaryFromReader); + msg.setDirectories(value); + break; + case 2: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Network; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinaryFromReader); + msg.setNetwork(value); + break; + case 3: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Sketch; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinaryFromReader); + msg.setSketch(value); + break; + case 4: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.BuildCache; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinaryFromReader); + msg.setBuildCache(value); + break; + case 5: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.BoardManager; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinaryFromReader); + msg.setBoardManager(value); + break; + case 6: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Daemon; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinaryFromReader); + msg.setDaemon(value); + break; + case 7: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Output; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinaryFromReader); + msg.setOutput(value); + break; + case 8: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Logging; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinaryFromReader); + msg.setLogging(value); + break; + case 9: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Library; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinaryFromReader); + msg.setLibrary(value); + break; + case 10: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Updater; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinaryFromReader); + msg.setUpdater(value); + break; + case 100: + var value = /** @type {string} */ (reader.readString()); + msg.setLocale(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDirectories(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Directories.serializeBinaryToWriter + ); + } + f = message.getNetwork(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Network.serializeBinaryToWriter + ); + } + f = message.getSketch(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Sketch.serializeBinaryToWriter + ); + } + f = message.getBuildCache(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.serializeBinaryToWriter + ); + } + f = message.getBoardManager(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.serializeBinaryToWriter + ); + } + f = message.getDaemon(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Daemon.serializeBinaryToWriter + ); + } + f = message.getOutput(); + if (f != null) { + writer.writeMessage( + 7, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Output.serializeBinaryToWriter + ); + } + f = message.getLogging(); + if (f != null) { + writer.writeMessage( + 8, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Logging.serializeBinaryToWriter + ); + } + f = message.getLibrary(); + if (f != null) { + writer.writeMessage( + 9, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Library.serializeBinaryToWriter + ); + } + f = message.getUpdater(); + if (f != null) { + writer.writeMessage( + 10, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Updater.serializeBinaryToWriter + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 100)); + if (f != null) { + writer.writeString( + 100, + f + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.toObject = function(includeInstance, msg) { + var f, obj = { + data: jspb.Message.getFieldWithDefault(msg, 1, ""), + user: jspb.Message.getFieldWithDefault(msg, 2, ""), + downloads: jspb.Message.getFieldWithDefault(msg, 3, ""), + builtin: (f = msg.getBuiltin()) && proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Directories; + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setData(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setUser(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDownloads(value); + break; + case 4: + var value = new proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinaryFromReader); + msg.setBuiltin(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Directories.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getUser(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getDownloads(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getBuiltin(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.toObject = function(includeInstance, msg) { + var f, obj = { + libraries: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin; + return proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setLibraries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string libraries = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.getLibraries = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.setLibraries = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.clearLibraries = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin.prototype.hasLibraries = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string data = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setData = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string user = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getUser = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setUser = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string downloads = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getDownloads = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setDownloads = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional Builtin builtin = 4; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.getBuiltin = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Directories.Builtin|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.setBuiltin = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Directories} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.clearBuiltin = function() { + return this.setBuiltin(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Directories.prototype.hasBuiltin = function() { + return jspb.Message.getField(this, 4) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Network.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Network} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.toObject = function(includeInstance, msg) { + var f, obj = { + extraUserAgent: jspb.Message.getFieldWithDefault(msg, 1, ""), + proxy: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Network; + return proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Network} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExtraUserAgent(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setProxy(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Network.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Network} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeString( + 1, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string extra_user_agent = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.getExtraUserAgent = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.setExtraUserAgent = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.clearExtraUserAgent = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.hasExtraUserAgent = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string proxy = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.getProxy = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.setProxy = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Network} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.clearProxy = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Network.prototype.hasProxy = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Sketch.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.toObject = function(includeInstance, msg) { + var f, obj = { + alwaysExportBinaries: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Sketch; + return proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAlwaysExportBinaries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Sketch.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAlwaysExportBinaries(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool always_export_binaries = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.prototype.getAlwaysExportBinaries = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Sketch.prototype.setAlwaysExportBinaries = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.toObject = function(includeInstance, msg) { + var f, obj = { + compilationsBeforePurge: jspb.Message.getFieldWithDefault(msg, 1, 0), + ttlSecs: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.BuildCache; + return proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setCompilationsBeforePurge(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTtlSecs(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCompilationsBeforePurge(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getTtlSecs(); + if (f !== 0) { + writer.writeUint64( + 2, + f + ); + } +}; + + +/** + * optional uint64 compilations_before_purge = 1; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.getCompilationsBeforePurge = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.setCompilationsBeforePurge = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint64 ttl_secs = 2; + * @return {number} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.getTtlSecs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BuildCache.prototype.setTtlSecs = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.toObject = function(includeInstance, msg) { + var f, obj = { + additionalUrlsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.BoardManager; + return proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.addAdditionalUrls(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAdditionalUrlsList(); + if (f.length > 0) { + writer.writeRepeatedString( + 1, + f + ); + } +}; + + +/** + * repeated string additional_urls = 1; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.getAdditionalUrlsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.setAdditionalUrlsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.addAdditionalUrls = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.BoardManager.prototype.clearAdditionalUrlsList = function() { + return this.setAdditionalUrlsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Daemon.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.toObject = function(includeInstance, msg) { + var f, obj = { + port: jspb.Message.getFieldWithDefault(msg, 1, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Daemon; + return proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setPort(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Daemon.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPort(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string port = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.prototype.getPort = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Daemon} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Daemon.prototype.setPort = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Output.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Output} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.toObject = function(includeInstance, msg) { + var f, obj = { + noColor: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Output} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Output; + return proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Output} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Output} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setNoColor(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Output.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Output} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getNoColor(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool no_color = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.prototype.getNoColor = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Output} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Output.prototype.setNoColor = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Logging.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.toObject = function(includeInstance, msg) { + var f, obj = { + level: jspb.Message.getFieldWithDefault(msg, 1, ""), + format: jspb.Message.getFieldWithDefault(msg, 2, ""), + file: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Logging; + return proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setLevel(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setFormat(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setFile(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Logging.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getLevel(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getFormat(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string level = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.getLevel = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.setLevel = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string format = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.getFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.setFormat = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string file = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.getFile = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.setFile = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Logging} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.clearFile = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Logging.prototype.hasFile = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Library.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Library} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.toObject = function(includeInstance, msg) { + var f, obj = { + enableUnsafeInstall: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Library} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Library; + return proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Library} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Library} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setEnableUnsafeInstall(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Library.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Library} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEnableUnsafeInstall(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool enable_unsafe_install = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.prototype.getEnableUnsafeInstall = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Library} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Library.prototype.setEnableUnsafeInstall = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.Configuration.Updater.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.toObject = function(includeInstance, msg) { + var f, obj = { + enableNotification: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.Configuration.Updater; + return proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setEnableNotification(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.Configuration.Updater.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEnableNotification(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool enable_notification = 1; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.prototype.getEnableNotification = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration.Updater} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.Updater.prototype.setEnableNotification = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); +}; + + +/** + * optional Directories directories = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Directories} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getDirectories = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Directories} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Directories, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Directories|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setDirectories = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearDirectories = function() { + return this.setDirectories(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasDirectories = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Network network = 2; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Network} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getNetwork = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Network} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Network, 2)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Network|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setNetwork = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearNetwork = function() { + return this.setNetwork(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasNetwork = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional Sketch sketch = 3; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Sketch} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getSketch = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Sketch} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Sketch, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Sketch|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setSketch = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearSketch = function() { + return this.setSketch(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasSketch = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional BuildCache build_cache = 4; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getBuildCache = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.BuildCache} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.BuildCache, 4)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.BuildCache|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setBuildCache = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearBuildCache = function() { + return this.setBuildCache(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasBuildCache = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional BoardManager board_manager = 5; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getBoardManager = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.BoardManager} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.BoardManager, 5)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.BoardManager|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setBoardManager = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearBoardManager = function() { + return this.setBoardManager(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasBoardManager = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional Daemon daemon = 6; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Daemon} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getDaemon = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Daemon} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Daemon, 6)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Daemon|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setDaemon = function(value) { + return jspb.Message.setWrapperField(this, 6, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearDaemon = function() { + return this.setDaemon(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasDaemon = function() { + return jspb.Message.getField(this, 6) != null; +}; + + +/** + * optional Output output = 7; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Output} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getOutput = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Output} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Output, 7)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Output|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setOutput = function(value) { + return jspb.Message.setWrapperField(this, 7, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearOutput = function() { + return this.setOutput(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasOutput = function() { + return jspb.Message.getField(this, 7) != null; +}; + + +/** + * optional Logging logging = 8; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Logging} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getLogging = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Logging} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Logging, 8)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Logging|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setLogging = function(value) { + return jspb.Message.setWrapperField(this, 8, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearLogging = function() { + return this.setLogging(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasLogging = function() { + return jspb.Message.getField(this, 8) != null; +}; + + +/** + * optional Library library = 9; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Library} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getLibrary = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Library} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Library, 9)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Library|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setLibrary = function(value) { + return jspb.Message.setWrapperField(this, 9, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearLibrary = function() { + return this.setLibrary(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasLibrary = function() { + return jspb.Message.getField(this, 9) != null; +}; + + +/** + * optional Updater updater = 10; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration.Updater} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getUpdater = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration.Updater} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration.Updater, 10)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Configuration.Updater|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this +*/ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setUpdater = function(value) { + return jspb.Message.setWrapperField(this, 10, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearUpdater = function() { + return this.setUpdater(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasUpdater = function() { + return jspb.Message.getField(this, 10) != null; +}; + + +/** + * optional string locale = 100; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.getLocale = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 100, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.setLocale = function(value) { + return jspb.Message.setField(this, 100, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Configuration} returns this + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.clearLocale = function() { + return jspb.Message.setField(this, 100, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Configuration.prototype.hasLocale = function() { + return jspb.Message.getField(this, 100) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest; + return proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.toObject = function(includeInstance, msg) { + var f, obj = { + configuration: (f = msg.getConfiguration()) && proto.cc.arduino.cli.commands.v1.Configuration.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse; + return proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.Configuration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.Configuration.deserializeBinaryFromReader); + msg.setConfiguration(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsMergeResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsMergeResponse'; -} + + /** - * 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 + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getConfiguration(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.Configuration.serializeBinaryToWriter + ); + } }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsSetValueResponse'; -} + + /** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor + * optional Configuration configuration = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Configuration} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.getConfiguration = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Configuration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.Configuration, 1)); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsWriteRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsWriteRequest'; -} + + /** - * 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.SettingsWriteResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + * @param {?proto.cc.arduino.cli.commands.v1.Configuration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.setConfiguration = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsWriteResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsWriteResponse'; -} + + /** - * 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 + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.clearConfiguration = function() { + return this.setConfiguration(undefined); }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest'; -} + + /** - * 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 + * Returns whether this field is set. + * @return {boolean} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.cc.arduino.cli.commands.v1.ConfigurationGetResponse.prototype.hasConfiguration = function() { + return jspb.Message.getField(this, 1) != null; }; -goog.inherits(proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse'; -} + + @@ -301,8 +3256,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.toObject(opt_includeInstance, this); }; @@ -311,13 +3266,13 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.toObject = function(includeInstance, msg) { var f, obj = { - jsonData: jspb.Message.getFieldWithDefault(msg, 1, "") + settingsFormat: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -331,23 +3286,23 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse; - return proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest; + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -356,7 +3311,7 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinaryFromRea switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); + msg.setSettingsFormat(value); break; default: reader.skipField(); @@ -371,9 +3326,9 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -381,13 +3336,13 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getJsonData(); + f = message.getSettingsFormat(); if (f.length > 0) { writer.writeString( 1, @@ -398,19 +3353,19 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.serializeBinaryToWriter /** - * optional string json_data = 1; + * optional string settings_format = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.prototype.getSettingsFormat = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllResponse.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveRequest.prototype.setSettingsFormat = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -431,8 +3386,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.toObject(opt_includeInstance, this); }; @@ -441,13 +3396,13 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.toObject = function(includeInstance, msg) { var f, obj = { - jsonData: jspb.Message.getFieldWithDefault(msg, 1, "") + encodedSettings: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -461,23 +3416,23 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsMergeRequest; - return proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse; + return proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -486,7 +3441,7 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinaryFromReade switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); + msg.setEncodedSettings(value); break; default: reader.skipField(); @@ -501,9 +3456,9 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -511,13 +3466,13 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getJsonData(); + f = message.getEncodedSettings(); if (f.length > 0) { writer.writeString( 1, @@ -528,19 +3483,19 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.serializeBinaryToWriter = /** - * optional string json_data = 1; + * optional string encoded_settings = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.prototype.getEncodedSettings = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsMergeRequest.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.ConfigurationSaveResponse.prototype.setEncodedSettings = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -561,8 +3516,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.toObject(opt_includeInstance, this); }; @@ -571,14 +3526,14 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.toObject = function(includeInstance, msg) { var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, ""), - jsonData: jspb.Message.getFieldWithDefault(msg, 2, "") + encodedSettings: jspb.Message.getFieldWithDefault(msg, 1, ""), + settingsFormat: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -592,23 +3547,23 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse; - return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest; + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -617,11 +3572,11 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromR switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setKey(value); + msg.setEncodedSettings(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); + msg.setSettingsFormat(value); break; default: reader.skipField(); @@ -636,9 +3591,9 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -646,20 +3601,20 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKey(); + f = message.getEncodedSettings(); if (f.length > 0) { writer.writeString( 1, f ); } - f = message.getJsonData(); + f = message.getSettingsFormat(); if (f.length > 0) { writer.writeString( 2, @@ -670,42 +3625,49 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWrite /** - * optional string key = 1; + * optional string encoded_settings = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.getEncodedSettings = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.setEncodedSettings = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional string json_data = 2; + * optional string settings_format = 2; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.getJsonData = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.getSettingsFormat = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} returns this + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.setJsonData = function(value) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenRequest.prototype.setSettingsFormat = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -721,8 +3683,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.toObject(opt_includeInstance, this); }; @@ -731,14 +3693,13 @@ proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.toObject = function(includeInstance, msg) { var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, ""), - jsonData: jspb.Message.getFieldWithDefault(msg, 2, "") + warningsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f }; if (includeInstance) { @@ -752,23 +3713,23 @@ proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest; - return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse; + return proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -777,11 +3738,7 @@ proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromRe switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setKey(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setJsonData(value); + msg.addWarnings(value); break; default: reader.skipField(); @@ -796,9 +3753,9 @@ proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -806,62 +3763,56 @@ proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKey(); + f = message.getWarningsList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedString( 1, f ); } - f = message.getJsonData(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } }; /** - * optional string key = 1; - * @return {string} + * repeated string warnings = 1; + * @return {!Array<string>} */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.getWarningsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setKey = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.setWarningsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * optional string json_data = 2; - * @return {string} + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getJsonData = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.addWarnings = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setJsonData = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.cc.arduino.cli.commands.v1.ConfigurationOpenResponse.prototype.clearWarningsList = function() { + return this.setWarningsList([]); }; @@ -881,8 +3832,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject(opt_includeInstance, this); }; @@ -891,13 +3842,14 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject = function(includeInstance, msg) { var f, obj = { - + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + valueFormat: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -911,58 +3863,116 @@ proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest; - return proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest; + return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setValueFormat(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValueFormat(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional string value_format = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.getValueFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsGetAllRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; +proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.setValueFormat = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; @@ -982,8 +3992,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject(opt_includeInstance, this); }; @@ -992,13 +4002,13 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.toObject = function(includeInstance, msg) { var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, "") + encodedValue: jspb.Message.getFieldWithDefault(msg, 1, "") }; if (includeInstance) { @@ -1012,23 +4022,23 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest; - return proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse; + return proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1037,7 +4047,7 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromRe switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setKey(value); + msg.setEncodedValue(value); break; default: reader.skipField(); @@ -1052,9 +4062,9 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1062,13 +4072,13 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKey(); + f = message.getEncodedValue(); if (f.length > 0) { writer.writeString( 1, @@ -1079,19 +4089,19 @@ proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.serializeBinaryToWriter /** - * optional string key = 1; + * optional string encoded_value = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.getEncodedValue = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsGetValueRequest.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsGetValueResponse.prototype.setEncodedValue = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1112,8 +4122,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject(opt_includeInstance, this); }; @@ -1122,13 +4132,15 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.toObject = function(includeInstance, msg) { var f, obj = { - + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + encodedValue: jspb.Message.getFieldWithDefault(msg, 2, ""), + valueFormat: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -1142,29 +4154,41 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsMergeResponse; - return proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest; + return proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setEncodedValue(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setValueFormat(value); + break; default: reader.skipField(); break; @@ -1178,9 +4202,9 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1188,12 +4212,87 @@ proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsMergeResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsMergeResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getEncodedValue(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getValueFormat(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string encoded_value = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getEncodedValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setEncodedValue = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string value_format = 3; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.getValueFormat = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SettingsSetValueRequest.prototype.setValueFormat = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; @@ -1314,8 +4413,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.toObject(opt_includeInstance, this); }; @@ -1324,13 +4423,13 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.toObject = function(includeInstance, msg) { var f, obj = { - filePath: jspb.Message.getFieldWithDefault(msg, 1, "") + }; if (includeInstance) { @@ -1344,33 +4443,29 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsWriteRequest; - return proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest; + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setFilePath(value); - break; default: reader.skipField(); break; @@ -1384,9 +4479,9 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1394,40 +4489,22 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getFilePath(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } }; -/** - * optional string file_path = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.getFilePath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - /** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteRequest} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.cc.arduino.cli.commands.v1.SettingsWriteRequest.prototype.setFilePath = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.repeatedFields_ = [1]; @@ -1444,8 +4521,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.toObject(opt_includeInstance, this); }; @@ -1454,13 +4531,14 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.toObject = function(includeInstance, msg) { var f, obj = { - + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.toObject, includeInstance) }; if (includeInstance) { @@ -1474,29 +4552,34 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsWriteResponse; - return proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse; + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinaryFromReader); + msg.addEntries(value); + break; default: reader.skipField(); break; @@ -1510,9 +4593,9 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1520,12 +4603,20 @@ proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsWriteResponse} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsWriteResponse.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.serializeBinaryToWriter + ); + } }; @@ -1545,8 +4636,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.toObject(opt_includeInstance, this); }; @@ -1555,13 +4646,14 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} msg The msg instance to transform. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.toObject = function(includeInstance, msg) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.toObject = function(includeInstance, msg) { var f, obj = { - key: jspb.Message.getFieldWithDefault(msg, 1, "") + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + type: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -1575,23 +4667,23 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.deserializeBinary = function(bytes) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest; - return proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry; + return proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} msg The message object to deserialize into. + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1602,6 +4694,10 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.deserializeBinaryFromRead var value = /** @type {string} */ (reader.readString()); msg.setKey(value); break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setType(value); + break; default: reader.skipField(); break; @@ -1615,9 +4711,9 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.serializeBinary = function() { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.serializeBinaryToWriter(this, writer); + proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1625,11 +4721,11 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} message + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.serializeBinaryToWriter = function(message, writer) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getKey(); if (f.length > 0) { @@ -1638,6 +4734,13 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.serializeBinaryToWriter = f ); } + f = message.getType(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } }; @@ -1645,118 +4748,73 @@ proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.serializeBinaryToWriter = * optional string key = 1; * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.getKey = function() { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.getKey = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest} returns this + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteRequest.prototype.setKey = function(value) { +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.setKey = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional string type = 2; + * @return {string} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.toObject(opt_includeInstance, this); +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.getType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * 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.SettingsDeleteResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry.prototype.setType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} + * repeated Entry entries = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry>} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse; - return proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.deserializeBinaryFromReader(msg, reader); +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.getEntriesList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} - */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; + * @param {!Array<!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry>} value + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry} */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.Entry, opt_index); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse} returns this */ -proto.cc.arduino.cli.commands.v1.SettingsDeleteResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; +proto.cc.arduino.cli.commands.v1.SettingsEnumerateResponse.prototype.clearEntriesList = function() { + return this.setEntriesList([]); }; diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index f112f7206..c1a2adc6f 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -16,16 +16,16 @@ import { } from '../common/protocol'; import { spawnCommand } from './exec-util'; import { ArduinoDaemonImpl } from './arduino-daemon-impl'; -import { DefaultCliConfig, CLI_CONFIG } from './cli-config'; +import { DefaultCliConfig, CLI_CONFIG, CliConfig } from './cli-config'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { deepClone, nls } from '@theia/core'; import { ErrnoException } from './utils/errors'; +import { createArduinoCoreServiceClient } from './arduino-core-service-client'; import { - SettingsMergeRequest, - SettingsWriteRequest, + ConfigurationSaveRequest, + SettingsSetValueRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/settings_pb'; -import { createArduinoCoreServiceClient } from './arduino-core-service-client'; const deepmerge = require('deepmerge'); @@ -180,13 +180,13 @@ export class ConfigServiceImpl const content = await fs.readFile(cliConfigPath, { encoding: 'utf8', }); - const model = (yaml.safeLoad(content) || {}) as DefaultCliConfig; + const model = (yaml.safeLoad(content) || {}) as CliConfig; this.logger.info(`Loaded CLI configuration: ${JSON.stringify(model)}`); - if (model.directories.data && model.directories.user) { + if (model.directories?.data && model.directories?.user) { this.logger.info( "'directories.data' and 'directories.user' are set in the CLI configuration model." ); - return model; + return model as DefaultCliConfig; } // The CLI can run with partial (missing `port`, `directories`), the IDE2 cannot. // We merge the default CLI config with the partial user's config. @@ -217,13 +217,17 @@ export class ConfigServiceImpl private async getFallbackCliConfig(): Promise<DefaultCliConfig> { const cliPath = this.daemon.getExecPath(); - const rawJson = await spawnCommand(cliPath, [ - 'config', - 'dump', - 'format', - '--json', + const [configRaw, directoriesRaw] = await Promise.all([ + spawnCommand(cliPath, ['config', 'dump', '--json']), + // Since CLI 1.0, the command `config dump` only returns user-modified values and not default ones. + // directories.user and directories.data are required by IDE2 so we get the default value explicitly. + spawnCommand(cliPath, ['config', 'get', 'directories', '--json']), ]); - return JSON.parse(rawJson); + + const config = JSON.parse(configRaw); + const { user, data } = JSON.parse(directoriesRaw); + + return { ...config.config, directories: { user, data } }; } private async initCliConfigTo(fsPathToDir: string): Promise<void> { @@ -291,48 +295,65 @@ export class ConfigServiceImpl } private async updateDaemon( - port: number | number, + port: number, config: DefaultCliConfig ): Promise<void> { - const client = createArduinoCoreServiceClient({ port }); - const req = new SettingsMergeRequest(); const json = JSON.stringify(config, null, 2); - req.setJsonData(json); this.logger.info(`Updating daemon with 'data': ${json}`); - return new Promise<void>((resolve, reject) => { - client.settingsMerge(req, (error) => { - try { + + const updatableConfig = { + locale: config.locale, + 'directories.user': config.directories.user, + 'directories.data': config.directories.data, + 'network.proxy': config.network?.proxy, + 'board_manager.additional_urls': + config.board_manager?.additional_urls || [], + }; + + const client = createArduinoCoreServiceClient({ port }); + + for (const [key, value] of Object.entries(updatableConfig)) { + const req = new SettingsSetValueRequest(); + req.setKey(key); + req.setEncodedValue(JSON.stringify(value)); + await new Promise<void>((resolve) => { + client.settingsSetValue(req, (error) => { if (error) { - reject(error); - return; + this.logger.error( + `Could not update config with key: ${key} and value: ${value}`, + error + ); } resolve(); - } finally { - client.close(); - } + }); }); - }); + } + + client.close(); } - private async writeDaemonState(port: number | number): Promise<void> { + private async writeDaemonState(port: number): Promise<void> { const client = createArduinoCoreServiceClient({ port }); - const req = new SettingsWriteRequest(); - const cliConfigUri = await this.getCliConfigFileUri(); - const cliConfigPath = FileUri.fsPath(cliConfigUri); - req.setFilePath(cliConfigPath); - return new Promise<void>((resolve, reject) => { - client.settingsWrite(req, (error) => { + const req = new ConfigurationSaveRequest(); + req.setSettingsFormat('yaml'); + + const configRaw = await new Promise<string>((resolve, reject) => { + client.configurationSave(req, (error, resp) => { try { if (error) { reject(error); return; } - resolve(); + resolve(resp.getEncodedSettings()); } finally { client.close(); } }); }); + + const cliConfigUri = await this.getCliConfigFileUri(); + const cliConfigPath = FileUri.fsPath(cliConfigUri); + await fs.writeFile(cliConfigPath, configRaw, { encoding: 'utf-8' }); } // #1445 diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 9cb1c4584..9ae7b405e 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -11,7 +11,6 @@ import type { Mutable } from '@theia/core/lib/common/types'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; import * as jspb from 'google-protobuf'; -import { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb'; import path from 'node:path'; import { UploadResponse as ApiUploadResponse, @@ -195,9 +194,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { request.setVerbose(options.verbose); request.setQuiet(false); if (typeof options.exportBinaries === 'boolean') { - const exportBinaries = new BoolValue(); - exportBinaries.setValue(options.exportBinaries); - request.setExportBinaries(exportBinaries); + request.setExportBinaries(options.exportBinaries); } this.mergeSourceOverrides(request, options); return request; 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 26e7c41e5..11342179e 100644 --- a/arduino-ide-extension/src/test/node/exec-util.test.ts +++ b/arduino-ide-extension/src/test/node/exec-util.test.ts @@ -37,7 +37,7 @@ describe('exec-utils', () => { 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; + expect(stdout.includes(path.parse(filename).name)).to.be.true; }); }); diff --git a/arduino-ide-extension/src/test/node/node-test-bindings.ts b/arduino-ide-extension/src/test/node/node-test-bindings.ts index 0f2ca5e35..690d19442 100644 --- a/arduino-ide-extension/src/test/node/node-test-bindings.ts +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -289,7 +289,6 @@ export async function createCliConfig( 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)) { diff --git a/yarn.lock b/yarn.lock index 71a0d2acb..d0912ee7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1899,6 +1899,19 @@ "@phosphor/signaling" "^1.3.1" "@phosphor/virtualdom" "^1.2.0" +"@pingghost/protoc@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pingghost/protoc/-/protoc-1.0.2.tgz#68436fe6df7b700149dfb2b9a6a9db3b66fe758a" + integrity sha512-7ndq6JmrfcRfr6wIxdrjBqAipsrWwldFL5TQRmJXgpGrRi1yU6vKWID6Z4cs96iK+3yLIoUON11fE5CThNBrXA== + dependencies: + glob "^7.2.3" + mkdirp "^0.5.6" + node-fetch "^3.2.10" + rimraf "^3.0.2" + unzipper "^0.10.11" + uuid "^9.0.0" + vinyl "^2.2.1" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -11100,19 +11113,6 @@ protobufjs@^7.2.3, protobufjs@^7.2.4: "@types/node" ">=13.7.0" long "^5.0.0" -protoc@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/protoc/-/protoc-1.1.3.tgz#d9857ec2a43a683af8263032d519ce7ba0b7d99e" - integrity sha512-Vy4OBxCcF0W38YrZZRFix659gFu8ujIxVDP1SUBK9ELzyeMSBe8m8tYyYlX1PI5j9gse9hWu4c4nzQaHesAf8Q== - dependencies: - 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" resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" From 2de8bd17171cff0797ff58162a3e04f57aa26554 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 6 Sep 2024 01:49:53 +0200 Subject: [PATCH 319/384] feat: decode grpc status objects and map them to protocol types Status object thrown by grpc commands contains metadata that needs to be serialized in order to map it to custom errors generated through proto files https://github.com/grpc/grpc-web/issues/399 --- .../src/node/service-error.ts | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/node/service-error.ts b/arduino-ide-extension/src/node/service-error.ts index a56cf13ea..a42c05d8a 100644 --- a/arduino-ide-extension/src/node/service-error.ts +++ b/arduino-ide-extension/src/node/service-error.ts @@ -1,14 +1,54 @@ import { Metadata, StatusObject } from '@grpc/grpc-js'; +import { Status } from './cli-protocol/google/rpc/status_pb'; +import { stringToUint8Array } from '../common/utils'; +import { ProgrammerIsRequiredForUploadError } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; + +type ProtoError = typeof ProgrammerIsRequiredForUploadError; +const protoErrorsMap = new Map<string, ProtoError>([ + [ + 'type.googleapis.com/cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', + ProgrammerIsRequiredForUploadError, + ], + // handle other cli defined errors here +]); export type ServiceError = StatusObject & Error; export namespace ServiceError { export function isCancel(arg: unknown): arg is ServiceError & { code: 1 } { return is(arg) && arg.code === 1; // https://grpc.github.io/grpc/core/md_doc_statuscodes.html } + export function is(arg: unknown): arg is ServiceError { - return arg instanceof Error && isStatusObjet(arg); + return arg instanceof Error && isStatusObject(arg); } - function isStatusObjet(arg: unknown): arg is StatusObject { + + export function isInstanceOf(arg: unknown, type: unknown): boolean { + if (!isStatusObject(arg)) { + return false; + } + + const bin = arg.metadata.get('grpc-status-details-bin')[0]; + + const uint8Array = + typeof bin === 'string' + ? stringToUint8Array(bin) + : new Uint8Array(bin.buffer, bin.byteOffset, bin.byteLength); + + const errors = Status.deserializeBinary(uint8Array) + .getDetailsList() + .map((details) => { + const typeUrl = details.getTypeUrl(); + const ErrorType = protoErrorsMap.get(typeUrl); + return ErrorType?.deserializeBinary(details.getValue_asU8()); + }); + + return !!errors.find((error) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return error && error instanceof <any>type; + }); + } + + function isStatusObject(arg: unknown): arg is StatusObject { if (typeof arg === 'object') { // eslint-disable-next-line @typescript-eslint/no-explicit-any const any = arg as any; From a5bf56ffa665a0054b1b788c6aeaf84fd7400080 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 6 Sep 2024 01:53:34 +0200 Subject: [PATCH 320/384] feat: upload using programmer by default if board requires it --- .../browser/contributions/upload-sketch.ts | 31 +++++++++++++++++-- .../src/common/protocol/core-service.ts | 5 +++ .../src/node/core-service-impl.ts | 15 ++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index 9cee46abb..c21b86190 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -127,6 +127,7 @@ export class UploadSketch extends CoreServiceContribution { usingProgrammer, verifyOptions ); + if (!uploadOptions) { return; } @@ -137,11 +138,37 @@ export class UploadSketch extends CoreServiceContribution { const uploadResponse = await this.doWithProgress({ progressText: nls.localize('arduino/sketch/uploading', 'Uploading...'), - task: (progressId, coreService, token) => - coreService.upload({ ...uploadOptions, progressId }, token), + task: async (progressId, coreService, token) => { + try { + return await coreService.upload( + { ...uploadOptions, progressId }, + token + ); + } catch (err) { + if (err.code === 4005) { + const uploadWithProgrammerOptions = await this.uploadOptions( + true, + verifyOptions + ); + if (uploadWithProgrammerOptions) { + return coreService.upload( + { ...uploadWithProgrammerOptions, progressId }, + token + ); + } + } else { + throw err; + } + } + }, keepOutput: true, cancelable: true, }); + + if (!uploadResponse) { + return; + } + // the port update is NOOP if nothing has changed this.boardsServiceProvider.updateConfig(uploadResponse.portAfterUpload); diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index f3a681d48..2b4a07652 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -71,6 +71,7 @@ export namespace CoreError { Upload: 4002, UploadUsingProgrammer: 4003, BurnBootloader: 4004, + UploadRequiresProgrammer: 4005, }; export const VerifyFailed = declareCoreError(Codes.Verify); export const UploadFailed = declareCoreError(Codes.Upload); @@ -78,6 +79,10 @@ export namespace CoreError { Codes.UploadUsingProgrammer ); export const BurnBootloaderFailed = declareCoreError(Codes.BurnBootloader); + export const UploadRequiresProgrammer = declareCoreError( + Codes.UploadRequiresProgrammer + ); + export function is( error: unknown ): error is ApplicationError<number, ErrorLocation[]> { diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 9ae7b405e..b8eba0335 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,4 +1,4 @@ -import type { ClientReadableStream } from '@grpc/grpc-js'; +import { type ClientReadableStream } from '@grpc/grpc-js'; import { ApplicationError } from '@theia/core/lib/common/application-error'; import type { CancellationToken } from '@theia/core/lib/common/cancellation'; import { CommandService } from '@theia/core/lib/common/command'; @@ -41,6 +41,7 @@ import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_ import { BurnBootloaderRequest, BurnBootloaderResponse, + ProgrammerIsRequiredForUploadError, UploadRequest, UploadResponse, UploadUsingProgrammerRequest, @@ -295,12 +296,24 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { reject(UserAbortApplicationError()); return; } + + if ( + ServiceError.isInstanceOf( + error, + ProgrammerIsRequiredForUploadError + ) + ) { + reject(CoreError.UploadRequiresProgrammer()); + return; + } + const message = nls.localize( 'arduino/upload/error', '{0} error: {1}', firstToUpperCase(task), error.details ); + this.sendResponse(error.details, OutputMessage.Severity.Error); reject( errorCtor( From 29219796780dc250bac4deaaf6a2f4c6ddf69735 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:59:16 +0200 Subject: [PATCH 321/384] Use `macos-13` for Intel build (#2508) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 058f081f7..cb94fbe05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -99,7 +99,7 @@ env: name: Linux_X86-64_app_image - config: name: macOS x86 - runs-on: macos-latest + runs-on: macos-13 container: | null # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: From 16bc1a4610939041b6903ad5b71f24f6baf937f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:05:43 +0200 Subject: [PATCH 322/384] Updated translation files (#2392) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 5 +- i18n/ar.json | 5 +- i18n/az.json | 5 +- i18n/be.json | 552 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/bg.json | 5 +- i18n/ca_ES.json | 35 +-- i18n/cs.json | 5 +- i18n/da.json | 552 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/de.json | 293 ++++++++++++------------ i18n/el.json | 69 +++--- i18n/es.json | 5 +- i18n/eu.json | 5 +- i18n/fa.json | 5 +- i18n/fil.json | 5 +- i18n/fr.json | 5 +- i18n/he.json | 5 +- i18n/hu.json | 5 +- i18n/hy.json | 552 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/id.json | 9 +- i18n/it.json | 7 +- i18n/ja.json | 5 +- i18n/ko.json | 5 +- i18n/my_MM.json | 5 +- i18n/ne.json | 5 +- i18n/nl.json | 5 +- i18n/no.json | 552 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/pl.json | 55 ++--- i18n/pt.json | 33 +-- i18n/ro.json | 5 +- i18n/ru.json | 293 ++++++++++++------------ i18n/si.json | 552 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/sr.json | 5 +- i18n/th.json | 5 +- i18n/tr.json | 5 +- i18n/uk.json | 19 +- i18n/vi.json | 87 ++++---- i18n/zh-Hant.json | 5 +- i18n/zh.json | 5 +- i18n/zh_TW.json | 9 +- 39 files changed, 3289 insertions(+), 495 deletions(-) create mode 100644 i18n/be.json create mode 100644 i18n/da.json create mode 100644 i18n/hy.json create mode 100644 i18n/no.json create mode 100644 i18n/si.json diff --git a/i18n/af.json b/i18n/af.json index 15774de28..cf5ee6560 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -152,7 +152,8 @@ "serialMonitor": "Seriaal Monitor", "type": "Type", "unknown": "Onbekend", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debugging is not supported by '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is nie geïnstalleer vir ' {0} '", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "saamstel", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/ar.json b/i18n/ar.json index 5bca31e16..3caadecc5 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -152,7 +152,8 @@ "serialMonitor": "مراقب المنفذ التسلسلي \"سيريال بورت\"\n ", "type": "النوع", "unknown": "غير معروف", - "updateable": "يمكن تحديثه" + "updateable": "يمكن تحديثه", + "userAbort": "User abort" }, "compile": { "error": "خطا في الترجمة : {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "'{0}' لا يقبل التصحيح البرمجي", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "المنصة غير مثبتة ل '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي", "sketchIsNotCompiled": "المشروع '{0}' يجب ان يتم التحقق منه قبل بدء جلسة تصحيح الاخطاء . الرجاء التحقق من المشروع و اعادة تشغيل مصحح الاخطاء مرة اخرى .\nهل تريد التحقق من المشروع الان؟" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True اذا كان يجب تحذير المستخدمين قبل سحب مشروع من السحابة . True افتراضيا", "cloud.push.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع الى السحابة . True افتراضيا", "cloud.pushpublic.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع عام الى السحابة . True افتراضيا", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "الوجهة المستخدمة لدفع و سحب المشاريع من الخلفية . تشير افتراضيا الى Arduino Cloud API.", "compile": "الترجمة", "compile.experimental": "مُفعل اذا وَجَبَ على الIDE التعامل مع عدة اخطاء اثناء الترجمة . غير مفعل بشكل افتراضي ", diff --git a/i18n/az.json b/i18n/az.json index a8cfcdb9d..1027d9092 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -152,7 +152,8 @@ "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Bilnməyən", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debugging is not supported by '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "noProgrammerSelectedFor": "No programmer selected 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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/be.json b/i18n/be.json new file mode 100644 index 000000000..ff3779efb --- /dev/null +++ b/i18n/be.json @@ -0,0 +1,552 @@ +{ + "arduino": { + "about": { + "detail": "Версія: {0}\nДата: {1}{2}\nВерсія CLI: {3}\n\n{4}", + "label": "Пра {0}" + }, + "account": { + "goToCloudEditor": "Перайсці ў сродак праўкі воблака", + "goToIoTCloud": "Перайсці ў воблака IoT", + "goToProfile": "Перайсці ў профіль", + "menuTitle": "Воблака Arduino" + }, + "board": { + "board": "Плата{0}", + "boardConfigDialogTitle": "Абярыце іншую плату і порт", + "boardInfo": "Інфармацыя пра плату", + "boards": "платы", + "configDialog1": "Абярыце як плату, так і порт, калі вы жадаеце загрузіць сцэнар.", + "configDialog2": "Калі вы выбіраеце толькі плату, вы зможаце кампіліраваць, але не загружаць сцэнар.", + "couldNotFindPreviouslySelected": "Не атрымалася знайсці раней абраную плату '{0}' на ўсталяванай платформе '{1}'.\nКалі ласка, абярыце ўручную плату, якую вы жадаеце ўжываць.\nЦі жадаеце вы паўторна абраць яе зараз?", + "editBoardsConfig": "Змяніць плату і порт…", + "getBoardInfo": "Атрымаць інфармацыю пра плату", + "inSketchbook": " (у альбоме з сцэнарамі)", + "installNow": "Ядро \"{0} {1}\" павінна быць усталяванае для абранай у бягучы час платы \"{2}\".\nЦі жадаеце вы ўсталяваць яе зараз?", + "noBoardsFound": "Не знойдзена плат для \"{0}\"", + "noNativeSerialPort": "Уласны паслядоўны порт, не атрымалася атрымаць інфармацыю.", + "noPortsDiscovered": "Парты не выяўленыя", + "nonSerialPort": "Уласны паслядоўны порт, не атрымалася атрымаць інфармацыю.", + "openBoardsConfig": "Абярыце іншую плату і порт…", + "pleasePickBoard": "Калі ласка, абярыце плату, якая злучаная з абраным вамі портам.", + "port": "Порт{0}", + "ports": "порты", + "programmer": "Сродак праграмавання", + "reselectLater": "Абярыце паўторна пазней", + "revertBoardsConfig": "Ужыта '{0}' выяўлена ў '{1}'", + "searchBoard": "Знайсці плату", + "selectBoard": "Знайсці плату", + "selectPortForInfo": "Калі ласка, абярыце порт, каб атрымаць інфармацыю пра плату.", + "showAllAvailablePorts": "Паказвае ўсе даступныя порты, калі яны ўключаныя", + "showAllPorts": "Паказаць усе порты", + "succesfullyInstalledPlatform": "Платформа {0}:{1} паспяхова ўсталяваная", + "succesfullyUninstalledPlatform": "Платформа {0}:{1} паспяхова выдаленая", + "typeOfPorts": "{0} порты", + "unconfirmedBoard": "Непацвержданная плата", + "unknownBoard": "Невядомая плата" + }, + "boardsManager": "Кіраванне платамі", + "boardsType": { + "arduinoCertified": "Сертыфікаваны Arduino" + }, + "bootloader": { + "burnBootloader": "Прашыць загрузнік", + "burningBootloader": "Прашыўка загрузніка…", + "doneBurningBootloader": "Прашыўка загрузніка скончаная." + }, + "burnBootloader": { + "error": "Памылка пры запісу загрузніка: {0}" + }, + "certificate": { + "addNew": "Дадаць новы", + "addURL": "Дадаць адрас URL для атрымання сертыфіката SSL", + "boardAtPort": "{0} у {1}", + "certificatesUploaded": "Сертыфікаты загружаныя.", + "enterURL": "Увядзіце адрас URL", + "noSupportedBoardConnected": "Плата, якая падтрымліваецца, не падключаная", + "openContext": "Адчыніць кантэкст", + "remove": "Выдаліць", + "selectBoard": "Абраць плату…", + "selectCertificateToUpload": "1. Абярыце сертыфікат для выгрузкі", + "selectDestinationBoardToUpload": "2. Абярыце мэтавую плату, і выгрузіце сертыфікат", + "upload": "Выгрузіць", + "uploadFailed": "Не атрымалася выгрузіць.\nКалі ласка, паспрабуйце зноў.", + "uploadRootCertificates": "Выгрузіць каранёвые сертыфікаты SSL", + "uploadingCertificates": "Выгрузка сертыфікатаў." + }, + "checkForUpdates": { + "checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino", + "installAll": "Усталяваць усе", + "noUpdates": "Апошнія абнаўленні недаступныя.", + "promptUpdateBoards": "Даступныя абнаўленні для некаторых вашых плат.", + "promptUpdateLibraries": "Даступныя абнаўленні для некаторых вашых бібліятэк.", + "updatingBoards": "Абнаўленне плат…", + "updatingLibraries": "Абнаўленне бібліятэк…" + }, + "cli-error-parser": { + "keyboardError": "'Keyboard' не знойдзеная.\nЦі прысутнічае ў вашым сцэнары радок '#include <Keyboard.h>'?", + "mouseError": "'Mouse' Не знойдзеная.\nЦі прысутнічае ў вашым сцэнары радок '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Абярыце бачнасць вашага сцэнару:", + "cloudSketchbook": "Альбом з сцэнарамі ў воблаке", + "connected": "Злучана", + "continue": "Працягнуць", + "donePulling": "Скончана выцягванне '{0}'.", + "donePushing": "Скончана адпраўка '{0}'.", + "embed": "Убудаваны:", + "emptySketchbook": "Ваш альбом з сцэнарамі пусты", + "goToCloud": "Перайсці ў воблака", + "learnMore": "Вывучыць больш", + "link": "Спасылак:", + "notYetPulled": "Не атрымалася паслаць у воблака.\nСцэнар яшчэ не выцягнуты.", + "offline": "Не ў сетцы", + "openInCloudEditor": "Адчыніць у сродку праўкі воблака", + "options": "Налады…", + "privateVisibility": "Асабісты.\nТолькі вы можаце глядзець сцэнар.", + "profilePicture": "Выява профілю", + "publicVisibility": "Грамадскі.\nЛюбы, хто мае спасылак, можа глядзець сцэнар.", + "pull": "Выцягнуць", + "pullFirst": "Спачатку вы павінны выцягнуць, каб мець магчымасць перайсці да воблака.", + "pullSketch": "Выцягнуць сцэнар", + "pullSketchMsg": "Пры выцягванні гэтага сцэнару з воблаку, будзе перазапісаная яго лакальная версія.\nЦі жадаеце працягнуць?", + "push": "Адправіць", + "pushSketch": "Адправіць сцэнар", + "pushSketchMsg": "Гэта грамадскі сцэнар.\nПерад адпраўкай пераканайцеся, што ў файлах arduino_secrets.h паказана любая канфідэнцыйная інфармацыя.\nВы можаце зрабіць сцэнар прыватным з панэлі агульнага доступу.", + "remote": "Падалены", + "share": "Падзяліцца…", + "shareSketch": "Падзяліцца сцэнарам", + "showHideSketchbook": "Адлюстраваць/схаваць альбом з сцэнарамі ў воблаке", + "signIn": "Увайсці", + "signInToCloud": "Увайсці ў воблака Arduino", + "signOut": "Выйсці", + "sync": "Сінхранізаваць", + "syncEditSketches": "Сінхранізаваць і змяніць сцэнары ў воблаку Arduino", + "visitArduinoCloud": "Наведаць воблака Arduino, каб стварыць сцэнары ў воблаке." + }, + "cloudSketch": { + "alreadyExists": "Сцэнар '{0}' ў воблаке ўжо існуе.", + "creating": "Стварэнне сцэнара '{0}' ў воблаке…", + "new": "Новы сцэнар у воблаку", + "notFound": "Не атрымалася выцягнуць сцэнар '{0}' з воблака.\nСцэнар не існуе.", + "pulling": "Сінхранізацыя альбому, выцягванне '{0}'…", + "pushing": "Сінхранізацыя альбому, адпраўка '{0}'…", + "renaming": "Пераназваць сцэнар '{0}' у '{1}' у воблаке…", + "synchronizingSketchbook": "Сінхранізацыя альбому з сцэнарамі…" + }, + "common": { + "all": "Усе", + "contributed": "Уклад", + "installManually": "Усталяваць уручную", + "later": "Пазней", + "noBoardSelected": "плата не абраная", + "noSketchOpened": "Сцэнар не абраны", + "notConnected": "[не злучана]", + "offlineIndicator": "Падобна на тое, што вы знаходзіцеся не ў сетцы.\nБез злучэння з інтэрнэтам Arduino CLI можа не загружаць неабходныя рэсурсы і гэтае можа прывесці да збою ў працы.\nКалі ласка, злучыцеся з інтэрнэтам, і запусціце праграму нанова.", + "oldFormat": "'{0}' ужывае стары фармат `.pde`.\nЦі жадаеце вы перайсці на новае пашырэнне `.ino`?", + "partner": "Партнёр", + "processing": "Апрацоўка", + "recommended": "Рэкамендаваны", + "retired": "У адстаўцы", + "selectManually": "Абраць уручную", + "selectedOn": "уключана {0}", + "serialMonitor": "Манітор паслядоўнага порта", + "type": "Тып", + "unknown": "Невядома", + "updateable": "Абнаўляецца", + "userAbort": "Перапыненне карыстальнікам" + }, + "compile": { + "error": "Памылка кампіляцыі: {0}" + }, + "component": { + "boardsIncluded": "Платы, якія ўваходзяць у гэты пакет:", + "by": "ад", + "clickToOpen": "Пстрыкніце, каб адчыніць ў інтэрнэт-аглядальніку: {0}", + "filterSearch": "Фільтраваць пошук…", + "install": "Усталяваць", + "installLatest": "Усталяваць пазней", + "installVersion": "Усталяваць {0}", + "installed": "{0} усталяваны", + "moreInfo": "Дадатковая інфармацыя", + "otherVersions": "Іншыя версіі", + "remove": "Выдаліць", + "title": "{0} ад {1}", + "uninstall": "Выдаліць", + "uninstallMsg": "Ці сапраўды вы жадаеце выдаліць {0}?", + "update": "Абнавіць" + }, + "configuration": { + "cli": { + "inaccessibleDirectory": "Не атрымалася атрымаць доступ да размяшчэння альбому па адрасу '{0}': {1}" + } + }, + "connectionStatus": { + "connectionLost": "Злучэнне страчанае.\nДзеянні і абнаўленні сцэнараў воблаку будуць недаступныя." + }, + "contributions": { + "addFile": "Дадаць файл", + "fileAdded": "Адзін файл дададзены ў сцэнар.", + "plotter": { + "couldNotOpen": "Не атрымалася адчыніць паслядоўны плотэр" + }, + "replaceTitle": "Замяніць" + }, + "core": { + "compilerWarnings": { + "all": "Усе", + "default": "Першапачаткова", + "more": "Больш", + "none": "Ніхто" + } + }, + "coreContribution": { + "copyError": "Капіраваць паведамленні пра памылкі", + "noBoardSelected": "Плата не выбрана.\nКалі ласка, абярыце вашу плату Arduino у меню Інструменты > Плата." + }, + "createCloudCopy": "Перамясціць сцэнар у воблака", + "daemon": { + "restart": "Запусціць Daemon нанова", + "start": "Запусціць Daemon", + "stop": "Спыніць Daemon" + }, + "debug": { + "debugWithMessage": "Адладзіць - {0}", + "debuggingNotSupported": "Адладка не падтрымліваецца для '{0}'", + "getDebugInfo": "Атрыманне дадатковай інфармацыі…", + "noPlatformInstalledFor": "Платформа не ўсталяваная для '{0}'", + "optimizeForDebugging": "Аптымізаваць для адладкі", + "sketchIsNotCompiled": "Сцэнар '{0}' неабходна праверыць перад пачаткам сеансу адладкі.\nКалі ласка, праверце сцэнар, і пачніце адладку нанова.\nЦі жадаеце праверыць сцэнар зараз?" + }, + "developer": { + "clearBoardList": "Ачысціць гісторыю спісу плат", + "clearBoardsConfig": "Ачысціць плату і абраць порт", + "dumpBoardList": "Звалка спісу плат" + }, + "dialog": { + "dontAskAgain": "Болей не пытаць" + }, + "editor": { + "autoFormat": "Аўтаматычнае фарматаванне", + "commentUncomment": "Каментаваць/раскаментаваць", + "copyForForum": "Капіраваць для форуму (Markdown)", + "decreaseFontSize": "Паменшыць памер шрыфту", + "decreaseIndent": "Паменшыць водступ", + "increaseFontSize": "Павялічыць памер шрыфту", + "increaseIndent": "Павялічыць водступ", + "nextError": "Наступная памылка", + "previousError": "Папярэдняя памылка", + "revealError": "Выявіць памылку" + }, + "examples": { + "builtInExamples": "Убудаваныя прыклады", + "couldNotInitializeExamples": "Не атрымалася ініцыялізаваць убудаваныя прыклады.", + "customLibrary": "Прыклады з карыстальніцкіх бібліятэк", + "for": "Прыклады для {0}", + "forAny": "Прыклады для любой платы", + "menu": "Прыклады" + }, + "firmware": { + "checkUpdates": "Праверыць наяўнасць абнаўленняў", + "failedInstall": "Памылка ўсталявання.\nКалі ласка, паспрабуйце зноў.", + "install": "Усталяваць", + "installingFirmware": "Усталяванне прашыўкі.", + "overwriteSketch": "Усталяванне перазапіша сцэнар на плаце.", + "selectBoard": "Знайсці плату", + "selectVersion": "Абярыце версію прашыўкі", + "successfullyInstalled": "Прашыўка паспяхова ўсталяваная.", + "updater": "Сродак абнаўлення прашыўкі" + }, + "help": { + "environment": "Асяроддзе", + "faq": "Часта задаваныя пытанні", + "findInReference": "Знайсці ў даведніку", + "gettingStarted": "Прыступаючы да працы", + "keyword": "Увядзіце ключавае слова", + "privacyPolicy": "Палітыка прыватнасці", + "reference": "Даведнік", + "search": "Пошук на Arduino.cc", + "troubleshooting": "Дыягностыка", + "visit": "Перайсці на Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino IDE", + "closeAndInstallButton": "Зачыніць і ўсталяваць", + "closeToInstallNotice": "Зачыніце праграмнае забеспячэнне і ўсталюйце абнаўленне на свой кампутар.", + "downloadButton": "Спампаваць", + "downloadingNotice": "Пампуе апошнюю версію Arduino IDE.", + "errorCheckingForUpdates": "Памылка пры праверцы абнаўленняў Arduino IDE.\n{0}", + "goToDownloadButton": "Перайсці да спампоўкі", + "goToDownloadPage": "Даступна абнаўленне для Arduino IDE, але мы не можам загрузіць і ўсталяваць яго аўтаматычна.\nКалі ласка, перайдзіце на старонку спампоўкі і спампуйце адтуль апошнюю версію.", + "ideUpdaterDialog": "Абнаўленне праграмнага забеспячэння", + "newVersionAvailable": "Новая версія Arduino IDE ({0}) даступная для спампоўкі.", + "noUpdatesAvailable": "Апошнія абнаўленні для Arduino IDE недаступныя", + "notNowButton": "Не цяпер", + "skipVersionButton": "Прапусціць версію", + "updateAvailable": "Даступна абнаўленне", + "versionDownloaded": "Arduino IDE {0} быў спампаваны." + }, + "installable": { + "libraryInstallFailed": "Не атрымалася ўсталяваць бібліятэку: '{0}{1}'.", + "platformInstallFailed": "Не атрымалася ўсталяваць платформу: '{0}{1}'." + }, + "library": { + "addZip": "Дадаць бібліятэку .ZIP…", + "arduinoLibraries": "Бібліятэкі Arduino", + "contributedLibraries": "Прадстаўленыя бібліятэкі", + "include": "Уключыць бібліятэку", + "installAll": "Усталяваць усе", + "installLibraryDependencies": "Усталяваць залежнасці бібліятэк", + "installMissingDependencies": "Ці жадаеце вы ўсталяваць усе залежнасці, якія адсутнічаюць?", + "installOneMissingDependency": "Ці жадаеце вы ўсталяваць залежнасць, якая адсутнічае?", + "installWithoutDependencies": "Усталяваць без залежнасцяў", + "installedSuccessfully": "Бібліятэка {0}:{1} паспяхова ўсталяваная", + "libraryAlreadyExists": "Бібліятэка ўжо існуе.\nЦі жадаеце вы перазапісаць яе?", + "manageLibraries": "Кіраваць бібліятэкамі…", + "namedLibraryAlreadyExists": "Каталог бібліятэкі {0} ужо існуе.\nЦі жадаеце вы перазапісаць яе?", + "needsMultipleDependencies": "Бібліятэцы <b>{0}:{1}</b> патрэбныя некаторыя іншыя залежнасці, якія ў бягучы час не ўсталяваныя:", + "needsOneDependency": "Бібліятэцы <b>{0}:{1}</b> патрабуецца іншая залежнасць, якая ў бягучы час не ўсталяваная:", + "overwriteExistingLibrary": "Ці жадаеце вы перазапісаць існуючую бібліятэку?", + "successfullyInstalledZipLibrary": "Бібліятэка з архіва {0} паспяхова ўсталяваная", + "title": "Кіраванне бібліятэкай", + "uninstalledSuccessfully": "Бібліятэка {0}:{1} паспяхова выдаленая", + "zipLibrary": "Бібліятэка" + }, + "librarySearchProperty": { + "topic": "Тэма" + }, + "libraryTopic": { + "communication": "Зносіны", + "dataProcessing": "Апрацоўка дадзеных", + "dataStorage": "Сховішча дадзеных", + "deviceControl": "Кіраванне прыладай", + "display": "Дысплей", + "other": "Іншае", + "sensors": "Датчыкі", + "signalInputOutput": "Сігналы ўводу/вываду", + "timing": "Сінхранізацыя", + "uncategorized": "Без рубрыкі" + }, + "libraryType": { + "installed": "Усталяваная" + }, + "menu": { + "advanced": "Пашыраны", + "sketch": "Сцэнар", + "tools": "Інструменты" + }, + "monitor": { + "alreadyConnectedError": "Не атрымалася злучыцца з портам {0} {1}.\nУжо злучаны.", + "baudRate": "{0} бод", + "connectionFailedError": "Не атрымалася злучыцца з портам {0} {1}", + "connectionFailedErrorWithDetails": "{0} не атрымалася злучыцца з портам {1} {2}.", + "connectionTimeout": "Затрымка.\nIDE не атрымалася паведамленне 'success' ад манітора паслядоўнага злучэння", + "missingConfigurationError": "Не атрымалася злучыцца з портам {0} {1}.\nКанфігурацыя манітора адсутнічае.", + "notConnectedError": "Не злучаны з портам {0} {1}.", + "unableToCloseWebSocket": "Не атрымалася зачыніць вэб-сокет", + "unableToConnectToWebSocket": "Не атрымалася злучыцца з вэб-сокетам" + }, + "newCloudSketch": { + "newSketchTitle": "Назва новага сцэнара ў воблаку" + }, + "portProtocol": { + "network": "Сетка", + "serial": "Паслядоўны порт" + }, + "preferences": { + "additionalManagerURLs": "Адрасы URL кіраўніка дадатковых плат", + "auth.audience": "Аўдыторыя OAuth2.", + "auth.clientID": "Ідэнтыфікатар кліенту OAuth2.", + "auth.domain": "Дамен OAuth2.", + "auth.registerUri": "URI, які ўжываецца пры рэгістрацыі новага карыстальніка.", + "automatic": "Аўтаматычна", + "board.certificates": "Спіс сертыфікатаў, якія могуць быць загружаныя на плату", + "browse": "Праглядзець", + "checkForUpdate": "Атрымліваць апавяшчэнні аб даступных абнаўленнях для IDE, плат і бібліятэк.\nПатрабуецца запусціць IDE нанова пасля ўнясення змяненняў.\nПершапачаткова true.", + "choose": "Выбраць", + "cli.daemonDebug": "Уключыць вядзенне часопісу адладкі выклікаў gRPC ў Arduino CLI.\nКаб уступіла ў сілу гэтая налада, патрабуецца запусціць IDE нанова.\nПершапачаткова false.", + "cloud.enabled": "Калі true, функцыі сінхранізацыі сцэнару ўключаныя.\nПершапачаткова true.", + "cloud.pull.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад стварэннем сцэнара ў воблаку.\nПершапачаткова true.", + "cloud.push.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад запускам сцэнара ў воблаку.\nПершапачаткова true.", + "cloud.pushpublic.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад адпраўкай агульнадаступнага сцэнара ў воблака.\nПершапачаткова true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "Канчатковая кропка, якая ўжываецца для адпраўкі і выцягвання сцэнара з сервернай часткі.\nПершапачаткова яна паказвае на API воблака Arduino.", + "compile": "кампіляваць", + "compile.experimental": "Калі true, асяроддзе IDE павінна апрацоўваць некалькі памылак кампілятара.\nПершапачаткова false", + "compile.revealRange": "Наладжвае спосаб адлюстравання памылак кампілятара ў сродку праўкі пасля няўдалай праверкі/загрузкі.\nМагчымыя значэнні:\n'auto': пракруціць па вертыкалі па меры неабходнасці і адлюстраваць радок.\n'center': пракруціць па вертыкалі па меры неабходнасці і адлюстраваць радок па цэнтры па вертыкалі.\n'top': пракруціць па вертыкалі па меры неабходнасці і паказаць лінію блізка да верхняй частцы вобласці прагляду, аптымізаваную для прагляду вызначэння кода.\n'centerIfOutsideViewport': пракруціць па вертыкалі па меры неабходнасці і паказаць лінію, цэнтраваць па вертыкалі, толькі калі яна знаходзіцца за межамі вобласці прагляду.\nПершапачаткова - '{0}'.", + "compile.verbose": "Калі true, каб быў падрабязны вывад кампілятарам.\nПершапачаткова false", + "compile.warnings": "Паказвае gcc, які ўжываць узровень папярэджанняў.\nПершапачаткова 'None'", + "compilerWarnings": "Папярэджанні кампілятара", + "editorFontSize": "Памер шрыфту ў сродку праўкі", + "editorQuickSuggestions": "Хуткія падказкі ў сродку праўкі", + "enterAdditionalURLs": "Увядзіце дадатковыя адрасы URL, па адным на кожным радку", + "files.inside.sketches": "Адлюстраваць файлы ўнутры сцэнара", + "ide.updateBaseUrl": "Асноўны адрас URL, з якога можна спампаваць абнаўленні.\nПершапачаткова 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Канал выпуску, з якога можна атрымліваць абнаўленні.\n'stable' - гэта стабільны выпуск, 'nightly' - апошняя зборка для распрацоўшчыкаў.", + "interfaceScale": "Маштабаванне інтэрфейсу", + "invalid.editorFontSize": "Хібны памер шрыфту сродку праўкі.\nПавінны быць станоўчы цэлы лік.", + "invalid.sketchbook.location": "Хібнае размяшчэнне альбому з сцэнарамі: {0}", + "invalid.theme": "Хібная тэма.", + "language.asyncWorkers": "Колькасць асінхронных працоўных працэсаў, якія ўжываюцца моўным серверам Arduino (clangd).\nФонавы індэкс таксама ўжывае дадзеную колькасць працоўных працэсаў.\nНайменшае значэнне 0, а найбольшае - 8.\nКалі 0, моўны сервер ужывае ўсе даступныя ядры.\nПершапачаткова 0.", + "language.log": "Калі true, моўны сервер Arduino павінен ствараць файлы часопісу ў каталог з сцэнарам.\nУ адваротным выпадку false.\nПершапачаткова false.", + "language.realTimeDiagnostics": "Калі true, моўны сервер забяспечвае дыягностыку пры ўводзе тэксту ў сродку праўкі ў рэальным часе.\nПершапачаткова false.", + "manualProxy": "Ручная налада проксі-сервера", + "monitor": { + "dockPanel": "Вобласць асяроддзя праграмы, дзе будзе знаходзіцца віджэт _{0}_.\nГэта \"bottom\" ці \"right\".\nПершапачаткова \"{1}\"." + }, + "network": "Сетка", + "newSketchbookLocation": "Абраць новае месцазнаходжанне альбому з сцэнарамі", + "noCliConfig": "Не атрымалася загрузіць канфігурацыю CLI", + "noProxy": "Без проксі-сервера", + "proxySettings": { + "hostname": "Назва вузла", + "password": "Пароль", + "port": "Нумар порта", + "username": "Імя карыстальніка" + }, + "showVerbose": "Паказаць падрабязныя выходныя дадзеныя падчас", + "sketch": { + "inoBlueprint": "Абсалютны шлях файлавай сістэмы да першапачатковага файла схемы `.ino`.\nКалі паказана, змест файлу схемы будзе ўжывацца для кожнага новага сцэнара, які створаны ў IDE.\nСцэнары будуць створаныя з ужываннем першапачатковага зместу Arduino, калі не пазначана.\nНедаступныя файлы схемы ігнаруюцца.\nКаб гэты параметр уступіў сілу, **патрабуецца запуск IDE нанова**." + }, + "sketchbook.location": "Месцазнаходжанне альбому з сцэнарамі", + "sketchbook.showAllFiles": "Калі true, адлюстроўваюцца ўсе файлы сцэнараў унутры сцэнара.\nПершапачаткова false.", + "survey.notification": "Калі true, карыстальнікі павінны атрымліваць апавяшчэнні аб даступнасці апытання.\nПершапачаткова true.", + "unofficialBoardSupport": "Пстрыкніце, каб праглядзець спіс адрасоў URL падтрымкі неафіцыйных плат", + "upload": "выгрузіць", + "upload.verbose": "Калі true, каб быў падрабязны вывад пры загрузцы.\nПершапачаткова false.", + "verifyAfterUpload": "Праверыць код пасля выгрузкі", + "window.autoScale": "Калі true, карыстальніцкі інтэрфейс аўтаматычна маштабуецца ў адпаведнасці з памерам шрыфту.", + "window.zoomLevel": { + "deprecationMessage": "Састарэлы.\nЗамест гэтага ўжывайце 'window.zoomLevel'." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "Новая назва сцэнара ў воблаку" + }, + "replaceMsg": "Ці замяніць існуючую версію {0}?", + "selectZip": "Абярыце файл zip, які змяшчае бібліятэку, якую вы жадаеце дадаць", + "serial": { + "autoscroll": "Аўтаматычная пракрутка", + "carriageReturn": "CR - вяртанне карэткі", + "connecting": "Злучэнне з '{0}' на '{1}'…", + "message": "Паведамленне (увядзіце, каб адправіць паведамленне '{0}' на '{1}')", + "newLine": "NL - новы радок", + "newLineCarriageReturn": "NL & CR - новы радок і вяртанне карэткі", + "noLineEndings": "Без канца радка", + "notConnected": "Не злучаны.\nАбярыце плату і порт для аўтаматычнага злучэння.", + "openSerialPlotter": "Паслядоўны плотэр", + "timestamp": "Адзнака часу", + "toggleTimestamp": "Пераключыць адзнаку часу" + }, + "sketch": { + "archiveSketch": "Архіваваць сцэнар", + "cantOpen": "Каталог \"{0}\" ужо існуе.\nНе атрымалася адчыніць сцэнар.", + "compile": "Кампіляцыя сцэнара…", + "configureAndUpload": "Наладзіць і выгрузіць", + "createdArchive": "Створаны архіў '{0}'.", + "doneCompiling": "Кампіляцыя скончана.", + "doneUploading": "Выгрузка скончана.", + "editInvalidSketchFolderLocationQuestion": "Ці жадаеце вы паспрабаваць захаваць сцэнар у іншым месцы?", + "editInvalidSketchFolderQuestion": "Ці жадаеце вы паспрабаваць захаваць сцэнар пад іншай назвай?", + "exportBinary": "Экспартаваць скампіляваны двайковы файл", + "invalidCloudSketchName": "Назва павінна пачынацца з літары, лічбы ці знака падкрэсляння, за якім ідуць літары, лічбы, працяжнікі, кропкі і знакі падкрэсляння.\nНайбольшая даўжыня - 36 знакаў.", + "invalidSketchFolderLocationDetails": "Вы не можаце захаваць сцэнар у каталогу ўнутры самога сабе.", + "invalidSketchFolderLocationMessage": "Хібнае размяшчэнне каталогу з сцэнарам: '{0}'", + "invalidSketchFolderNameMessage": "Хібнае імя каталогу з сцэнарам: '{0}'", + "invalidSketchName": "Назва павінна пачынацца з літары, лічбы ці знака падкрэсляння, за якім ідуць літары, лічбы, працяжнікі, кропкі і знакі падкрэсляння.\nНайбольшая даўжыня - 63 знакі.", + "moving": "Які рухаецца", + "movingMsg": "Файл \"{0}\" павінен знаходзіцца ў каталогу з сцэнарам \"{1}\".\nЦі стварыць каталог, перамясціць файл, і працягнуць?", + "new": "Новы сцэнар", + "noTrailingPeriod": "Імя файла не можа заканчвацца кропкай", + "openFolder": "Адчыніць каталог", + "openRecent": "Адчыніць нядаўні", + "openSketchInNewWindow": "Адчыніць сцэнар у новым акне", + "reservedFilename": "'{0}' - зарэзерваванае імя файла.", + "saveFolderAs": "Захаваць каталог з сцэнарам як…", + "saveSketch": "Захаваць сцэнар, каб адчыніць яго пазней.", + "saveSketchAs": "Захаваць каталог з сцэнарам як…", + "showFolder": "Адлюстраваць каталог з сцэнарам", + "sketch": "Сцэнар", + "sketchAlreadyContainsThisFileError": "Сцэнар ужо ўтрымлівае файл з іменем '{0}'", + "sketchAlreadyContainsThisFileMessage": "Не атрымалася захаваць сцэнар \"{0}\" як \"{1}\".\n{2}", + "sketchbook": "Альбом з сцэнарам", + "titleLocalSketchbook": "Лакальны альбом з сцэнарам", + "titleSketchbook": "Альбом з сцэнарам", + "upload": "Выгрузіць", + "uploadUsingProgrammer": "Выгрузіць з дапамогай сродку праграмавання", + "uploading": "Выгрузка…", + "userFieldsNotFoundError": "Не атрымалася знайсці карыстальніцкія палі для злучанай платы", + "verify": "Праверыць", + "verifyOrCompile": "Праверыць/Кампіляваць" + }, + "sketchbook": { + "newCloudSketch": "Новы сцэнар у воблаку", + "newSketch": "Новы сцэнар" + }, + "survey": { + "answerSurvey": "Апытанне з адказамі", + "dismissSurvey": "Болей не адлюстроўваць", + "surveyMessage": "Калі ласка, дапамажыце нам стаць лепш, адказаўшы на гэтае звышкароткае апытанне.\nМы цэнім нашу супольнасць і хацелі б даведацца нашых прыхільнікаў трохі лепш." + }, + "theme": { + "currentThemeNotFound": "Не атрымалася знайсці абраную ў дадзены момант тэму: {0}.\nArduino IDE абрала ўбудаваную тэму, якая сумяшчальная з адсутнай.", + "dark": "Цёмная", + "deprecated": "{0} (састарэлая)", + "hc": "Цёмная высокакантрасная", + "hcLight": "Светлая высокакантрасная", + "light": "Светлая", + "user": "{0} (карыстальніцкая)" + }, + "title": { + "cloud": "Воблака" + }, + "updateIndexes": { + "updateIndexes": "Абнавіць індэксы", + "updateLibraryIndex": "Абнавіць індэксы бібліятэкі", + "updatePackageIndex": "Абнавіць індэксы пакетаў" + }, + "upload": { + "error": "{0} памылка: {1}" + }, + "userFields": { + "cancel": "Адмяніць", + "enterField": "Увясці {0}", + "upload": "Выгрузіць" + }, + "validateSketch": { + "abortFixMessage": "Сцэнар па-ранейшаму хібны.\nЦі жадаеце вы ліквідаваць пакінутыя праблемы?\nНацісніце '{0}', адчыніцца новы сцэнар.", + "abortFixTitle": "Хібны сцэнар", + "renameSketchFileMessage": "Файл сцэнара '{0}' не можа быць ужыты.\n{1} Ці жадаеце вы пераназваць файл сцэнара прама зараз?", + "renameSketchFileTitle": "Хібнае імя файлу сцэнара", + "renameSketchFolderMessage": "Сцэнар '{0}' не можа быць ужыты.\n{1} Каб пазбавіцца ад гэтага паведамлення, пераназавіце сцэнар.\nЦі жадаеце вы пераназваць сцэнар?", + "renameSketchFolderTitle": "Хібная назва сцэнара" + }, + "workspace": { + "alreadyExists": "{0}' ужо існуе." + } + }, + "theia": { + "core": { + "cannotConnectBackend": "Не атрымалася злучыцца з сервернай часткай.", + "cannotConnectDaemon": "Не атрымалася злучыцца з дэманам CLI.", + "couldNotSave": "Не атрымалася захаваць сцэнар.\nКалі ласка, скапіруйце вашую незахаваную працу ў ваш любімы тэкставы сродак праўкі, і запусціце асяроддзе IDE нанова.", + "daemonOffline": "Дэман CLI у аўтаномным рэжыме", + "offline": "Аўтаномны", + "offlineText": "Не ў сетцы", + "quitTitle": "Ці ўпэўненыя вы, што жадаеце выйсці?" + }, + "editor": { + "unsavedTitle": "Незахаваны – {0}" + }, + "messages": { + "collapse": "Згарнуць", + "expand": "Разгарнуць" + }, + "workspace": { + "deleteCloudSketch": "Сцэнар у воблаку '{0}' будзе незваротна выдалены з сервераў Arduino і лакальных кэшаў.\nГэтае дзеянне незваротнае.\nЦі жадаеце вы выдаліць бягучы сцэнар?", + "deleteCurrentSketch": "Сцэнар '{0}' будзе незваротна выдалены.\nГэтае дзеянне незваротнае.\nЦі жадаеце вы выдаліць бягучы сцэнар?", + "fileNewName": "Імя для новага файла", + "invalidExtension": ".{0} не з'яўляецца дапушчальным пашырэннем", + "newFileName": "Новае імя для файла" + } + } +} diff --git a/i18n/bg.json b/i18n/bg.json index 6339fd280..e8102ac80 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -152,7 +152,8 @@ "serialMonitor": "Сериен Монитор", "type": "Type", "unknown": "Неизвестно", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Грешка при компилация: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Отстраняването на грешки не се поддържа от „{0}“", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформата не е инсталирана за „{0}“", - "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True е, ако потребителите трябва да бъдат предупредени, преди да се изтегли скица от облака. По подразбиране е true.", "cloud.push.warn": "True, ако потребителите трябва да бъдат предупредени, преди да бъде пусната скица в облака. По подразбиране е true.", "cloud.pushpublic.warn": "True, ако потребителите трябва да бъдат предупредени, преди да бъде изпратена публична скица в облака. По подразбиране е true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Крайната точка, използвана за изпращане и изтегляне на скици от бекенда. По подразбиране той сочи към Arduino Cloud API.", "compile": "компилиране", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 51b38011b..8d59ff87c 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -18,7 +18,7 @@ "configDialog1": "Selecciona una placa i un port si vols carregar un programa.", "configDialog2": "Si només selecciones una placa, podràs compilar, però no carregar un programa.", "couldNotFindPreviouslySelected": "No s'ha trobat la placa \"{0}\" seleccionada anteriorment en la plataforma instal·lada \"{1}\". Torna a seleccionar manualment la placa que vols utilitzar. Vols tornar-la a seleccionar ara?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Selecciona placa i port...", "getBoardInfo": "Obtín informació de la placa", "inSketchbook": "(al quadern de programes)", "installNow": "El nucli de \"{0} {1}\" s'ha d'instal·lar en la placa \"{2}\" seleccionada actualment. Vols instal·lar-lo ara?", @@ -32,7 +32,7 @@ "ports": "ports", "programmer": "Programador", "reselectLater": "Torna a triar més tard", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "Fes servir ' {0} ' descobert a ' {1} '", "searchBoard": "Busca una placa", "selectBoard": "Tria una placa", "selectPortForInfo": "Tria un port per obtenir informació de la placa.", @@ -41,7 +41,7 @@ "succesfullyInstalledPlatform": "Plataforma instal·lada correctament {0}:{1}", "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}", "typeOfPorts": "{0} ports", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "Placa no confirmada", "unknownBoard": "Placa desconeguda" }, "boardsManager": "Gestor de plaques", @@ -139,7 +139,7 @@ "installManually": "Instal·la manualment", "later": "Més tard", "noBoardSelected": "No s'ha seleccionat cap placa", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Cap sketch obert", "notConnected": "[no connectat]", "offlineIndicator": "Sembla que estàs fora de línia. Sense connexió a Internet, és possible que l'Arduino CLI no pugui descarregar els recursos necessaris i podria provocar un mal funcionament. Connecteu-vos a Internet i reinicieu l'aplicació.", "oldFormat": "El \"{0}\" encara utilitza l'antic format \".pde\". Voleu canviar a la nova extensió \".ino\"?", @@ -147,12 +147,13 @@ "processing": "Processant", "recommended": "Recomanat", "retired": "Retirat", - "selectManually": "Select Manually", + "selectManually": "Selecciona manualment", "selectedOn": "sobre {0}", "serialMonitor": "Monitor sèrie", "type": "Tipus", "unknown": "Desconegut", - "updateable": "Actualitzable" + "updateable": "Actualitzable", + "userAbort": "Abortar per l'usuari" }, "compile": { "error": "Error de compilació: {0}" @@ -211,15 +212,14 @@ "debug": { "debugWithMessage": "Depuració - {0}", "debuggingNotSupported": "La depuració no és compatible amb '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Recopilant info depuració", "noPlatformInstalledFor": "La plataforma no està instal·lada per a '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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", + "clearBoardList": "Esborra historial del llistat de plaques", + "clearBoardsConfig": "Esborra la selecció de placa i port", "dumpBoardList": "Dump the Board List" }, "dialog": { @@ -254,7 +254,7 @@ "selectBoard": "Selecciona una placa", "selectVersion": "Selecciona la versió de l'entorn", "successfullyInstalled": "L'entorn s'ha instal·lat correctament.", - "updater": "Firmware Updater" + "updater": "Actualitzador de l'entorn WiFi101 / WiFiNINA" }, "help": { "environment": "Entorn", @@ -286,8 +286,8 @@ "versionDownloaded": "L'IDE d'Arduino {0} s'ha descarregat" }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "Instal.lació de llibrería fallida '{0}{1}'.", + "platformInstallFailed": "Instal.lació fallida de plataforma '{0}{1}'." }, "library": { "addZip": "Afegeix llibreria .ZIP...", @@ -368,6 +368,7 @@ "cloud.pull.warn": "És cert si s'ha d'avisar als usuaris abans de baixar un programa del núvol. Per defecte està activat.", "cloud.push.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa del núvol. Per defecte està activat.", "cloud.pushpublic.warn": "És cert si s'ha d'avisar als usuaris abans d'enviar un programa públic al núvol. Per defecte està activat.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "El punt final s'utilitza per a enviar i descarregar programes des d'un administrador. Per defecte apunta a l'API d'Arduino Cloud.", "compile": "compila", "compile.experimental": "És cert si l'IDE gestiona múltiples errors de compilació. Per defecte està desactivat.", @@ -465,8 +466,8 @@ "saveSketchAs": "Desa la carpeta del programa com a...", "showFolder": "Mostra la carpeta del programa", "sketch": "Programa", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "L' sketch ja conté un arxiu anomenat '{0}'", + "sketchAlreadyContainsThisFileMessage": "No s'ha pogut desar l' sketch \"{0}\" com a \"{1}\". {2}", "sketchbook": "Quadern de programes", "titleLocalSketchbook": "Quadern de programes local", "titleSketchbook": "Quadern de programes", @@ -490,8 +491,8 @@ "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", + "hc": "Fosc alt contrast", + "hcLight": "Clar alt contrast", "light": "Clar", "user": "{0} (usuari)" }, diff --git a/i18n/cs.json b/i18n/cs.json index 8469f806f..5f66422af 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -152,7 +152,8 @@ "serialMonitor": "Seriový monitor", "type": "typ", "unknown": "Neznámý", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Chyba kompilace: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debugging není podporován s '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma není nainstalována pro '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Ano pokud by měl být uživatel varován před stahováním cloud sketche. Ano je výchozí hodnota. ", "cloud.push.warn": "Ano pokud by měl být uživatel varován před odesláním cloud sketche. Ano je výchozí hodnota. ", "cloud.pushpublic.warn": "Ano pokud by měl být uživatel varován před odesláním veřejné sketche do cloudu. Ano je výchozí hodnota. ", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Endpoint použitý pro stahování a odesílání sketchí z backendu. Ve výchozím stavu je toto směrováno na Arduino Cloud API.", "compile": "kompilovat", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/da.json b/i18n/da.json new file mode 100644 index 000000000..22babc740 --- /dev/null +++ b/i18n/da.json @@ -0,0 +1,552 @@ +{ + "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?", + "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}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No ports discovered", + "nonSerialPort": "Non-serial port, can't obtain info.", + "openBoardsConfig": "Select other board and port…", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "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.", + "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", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" + }, + "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, + "bootloader": { + "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", + "doneBurningBootloader": "Done burning bootloader." + }, + "burnBootloader": { + "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 <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "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", + "noSketchOpened": "No sketch opened", + "notConnected": "[not connected]", + "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", + "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", + "processing": "Processing", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", + "selectedOn": "on {0}", + "serialMonitor": "Serial Monitor", + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "Filter your search...", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", + "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "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}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, + "dialog": { + "dontAskAgain": "Don't ask again" + }, + "editor": { + "autoFormat": "Auto Format", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Next Error", + "previousError": "Previous Error", + "revealError": "Reveal Error" + }, + "examples": { + "builtInExamples": "Built-in examples", + "couldNotInitializeExamples": "Could not initialize built-in examples.", + "customLibrary": "Examples from Custom Libraries", + "for": "Examples for {0}", + "forAny": "Examples for any board", + "menu": "Examples" + }, + "firmware": { + "checkUpdates": "Check Updates", + "failedInstall": "Installation failed. Please try again.", + "install": "Install", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "Select Board", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "Add .ZIP Library...", + "arduinoLibraries": "Arduino libraries", + "contributedLibraries": "Contributed libraries", + "include": "Include Library", + "installAll": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "compile", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "Compiler warnings", + "editorFontSize": "Editor font size", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "Invalid sketchbook location: {0}", + "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", + "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "Network", + "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "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.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "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": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Cancel", + "enterField": "Enter {0}", + "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "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 c755c08c8..7c4125363 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -1,47 +1,47 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDatum: {1}{2}\nCLI Version: {3}{4} [{5}]\n\n{6}", + "detail": "Version: {0}\nDatum: {1}{2}\nCLI Version: {3}\n\n{4}", "label": "Über {0}" }, "account": { - "goToCloudEditor": "Zum Cloud-Editor gehen", - "goToIoTCloud": "Zur IoT-Cloud gehen", + "goToCloudEditor": "Zum Cloud-Editor", + "goToIoTCloud": "Zur IoT-Cloud", "goToProfile": "Profil aufrufen", "menuTitle": "Arduino-Cloud" }, "board": { "board": "Board{0}", - "boardConfigDialogTitle": "Andere Boards und Ports wählen", + "boardConfigDialogTitle": " Anderes Board und anderen Ports wählen", "boardInfo": "Board-Informationen", "boards": "Boards", - "configDialog1": "Wählen Sie ein Board und einen Port, wenn Sie den Sketch hochladen möchten.", + "configDialog1": " Wähle ein Board und einen Port, wenn du den Sketch hochladen möchtest.", "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?", + "couldNotFindPreviouslySelected": " Das vorher gewählte Board '{0}' gehört nicht zur installierten Plattform '{1}'. Möchtest du das Board neu auswählen?", "editBoardsConfig": "Board und Port ändern...", - "getBoardInfo": "Board-Informationen abrufen", + "getBoardInfo": "Board-Infos abrufen", "inSketchbook": "(im Sketchbook)", - "installNow": "Der \"{0} {1}\" Core muss für das ausgewählte \"{2}\" Board installiert werden. Jetzt installieren?", + "installNow": " Der Core \"{0}{1}\" muss für das ausgewählte Board \"{2}\" installiert werden. Möchtest du jetzt installieren?", "noBoardsFound": "Für \"{0}\" wurden keine Boards gefunden.", - "noNativeSerialPort": "Nativer serieller Port, keine Informationen verfügbar.", + "noNativeSerialPort": " Nativer serieller Port, keine Infos verfügbar.", "noPortsDiscovered": "Keine Ports gefunden", - "nonSerialPort": "Nicht-serieller Port, keine Informationen verfügbar.", - "openBoardsConfig": "Wähle einen anderes Board und einen anderen Port...", - "pleasePickBoard": "Bitte wählen Sie das Board, welches am ausgewählten Port angeschlossen ist.", + "nonSerialPort": " Nicht-serieller Port, keine Infos verfügbar.", + "openBoardsConfig": " Wähle ein anderes Board und einen anderen Port ...", + "pleasePickBoard": " Wähle bitte ein Board, das am angegebenen Port angeschlossen ist.", "port": "Port{0}", "ports": "Ports", "programmer": "Programmer", "reselectLater": "Später auswählen", - "revertBoardsConfig": "Verwende {0} an {1}", + "revertBoardsConfig": "'{0}' an '{1}' verwenden", "searchBoard": "Board suchen", "selectBoard": "Board wählen", - "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", - "showAllAvailablePorts": "Zeige alle verfügbaren Ports, wenn aktiviert.", - "showAllPorts": "Zeige alle Ports", + "selectPortForInfo": " Wähle einen Port, um Infos über das Board zu erhalten.", + "showAllAvailablePorts": " Alle verfügbaren Ports anzeigen, wenn aktiviert.", + "showAllPorts": "Alle Ports anzeigen", "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", "typeOfPorts": "{0} Ports", - "unconfirmedBoard": "Board nicht bestätigt", + "unconfirmedBoard": "Unbestätigtes Board", "unknownBoard": "Unbekanntes Board" }, "boardsManager": "Board-Verwaltung", @@ -50,41 +50,41 @@ }, "bootloader": { "burnBootloader": "Bootloader brennen", - "burningBootloader": "Bootloader überschreiben ...", + "burningBootloader": "Bootloader wird gebrannt ...", "doneBurningBootloader": "Bootloader erfolgreich gebrannt." }, "burnBootloader": { - "error": "Fehler beim Überschreiben des Bootloaders: {0}" + "error": " Fehler beim Brennen des Bootloaders: {0}" }, "certificate": { "addNew": "Neu hinzufügen", "addURL": "URL hinzufügen, um das SSL-Zertifikat abzurufen", "boardAtPort": "{0} bei {1}", - "certificatesUploaded": "Die Zertifikate wurden erfolgreich hochgeladen.", + "certificatesUploaded": "Zertifikate erfolgreich hochgeladen.", "enterURL": "URL eingeben", "noSupportedBoardConnected": "Kein unterstütztes Board angeschlossen", "openContext": "Kontext öffnen", "remove": "Entfernen", "selectBoard": "Wähle ein Board...", - "selectCertificateToUpload": "1. Zertifikat zum hochladen auswählen", + "selectCertificateToUpload": "1. Zertifikat zum Hochladen auswählen", "selectDestinationBoardToUpload": "2. Zielboard wählen und Zertifikat hochladen", "upload": "Hochladen", - "uploadFailed": "Hochladen fehlgeschlagen. Bitte versuchen Sie es erneut.", + "uploadFailed": "Hochladen fehlgeschlagen. Versuche es bitte noch einmal.", "uploadRootCertificates": "SSL Root Zertifikat hochladen", "uploadingCertificates": "Zertifikate hochladen..." }, "checkForUpdates": { - "checkForUpdates": "Nach Arduino Updates suchen", + "checkForUpdates": "Arduino-Updates suchen", "installAll": "Alle installieren", - "noUpdates": "Es sind keine aktuellen Updates verfügbar.", - "promptUpdateBoards": "Es sind Updates für einige Ihrer Boards verfügbar.", - "promptUpdateLibraries": "Es sind Updates für einige Ihrer Blibliotheken verfügbar.", + "noUpdates": " Es sind keine neuen Updates verfügbar.", + "promptUpdateBoards": " Es sind Updates für einige deiner Boards verfügbar.", + "promptUpdateLibraries": " Es sind Updates für einige deiner Bibliotheken verfügbar.", "updatingBoards": "Boards werden aktualisiert ...", "updatingLibraries": "Bibliotheken werden aktualisiert ..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' nicht gefunden. Enthält ihr Sketch die Zeile '#include <Keyboard.h>'?", - "mouseError": "'Mouse' nicht gefunden. Enthält ihr Sketch die Zeile '#include <Mouse.h>'?" + "keyboardError": " 'Keyboard' nicht gefunden. Enthält dein Sketch die Zeile '#include <Keyboard.h>'?", + "mouseError": " 'Mouse' nicht gefunden. Enthält dein Sketch die Zeile '#include <Mouse.h>'?" }, "cloud": { "chooseSketchVisibility": "Wähle die Sichtbarkeit deines Sketches:", @@ -104,34 +104,34 @@ "options": "Optionen ...", "privateVisibility": "Privat. Nur du siehst diesen Sketch.", "profilePicture": "Profilbild", - "publicVisibility": "Öffentlich - Jeder kann mit diesen Link den Sketch sehen.", + "publicVisibility": " Öffentlich. Jeder mit diesen Link kann den Sketch sehen.", "pull": "Pull", "pullFirst": "Du musst zuerst herunterladen, damit du in die Cloud schieben kannst.", "pullSketch": "Pull Sketch", "pullSketchMsg": "Wenn du diesen Sketch aus der Cloud lädst, wird die lokale Version überschrieben. Möchtest du fortfahren?", "push": "Push", "pushSketch": "Push Sketch", - "pushSketchMsg": "Das ist ein öffentlicher Sketch. Vor dem Pushen solltest du überprüfen, ob alle sensiblen Informationen in arduino_secrets.h definiert sind. Du kannst einen Sketch mit dem Teilen-Feld als privat definieren.", + "pushSketchMsg": " Der Sketch ist öffentlich. Prüfe vor dem Pushen, dass alle sensiblen Infos in arduino_secrets.h definiert sind. Du kannst einen Sketch beim Teilen als privat definieren.", "remote": "Remote", - "share": "Teilen....", + "share": "Teilen ...", "shareSketch": "Sketch teilen", - "showHideSketchbook": "Zeige/Verstecke Cloud Sketchbook", + "showHideSketchbook": "Zeige/verstecke Cloud Sketchbook", "signIn": "Anmelden", "signInToCloud": "Anmelden zur Arduino Cloud", "signOut": "Abmelden", - "sync": "Synchronisiere", + "sync": "Synchronisieren", "syncEditSketches": "Synchronisiere und editiere deine Arduino Cloud Sketches.", - "visitArduinoCloud": "Besuche Arduino Cloud um Cloud Sketche zu erstellen." + "visitArduinoCloud": "Arduino Cloud besuchen, um Cloud Sketches zu erstellen." }, "cloudSketch": { "alreadyExists": "Cloud-Sketch '{0}' existiert bereits.", "creating": "Cloud-Sketch '{0}' wird erstellt...", "new": "Neuer Cloud-Sketch", "notFound": "Cloud-Sketch '{0}' konnte nicht heruntergeladen werden. Er existiert nicht.", - "pulling": "Synchronisiere Sketchbook, lade '{0}' runter...", - "pushing": "Synchronisiere Sketchbook, lade '{0}' hoch...", + "pulling": "Sketchbook synchronisieren und '{0}' herunterladen ...", + "pushing": "Sketchbook synchronisieren und '{0}' hochladen ...", "renaming": "Cloud-Sketch wird von '{0}' nach '{1}' umbenannt ...", - "synchronizingSketchbook": "Synchronisiere Sketchbook..." + "synchronizingSketchbook": "Sketchbook wird synchronisiert ..." }, "common": { "all": "Alle", @@ -139,54 +139,55 @@ "installManually": "Manuell installieren", "later": "später", "noBoardSelected": "Kein Board ausgewählt", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Kein Sketch geöffnet", "notConnected": "[keine Verbindung]", "offlineIndicator": "Anscheinend bist du offline. Ohne eine aktive Internetverbindung kann das Arduino CLI nicht die nötigen Ressourcen herunterladen, was zu Problemen führen kann. Bitte überprüfe deine Internetverbindung und starte das Programm neu. ", - "oldFormat": "Der Sketch '{0}' verwendet noch das alte '.pde' Format. Möchtest du auf die neuere '.ino' Endung wechseln?", + "oldFormat": " Der Sketch '{0}' verwendet das alte Format '.pde'. Möchtest du auf die neue Endung '.ino' wechseln?", "partner": "Partner", "processing": "Verarbeiten", "recommended": "Empfohlen", "retired": "Zurückgezogen", - "selectManually": "Select Manually", + "selectManually": "Manuell auswählen", "selectedOn": "an {0}", "serialMonitor": "Serieller Monitor", "type": "Typ", "unknown": "unbekannt", - "updateable": "Aktualisierbar" + "updateable": "Aktualisierbar", + "userAbort": "Nutzerabbruch" }, "compile": { "error": "Fehler beim kompilieren: {0}" }, "component": { - "boardsIncluded": "In diesem Paket enthaltene Boards:", + "boardsIncluded": "Im Paket enthaltene Boards:", "by": "von", - "clickToOpen": "Klicken, um im Browser zu öffnen: {0}", - "filterSearch": "Filtern Sie Ihre Suche ...", + "clickToOpen": " Klicke, um im Browser zu öffnen: {0}", + "filterSearch": "Filtere deine Suche ...", "install": "Installieren", "installLatest": "Neueste installieren", - "installVersion": "Installiere {0}", + "installVersion": "{0} installieren", "installed": "{0} installiert", "moreInfo": "Mehr Information", "otherVersions": "Andere Versionen", "remove": "Entfernen", - "title": "{0} durch {1}", + "title": "{0} von {1}", "uninstall": "Deinstallieren", - "uninstallMsg": "Möchten Sie {0} deinstallieren?", + "uninstallMsg": "Möchtest du {0} deinstallieren?", "update": "Aktualisieren" }, "configuration": { "cli": { - "inaccessibleDirectory": "Kein Zugriff möglich auf Sketchbook-Ort bei '{0}': {1}" + "inaccessibleDirectory": "Kein Zugriff möglich auf Sketchbook-Pfad bei '{0}': {1}" } }, "connectionStatus": { - "connectionLost": "Verbindung verloren. Cloud-Sketch Aktionen und Updates werden nicht verfügbar sein." + "connectionLost": "Keine Verbindung. Aktionen und Updates für Cloud-Sketches sind nicht möglich." }, "contributions": { - "addFile": "Datei hinzufügen...", + "addFile": " Datei hinzufügen", "fileAdded": "Eine Datei wurde zum Sketch hinzugefügt.", "plotter": { - "couldNotOpen": "Konnte den seriellen Plotter nicht öffnen" + "couldNotOpen": " Der serielle Plotter konnte nicht geöffnet werden." }, "replaceTitle": "Ersetzen" }, @@ -195,30 +196,29 @@ "all": "Alle", "default": "Standard", "more": "Mehr", - "none": "Kein/e/r" + "none": "Keine" } }, "coreContribution": { "copyError": "Fehlermeldungen kopieren", - "noBoardSelected": "Kein Board ausgewählt. Bitte Arduino Board im Menü wählen mit Werkzeuge > Board" + "noBoardSelected": "Kein Board ausgewählt. Wähle dein Arduino-Board im Menü 'Werkzeuge > Board'." }, - "createCloudCopy": "Sketch in Cloud hochladen", + "createCloudCopy": "Sketch in die Cloud hochladen", "daemon": { "restart": "Daemon neustarten", "start": "Daemon starten", - "stop": "Stoppe Daemon" + "stop": "Daemon stoppen" }, "debug": { "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "'{0}' unterstützt kein Debuggen", - "getDebugInfo": "Getting debug info...", - "noPlatformInstalledFor": "Die Platform für '{0}' ist nicht instaliert.", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", + "debuggingNotSupported": "Debugging wird von '{0}' nicht unterstützt.", + "getDebugInfo": "Debug-Infos holen ...", + "noPlatformInstalledFor": "Plattform ist für \"{0}\" nicht installiert.", "optimizeForDebugging": "Für Debugging optimieren", - "sketchIsNotCompiled": "Der Sketch '{0}' muss vor dem 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?" + "sketchIsNotCompiled": "Der Sketch '{0}' muss vor dem Debugging überprüft werden. Überprüfe den Sketch und starte das Debugging erneut. Möchtest du den Sketch jetzt überprüfen?" }, "developer": { - "clearBoardList": "Board-Tabellen-Historie leeren", + "clearBoardList": "Board-Tabellen-Verlauf löschen", "clearBoardsConfig": "Board- und Portauswahl aufheben", "dumpBoardList": "Board-Tabelle löschen" }, @@ -226,12 +226,12 @@ "dontAskAgain": "Nicht noch einmal fragen" }, "editor": { - "autoFormat": "automatisch Formatieren", + "autoFormat": "Automatisch formatieren", "commentUncomment": "Kommentieren/Kommentar aufheben", "copyForForum": "Für Forum kopieren (Markdown)", "decreaseFontSize": "Schrift verkleinern", "decreaseIndent": "Einrückung verringern ", - "increaseFontSize": "Schriftgröße vergrößern ", + "increaseFontSize": "Schrift vergrößern", "increaseIndent": "Einrückung erweitern", "nextError": "Nächster Fehler", "previousError": "Vorheriger Fehler", @@ -239,8 +239,8 @@ }, "examples": { "builtInExamples": "Mitgelieferte Beispiele", - "couldNotInitializeExamples": "Mitgelieferte Beispiele konnten nicht initialisiert werden", - "customLibrary": "Beispiele aus eigenen Bibliotheken", + "couldNotInitializeExamples": "Die integrierten Beispiele konnten nicht initialisiert werden.", + "customLibrary": "Beispiele aus angepassten Bibliotheken", "for": "Beispiele für {0}", "forAny": "Beispiele für jedes Board", "menu": "Beispiele" @@ -250,17 +250,17 @@ "failedInstall": "Installation fehlgeschlagen. Bitte versuche es erneut ", "install": "Installieren", "installingFirmware": "Firmware wird installiert.", - "overwriteSketch": "Die Installation wird den Sketch auf dem Board überschreiben.", + "overwriteSketch": "Die Installation überschreibt den Sketch auf dem Board.", "selectBoard": "Board auswählen", - "selectVersion": "Firmware Version wählen", - "successfullyInstalled": "Firmware wurde erfolgreich installiert.", - "updater": "Firmware Updater" + "selectVersion": "Firmware-Version wählen", + "successfullyInstalled": "Die Firmware wurde erfolgreich installiert.", + "updater": "Firmware-Updater" }, "help": { "environment": "Umgebung", "faq": "Häufig gestellte Fragen", "findInReference": "Referenzsuche", - "gettingStarted": "Loslegen...", + "gettingStarted": "Loslegen ...", "keyword": "Schlagwort eingeben", "privacyPolicy": "Datenschutzbestimmungen", "reference": "Referenz", @@ -269,17 +269,17 @@ "visit": "Besuche Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Nach Arduino IDE Updates suchen", + "checkForUpdates": "Arduino IDE Updates suchen", "closeAndInstallButton": "Schließen und Installieren", - "closeToInstallNotice": "Beende die Software und installiere das Update auf deinem Computer", + "closeToInstallNotice": "Software beenden und Update auf deinem Computer installieren", "downloadButton": "Download", - "downloadingNotice": "Die neueste Version der Arduino IDE wird heruntergeladen", + "downloadingNotice": "Die neueste Version der Arduino IDE wird heruntergeladen.", "errorCheckingForUpdates": "Fehler bei der Suche nach IDE Updates{0}", "goToDownloadButton": "Zum Download wechseln", - "goToDownloadPage": "Ein Update für die Arduino IDE ist verfügbar, konnte aber nicht automatisch heruntergeladen und installiert werden. Bitte gehen sie zur Download-Seite und laden sie dort die neueste Version herunter ", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "Eine neue Version der Arduino IDE ({0}) ist zum Download verfügbar", - "noUpdatesAvailable": "Es gibt keine neuen Updates für die Arduino IDE", + "goToDownloadPage": "Ein Update für die Arduino IDE ist verfügbar, konnte aber nicht automatisch installiert werden. Gehe zur Download-Seite und lade dort die neueste Version herunter. ", + "ideUpdaterDialog": "Software-Update", + "newVersionAvailable": "Eine neue Version der Arduino IDE ({0}) ist zum Download verfügbar.", + "noUpdatesAvailable": "Es gibt keine neuen Updates für die Arduino IDE.", "notNowButton": "Später", "skipVersionButton": "Version überspringen", "updateAvailable": "Update verfügbar", @@ -291,22 +291,22 @@ }, "library": { "addZip": ".ZIP-Bibliothek hinzufügen...", - "arduinoLibraries": "Arduino Bibliotheken", - "contributedLibraries": "Bibliotheken, zu denen beigetragen wurde", + "arduinoLibraries": "Arduino-Bibliotheken", + "contributedLibraries": "Beigesteuerte Bibliotheken", "include": "Bibliothek einbinden", "installAll": "Alle installieren", "installLibraryDependencies": "Bibliotheksabhängigkeiten installieren", - "installMissingDependencies": "Möchtest Du die fehlenden Abhängigkeiten installieren?", - "installOneMissingDependency": "Möchtest Du die fehlende Abhängigkeit installieren?", + "installMissingDependencies": "Möchtest du die fehlenden Abhängigkeiten installieren?", + "installOneMissingDependency": "Möchtest du die fehlende Abhängigkeit installieren?", "installWithoutDependencies": "Ohne Abhängigkeiten installieren", "installedSuccessfully": "Bibliothek {0}:{1} erfolgreich installiert", - "libraryAlreadyExists": "Eine Bibliothek existiert bereits. Möchten sie diese überschreiben?", + "libraryAlreadyExists": "Die Bibliothek existiert bereits. Möchtest du sie überschreiben?", "manageLibraries": "Bibliotheken verwalten ...", - "namedLibraryAlreadyExists": "Der Bibliothek-Ordner '{0}' existiert bereits. Überschreiben?", - "needsMultipleDependencies": "Die Bibliothek <b>{0}:{1}</b> benötigt ein paar andere Abhängigkeiten, die derzeit nicht installiert sind:", - "needsOneDependency": "Die Bibliothek <b>{0}:{1}</b> benötigt eine andere Abhängigkeit, welche derzeit nicht installiert ist:", + "namedLibraryAlreadyExists": "Der Bibliothek-Ordner '{0}' existiert bereits. Möchtest du ihn überschreiben?", + "needsMultipleDependencies": "Die Bibliothek <b>{0}:{1}</b> benötigt ein paar weitere Abhängigkeiten, die derzeit nicht installiert sind:", + "needsOneDependency": "Die Bibliothek <b>{0}:{1}</b> benötigt eine weitere Abhängigkeit, die derzeit nicht installiert ist:", "overwriteExistingLibrary": "Möchtest du die existierende Bibliothek überschreiben?", - "successfullyInstalledZipLibrary": "Bibliothek erfolgreich vom {0} Archiv installiert", + "successfullyInstalledZipLibrary": "Bibliothek erfolgreich vom Archiv {0} installiert", "title": "Bibliotheksverwalter", "uninstalledSuccessfully": "Bibliothek {0}:{1} erfolgreich deinstalliert", "zipLibrary": "Bibliothek" @@ -320,7 +320,7 @@ "dataStorage": "Datenspeicher", "deviceControl": "Gerätesteuerung", "display": "Anzeige", - "other": "Andere/s", + "other": "Weitere", "sensors": "Sensoren", "signalInputOutput": "Signal Ein-/Ausgang", "timing": "Timing", @@ -339,7 +339,7 @@ "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.", + "connectionTimeout": "Timeout. Die IDE hat keine 'Success'-Nachricht erhalten, nachdem der Monitor erfolgreich verbunden wurde.", "missingConfigurationError": "Konnte nicht mit {0} {1} Port verbinden. Monitor-Konfiguration fehlt.", "notConnectedError": "Nicht mit {0} {1} Port verbunden.", "unableToCloseWebSocket": "Websocket wurde nicht geschlossen", @@ -354,84 +354,85 @@ }, "preferences": { "additionalManagerURLs": "Zusätzliche Boardverwalter-URLs", - "auth.audience": "Die OAuth2 Audience", - "auth.clientID": "Die OAuth2 client ID.", - "auth.domain": "Die OAuth2 Domain.", - "auth.registerUri": "Das URI hat einen neuen Benutzer registriert.", + "auth.audience": "OAuth2-Audience", + "auth.clientID": "OAuth2-ClientID", + "auth.domain": "OAuth2-Domain", + "auth.registerUri": "Das URI hat einen neuen Nutzer registriert.", "automatic": "Automatisch", - "board.certificates": "Liste der Zertifikate, welche zu den Boards hochgeladen werden können.", + "board.certificates": "Liste der Zertifikate, die zu den Boards hochgeladen werden können.", "browse": "Durchsuchen", - "checkForUpdate": "Erhalte Benachrichtigungen bei verfügbaren Updates für die IDE, die Boards und Bibliotheken. Nach Änderung ist ein Neustart der IDE notwendig. Standardmäßig eingeschaltet.", + "checkForUpdate": "Benachrichtigungen bei verfügbaren Updates für IDE, Boards und Bibliotheken erhalten. Nach einer Änderung ist ein Neustart der IDE notwendig. Standardmäßig eingeschaltet.", "choose": "Wähle", - "cli.daemonDebug": "Aktivieren Sie die Debug-Protokollierung der gRPC-Aufrufe an das Arduino CLI. Ein Neustart der IDE ist erforderlich, damit diese Einstellung wirksam wird. Standardmäßig ist sie deaktiviert.", - "cloud.enabled": "Wahr, wenn die Sketch-Syncfunctionen aktiv sind. Standardeinstellung ist wahr.", - "cloud.pull.warn": "Wahr, wenn Benutzer vor dem Herunterladen eines Sketches aus der Cloud gewarnt werden sollen. Standardmäßig Wahr.", - "cloud.push.warn": "Wahr, wenn Benutzer vor dem Hochladen eines Cloud-Sketches gewarnt werden sollen. Standardmäßig Wahr.", - "cloud.pushpublic.warn": "Wahr, wenn Benutzer vor dem Hochladen eines öffentlichen Sketches in die Cloud gewarnt werden sollen. Standardmäßig Wahr.", - "cloud.sketchSyncEndpoint": "Der Endpunkt, um Sketches zu/von einem Backend zu laden. Standardeinstellung ist die Arduino Cloud API.", + "cli.daemonDebug": "Debug-Protokoll von gRPC-Aufrufe an das Arduino CLI aktivieren. Nach der Änderung ist ein Neustart der IDE notwendig. Standardmäßig deaktiviert.", + "cloud.enabled": "Wenn diese Option aktiviert ist, sind die Sketch-Syncfunktionen aktiv. Standardmäßig aktiviert.", + "cloud.pull.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Herunterladen eines Sketches aus der Cloud gewarnt. Standardmäßig aktiviert.", + "cloud.push.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Hochladen eines Sketches in die Cloud gewarnt. Standardmäßig aktiviert. ", + "cloud.pushpublic.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Hochladen eines öffentlichen Sketches in die Cloud gewarnt. Standardmäßig aktiviert. ", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "Endpunkt, um Sketches zu/von einem Backend zu laden. Standardeinstellung ist die Arduino Cloud API.", "compile": "Kompilieren", - "compile.experimental": "Aktivieren, wenn die IDE mehrere Fehler des Compiler behandeln soll. Standardmäßig ausgeschaltet.", - "compile.revealRange": "Legt fest, wie Compilerfehler im Editor nach einer fehlgeschlagenen Überprüfung/einem fehlgeschlagenen Upload angezeigt werden. Mögliche Werte: 'auto': bei Bedarf vertikal scrollen, um die Zeile anzuzeigen. 'center': bei Bedarf vertikal scrollen und die Zeile zentriert anzeigen. 'top': bei Bedarf vertikal scrollen und die Zeile nahe am oberen Ende des Darstellungsbereichs anzeigen. Optimiert für das Betrachten einer Codedefinition. 'centerIfOutsideViewport': bei Bedarf vertikal scrollen und die Zeile nur anzeigen, wenn sie außerhalb des Anzeigebereichs liegt. Der Standardwert ist '{0}'.", - "compile.verbose": "Aktivieren Sie diese Option, wenn ausführliche Compiler-Meldungen angezeigt werden sollen. Standardgemäß deaktiviert.", - "compile.warnings": "Einstellung der Compiler-Warnungen für den GCC. Standardeinstellung ist 'Keine'. ", + "compile.experimental": "Wenn diese Option aktiviert, werden mehrere Compiler-Fehler in der IDE gleichzeitig behandelt. Standardmäßig deaktiviert.", + "compile.revealRange": "Diese Option steuert, wie Compiler-Fehler im Editor angezeigt werden. Mögliche Werte sind: \n'auto': bei Bedarf vertikal scrollen, um die Zeile anzuzeigen. 'center': bei Bedarf vertikal scrollen und die Zeile zentriert anzeigen. 'top': bei Bedarf vertikal scrollen und die Zeile oben im Textbereich anzeigen, optimiert für das Betrachten einer Codedefinition. 'centerIfOutsideViewport': bei Bedarf vertikal scrollen und die Zeile nur anzeigen, wenn sie außerhalb des Anzeigebereichs liegt. Der Standardwert ist '{0}'.", + "compile.verbose": "Wenn diese Option aktiviert ist, werden ausführliche Compiler-Meldungen angezeigt. Standardgemäß deaktiviert.", + "compile.warnings": "Einstellung der Compiler-Warnungen für den GCC. Standardmäßig 'Keine'. ", "compilerWarnings": "Compiler-Meldungen", - "editorFontSize": "Editor Schriftgröße", - "editorQuickSuggestions": "Schnelle Editor Vorschläge", - "enterAdditionalURLs": "Füge zusätzliche URLs hinzu, jede Reihe einzeln", + "editorFontSize": "Schriftgröße im Editor", + "editorQuickSuggestions": "Schnelle Editor-Vorschläge", + "enterAdditionalURLs": "Zusätzliche URLs hinzufügen, jeweils eine pro Zeile.", "files.inside.sketches": "Dateien im Sketch zeigen", - "ide.updateBaseUrl": "URL für den Download von Updates. Standard-URL: \"https://downloads.arduino.cc/arduino-ide\"", + "ide.updateBaseUrl": "URL für den Download von Updates. Standardmäßig 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "Release-Channel, von dem Updates bezogen werden sollen. 'stable' für stabile und getestete Updates. 'nightly' für allerneuste Updates, welche jedoch noch nicht ausreichend getestet wurden.", - "interfaceScale": "Größe der Benutzeroberfläche", - "invalid.editorFontSize": "Ungültige Editor-Schriftgröße. Wert muss eine Ganzzahl größer 0 (Null) sein.", - "invalid.sketchbook.location": "Ungültiger Sketchbook Speicherort: {0}", - "invalid.theme": "Ungültiges Erscheinungsbild", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", - "language.log": "Wenn aktivert, werden Arduino-Sprach-Server-Logdateien in den Sketch-Ordner geschrieben. Standardmäßig deaktivert. ", - "language.realTimeDiagnostics": "Wenn aktiviert, bietet der Sprachserver bei der Eingabe im Editor eine Echtzeitdiagnose. Ist standardmäßig deaktiviert.", - "manualProxy": "Manuelle Proxy Einstellung", + "interfaceScale": "Skalierung der Darstellung", + "invalid.editorFontSize": "Ungültige Schriftgröße. Der Wert muss eine positie ganze Zahl sein.", + "invalid.sketchbook.location": "Ungültiger Sketchbook-Pfad: {0}", + "invalid.theme": "Ungültiges Design", + "language.asyncWorkers": "Anzahl der asynchronen Worker, die vom Arduino-Sprachserver (clangd) verwendet werden. Der Hintergrundindex verwendet diese Anzahl an Workern ebenfalls. Der Mindestwert ist 0 und der Höchstwert ist 8. Wenn der Wert 0 ist, verwendet der Sprachserver alle verfügbaren Kerne. Der Standardwert ist 0.", + "language.log": "Wenn diese Option aktiviert ist, schreibt der Arduino-Sprachserver seine Logdateien in den Sketch-Ordner. Standardmäßig deaktivert. ", + "language.realTimeDiagnostics": "Wenn diese Option aktiviert ist, wird bei der Eingabe im Editor eine Echtzeitdiagnose angeboten. Standardmäßig deaktiviert.", + "manualProxy": "Manuelle Proxy-Einstellung", "monitor": { "dockPanel": "Der Bereich der Applikations-Shell wo das {0}-Widget angezeigt werden soll. Entweder \"unten\" oder \"rechts\". Standardmäßig \"{1}\"." }, "network": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", - "noCliConfig": "CLI-Konfiguration konnte nicht geladen werden", + "noCliConfig": "CLI-Konfiguration konnte nicht geladen werden.", "noProxy": "Kein Proxy", "proxySettings": { "hostname": "Hostname", - "password": "Passwort", - "port": "Portnummer", - "username": "Benutzername" + "password": "Kennwort", + "port": "Port", + "username": "Nutzername" }, "showVerbose": "Compiler-Meldungen anzeigen beim", "sketch": { - "inoBlueprint": "Absoluter Dateipfad zur Standard-'.ino'-Dateivorlage. Wenn angegeben, wird der Inhalt der Dateivorlage für jeden, mit der IDE erstellten, Sketch verwendet. Wenn nicht angegeben, werden die Sketches mit dem Standard-Arduino-Inhalt erstellt. Unauffindbare Dateivorlagen werden ignoriert. **Ein Neustarten der IDE ist erforderlich**, um diese Einstellung zu übernehmen." + "inoBlueprint": "Dateipfad zur Standardvorlage '.ino'. Wenn eine Vorlage angegeben ist, wird deren Inhalt für alle mit der IDE erstellten Sketches verwendet. Wenn keine Vorlage angegeben ist, werden Sketches mit dem Standard-Arduino-Inhalt erstellt. Nichtauffindbare Vorlagen werden ignoriert. **Ein Neustart der IDE ist erforderlich**, um diese Einstellung zu übernehmen." }, - "sketchbook.location": "Dateipfad des Sketchbooks", - "sketchbook.showAllFiles": "Wenn aktiviert, werden alle Sketch-Dateien innerhalb des Sketch angezeigt. Standardmäßig deaktiviert. ", - "survey.notification": "Wenn aktiviert, werden Nutzer benachrichtigt, wenn eine Umfrage verfügbar ist. Standardmäßig aktiviert.", - "unofficialBoardSupport": "Klicke hier für eine Liste von inoffiziell unterstützten Boards", + "sketchbook.location": "Pfad für Sketchbook", + "sketchbook.showAllFiles": "Wenn diese Option aktiviert ist, werden alle Sketch-Dateien innerhalb des Sketches angezeigt. Standardmäßig deaktiviert. ", + "survey.notification": "Wenn diese Option aktiviert ist, werden Nutzer über eine verfügbare Umfrage informiert. Standardmäßig aktiviert.", + "unofficialBoardSupport": "Klicke hier, um eine URL-Liste von inoffiziell unterstützten Boards anzuzeigen.", "upload": "Hochladen", - "upload.verbose": "Wenn aktiviert, werden ausführliche Compiler-Meldungen angezeigt. Standardmäßig deaktiviert.", + "upload.verbose": "Wenn die Option aktiviert ist, werden ausführliche Compiler-Meldungen angezeigt. Standardmäßig deaktiviert.", "verifyAfterUpload": "Code nach Hochladen überprüfen ", - "window.autoScale": "Wenn aktiviert: Benutzeroberfläche soll mit Schriftgröße skalieren.", + "window.autoScale": "Wenn die Option aktiviert ist, skaliert die Nutzeroberfläche automatisch mit der Schriftgröße.", "window.zoomLevel": { - "deprecationMessage": "Veraltet. Bitte 'window.zoomLevel' stattdessen benutzen." + "deprecationMessage": "Veraltet. Verwende stattdessen 'window.zoomLevel'." } }, "renameCloudSketch": { "renameSketchTitle": "Neuer Name des Cloud-Sketches" }, "replaceMsg": "Existierende Version von {0} ersetzen?", - "selectZip": "Wähle die ZIP-Datei, welche die hinzuzufügende Bibliothek enthält", + "selectZip": "Wähle die ZIP-Datei mit der Bibliothek, die du hinzufügen möchtest.", "serial": { "autoscroll": "Automatisch scrollen", - "carriageReturn": "Zeilenumbruch", + "carriageReturn": "Zeilenumbruch (CR)", "connecting": "Verbindung zu '{0}' auf '{1}'...", - "message": "Nachicht (Enter um Nachricht für '{0}' auf '{1}' zu senden)", + "message": "Nachicht (drücke Enter zum Senden für '{0}' auf '{1}')", "newLine": "Neue Zeile", - "newLineCarriageReturn": "Sowohl NL als auch CR", + "newLineCarriageReturn": "Beides CR/LF", "noLineEndings": "Kein Zeilenende", - "notConnected": "Nicht verbunden. Wählen Sie ein Board und einen Port, um automatisch zu verbinden.", + "notConnected": "Keine Verbindung. Wähle ein Board und einen Port, um automatisch zu verbinden.", "openSerialPlotter": "Serieller Plotter", "timestamp": "Zeitstempel", "toggleTimestamp": "Zeitstempel an/aus" @@ -442,13 +443,13 @@ "compile": "Kompiliere Sketch ...", "configureAndUpload": "Konfigurieren und Hochladen", "createdArchive": "Archiv '{0}' erstellt.", - "doneCompiling": "Kompilieren erfolgreich!", - "doneUploading": "Hochladen erfolgreich! ", - "editInvalidSketchFolderLocationQuestion": "Wollen Sie versuchen, den Sketch an einer anderen Stelle abzuspeichern?", - "editInvalidSketchFolderQuestion": "Wollen Sie versuchen, den Sketch mit einem anderen Namen abzuspeichern?", + "doneCompiling": "Kompilieren erfolgreich.", + "doneUploading": "Hochladen erfolgreich.", + "editInvalidSketchFolderLocationQuestion": "Möchtest du versuchen, den Sketch an einer anderen Stelle abzuspeichern?", + "editInvalidSketchFolderQuestion": "Möchtest du versuchen, den Sketch mit einem anderen Namen abzuspeichern?", "exportBinary": "Kompilierte Binärdatei exportieren", - "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": "Ein Sketch kann nicht innerhalb einem seiner Ordner gespeichert werden.", + "invalidCloudSketchName": "Der Name muss mit einem Buchstaben, einer Ziffer oder einem Unterstrich beginnen. Der Name darf nur Buchstaben, Ziffern, Bindestriche, Punkte und Unterstriche enthalten. Die maximale Länge ist 36 Zeichen.", + "invalidSketchFolderLocationDetails": "Ein Sketch kann nicht innerhalb eines seiner Ordner gespeichert werden.", "invalidSketchFolderLocationMessage": "Ungültiger Ort für Sketch-Ordner: '{0}'", "invalidSketchFolderNameMessage": "Ungültiger Name für einen Sketch-Ordner: '{0}'", "invalidSketchName": "Der Name muss mit einem Buchstaben, einer Ziffer oder einem Unterstrich beginnen und darf Buchstaben, Ziffern, Bindestriche, Punkte und Unterstriche enthalten. Die maximale Länge ist 63 Zeichen.", @@ -465,15 +466,15 @@ "saveSketchAs": "Sketch Ordner speichern als...", "showFolder": "Zeige Sketch Ordner", "sketch": "Sketch", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "Der Sketch enthält bereits eine Datei \"{0}\".", + "sketchAlreadyContainsThisFileMessage": "Fehler beim Speichern von \"{0}\" als \"{1}\". {2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Lokales Sketchbook", "titleSketchbook": "Sketchbook", "upload": "Hochladen", "uploadUsingProgrammer": "Mit Programmer hochladen", "uploading": "Hochladen ...", - "userFieldsNotFoundError": "User Fields für das angeschlossene Board nicht gefunden", + "userFieldsNotFoundError": "Nutzerfelder für das angeschlossene Board nicht gefunden", "verify": "Überprüfen", "verifyOrCompile": "Überprüfen/Kompilieren" }, @@ -512,11 +513,11 @@ "upload": "Hochladen" }, "validateSketch": { - "abortFixMessage": "Der Sketch ist noch immer ungültig. Sollen die verbliebenen Probleme behoben werden? Durch Klicken auf '{0}' wird ein neuer Sketch geöffnet.", + "abortFixMessage": "Der Sketch ist noch immer ungültig. Möchtest du die verbliebenen Probleme beheben? Beim Klicken auf '{0}' wird ein neuer Sketch geöffnet.", "abortFixTitle": "Ungültiger Sketch", "renameSketchFileMessage": "Die Sketch-Datei '{0}' kann nicht verwendet werden. {1} Soll die Sketch-Datei jetzt umbenannt werden?", "renameSketchFileTitle": "Ungültiger Sketch-Dateiname", - "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Meldung loszuwerden, muss der Sketch umbenannt werden. Wollen Sie den Sketch jetzt umbenennen?", + "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Meldung loszuwerden, muss der Sketch umbenannt werden. Möchtest du den Sketch jetzt umbenennen?", "renameSketchFolderTitle": "Ungültiger Sketch-Name" }, "workspace": { @@ -541,8 +542,8 @@ "expand": "Ausklappen" }, "workspace": { - "deleteCloudSketch": "Der Cloud-Sketch '{0}' wird dauerhaft von den Arduino-Servern und den lokalen Caches gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest Du den aktuellen Sketch löschen?", - "deleteCurrentSketch": "Der Sketch {0} wird dauerhaft gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest Du den aktuellen Sketch löschen?", + "deleteCloudSketch": " Der Cloud-Sketch '{0}' wird dauerhaft von den Arduino-Servern und den lokalen Caches gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest du den aktuellen Sketch wirklich löschen?", + "deleteCurrentSketch": " Der Sketch '{0}' wird dauerhaft gelöscht. Diese Aktion ist nicht umkehrbar. Möchtest du den aktuellen Sketch wirklich löschen?", "fileNewName": "Name für die neue Datei", "invalidExtension": "\".{0}\" ist keine gültige Dateierweiterung.", "newFileName": "Neuer Name für die Datei" diff --git a/i18n/el.json b/i18n/el.json index 76d453b26..17bbb8e44 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -15,7 +15,7 @@ "boardConfigDialogTitle": "Επιλέξτε Άλλη Πλακέτα & Θύρα", "boardInfo": "Πληροφορίες Πλακέτας", "boards": "Πίνακες - Πλακέτες", - "configDialog1": "Επίλεξε και Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα σχέδιο.", + "configDialog1": "Επίλεξε Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα έργο.", "configDialog2": "Αν επιλέξεις μονο Πλακέτα θα μπορείς να κάνεις μόνο μεταγγλώτιση, αλλά οχι να ανεβάσεις το σχέδιο.", "couldNotFindPreviouslySelected": "Δεν έγινε εντοπισμός της προηγουμένως επιλεγμένης πλακέτας '{0}' στην εγκατεστημένη πλατφόρμα '{1}'. Παρακαλώ επίλεξε πάλι χειροκίνητα την πλακέτα που θέλεις να χρησιμοποιήσεις. Θέλεις να την επιλέξεις τώρα;", "editBoardsConfig": "Πλακέτα και θύρα...", @@ -32,7 +32,7 @@ "ports": "Θύρες", "programmer": "Προγραμματιστής", "reselectLater": "Επιλογή αργότερα", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "Χρησιμοποιήστε '{0}' που ανακαλύφθηκε στο '{1}'", "searchBoard": "Αναζήτηση πλακέτας", "selectBoard": "Επιλογή Πλακέτας", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", @@ -83,12 +83,12 @@ "updatingLibraries": "Ενημέρωση βιβλιοθηκών..." }, "cli-error-parser": { - "keyboardError": "Το \"πληκτρολόγιο\" δεν βρέθηκε. Το σχέδιό σας περιλαμβάνει τη γραμμή '#include <Keyboard.h>';", - "mouseError": "Το 'Ποντίκι' δεν βρέθηκε. Περιλαμβάνει το σχέδιό σας τη γραμμή '#include <Mouse.h>'; " + "keyboardError": "Το \"πληκτρολόγιο\" δεν βρέθηκε. Το έργο σας περιλαμβάνει τη γραμμή '#include <Keyboard.h>';", + "mouseError": "Το 'Ποντίκι' δεν βρέθηκε. Περιλαμβάνει το έργο σας τη γραμμή '#include <Mouse.h>'; " }, "cloud": { - "chooseSketchVisibility": "Επίλεξε την ορατότητα του Σχεδίου σου:", - "cloudSketchbook": "Σχέδια Cloud", + "chooseSketchVisibility": "Επιλέξτε την εμφάνιση του έργου σας:", + "cloudSketchbook": "Cloud Άλμπουμ έργων.", "connected": "Συνδέθηκε", "continue": "Συνέχεια", "donePulling": "Τελείωσε το κατέβασμα '{0}'.", @@ -109,8 +109,8 @@ "pullFirst": "Πρώτα πρέπει να τραβήξετε για να μπορέσετε να το ανεβάσετε στο Cloud.", "pullSketch": "Τραβήξτε το σχέδιο", "pullSketchMsg": "Αν τραβήξετε αυτό το Σχέδιο από το Cloud, θα αντικατασταθεί η τοπική του έκδοση. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", - "push": "Push", - "pushSketch": "Push Sketch", + "push": "Πιέστε", + "pushSketch": "Τραβήξτε το σχέδιο", "pushSketchMsg": "Αυτό είναι ένα Δημόσιο Σχέδιο. Βεβαιωθείτε ότι οποιεσδήποτε ευαίσθητες πληροφορίες έχουν οριστεί στο φάκελο arduino_secrets.h. Μπορείτε να κάνετε ένα Σχέδιο ιδιωτικό από τον πίνακα Κοινή χρήση.", "remote": "Απομακρυνσμένο", "share": "Κοινοποίηση...", @@ -126,16 +126,16 @@ "cloudSketch": { "alreadyExists": "Υπάρχει ήδη το σχέδιο '{0}' στο Cloud ", "creating": "Δημιουργία σχεδίου στο cloud '{0}'...", - "new": "Νέο σχέδιο Cloud ", - "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", - "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "new": "Νέο έργο στο Cloud", + "notFound": "Δεν ήταν δυνατή η ανάκτηση του έργου'{0}'. από το could. Δεν υπάρχει.", + "pulling": "Συγχρονισμός βιβλιοθήκη έργων, τραβώντας '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Μετονομασία σχεδίου cloud από '{0}' σε '{1}'...", + "renaming": "Μετονομασία έργου could από '{0}' σε '{1}'...", "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { "all": "Όλα", - "contributed": "Contributed", + "contributed": "Συνεισέφερε", "installManually": "Χειροκίνητη Εγκατάσταση", "later": "Αργότερα", "noBoardSelected": "Δεν έχει επιλεχθεί πλακέτα", @@ -143,16 +143,17 @@ "notConnected": "[μη συνδεμένο]", "offlineIndicator": "Φαίνεται πως είστε εκτός σύνδεσης. Χωρίς σύνδεση στο Internet, το Arduino CLI ίσως να μη μπορεί να κάνει λήψη των απαιτούμενων πόρων και να υπάρξει δυσλειτουργία. Παρακαλώ συνδεθείτε στο Internet και επανεκκινήστε την εφαρμογή.", "oldFormat": "Το '{0}' χρησιμοποιεί ακόμα το παλιό '.pde' στυλ. Θέλετε να αλλάξετε στην νέα κατάληξη '.ino';", - "partner": "Partner", + "partner": "Συνεργάτης", "processing": "Επεξεργασία", - "recommended": "Recommended", + "recommended": "Συνιστάται", "retired": "Παλιό ", "selectManually": "Επιλέξτε Χειροκίνητα", "selectedOn": "στο {0}", "serialMonitor": "Παρακολούθηση Σειριακής", "type": "Τύπος", "unknown": "Άγνωστο", - "updateable": "Με δυνατότητα ενημέρωσης" + "updateable": "Με δυνατότητα ενημέρωσης", + "userAbort": "Ακύρωση χρήστη" }, "compile": { "error": "Σφάλμα μεταγλώττισης: {0}" @@ -213,14 +214,13 @@ "debuggingNotSupported": "Δεν υποστιρίζεται αποσφαλμάτωση από '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Δεν έχει εγκατασταθεί πλατφόρμα για '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{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}' πρέπει να επαληθευτεί πριν από την έναρξη μιας διαδικασίας αποσφαλμάτωσης. Παρακαλώ επαληθεύστε το σκίτσο και ξεκινήστε ξανά την αποσφαλμάτωση. Θέλετε να επαληθεύσετε το έργο τώρα;" }, "developer": { "clearBoardList": "Clear the Board List History", "clearBoardsConfig": "Διαγράψτε την επιλογή πλακέτας και θύρας", - "dumpBoardList": "Dump the Board List" + "dumpBoardList": "Αδειάστε τη λίστα του Πίνακα" }, "dialog": { "dontAskAgain": "Μην με ξαναρωτήσεις" @@ -250,7 +250,7 @@ "failedInstall": "Η εγκατάσταση απέτυχε. Παρακαλώ προσπαθήστε ξανά.", "install": "Εγκατάσταση", "installingFirmware": "Εγκατάσταση λογισμικού.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "overwriteSketch": "Η εγκατάσταση θα αντικαταστήσει το σχέδιο στον πίνακα.", "selectBoard": "Επιλογή Πλακέτας", "selectVersion": "Επιλέξτε έκδοση λογισμικού", "successfullyInstalled": "Το λογισμικό εγκαταστάθηκε με επιτυχία.", @@ -263,7 +263,7 @@ "gettingStarted": "Ξεκινώντας", "keyword": "Πληκτρολογήστε μια λέξη-κλειδί", "privacyPolicy": "Πολιτική Απορρήτου", - "reference": "Reference", + "reference": "Αναφορά", "search": "Αναζήτηση στο Arduino.cc", "troubleshooting": "Αντιμετώπιση προβλημάτων", "visit": "Επίσκεψη Arduino.cc" @@ -277,17 +277,17 @@ "errorCheckingForUpdates": "Σφάλμα κατά τον έλεγχο για ενημερώσεις του Arduino IDE.\n{0}", "goToDownloadButton": "Μετάβαση στη λήψη", "goToDownloadPage": "Υπάρχει διαθέσιμη ενημέρωση για το Arduino IDE, αλλά δεν μπορούμε να το κατεβάσουμε και να το εγκαταστήσουμε αυτόματα. Μεταβείτε στη σελίδα λήψης και κατεβάστε την πιο πρόσφατη έκδοση από εκεί. ", - "ideUpdaterDialog": "Software Update", + "ideUpdaterDialog": "Ενημέρωση λογισμικού", "newVersionAvailable": "Μια νέα έκδοση του Arduino IDE ({0}) είναι διαθέσιμη για λήψη.", "noUpdatesAvailable": "Δεν υπάρχουν διαθέσιμες πρόσφατες ενημερώσεις για το Arduino IDE", "notNowButton": "Όχι τώρα", "skipVersionButton": "Παράλειψη έκδοσης", "updateAvailable": "Διαθέσιμη ενημέρωση", - "versionDownloaded": "Arduino IDE {0} has been downloaded." + "versionDownloaded": "Arduino IDE {0} έχει ληφθεί." }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "Αποτυχία εγκατάστασης βιβλιοθήκης: '{0}{1}'.", + "platformInstallFailed": "Αποτυχία εγκατάστασης πλατφόρμας: '{0}{1}'." }, "library": { "addZip": "Προσθέστε μια βιβλιοθήκη μορφής .ZIP", @@ -295,9 +295,9 @@ "contributedLibraries": "Συνεισφορά βιβλιοθηκών", "include": "Συμπεριλάβετε βιβλιοθήκη", "installAll": "Εγκατάσταση όλων", - "installLibraryDependencies": "Install library dependencies", - "installMissingDependencies": "Would you like to install all the missing dependencies?", - "installOneMissingDependency": "Would you like to install the missing dependency?", + "installLibraryDependencies": "Εγκαταστήστε τα στοιχεία της βιβλιοθήκης.", + "installMissingDependencies": "Θέλετε να εγκαταστήσετε όλα τα στοιχεία που λείπουν;", + "installOneMissingDependency": "Θέλετε να εγκαταστήσετε το στοιχείο που λείπει; ", "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Επιτυχής εγκατάσταση Βιβλιοθήκης {0} :{1} ", "libraryAlreadyExists": "Μια βιβλιοθήκη υπάρχει ήδη. Θέλετε να την αντικαταστήσετε;", @@ -319,7 +319,7 @@ "dataProcessing": "Επεξεργασία δεδομένων", "dataStorage": "Αποθήκευση δεδομένων", "deviceControl": "Έλεγχος συσκευής", - "display": "Display", + "display": "Εμφάνιση", "other": "Άλλα", "sensors": "Αισθητήρες", "signalInputOutput": "Είσοδος/Έξοδος Σήματος", @@ -368,7 +368,8 @@ "cloud.pull.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν τραβηχτεί ενα σχέδιο σύννεφου. Προεπιλογή ως αληθές.", "cloud.push.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν σπρωχθεί ενα σχέδιο σύννεφου. Προεπιλογή ως αληθές. ", "cloud.pushpublic.warn": "Αληθές αν οι χρήστες πρέπει προειδοποιηθούν πριν σπρωχθεί ενα δημόσιο σχέδιο σύννεφου. Προεπιλογή ως αληθές. ", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "Το σημείο που χρησιμοποιείται για την αποστολή και λήψη σκίτσων από ένα πίσω μέρος. Από προεπιλογή δείχνει στο Arduino Cloud API.", "compile": "μεταγλώττιση", "compile.experimental": "Σωστό αν το IDE πρέπει να χειρίζεται πολλαπλά σφάλματα μεταγλωττιστή. Λάθος από προεπιλογή", "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", @@ -390,7 +391,7 @@ "language.realTimeDiagnostics": "Εάν ισχύει, ο διακομιστής γλώσσας παρέχει διαγνωστικά σε πραγματικό χρόνο όταν πληκτρολογείτε στον επεξεργαστή. Είναι ψευδές από προεπιλογή.", "manualProxy": "Μη αυτόματη διαμόρφωση proxy διακομιστή μεσολάβησης", "monitor": { - "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + "dockPanel": "Η περιοχή του περιβλήματος της εφαρμογής όπου θα βρίσκεται το γραφικό στοιχείο _{0}_. Είναι είτε \"κάτω\" είτε \"δεξιά\". Προεπιλέγεται σε \"{1}\"." }, "network": "Δίκτυο", "newSketchbookLocation": "Επιλογή νέας τοποθεσίας σχεδίων", @@ -454,7 +455,7 @@ "invalidSketchName": "Το όνομα πρέπει να ξεκινά με γράμμα, αριθμό ή κάτω παύλα, ακολουθούμενα από γράμματα, αριθμούς, παύλες, τελείες και κάτω παύλες. Το μέγιστο μήκος είναι 63 χαρακτήρες.", "moving": "Μετακίνηση", "movingMsg": "Το αρχείο \"{0}\" πρέπει να βρίσκεται μέσα σε έναν φάκελο σχεδίου με το όνομα \"{1}\". \nΔημιουργία φακέλου, μεταφορά του αρχείου και συνέχεια;", - "new": "Νέο Σχέδιο ", + "new": "Νέο έργο", "noTrailingPeriod": "Ένα όνομα αρχείου δεν μπορεί να τελειώνει με τελεία", "openFolder": "Άνοιγμα φακέλου", "openRecent": "Άνοιγμα πρόσφατου", @@ -541,8 +542,8 @@ "expand": "Επαναφορά" }, "workspace": { - "deleteCloudSketch": "Το σχέδιο του cloud '{0}' θα διαγραφεί οριστικά από τους διακομιστές Arduino και τις τοπικές κρυφές μνήμες. Αυτή η ενέργεια είναι μη αναστρέψιμη. Θέλετε να διαγράψετε το τρέχον σχέδιο;", - "deleteCurrentSketch": "Το σχέδιο '{0}' θα διαγραφεί οριστικά. Αυτή η ενέργεια είναι μη αναστρέψιμη. Θέλετε να διαγράψετε το τρέχον σχέδιο; ", + "deleteCloudSketch": "Το έργο του cloud '{0}' θα διαγραφεί οριστικά από τους διακομιστές Arduino και τις τοπικές κρυφές μνήμες. Αυτή η ενέργεια είναι μη αναστρέψιμη. Θέλετε να διαγράψετε το τρέχον έργο;", + "deleteCurrentSketch": "Το έργο '{0}' θα διαγραφεί μόνιμα. Αυτή η ενέργεια είναι ανεπανόρθωτη. Θέλετε να διαγράψετε το τρέχον έργο;", "fileNewName": "Όνομα για το νεό αρχείο", "invalidExtension": ". {0}δεν είναι έγκυρη επέκταση", "newFileName": "Νέο όνομα για το αρχείο" diff --git a/i18n/es.json b/i18n/es.json index dd0802c4b..60dfe189f 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -152,7 +152,8 @@ "serialMonitor": "Monitor Serie", "type": "Tipo", "unknown": "Desconocido", - "updateable": "Actualizable" + "updateable": "Actualizable", + "userAbort": "User abort" }, "compile": { "error": "Error de compilación: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "La depuración no está soportada por '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "La plataforma no está instalada para '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "Optimizar para depuración", "sketchIsNotCompiled": "El sketch '{0}' debe ser verificado antes de iniciar una sesión de depuración. Por favor, verifique el sketch e inicia la depuración nuevamente. ¿Deseas verificar el sketch ahora?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Verdadero si se debe advertir a los usuarios antes de sacar un boceto de la nube. El valor predeterminado es verdadero.", "cloud.push.warn": "Verdadero si se debe advertir a los usuarios antes de enviar un boceto a la nube. El valor predeterminado es verdadero.", "cloud.pushpublic.warn": "Verdadero si se debe advertir a los usuarios antes de enviar un boceto público a la nube. El valor predeterminado es verdadero.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "El punto final utilizado para empujar y extraer bocetos de un backend. Por defecto, apunta a la API de Arduino Cloud.", "compile": "Compliar", "compile.experimental": "True si el IDE debe manejar multiples errores del compilador. False por defecto", diff --git a/i18n/eu.json b/i18n/eu.json index 5dfc9dbdd..3e9f0675f 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -152,7 +152,8 @@ "serialMonitor": "Serieko monitorea", "type": "Type", "unknown": "Ezezaguna", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Konpilazio-errorea: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Ez dauka arazketarako euskarririk: '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Plataforma ez dago instalatuta honentzat: '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Egia bada erabiltzaileek abisua jasoko dute programa bat hodeitik kargatu aurretik. Lehenetsia egia da.", "cloud.push.warn": "Egia bada erabiltzaileek abisua jasoko dute programa bat hodeian gorde aurretik. Lehenetsia egia da.", "cloud.pushpublic.warn": "Egia bada erabiltzaileek abisua jasoko dute programa publiko bat hodeian gorde aurretik. Lehenetsia egia da.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Zerbitzari batean programak gorde eta kargatzeko amaiera-puntua. Lehenetsia Arduino Cloud API da.", "compile": "konpilazioa", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/fa.json b/i18n/fa.json index fc6a651bd..3e3adf901 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -152,7 +152,8 @@ "serialMonitor": "نمایشگر ترمینال سریال", "type": "نوع", "unknown": "نامعلوم", - "updateable": "قابل به روز رسانی" + "updateable": "قابل به روز رسانی", + "userAbort": "User abort" }, "compile": { "error": "خطای کامپایل : {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "رفع خطا توسط {0} پشتیبانی نمی شود.", "getDebugInfo": "در حال دریافت اطلاعات اشکال زدایی...", "noPlatformInstalledFor": "دستگاه مورد نظر برای {0} نصب نشده است", - "noProgrammerSelectedFor": "برنامه‌نویسی برای \"{0}\" انتخاب نشده است.", "optimizeForDebugging": "بهینه کردن برای رفع خطا", "sketchIsNotCompiled": "طرح «{0}» باید قبل از شروع برای اشکال‌زدایی بازبینی شود. لطفاً طرح را بازبینی کنید و دوباره اشکال زدایی را شروع کنید. آیا می خواهید اکنون طرح را تأیید کنید؟" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "اگر هشدار دادن به کاربران قبل از کشیدن یک طرح ابری درست می باشد ، پیش فرض ها صحیح است.", "cloud.push.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح ابری درست است پیش فرض ها درست می باشد", "cloud.pushpublic.warn": "اگر هشدار دادن به کاربران قبل از ارسال یک طرح عمومی به فضای درست می باشد پیش فرض ها درست است.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "نقطه ای برای ارسال و دریافت طرح ها استفاده می شود . به طور پیش فرض به رابط ابر آردوینو استفاده می کند.", "compile": "کامپایل", "compile.experimental": "درست است اگر IDE باید چندین خطای کامپایلر را مدیریت کند. به طور پیش فرض نادرست است", diff --git a/i18n/fil.json b/i18n/fil.json index da9068f2c..8ebbcaac5 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -152,7 +152,8 @@ "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Hindi alam", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Ang debugging ay hindi suportado ng '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Ang platform ay hindi naka-install para sa '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/fr.json b/i18n/fr.json index 57504c257..090c4f643 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -152,7 +152,8 @@ "serialMonitor": "Moniteur série", "type": "Type", "unknown": "Inconnu", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Erreur de compilation : {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Le débogage n'est pas supporté pour '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "La plateforme n'est pas installée pour '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Vrai si les utilisateurs devrait être averti avant de pull un croquis sur le cloud. Par défaut, la valeur est vrai.", "cloud.push.warn": "Vrai, si les utilisateurs devrait être averti avant de push un croquis sur le cloud. Par défaut, la valeur est vrai.", "cloud.pushpublic.warn": "Vrai si les utilisateurs devrait être avertit avant de publier un croquis public sur le cloud. Vrai par défaut.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "L'endpoint est utilisé pour pousser et tirer des croquis à partir du backend. Par défault, il pointe vers l'Arduino Cloud API.", "compile": "compiler", "compile.experimental": "Vrai si l'IDE doit gérer les multiples erreurs du compilateur. Faux par défaut", diff --git a/i18n/he.json b/i18n/he.json index 4c22dcd56..3f3cbb3bb 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -152,7 +152,8 @@ "serialMonitor": "מוניטור סיריאלי", "type": "סוג", "unknown": "לא ידוע", - "updateable": "ניתן לעדכון" + "updateable": "ניתן לעדכון", + "userAbort": "User abort" }, "compile": { "error": "שגיאת קומפילציה: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "דיבאג לא נתמך על ידי '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "פלטפורמה אינה מותקנת עבור ׳{0}׳", - "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "קומפילציה", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/hu.json b/i18n/hu.json index bb7544c26..93e7180e3 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -152,7 +152,8 @@ "serialMonitor": "Soros monitor", "type": "Type", "unknown": "ismeretlen", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Összeállítási hiba: {0} " @@ -213,7 +214,6 @@ "debuggingNotSupported": "A hibakeresést a '{0}' nem támogatja ", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "A platform nincs telepítve a következőhöz: „{0}” ", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Kipipálva: figyelmeztetés megjelenítése a vázlat/sketch felhőből letöltése előtt. Alapértelmezés szerint: kipipálva.", "cloud.push.warn": "Kipipálva: figyelmeztetés megjelenítése a vázlat/sketch felhőből való letöltése előtt. Alapértelmezés: kipipálva. ", "cloud.pushpublic.warn": "Kipipálva: figyelmeztetés megjelenítése a nyilvános vázlat/sketch felhőbe küldése előtt. Alapértelmezés szerint: kipipálva.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "A végpont/endpoint a vázlatok/sketch-ek háttéből történő letöltésére illetve publikálására szolgál. Alapértelmezés szerint az Arduino Cloud API-ra mutat. ", "compile": "fordítás", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/hy.json b/i18n/hy.json new file mode 100644 index 000000000..22babc740 --- /dev/null +++ b/i18n/hy.json @@ -0,0 +1,552 @@ +{ + "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?", + "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}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No ports discovered", + "nonSerialPort": "Non-serial port, can't obtain info.", + "openBoardsConfig": "Select other board and port…", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "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.", + "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", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" + }, + "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, + "bootloader": { + "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", + "doneBurningBootloader": "Done burning bootloader." + }, + "burnBootloader": { + "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 <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "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", + "noSketchOpened": "No sketch opened", + "notConnected": "[not connected]", + "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", + "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", + "processing": "Processing", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", + "selectedOn": "on {0}", + "serialMonitor": "Serial Monitor", + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "Filter your search...", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", + "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "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}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, + "dialog": { + "dontAskAgain": "Don't ask again" + }, + "editor": { + "autoFormat": "Auto Format", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Next Error", + "previousError": "Previous Error", + "revealError": "Reveal Error" + }, + "examples": { + "builtInExamples": "Built-in examples", + "couldNotInitializeExamples": "Could not initialize built-in examples.", + "customLibrary": "Examples from Custom Libraries", + "for": "Examples for {0}", + "forAny": "Examples for any board", + "menu": "Examples" + }, + "firmware": { + "checkUpdates": "Check Updates", + "failedInstall": "Installation failed. Please try again.", + "install": "Install", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "Select Board", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "Add .ZIP Library...", + "arduinoLibraries": "Arduino libraries", + "contributedLibraries": "Contributed libraries", + "include": "Include Library", + "installAll": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "compile", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "Compiler warnings", + "editorFontSize": "Editor font size", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "Invalid sketchbook location: {0}", + "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", + "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "Network", + "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "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.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "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": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Cancel", + "enterField": "Enter {0}", + "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "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/id.json b/i18n/id.json index 5a06a4516..7ff8cae03 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -76,8 +76,8 @@ "checkForUpdates": { "checkForUpdates": "Periksa Pembaruan Arduino", "installAll": "Pasang Semua", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", + "noUpdates": "Tidak ada pembaruan terbaru yang tersedia.", + "promptUpdateBoards": "Pembaruan tersedia untuk beberapa papan Anda.", "promptUpdateLibraries": "Updates are available for some of your libraries.", "updatingBoards": "Updating boards...", "updatingLibraries": "Updating libraries..." @@ -152,7 +152,8 @@ "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Unknown", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debugging is not supported by '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "noProgrammerSelectedFor": "No programmer selected 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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/it.json b/i18n/it.json index 8c618632b..35400398d 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -152,7 +152,8 @@ "serialMonitor": "Monitor seriale", "type": "Tipo", "unknown": "Sconosciuto", - "updateable": "Aggiornabile" + "updateable": "Aggiornabile", + "userAbort": "Interruzione da parte dell'utente" }, "compile": { "error": "Errore di compilazione: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Il debug non è supportato da '{0}'", "getDebugInfo": "Acquisizione delle informazioni di debug in corso...", "noPlatformInstalledFor": "La piattaforma non è ancora stata installata per '{0}'", - "noProgrammerSelectedFor": "Nessun programmatore selezionato per '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Imposta su true se gli utenti devono essere avvisato dopo avere effettuato il pull dello sketch sul cloud. Il valore predefinito è true.", "cloud.push.warn": "Imposta su True se gli utenti devono essere avvisati prima di eseguire l'invio di uno sketch cloud. Il valore predefinito è true.", "cloud.pushpublic.warn": "Imposta su true se gli utenti devono essere avvisati prima di eseguire l'invio di uno sketch pubblico nel cloud. Il valore predefinito è true.", + "cloud.sharedSpaceId": "L'ID dello spazio condiviso di Arduino Cloud da cui caricare lo sketchbook. Se vuoto, viene selezionato lo spazio privato.", "cloud.sketchSyncEndpoint": "La destinazione utilizzata per inviare e richiedere gli schizzi da un back-end. L'impostazione predefinita utilizza Arduino Cloud API.", "compile": "compilazione", "compile.experimental": "Imposta su true se l'IDE deve gestire errori multipli del compilatore. Il valore predefinito è false.", @@ -454,7 +455,7 @@ "invalidSketchName": "Il nome deve iniziare con una lettera, un numero o un trattino basso, seguito da lettere, numeri, trattini, punti e trattini bassi. La lunghezza massima è di 63 caratteri.", "moving": "Spostando", "movingMsg": "Il file \"{0}\" deve essere all'interno della cartella \"{1}\".\nCreare questa cartella, spostare il file e continuare?", - "new": "Nuovo Sketch", + "new": "Nuovo sketch", "noTrailingPeriod": "Il nome di un file non può terminare con un punto", "openFolder": "Apri Cartella", "openRecent": "Apri recenti", diff --git a/i18n/ja.json b/i18n/ja.json index cefc471f8..4e36e6b46 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -152,7 +152,8 @@ "serialMonitor": "シリアルモニタ", "type": "タイプ", "unknown": "不明", - "updateable": "アップデート可能" + "updateable": "アップデート可能", + "userAbort": "User abort" }, "compile": { "error": "コンパイルエラー: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "デバッグは'{0}'ではサポートされていません。", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}'用にプラットフォームがインストールされていません。", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "デバッグに最適化", "sketchIsNotCompiled": "デバッグセッションを開始する前に、スケッチ'{0}'を検証する必要があります。スケッチを検証してから、もう一度デバッグを開始してください。今すぐスケッチを検証しますか?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "クラウドスケッチをプルする前に、ユーザーに警告を表示するにはtrueを指定。デフォルトではtrue。", "cloud.push.warn": "クラウドスケッチをプッシュする前に、ユーザーに警告を表示するにはtrueを指定。デフォルトではtrue。", "cloud.pushpublic.warn": "パブリックスケッチをクラウドにプッシュする前に、ユーザーに警告を表示するにはtrueを指定。デフォルトではtrue。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "バックエンドからスケッチをプッシュ/プルするために使用されるエンドポイント。デフォルトではArduino Cloud APIを指します。", "compile": "コンパイル", "compile.experimental": "IDEが複数のコンパイラエラーを処理するよう設定するにはtrueを指定します。デフォルトは falseです。", diff --git a/i18n/ko.json b/i18n/ko.json index 3d2c1db2c..ddeae53a9 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -152,7 +152,8 @@ "serialMonitor": "시리얼 모니터", "type": "Type", "unknown": "알 수 없음", - "updateable": "업데이트 가능함" + "updateable": "업데이트 가능함", + "userAbort": "User abort" }, "compile": { "error": "컴파일 오류: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debugging is not supported by '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}'에 대한 플랫폼이 설치되어 있지 않습니다", - "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "클라우드 스케치를 pulling 전에 사용자에게 경고해야 하는 경우 True입니다. 기본값은 true입니다.", "cloud.push.warn": "클라우드 스케치를 pushing 전에 사용자에게 경고해야 하는 경우 True입니다. 기본값은 true입니다.", "cloud.pushpublic.warn": "공개 스케치를 클라우드로 pushing 전에 사용자에게 경고해야 하는 경우 True입니다.기본값은 true입니다.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "컴파일", "compile.experimental": "IDE가 여러 컴파일러 오류를 처리해야 하는 경우 True입니다.기본적으로 False입니다.", diff --git a/i18n/my_MM.json b/i18n/my_MM.json index f6dd4b7c4..626fdad02 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -152,7 +152,8 @@ "serialMonitor": "အတန်းလိုက်ဆက်သွယ်မှုမော်နီတာ", "type": "အမျိုးအစား", "unknown": "မသိ", - "updateable": "အပ်ဒိတ်တင်၍ရသော" + "updateable": "အပ်ဒိတ်တင်၍ရသော", + "userAbort": "User abort" }, "compile": { "error": "ကုတ်ပေါင်းခြင်းဆိုင်ရာအမှား- {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "ကုတ်ပြစ်ချက်ရှာဖွေမှုကို '{0}'မှ မပေးထားပါ", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}' အတွက် ပလက်ဖောင်းကို မထည့်သွင်းရသေးပါ", - "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "ကလောက်ကုတ်ဖိုင်လ်ကို စက်ထဲ့သို့ မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", "cloud.push.warn": "ကလောက်ကုတ်ဖိုင်လ်သို့ ကုတ်ဖိုင်လ် မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", "cloud.pushpublic.warn": "ကလောက်သို့ အများသုံးကုတ်ဖိုင်လ် မသွင်းခင် သတိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "နောက်ကွယ်လုပ်ဆောင်မှုစနစ်မှ ကုတ်ဖိုင်လ် ရယူခြင်း သို့ ပေးပို့ခြင်းလုပ်ရန် အသုံးပြုသော အဆုံးမှတ်။ မူရင်းတန်းဖိုး - အာဒီနိုကလောက်အေပီအိုင်သို့ ညွှန်ပြနေသည်။", "compile": "စက်ဘာသာပြန်", "compile.experimental": "ကုတ်ပေါင်းမှုဆိုင်ရာပြဿနာများအား အိုင်ဒီအီးမှ ကိုင်တွယ်မည်။ မူရင်းတန်ဖိုး - အမှား", diff --git a/i18n/ne.json b/i18n/ne.json index 607772940..f5617ebb7 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -152,7 +152,8 @@ "serialMonitor": "सिरियल मनिटर", "type": "प्रकार", "unknown": "थाहा नभएको", - "updateable": "अपडेट गर्न मिल्ने" + "updateable": "अपडेट गर्न मिल्ने", + "userAbort": "User abort" }, "compile": { "error": "संकलन त्रुटि: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "डिबगिङ '{0}' द्वारा समर्थित छैन", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "'{0}' को लागि प्लेटफर्म स्थापना गरिएको छैन", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "डिबगिङका लागि अप्टिमाइज गर्नुहोस्", "sketchIsNotCompiled": "डिबग अवधि सुरु गर्नु अघि स्केच {0} पुष्टि गरिनुपर्छ। कृपया स्केच पुष्टि गर्नुहोस् र फेरि डिबगिङ सुरु गर्नुहोस्। के तपाई अहिले स्केच पुष्टि गर्न चाहनुहुन्छ?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "क्लाउड स्केच पुल गर्नु अघि प्रयोगकर्ताहरूलाई चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", "cloud.push.warn": "क्लाउड स्केच पुश गर्नु अघि प्रयोगकर्ताहरूलाई चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", "cloud.pushpublic.warn": "यदि प्रयोगकर्ताहरूलाई क्लाउडमा सार्वजनिक स्केच पुश गर्नु अघि चेतावनी दिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा सही हुन्छ।", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "ब्याकइन्डबाट स्केचहरू पुश गर्न र पुल गर्न अन्तिम बिन्दु प्रयोग गरियो। पूर्वनिर्धारित रूपमा यसले Arduino क्लाउड API लाई संकेत गर्दछ।", "compile": "कम्पाइल ", "compile.experimental": "यदि IDE ले धेरै कम्पाइलर त्रुटिहरू ह्यान्डल गर्नुपर्छ भने सक्षम गर्नुहोस्। यो पूर्वनिर्धारित सेटिङमा असक्षम छ।", diff --git a/i18n/nl.json b/i18n/nl.json index b6d55b419..9b3aba52f 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -152,7 +152,8 @@ "serialMonitor": "Seriële Monitor", "type": "Type", "unknown": "Onbekend", - "updateable": "Bijwerkbaar" + "updateable": "Bijwerkbaar", + "userAbort": "User abort" }, "compile": { "error": "Compilatiefout: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Foutopsporing wordt niet ondersteund door '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is niet geïnstalleerd voor '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "Optimaliseren voor foutopsporing", "sketchIsNotCompiled": "Schets '{0}' moet geverifieerd worden voordat de foutopsporing kan beginnen. Verifieer aub de schets opnieuw en herstart foutopsporing. Wil je de schets nu opnieuw verifiëren?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Waar als de gebruiker verwittigd moet worden voordat een Cloud schets opgehaald wordt. Standaard ingesteld op waar. ", "cloud.push.warn": "Waar als de gebruiker verwittigd moet worden voordat een Cloud schets opgeladen wordt. Standaard ingesteld op waar. ", "cloud.pushpublic.warn": "Waar als de gebruiker verwittigd moet worden voordat een publieke Cloud schets opgeladen wordt. Standaard ingesteld op waar. ", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Het eindpunt dat gebruikt wordt voor het opladen of ophalen van schetsen van een backend. Standaard verwijst het naar Arduino Cloud API.", "compile": "compileren", "compile.experimental": "Waar als de IDE meerdere compileer fouten moet afhandelen. Standaard is het Onwaar", diff --git a/i18n/no.json b/i18n/no.json new file mode 100644 index 000000000..fa6f0f253 --- /dev/null +++ b/i18n/no.json @@ -0,0 +1,552 @@ +{ + "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": "Kort{0}", + "boardConfigDialogTitle": "Velg et annet kort og port", + "boardInfo": "Informasjon om kort", + "boards": "Kort", + "configDialog1": "Velg kort og portnummer for å laste opp skissen", + "configDialog2": "Hvis du bare velger kort vil du være i stand til å kompilere, men ikke laste opp skissen", + "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", + "editBoardsConfig": "Rediger kort og port", + "getBoardInfo": "Få info om kort", + "inSketchbook": " (in Sketchbook)", + "installNow": "\"{0}{1}\"kjernen må installeres for kortet \"{2}\" som er valgt. Vil du installere det nå?", + "noBoardsFound": "Intet kort funnet for \"{0}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "Ingen porter oppdaget", + "nonSerialPort": "Ikke-seriell port. Kan ikke innhentete info.", + "openBoardsConfig": "Velg et annet kort og port...", + "pleasePickBoard": "Velg et kort som er koblet til porten du har valgt.", + "port": "Port {0}", + "ports": "porter", + "programmer": "Programmer", + "reselectLater": "Velg igjen senere", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Søk etter kort", + "selectBoard": "Velg kort", + "selectPortForInfo": "Velg en port for å få info om kort", + "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Vis alle porter", + "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Ukjent kort" + }, + "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, + "bootloader": { + "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", + "doneBurningBootloader": "Done burning bootloader." + }, + "burnBootloader": { + "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 <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "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", + "noSketchOpened": "No sketch opened", + "notConnected": "[not connected]", + "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", + "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", + "processing": "Processing", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", + "selectedOn": "on {0}", + "serialMonitor": "Serial Monitor", + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "Filter your search...", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", + "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "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}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, + "dialog": { + "dontAskAgain": "Don't ask again" + }, + "editor": { + "autoFormat": "Auto Format", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Next Error", + "previousError": "Previous Error", + "revealError": "Reveal Error" + }, + "examples": { + "builtInExamples": "Built-in examples", + "couldNotInitializeExamples": "Could not initialize built-in examples.", + "customLibrary": "Examples from Custom Libraries", + "for": "Examples for {0}", + "forAny": "Examples for any board", + "menu": "Examples" + }, + "firmware": { + "checkUpdates": "Check Updates", + "failedInstall": "Installation failed. Please try again.", + "install": "Install", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "Velg kort", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "Add .ZIP Library...", + "arduinoLibraries": "Arduino libraries", + "contributedLibraries": "Contributed libraries", + "include": "Include Library", + "installAll": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "compile", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "Compiler warnings", + "editorFontSize": "Editor font size", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "Invalid sketchbook location: {0}", + "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", + "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "Network", + "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "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.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "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": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Cancel", + "enterField": "Enter {0}", + "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "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/pl.json b/i18n/pl.json index c65a146ce..1b19d20e5 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -7,7 +7,7 @@ "account": { "goToCloudEditor": "Go to Cloud Editor", "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToProfile": "Przejdź do profilu", "menuTitle": "Arduino Cloud" }, "board": { @@ -18,7 +18,7 @@ "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ć?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Edytuj płytkę i 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?", @@ -41,8 +41,8 @@ "succesfullyInstalledPlatform": "Pomyślnie zainstalowano platformę {0}:{1}", "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}", "typeOfPorts": "{0} Porty", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" + "unconfirmedBoard": "Niepotwierdzona płytka", + "unknownBoard": "Nieznana płytka" }, "boardsManager": "Menedżer Płytek", "boardsType": { @@ -115,7 +115,7 @@ "remote": "Zdalny", "share": "Udostępnij...", "shareSketch": "Udostępnij Szkic", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Pokaż/ukryj szkicownik w chmurze", "signIn": "ZALOGUJ SIĘ", "signInToCloud": "Zaloguj się do Arduino Cloud", "signOut": "Wyloguj się", @@ -131,15 +131,15 @@ "pulling": "Synchronizing sketchbook, pulling '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "synchronizingSketchbook": "Synchronizacja szkicownika ..." }, "common": { - "all": "Wszytko", + "all": "Wszystko", "contributed": "Przyczynił się", "installManually": "Zainstaluj ręcznie", "later": "Później", "noBoardSelected": "Nie wybrano płytki", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Nie otworzono żadnego szkicu", "notConnected": "[nie podłączone]", "offlineIndicator": "Wygląda na to, że jesteś w trybie offline. Bez połączenia z Internetem Arduino CLI może nie być w stanie pobrać wymaganych zasobów i może spowodować awarię. Połącz się z Internetem i uruchom ponownie aplikację.", "oldFormat": "'{0}' nadal używa starego formatu `.pde`. Czy chcesz się przełączyć na nowe rozszerzenie `.ino`?", @@ -147,12 +147,13 @@ "processing": "Przetwarzanie", "recommended": "Zalecane", "retired": "Odosobniony", - "selectManually": "Select Manually", + "selectManually": "Wybór ręczny", "selectedOn": "na {0}", "serialMonitor": "Monitor portu szeregowego", "type": "Typ", "unknown": "Nieznany", - "updateable": "Możliwość aktualizacji" + "updateable": "Możliwość aktualizacji", + "userAbort": "Anulowanie przez użytkownika" }, "compile": { "error": "Błąd kompilacji: {0}" @@ -160,19 +161,19 @@ "component": { "boardsIncluded": "Płytka dołączona w pakiecie:", "by": "przez", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "Kliknij, aby otworzyć w przeglądarce: {0}", "filterSearch": "Filtruj przeszukiwanie....", "install": "Zainstaluj", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "Zainstaluj najnowszą", + "installVersion": "Zainstaluj{0}", + "installed": "{0}Zainstalowano", "moreInfo": "Więcej informacji", - "otherVersions": "Other Versions", + "otherVersions": "Pozostałe wersje", "remove": "Usuń", - "title": "{0} by {1}", + "title": "{0}do{1}", "uninstall": "Odinstaluj", "uninstallMsg": "Czy chcesz odinstalować {0}?", - "update": "Update" + "update": "Aktualizacja" }, "configuration": { "cli": { @@ -213,13 +214,12 @@ "debuggingNotSupported": "Debugowanie nie jest wspierane przez '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma nie jest zainstalowana dla '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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", + "clearBoardsConfig": "Wyczyść wybraną płytę i port", "dumpBoardList": "Dump the Board List" }, "dialog": { @@ -254,7 +254,7 @@ "selectBoard": "Wybierz płytkę", "selectVersion": "Wybierz wersję firmware'u", "successfullyInstalled": "Firmware zainstalowany prawidłowo.", - "updater": "Firmware Updater" + "updater": "Aktualizacja firmware" }, "help": { "environment": "Środowisko", @@ -287,7 +287,7 @@ }, "installable": { "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "platformInstallFailed": "Nie udało się zainstalować platformy:'{0}{1}'." }, "library": { "addZip": "Dodaj bibliotekę .ZIP...", @@ -295,10 +295,10 @@ "contributedLibraries": "Przesłane biblioteki", "include": "Dołącz bibliotekę", "installAll": "Zainstaluj wszystko", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "Zainstaluj zależności bibliotek", "installMissingDependencies": "Czy chcesz zainstalować wszystkie brakujące zależności?", "installOneMissingDependency": "Czy chcesz zainstalować brakującą zależność?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Zainstaluj bez zależności", "installedSuccessfully": "Pomyślnie zainstalowano bibliotekę {0}:{1}", "libraryAlreadyExists": "Biblioteka już istnieje. Czy chcesz ją nadpisać?", "manageLibraries": "Zarządzaj bibliotekami...", @@ -346,7 +346,7 @@ "unableToConnectToWebSocket": "Nie można połączyć się z gniazdem sieciowym" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Nazwa nowego szkicu w chmurze" }, "portProtocol": { "network": "Sieć", @@ -368,6 +368,7 @@ "cloud.pull.warn": "Prawdziwy, jeśli użytkownicy powinni zostać ostrzeżeni przed wyciągnięciem szkicu z chmury. Wartość domyślna to prawdziwy.", "cloud.push.warn": "Prawdziwy, jeśli użytkownicy powinni zostać ostrzeżeni przed wysłaniem szkicu do chmury. Wartość domyślna to prawdziwy.", "cloud.pushpublic.warn": "Prawdziwy, jeśli użytkownicy powinni zostać ostrzeżeni przed przesłaniem szkicu publicznego do chmury. Wartość domyślna to prawdziwy.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Punkt końcowy używany do wypychania i wyciągania szkiców z zaplecza. Domyślnie wskazuje na Arduino Cloud API.", "compile": "kompilacja", "compile.experimental": "Prawdziwy, jeśli IDE powinno obsługiwać wiele błędów kompilatora. Nieprawdziwy domyślnie", @@ -385,7 +386,7 @@ "invalid.editorFontSize": "Nieprawidłowy rozmiar czcionki edytora. Musi to być dodatnia liczba całkowita.", "invalid.sketchbook.location": "Błędna lokalizacja szkicownika: {0}", "invalid.theme": "Nieprawidłowy schemat.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.asyncWorkers": "Liczba procesów roboczych asynchronicznych używanych przez serwer językowy Arduino (clangd). Indeks tła również wykorzystuje tę liczbę pracowników. Minimalna wartość to 0, a maksymalna to 8. Gdy wynosi 0, serwer językowy wykorzystuje wszystkie dostępne rdzenie. Wartość domyślna to 0.", "language.log": "Prawda, jeśli Arduino Language Server ma generować pliki z logami do folderu ze sketchem. W przeciwnym wypadku fałsz. Fałsz jest wartością domyślną.", "language.realTimeDiagnostics": "Jeśli prawdziwy, serwer języka zapewnia diagnostykę w czasie rzeczywistym podczas pisania w edytorze. Domyślnie jest nieprawdziwy.", "manualProxy": "Konfiguracja ręczna proxy", @@ -394,7 +395,7 @@ }, "network": "Sieć", "newSketchbookLocation": "Wybierz nową lokalizację szkicownika", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "Nie można załadować konfiguracji CLI", "noProxy": "Bez proxy", "proxySettings": { "hostname": "Nazwa Hosta", @@ -404,7 +405,7 @@ }, "showVerbose": "Pokazuj informacje zwrotne podczas:", "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": "Bezwzględna ścieżka systemu plików do domyślnego pliku planu `.ino`. Jeśli określono, zawartość pliku planu będzie używana dla każdego nowego szkicu utworzonego przez IDE. Jeśli nie określono inaczej, szkice zostaną wygenerowane z domyślną zawartością Arduino. Niedostępne pliki planów są ignorowane. **Wymagane jest ponowne uruchomienie IDE**, aby to ustawienie zaczęło obowiązywać." }, "sketchbook.location": "Lokalizacja szkicownika", "sketchbook.showAllFiles": "Prawda, aby wyświetlać wszystkie pliki ze szkicu. Fałsz jest wartością domyślną.", diff --git a/i18n/pt.json b/i18n/pt.json index d835f28ee..fdc604356 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -18,7 +18,7 @@ "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?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Editar Placa e Porta...", "getBoardInfo": "Obter Informações da Placa", "inSketchbook": "(no Sketchbook)", "installNow": "O núcleo \"{0} {1}\" deve ser instalado para a placa \"{2}\" atualmente selecionada. Quer instalar agora?", @@ -32,7 +32,7 @@ "ports": "portas", "programmer": "Programador/Gravador", "reselectLater": "Selecionar novamente mais tarde", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "Uso '{0}' descoberto em '{1}'", "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", @@ -41,7 +41,7 @@ "succesfullyInstalledPlatform": "Plataforma instalada com sucesso {0}: {1}", "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}", "typeOfPorts": "{0} portas", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "Placa não confirmada", "unknownBoard": "Placa desconhecida" }, "boardsManager": "Gerenciador de Placas", @@ -139,7 +139,7 @@ "installManually": "Instalar Manualmente", "later": "Depois", "noBoardSelected": "Nenhuma placa selecionada.", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Nenhum sketch aberto", "notConnected": "[não está conectado]", "offlineIndicator": "Parece que você está offline. Sem conexão com a Internet, o Arduino CLI não será capaz de baixar os recursos exigidos e poderá provovar mau funcionamento. Por favor, conecte-se à Internet e reinicie o aplicativo.", "oldFormat": "O '{0}' ainda utiliza o formato antigo `.pde`. Deseja mudar para a nova extensão `.ino`?", @@ -147,12 +147,13 @@ "processing": "Em processamento", "recommended": "Recomendado", "retired": "Afastado", - "selectManually": "Select Manually", + "selectManually": "Selecionar Manualmente", "selectedOn": "em {0}", "serialMonitor": "Monitor Serial", "type": "Tipo", "unknown": "Desconhecido", - "updateable": "Atualizável" + "updateable": "Atualizável", + "userAbort": "Abortado pelo usuário" }, "compile": { "error": "Erro de compilação: {0}" @@ -211,16 +212,15 @@ "debug": { "debugWithMessage": "Depuração - {0}", "debuggingNotSupported": "A depuração não é suportada por '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Obtendo informações de depuração...", "noPlatformInstalledFor": "A plataforma não está instalada para '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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" + "clearBoardList": "Limpar Histórico de Lista de Placas", + "clearBoardsConfig": "Limpar Seleção de Placa e Porta", + "dumpBoardList": "Despejo da Lista de Placas" }, "dialog": { "dontAskAgain": "Não perguntar novamente" @@ -254,7 +254,7 @@ "selectBoard": "Selecionar Placa", "selectVersion": "Selecione a versão do firmware", "successfullyInstalled": "Firmware instalado com sucesso. ", - "updater": "Firmware Updater" + "updater": "Atualizador de Firmware" }, "help": { "environment": "Ambiente", @@ -368,6 +368,7 @@ "cloud.pull.warn": "Verdadeiro se os usuários devem ser avisados antes de baixar um esboço da nuvem. O padrão é verdadeiro.", "cloud.push.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um esboço para a nuvem. O padrão é verdadeiro.", "cloud.pushpublic.warn": "Verdadeiro se os usuários devem ser avisados antes de enviar um esboço público para a nuvem. O padrão é verdadeiro.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "O endpoint usado para enviar e baixar os esboços de um backend. Por padrão, ele aponta para a API da Nuvem Arduino.", "compile": "compilar", "compile.experimental": "Verdadeiro se o IDE deve trabalhar com múltiplos erros de compilação. Falso por padrão", @@ -385,7 +386,7 @@ "invalid.editorFontSize": "Tamanho da fonte do editor inválido. Deve ser um número inteiro positivo.", "invalid.sketchbook.location": "Localização inválida para o caderno de esboços: {0}", "invalid.theme": "Tema inválido", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.asyncWorkers": "Número de trabalhadores assíncronos usados ​​pelo Arduino Language Server (clangd). O índice de segundo plano também usa esse número de trabalhadores. O valor mínimo é 0 e o máximo é 8. Quando for 0, o servidor de idioma usa todos os núcleos disponíveis. O valor padrão é 0.", "language.log": "Verdadeiro se o Arduino Language Server deverá gerar arquivos de log na pasta do esboço. Caso contrário, falso. O padrão é falso.", "language.realTimeDiagnostics": "Se marcado, diagnósticos em tempo-real serão exibidos enquanto digita no editor. Fica desmarcado por padrão.", "manualProxy": "Configurações manuais de proxy", @@ -465,12 +466,12 @@ "saveSketchAs": "Salvar o diretório de esboços como...", "showFolder": "Mostrar o diretório de Esboços...", "sketch": "Esboço", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "O sketch já possui um arquivo nomeado '{0}'", + "sketchAlreadyContainsThisFileMessage": "Falha ao salvar sketch \"{0}\" como \"{1}\". {2}", "sketchbook": "Caderno de Esboços", "titleLocalSketchbook": "Caderno de Esboços local", "titleSketchbook": "Caderno de Esboços", - "upload": "Carregar", + "upload": "Enviar usando Programador", "uploadUsingProgrammer": "Enviar Usando Programador", "uploading": "Enviando...", "userFieldsNotFoundError": "Não é possível encontrar dados de usuário para placa conectada", diff --git a/i18n/ro.json b/i18n/ro.json index 6c98e2e4b..a5a37a99a 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -152,7 +152,8 @@ "serialMonitor": "Monitor Serial", "type": "Type", "unknown": "Necunoscut", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Depanarea nu este suportată de '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platforma nu este instalată pentru '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compila", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/ru.json b/i18n/ru.json index 1afe35611..046070f98 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -1,52 +1,52 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Версия: {0}\nДата: {1}{2}\nВерсия CLI: {3}{4} [{5}]\n\n{6}", "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": { "board": "Плата{0}", - "boardConfigDialogTitle": "Select Other Board and Port", + "boardConfigDialogTitle": "Выберите другую плату и порт", "boardInfo": "Информация о плате", - "boards": "boards", + "boards": "платы", "configDialog1": "Выберите плату и порт, если Вы хотите загрузить скетч в плату.", "configDialog2": "Если вы выбираете только плату, вы сможете компилировать, но не загружать свой скетч.", "couldNotFindPreviouslySelected": "Не удалось найти ранее выбранную плату '{0}' в установленной платформе '{1}'.Пожалуйста, выберите плату которую хотите использовать вручную повторно. Вы хотите повторно выбрать её сейчас?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Редактирование платы и порта...", "getBoardInfo": "Получить информацию о подключенной плате", "inSketchbook": " (в альбоме).", "installNow": "Необходимо установить ядро «{0} {1}» для выбранной в данный момент «{2}» платы. Вы хотите установить его сейчас?", - "noBoardsFound": "No boards found for \"{0}\"", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "nonSerialPort": "Non-serial port, can't obtain info.", + "noBoardsFound": "Для \"{0}\" не найдено ни одной платы.", + "noNativeSerialPort": "Родной последовательный порт, не удается получить информацию.", + "noPortsDiscovered": "Порты не обнаружены", + "nonSerialPort": "Порт не последовательный, не удается получить информацию.", "openBoardsConfig": "Выберите другую плату и порт...", "pleasePickBoard": "Пожалуйста, выберите плату, подключенную к выбранному вами порту.", "port": "Порт{0}", - "ports": "ports", + "ports": "порты", "programmer": "Программатор", "reselectLater": "Перевыбрать позже", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", - "searchBoard": "Search board", + "revertBoardsConfig": "Используйте '{0}', обнаруженный на '{1}'", + "searchBoard": "Поиск платы", "selectBoard": "Выбор платы", "selectPortForInfo": "Пожалуйста, выберите порт в меню инструментов для получения информации с платы.", "showAllAvailablePorts": "Показать все доступные порты при включении", - "showAllPorts": "Show all ports", + "showAllPorts": "Показать все порты", "succesfullyInstalledPlatform": "Платформа установлена успешно {0}:{1}", "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}", - "typeOfPorts": "{0} ports", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" + "typeOfPorts": "{0}порты", + "unconfirmedBoard": "Неподтвержденная плата", + "unknownBoard": "Неизвестная плата" }, "boardsManager": "Менеджер плат", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Сертифицированный Arduino" }, "bootloader": { "burnBootloader": "Записать Загрузчик", @@ -74,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": "Проверьте наличие обновлений Arduino", + "installAll": "Установить все", + "noUpdates": "Последние обновления отсутствуют.", + "promptUpdateBoards": "Для некоторых плат доступны обновления.", + "promptUpdateLibraries": "Для некоторых библиотек доступны обновления.", + "updatingBoards": "Обновление плат...", + "updatingLibraries": "Обновление библиотек..." }, "cli-error-parser": { "keyboardError": "'Keyboard' не найдено. В вашем скетче есть строка '#include <Keyboard.h>'?", @@ -91,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": "Не удается отправить в облако. Он еще не вытащен.", @@ -115,7 +115,7 @@ "remote": "Удаленный", "share": "Поделиться...", "shareSketch": "Поделиться скетчем", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Показать/скрыть облачный скетчбук", "signIn": "Войти", "signInToCloud": "Войдите в Arduino Cloud", "signOut": "Выйти", @@ -124,85 +124,86 @@ "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": "Плата не выбрана", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Скетч не открыт", "notConnected": "[не подключено].", "offlineIndicator": "Похоже, у Вас нет подключения к Интернету. Без подключения к Интернету Arduino CLI не сможет загрузить необходимые ресурсы и упадет. Подключитесь к Интернету и перезапустите приложение.", "oldFormat": "'{0}' использует старый формат `.pde`. Хотите сконвертировать в новый формат `.ino`?", - "partner": "Partner", + "partner": "Партнер", "processing": "Обработка", - "recommended": "Recommended", - "retired": "Retired", - "selectManually": "Select Manually", + "recommended": "Рекомендовано", + "retired": "В отставке", + "selectManually": "Выберите вручную", "selectedOn": "вкл. {0}", "serialMonitor": "Монитор порта", - "type": "Type", + "type": "Тип", "unknown": "Неизвестно", - "updateable": "Updatable" + "updateable": "Обновляемый", + "userAbort": "Прерывание пользователем" }, "compile": { "error": "Ошибка компиляции: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Платы, входящие в этот комплект:", "by": "от", - "clickToOpen": "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": "Не выбрана плата. Пожалуйста, выберите вашу плату Arduino в меню Инструменты > Плата." }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "Передача скетчей в облако", "daemon": { "restart": "Перезапустить Daemon", "start": "Запустить Daemon", @@ -211,16 +212,15 @@ "debug": { "debugWithMessage": "Отладка - {0}", "debuggingNotSupported": "Отладка не поддерживается '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Получение отладочной информации...", "noPlatformInstalledFor": "Платформа не установлена для '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{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}' должен быть проверен перед началом сеанса отладки. Пожалуйста, проверьте скетч и начните отладку снова. Хотите ли вы проверить скетч сейчас?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "Очистите историю списка форумов", + "clearBoardsConfig": "Очистить выбор платы и порта", + "dumpBoardList": "Выбросить список плат управления" }, "dialog": { "dontAskAgain": "Больше не спрашивать" @@ -235,7 +235,7 @@ "increaseIndent": "Увеличить отступ", "nextError": "Следущая ошибка", "previousError": "Предыдущая ошибка", - "revealError": "Reveal Error" + "revealError": "Ошибка раскрытия" }, "examples": { "builtInExamples": "Встроенные Примеры", @@ -254,7 +254,7 @@ "selectBoard": "Выбор платы", "selectVersion": "Выберите версию прошивки", "successfullyInstalled": "Прошивка успешно установлена.", - "updater": "Firmware Updater" + "updater": "Программа обновления прошивки" }, "help": { "environment": "Окружение", @@ -269,7 +269,7 @@ "visit": "Перейти на сайт Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Проверка обновлений среды Arduino IDE", "closeAndInstallButton": "Закрыть и установить", "closeToInstallNotice": "Закройте программное обеспечение и установите обновление на вашем компьютере.", "downloadButton": "Скачать", @@ -286,19 +286,19 @@ "versionDownloaded": "Arduino IDE {0} был загружен." }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "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": "Управление библиотеками...", @@ -312,22 +312,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": "Расширенные", @@ -335,22 +335,22 @@ "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": "Не удалось закрыть веб-сокет.", "unableToConnectToWebSocket": "Не удается подключиться к веб-сокету." }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Имя нового облачного скетча" }, "portProtocol": { "network": "Сеть", - "serial": "Serial" + "serial": "Серийный" }, "preferences": { "additionalManagerURLs": "Дополнительные ссылки для Менеджера плат", @@ -361,13 +361,14 @@ "automatic": "Автоматика", "board.certificates": "Список сертификатов, которые могут быть загружены в платы", "browse": "Обзор", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Получение уведомлений о доступных обновлениях для IDE, плат и библиотек. Требуется перезапуск IDE после внесения изменений. По умолчанию установлено значение true.", "choose": "Выбрать", "cli.daemonDebug": "Включить отладочное логирование вызовов gRPC в Arduino CLI. Чтобы эта настройка вступила в силу, необходим перезапуск IDE. По умолчанию оно выключено.", "cloud.enabled": "True, если функции синхронизации скетчей включены. По умолчанию - true.", "cloud.pull.warn": "True, если пользователи должны быть предупреждены перед созданием облачного скетча. По умолчанию установлено значение true.", "cloud.push.warn": "True, если пользователи должны быть предупреждены перед запуском облачного эскиза. По умолчанию установлено значение true.", - "cloud.pushpublic.warn": "True, если пользователи должны быть предупреждены перед отправкой общедоступного эскиза в облако. По умолчанию установлено значение true.", + "cloud.pushpublic.warn": "True, если пользователи должны быть предупреждены перед отправкой общедоступного скетча в облако. По умолчанию установлено значение true.", + "cloud.sharedSpaceId": "Идентификатор общего пространства Arduino Cloud для загрузки скетчбука. Если он пуст, будет выбрано ваше личное пространство.", "cloud.sketchSyncEndpoint": "Конечная точка, используемая для отправки и извлечения скетчей из серверной части. По умолчанию он указывает на Arduino Cloud API.", "compile": "компиляции", "compile.experimental": "Включите, если IDE должна обрабатывать множественные ошибки компилятора. По умолчанию выключено", @@ -385,26 +386,26 @@ "invalid.editorFontSize": "Неверный размер шрифта редактора. Это должно быть положительное целое число.", "invalid.sketchbook.location": "Неправильный путь к альбому со скетчами: {0}", "invalid.theme": "Неверная тема.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.asyncWorkers": "Количество асинхронных рабочих, используемых Arduino языковым сервером (clangd). Фоновый индекс также использует это количество рабочих. Минимальное значение - 0, максимальное - 8. Когда значение равно 0, языковой сервер использует все доступные ядра. По умолчанию значение равно 0.", "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}\"." + "dockPanel": "Область оболочки приложения, в которой будет располагаться виджет _{0}_. Это либо \"внизу\", либо \"справа\". По умолчанию принимает значение \"{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`. Если указан, содержимое файла blueprint будет использоваться для каждого нового скетча, создаваемого IDE. Если не указано, то скетчи будут создаваться с содержимым по умолчанию для Arduino. Недоступные файлы чертежей будут игнорироваться. **Для того чтобы эта настройка вступила в силу, необходимо перезапустить IDE**." }, "sketchbook.location": "Путь к альбому со скетчами", "sketchbook.showAllFiles": "True - показывать все файлы внутри скетча. По умолчанию - false.", @@ -415,19 +416,19 @@ "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": "CR Возврат каретки", - "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": "Нет конца строки", @@ -440,22 +441,22 @@ "archiveSketch": "Архивировать скетч", "cantOpen": "Папка \"{0}\" уже существует. Невозможно открыть скетч.", "compile": "Компиляция скетча...", - "configureAndUpload": "Configure and Upload", + "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": "Открыть скетч в новом окне", @@ -465,8 +466,8 @@ "saveSketchAs": "Сохранить папку скетча как...", "showFolder": "Показать папку скетча", "sketch": "Скетч", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "В скетче уже есть файл с именем '{0}'", + "sketchAlreadyContainsThisFileMessage": "Не удалось сохранить скетч \"{0}\" как \"{1}\". {2}", "sketchbook": "Альбом", "titleLocalSketchbook": "Локальный альбом", "titleSketchbook": "Альбом", @@ -478,8 +479,8 @@ "verifyOrCompile": "Проверить/Скомпилировать" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Новый облачный скетч", + "newSketch": "Новый скетч" }, "survey": { "answerSurvey": "Ответить на опрос", @@ -487,36 +488,36 @@ "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": "Dark High Contrast", - "hcLight": "Light 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?", + "abortFixMessage": "Эскиз все еще недействителен. Хотите устранить оставшиеся проблемы? Если нажать кнопку '{0}', откроется новый эскиз.", + "abortFixTitle": "Неверный скетч", + "renameSketchFileMessage": "Файл скетча '{0}' не может быть использован.{1} Вы хотите переименовать файл скетча сейчас?", + "renameSketchFileTitle": "Недопустимое имя файла скетча", + "renameSketchFolderMessage": "Скетч '{0}' не может быть использован. {1} Чтобы избавиться от этого сообщения, переименуйте скетч. Хотите ли вы переименовать скетч сейчас?", "renameSketchFolderTitle": "Неверное название скетча" }, "workspace": { @@ -541,8 +542,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}' будет навсегда удален с серверов Arduino и из локальных кэшей. Это действие необратимо. Вы хотите удалить текущий скетч?", + "deleteCurrentSketch": "Скетч '{0}' будет удален навсегда. Это действие необратимо. Вы хотите удалить текущий эскиз?", "fileNewName": "Имя нового файла", "invalidExtension": "Файлы с расширением \".{0}\" не поддерживаются.", "newFileName": "Новое имя файла" diff --git a/i18n/si.json b/i18n/si.json new file mode 100644 index 000000000..1c6490617 --- /dev/null +++ b/i18n/si.json @@ -0,0 +1,552 @@ +{ + "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": "පැතිකඩට යන්න", + "menuTitle": "Arduino Cloud" + }, + "board": { + "board": "Board{0}", + "boardConfigDialogTitle": "Select Other Board and Port", + "boardInfo": "Board Info", + "boards": "පුවරු", + "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", + "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", + "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", + "editBoardsConfig": "Edit Board and Port...", + "getBoardInfo": "පුවරුවේ තොරතුරු ලබාගන්න", + "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}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No ports discovered", + "nonSerialPort": "Non-serial port, can't obtain info.", + "openBoardsConfig": "Select other board and port…", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "Port{0}", + "ports": "ports", + "programmer": "ක්‍රමලේඛක", + "reselectLater": "පසුව තෝරන්න", + "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", + "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" + }, + "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, + "bootloader": { + "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", + "doneBurningBootloader": "Done burning bootloader." + }, + "burnBootloader": { + "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": "ඒ.ස.නි. ලියන්න", + "noSupportedBoardConnected": "No supported board connected", + "openContext": "Open context", + "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": "සහතික උඩුගත වෙමින්." + }, + "checkForUpdates": { + "checkForUpdates": "Check for Arduino Updates", + "installAll": "සියල්ල ස්ථාපනය", + "noUpdates": "There are no recent updates available.", + "promptUpdateBoards": "Updates are available for some of your boards.", + "promptUpdateLibraries": "Updates are available for some of your libraries.", + "updatingBoards": "Updating boards...", + "updatingLibraries": "Updating libraries..." + }, + "cli-error-parser": { + "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "සම්බන්ධයි", + "continue": "ඉදිරියට", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "කාවැද්දූ:", + "emptySketchbook": "Your Sketchbook is empty", + "goToCloud": "මේඝයට යන්න", + "learnMore": "තව දැනගන්න", + "link": "සබැඳිය:", + "notYetPulled": "Cannot push to Cloud. It is not yet pulled.", + "offline": "Offline", + "openInCloudEditor": "Open in Cloud Editor", + "options": "විකල්ප...", + "privateVisibility": "Private. Only you can view the Sketch.", + "profilePicture": "පැතිකඩ රූපය", + "publicVisibility": "Public. Anyone with the link can view the Sketch.", + "pull": "Pull", + "pullFirst": "You have to pull first to be able to push to the Cloud.", + "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": "දුරස්ථ", + "share": "බෙදාගන්න...", + "shareSketch": "Share Sketch", + "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "signIn": "පිවිසෙන්න", + "signInToCloud": "Sign in to Arduino Cloud", + "signOut": "නික්මෙන්න", + "sync": "සමමුහූර්තය", + "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", + "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." + }, + "cloudSketch": { + "alreadyExists": "Cloud sketch '{0}' already exists.", + "creating": "Creating cloud sketch '{0}'...", + "new": "New Cloud Sketch", + "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", + "pulling": "Synchronizing sketchbook, pulling '{0}'...", + "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", + "synchronizingSketchbook": "Synchronizing sketchbook..." + }, + "common": { + "all": "සියල්ල", + "contributed": "Contributed", + "installManually": "අතින් ස්ථාපනය", + "later": "පසුව", + "noBoardSelected": "පුවරුවක් තෝරා නැත", + "noSketchOpened": "No sketch opened", + "notConnected": "[සම්බන්ධ වී නැත]", + "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", + "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", + "processing": "සැකසෙමින්", + "recommended": "නිර්දේශිත", + "retired": "Retired", + "selectManually": "අතින් තෝරන්න", + "selectedOn": "on {0}", + "serialMonitor": "Serial Monitor", + "type": "වර්ගය", + "unknown": "නොදන්නා", + "updateable": "Updatable", + "userAbort": "User abort" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "Filter your search...", + "install": "ස්ථාපනය", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", + "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "ඉවත් කරන්න", + "title": "{0} by {1}", + "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": "සියල්ල", + "default": "Default", + "more": "More", + "none": "None" + } + }, + "coreContribution": { + "copyError": "Copy error messages", + "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + }, + "createCloudCopy": "Push Sketch to Cloud", + "daemon": { + "restart": "Restart Daemon", + "start": "Start Daemon", + "stop": "Stop Daemon" + }, + "debug": { + "debugWithMessage": "Debug - {0}", + "debuggingNotSupported": "Debugging is not supported by '{0}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, + "dialog": { + "dontAskAgain": "Don't ask again" + }, + "editor": { + "autoFormat": "Auto Format", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Next Error", + "previousError": "Previous Error", + "revealError": "Reveal Error" + }, + "examples": { + "builtInExamples": "Built-in examples", + "couldNotInitializeExamples": "Could not initialize built-in examples.", + "customLibrary": "Examples from Custom Libraries", + "for": "Examples for {0}", + "forAny": "Examples for any board", + "menu": "Examples" + }, + "firmware": { + "checkUpdates": "Check Updates", + "failedInstall": "Installation failed. Please try again.", + "install": "ස්ථාපනය", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "පුවරුව තෝරන්න", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "Add .ZIP Library...", + "arduinoLibraries": "Arduino libraries", + "contributedLibraries": "Contributed libraries", + "include": "Include Library", + "installAll": "සියල්ල ස්ථාපනය", + "installLibraryDependencies": "Install library dependencies", + "installMissingDependencies": "Would you like to install all the missing dependencies?", + "installOneMissingDependency": "Would you like to install the missing dependency?", + "installWithoutDependencies": "Install without dependencies", + "installedSuccessfully": "Successfully installed library {0}:{1}", + "libraryAlreadyExists": "A library already exists. Do you want to overwrite it?", + "manageLibraries": "Manage Libraries...", + "namedLibraryAlreadyExists": "A library folder named {0} already exists. Do you want to overwrite it?", + "needsMultipleDependencies": "The library <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "compile", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "Compiler warnings", + "editorFontSize": "Editor font size", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "Invalid sketchbook location: {0}", + "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", + "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "Network", + "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "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.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "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": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Cancel", + "enterField": "Enter {0}", + "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "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/sr.json b/i18n/sr.json index 566978788..fa4bc38bb 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -152,7 +152,8 @@ "serialMonitor": "Монитор серијског порта", "type": "Type", "unknown": "Непознато", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Грешка приликом превођења: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "'{0}' не подржава отклањање грешака", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Платформа није инсталирана за '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "преведи", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/th.json b/i18n/th.json index 9d3297d79..8d3247c8c 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -152,7 +152,8 @@ "serialMonitor": "Serial Monitor", "type": "Type", "unknown": "Unknown", - "updateable": "Updatable" + "updateable": "Updatable", + "userAbort": "User abort" }, "compile": { "error": "Compilation error: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debugging is not supported by '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "noProgrammerSelectedFor": "No programmer selected 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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", "compile": "compile", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", diff --git a/i18n/tr.json b/i18n/tr.json index 389e85989..52fce53da 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -152,7 +152,8 @@ "serialMonitor": "Seri Port Ekranı", "type": "Tür", "unknown": "Bilinmeyen", - "updateable": "Güncellenebilir" + "updateable": "Güncellenebilir", + "userAbort": "Kullanıcı iptali" }, "compile": { "error": "Derleme hatası: {0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "Debug '{0}' tarafından desteklenmiyor", "getDebugInfo": "Hata ayıklama bilgisi alınıyor...", "noPlatformInstalledFor": "'{0}' için platform kurulmadı", - "noProgrammerSelectedFor": "'{0}' için programlayıcı seçilmedi", "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?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "Kullanıcılar bir bulut eskizini çekmeden önce uyarılacaksa açın. Varsayılan: Açık.", "cloud.push.warn": "Kullanıcılar bir bulut eskizini göndermeden önce uyarılacaksa açın. Varsayılan: Açık.", "cloud.pushpublic.warn": "Kullanıcılar buluta herkese açık bir eskiz yüklemeden önce uyarılacaksa açın. Varsayılan: Açık.", + "cloud.sharedSpaceId": "Eskiz defterinin yükleneceği paylaşılan Arduino Cloud alanı ID'si. Boş bırakılırsa özel alanınız seçilir.", "cloud.sketchSyncEndpoint": "Ana yapıdan eskizler çekmek veya göndermek için son nokta kullanılır. Varsayılan: Arduino Cloud API.", "compile": "derle", "compile.experimental": "IDE'nin birden fazla derleme hatasını kontrol etmesini istiyorsanız açın. Varsayılan olarak kapalı.", diff --git a/i18n/uk.json b/i18n/uk.json index a3f9e0a00..8aec50d7e 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -139,7 +139,7 @@ "installManually": "Встановити вручну", "later": "Пізніше", "noBoardSelected": "Не обрана плата", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Нема відкритих скетчів", "notConnected": "[не підключено]", "offlineIndicator": "Здається, ви відключені від мережі. Без підключення до Інтернету Arduino CLI не може завантажити необхідні ресурси. Підключіться до Інтернету та перезапустіть програму.", "oldFormat": "'{0}' досі використовує старий формат `.pde`. Бажаєте перейти на нове розширення `.ino` ?", @@ -147,12 +147,13 @@ "processing": "Обробляється", "recommended": "Рекомендовано", "retired": "Застаріло", - "selectManually": "Select Manually", + "selectManually": "Оберіть вручну", "selectedOn": "на {0}", "serialMonitor": "Монітор порту", "type": "Тіп", "unknown": "Невідомо", - "updateable": "Можливість оновлення" + "updateable": "Можливість оновлення", + "userAbort": "Переривання користувача" }, "compile": { "error": "Помилка компілятора: {0}" @@ -211,9 +212,8 @@ "debug": { "debugWithMessage": "Налагодження - {0}", "debuggingNotSupported": "Налагодження не підтримується з '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Отримання інформації про налагодження...", "noPlatformInstalledFor": "Не встановлення платформа для '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "optimizeForDebugging": "Оптимізація для налагодження", "sketchIsNotCompiled": "Скетч'{0}' повинен бути перевірений до початку налагодження. Будь ласка, перевірте скетч та запустіть налагодження знову. Бажаєте перевірити скетч зараз?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "\"Так\", якщо треба попередження перед отриманням хмарного скетчу. \"Так\" за замовчуванням. ", "cloud.push.warn": "\"Так\", якщо треба попередження перед надсиланням хмарного скетчу. \"Так\" за замовчуванням.", "cloud.pushpublic.warn": "\"Так\", якщо треба попередження перед надсиланням публічного скетча в хмару. \"Так\" за замовчуванням.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Призначення для надсилання та отримання скетчів з серверної частини. За замовчуванням вказує на API хмари Arduino.", "compile": "компіляція", "compile.experimental": "\"Так\", якщо IDE може отримати декілька помилок компілятора. \"Ні\" за замовчуванням", @@ -385,7 +386,7 @@ "invalid.editorFontSize": "Хибний розмір шрифта редактора. Значення повинно бути цілим числом.", "invalid.sketchbook.location": "Хибний шлях до книги скетчів: {0}", "invalid.theme": "Недійсна тема.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.asyncWorkers": "Кількість асинхронних процесів, які використовуються мовним сервером Arduino (clangd). Фоновий індекс також використовує цю кількість процесів. Мінімальне значення дорівнює 0, а максимальне – 8. Коли воно дорівнює 0, мовний сервер використовує всі доступні ядра. Значення за замовчуванням — 0.", "language.log": "\"Так\", якщо треба генерувати log-файли журналу в папці скетча. В іншому випадку \"Ні\". За замовчуванням це \"Ні\". ", "language.realTimeDiagnostics": "Якщо \"Так\", перевірка синтаксису відбувається в режимі реального часу. Під час введення тексту в редакторі. Знчення замовчуванням - \"Ні\".", "manualProxy": "Налаштування проксі вручну", @@ -442,7 +443,7 @@ "compile": "Компіляція скетча...", "configureAndUpload": "Налаштувати та завантажити", "createdArchive": "Створення архіву '{0}'.", - "doneCompiling": "Компіляцію завершено", + "doneCompiling": "Компіляцію завершено.", "doneUploading": "Завантаження завершено.", "editInvalidSketchFolderLocationQuestion": "Бажаєте спробувати зберегти скетч в іншому місці?", "editInvalidSketchFolderQuestion": "Бажаєте спробувати зберегти скетч під іншою назвою?", @@ -465,8 +466,8 @@ "saveSketchAs": "Зберігти папку скетча як...", "showFolder": "Показати папку скетча", "sketch": "Скетч", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "Скетч вже містить файл з назвою '{0}'", + "sketchAlreadyContainsThisFileMessage": "Помилка при збереженні скетча \"{0}\" як \"{1}\". {2}", "sketchbook": "Книга скетчів", "titleLocalSketchbook": "Локальна книга скетчів", "titleSketchbook": "Книга скетчів", diff --git a/i18n/vi.json b/i18n/vi.json index 97c7bb16f..e650cc5bb 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -18,7 +18,7 @@ "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?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Thiết lập Bảng và Cổng...", "getBoardInfo": "Lấy thông tin bo mạch", "inSketchbook": "(trong Sketchbook)", "installNow": "Nhân \"{0} {1}\" phải được cài đặt cho bo mạch \"{2}\" đang được chọn. Bạn có muốn cài đặt ngay?", @@ -40,7 +40,7 @@ "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", + "typeOfPorts": "{0}Cổng", "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Bảng không xác định" }, @@ -74,7 +74,7 @@ "uploadingCertificates": "Đang nạp các chứng chỉ." }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", + "checkForUpdates": "Kiểm tra bản cập nhật", "installAll": "Cài đặt tất cả", "noUpdates": "There are no recent updates available.", "promptUpdateBoards": "Updates are available for some of your boards.", @@ -83,16 +83,16 @@ "updatingLibraries": "Đang cập nhật thư viện..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "Không tìm thấy 'Keyboard'. Dự án của bạn có khai báo '<Keyboard.h>' chưa?", + "mouseError": "Không tìm thấy 'Mouse'. Dự án của bạn có khai báo '<Mouse.h> chưa?" }, "cloud": { "chooseSketchVisibility": "Chọn khả năng hiển thị của Sketch của bạn:", "cloudSketchbook": "Cloud Sketchbook", "connected": "Đã kết nối", "continue": "Tiếp tục", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "Pulling thành công{0}", + "donePushing": "Pushing thành công{0}", "embed": "Nhúng: ", "emptySketchbook": "Sketchbook của bạn đang trống", "goToCloud": "Chuyển đến đám mây", @@ -139,7 +139,7 @@ "installManually": "Cài thủ công", "later": "Để sau", "noBoardSelected": "Không có bo mạch được chọn", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Không có dự án nào được mở", "notConnected": "[Chưa được kết nối]", "offlineIndicator": "Bạn dường như đang ngoại tuyến. Không có kết nối mạng, Arduino CLI có thể sẽ không thể tải về những tài nguyên cần thiết và có thể sẽ gây ra sự cố. Hãy kết nối Internet và khởi động lại ứng dụng.", "oldFormat": "'{0}' vẫn đang sử dụng đuôi '.pde' cũ. Bạn có muốn chuyển sang đuôi '.ino' mới hơn không?", @@ -152,7 +152,8 @@ "serialMonitor": "Serial Monitor", "type": "Kiểu", "unknown": "Không xác định", - "updateable": "Có thể cập nhật" + "updateable": "Có thể cập nhật", + "userAbort": "User abort" }, "compile": { "error": "Lỗi biên dịch: {0}" @@ -160,12 +161,12 @@ "component": { "boardsIncluded": "Boards included in this package:", "by": "bởi", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "Nhấn để mở trên trình duyệt:{0}", "filterSearch": "Lọc kết quả tìm kiếm của bạn...", "install": "Cài đặt", "installLatest": "Cài đặt mới nhất", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installVersion": "Cài đặt{0}", + "installed": "{0}Đã cài đặt", "moreInfo": "Thêm thông tin", "otherVersions": "Các phiên bản khác", "remove": "Loại bỏ", @@ -193,16 +194,16 @@ "core": { "compilerWarnings": { "all": "Tất cả", - "default": "Default", + "default": "Mặc định", "more": "More", "none": "None" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Sao chép lỗi", + "noBoardSelected": "Không có board được chọn. Hãy vào Tools > Board để chọn board Arduino." }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "Đẩy dự án lên Cloud", "daemon": { "restart": "Restart Daemon", "start": "Start Daemon", @@ -213,7 +214,6 @@ "debuggingNotSupported": "Sửa lỗi không hỗ trợ bởi '{0}'", "getDebugInfo": "Getting debug info...", "noPlatformInstalledFor": "Nền tảng chưa được cài đặt cho '{0}'", - "noProgrammerSelectedFor": "No programmer selected for '{0}'", "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?" }, @@ -254,7 +254,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": "Firmware Updater" + "updater": "Cập nhật Frmware" }, "help": { "environment": "Môi trường", @@ -269,7 +269,7 @@ "visit": "Truy cập Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "Kiểm tra bản cập nhật phần mềm", "closeAndInstallButton": "Đóng và cài đặt", "closeToInstallNotice": "Đóng ứng dụng và cài đặt bản cập nhật mới nhất lên máy bạn.", "downloadButton": "Tải về", @@ -286,7 +286,7 @@ "versionDownloaded": "Arduino IDE {0} đã được tải về." }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "libraryInstallFailed": "Cài thư viện {0}{1} không thành công", "platformInstallFailed": "Failed to install platform: '{0}{1}'." }, "library": { @@ -315,29 +315,29 @@ "topic": "Topic" }, "libraryTopic": { - "communication": "Communication", + "communication": "Giao tiếp", "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", + "dataStorage": "Lưu trữ dữ liệu", + "deviceControl": "Điều khiển thiết bị", + "display": "Hiển thị", + "other": "Khác", + "sensors": "Cảm biến", + "signalInputOutput": "Tín hiệu vào/ra", "timing": "Timing", - "uncategorized": "Uncategorized" + "uncategorized": "Chưa được phân loại." }, "libraryType": { - "installed": "Installed" + "installed": "Đã cài đặt" }, "menu": { - "advanced": "Advanced", + "advanced": "Nâng cao", "sketch": "Sketch", "tools": "Công cụ" }, "monitor": { "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedError": "Không thể kết nối tới cổng {0}{1}.", "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", @@ -368,6 +368,7 @@ "cloud.pull.warn": "'True' nếu người dùng muốn được cảnh báo trước khi tải xuống một cloud sketch. Mặc định là 'true'.", "cloud.push.warn": "'True' nếu người dùng muốn được cảnh báo trước khi đẩy lên lên một cloud sketch. Mặc định là 'true'.", "cloud.pushpublic.warn": "'True' nếu người dùng muốn được cảnh báo trước khi đẩy lên lên một sketch công khai lên đám mây. Mặc định là 'true'.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "Đầu cuối đùng dể đẩy lên và tải xuống sketch từ backend. Mặc định chỉ đến Arduino Cloud API.", "compile": "biên dịch", "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", @@ -398,9 +399,9 @@ "noProxy": "Không có proxy", "proxySettings": { "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "password": "Mật khẩu", + "port": "Số cổng", + "username": "Tài khoản" }, "showVerbose": "Hiển thị đầu ra chi tiết trong khi", "sketch": { @@ -419,7 +420,7 @@ } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Tên mới cho dự án Cloud" }, "replaceMsg": "Thay thế phiên bản hiện tại của {0}?", "selectZip": "Chọn một tệp zip chứa thư viện mà bạn muốn cài", @@ -449,24 +450,24 @@ "exportBinary": "Xuất tệp nhị phân đã biên dịch", "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", - "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", - "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchFolderLocationMessage": "Vị trí thư mục dự án {0} không hợp lệ", + "invalidSketchFolderNameMessage": "Tên thư mục dự án {0} không hợp lệ", "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Chuyển", "movingMsg": "Tệp \"{0}\" cần phải được chứa trong thư mục sketch tên \"{1}\".\nTạo thư mục này, chuyển tệp tin vào đó, và tiếp tục?", "new": "Bản phác thảo mới", - "noTrailingPeriod": "A filename cannot end with a dot", + "noTrailingPeriod": "Tên file không thể kết túc bằng dấu chấm", "openFolder": "Mở thư mục", "openRecent": "Mở gần đây", "openSketchInNewWindow": "Mở sketch trong cửa sổ mới", "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Lưu thư mục sketch như là...", - "saveSketch": "Save your sketch to open it again later.", + "saveSketch": "Lưu dự án của bạn để mở vào lần sau.", "saveSketchAs": "Lưu thư mục sketch như là...", "showFolder": "Hiện thư mục sketch", "sketch": "Sketch", "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileMessage": "Lưu dự án \"{0}\" thành \"{1}\" không thành công.{2}", "sketchbook": "Sketchbook", "titleLocalSketchbook": "Sketchbook cục bộ", "titleSketchbook": "Sketchbook", @@ -489,11 +490,11 @@ "theme": { "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", "dark": "Tối", - "deprecated": "{0} (deprecated)", + "deprecated": "{0}(Không được dùng nữa)", "hc": "Độ tương phản tối cao", "hcLight": "Độ tương phản cao nhẹ", "light": "Sáng", - "user": "{0} (user)" + "user": "{0}(người dùng)" }, "title": { "cloud": "Đám mây" @@ -520,7 +521,7 @@ "renameSketchFolderTitle": "Tên bản phác thảo không hợp lệ" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}'đã tồn tại." } }, "theia": { diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index 65836a9e6..a6d3ce1c7 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -152,7 +152,8 @@ "serialMonitor": "序列埠監控窗", "type": "類型", "unknown": "未知", - "updateable": "可更新" + "updateable": "可更新", + "userAbort": "User abort" }, "compile": { "error": "編譯錯誤:{0} " @@ -213,7 +214,6 @@ "debuggingNotSupported": "'{0}' 不支援除錯功能。", "getDebugInfo": "取得除錯資訊...", "noPlatformInstalledFor": "平台未安裝給'{0}'", - "noProgrammerSelectedFor": "未選取給 '{0}' 用的燒錄器", "optimizeForDebugging": "除錯最佳化", "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "讀取雲端 sketch 前會警告使用者。預設: 開啟。", "cloud.push.warn": "推送雲端 sketch 前會警告使用者。預設: 開啟。", "cloud.pushpublic.warn": "推送公開的 sketch 到雲端前會警告使用者。預設: 開啟。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", "compile": "編譯", "compile.experimental": "IDE 處理多個編譯器錯誤。 預設: 關閉", diff --git a/i18n/zh.json b/i18n/zh.json index 48c60dad5..d06007f7b 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -152,7 +152,8 @@ "serialMonitor": "串口监视器", "type": "类型", "unknown": "未知", - "updateable": "可更新" + "updateable": "可更新", + "userAbort": "用户终止" }, "compile": { "error": "编译错误:{0}" @@ -213,7 +214,6 @@ "debuggingNotSupported": "‘{0}’ 不支持调试", "getDebugInfo": "正在获取调试信息。。。", "noPlatformInstalledFor": "‘{0}’ 平台未安装", - "noProgrammerSelectedFor": "未为 '{0}' 项目选择任何编程器。", "optimizeForDebugging": "调试优化", "sketchIsNotCompiled": "项目 '{0}' 在开始调试会话之前必须经过验证。请验证草图并重新开始调试。你现在要验证草图吗?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "True 则在拉取 cloud 项目之前警告用户。默认为 True。", "cloud.push.warn": "True 则在推送 cloud 项目之前警告用户。默认为 True。", "cloud.pushpublic.warn": "True 则将公开项目推送到 cloud 中之前警告用户。默认为 True。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "用于从后台推送项目的端点。默认情况下,它指向 Arduino Cloud API。", "compile": "编译", "compile.experimental": "True 则 IDE 处理多个编译器错误。默认为 False。", diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 3b304e2a2..268b010cb 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -152,7 +152,8 @@ "serialMonitor": "序列埠監控窗", "type": "類型", "unknown": "未知", - "updateable": "可更新" + "updateable": "可更新", + "userAbort": "用戶中止" }, "compile": { "error": "編譯錯誤:{0} " @@ -186,7 +187,7 @@ "addFile": "加入檔案", "fileAdded": "一個檔案加入 Sketch", "plotter": { - "couldNotOpen": "無法開啟繪圖儀。" + "couldNotOpen": "無法開啟序列埠繪圖" }, "replaceTitle": "取代" }, @@ -213,7 +214,6 @@ "debuggingNotSupported": "'{0}'不支援除錯。", "getDebugInfo": "取得除錯資訊...", "noPlatformInstalledFor": "平台未安裝給'{0}'", - "noProgrammerSelectedFor": "未選取給 '{0}' 用的燒錄器", "optimizeForDebugging": "除錯最佳化", "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" }, @@ -368,6 +368,7 @@ "cloud.pull.warn": "讀取雲端 sketch 前會警告使用者。預設: 開啟。", "cloud.push.warn": "推送雲端 sketch 前會警告使用者。預設: 開啟。", "cloud.pushpublic.warn": "推送公開的 sketch 到雲端前會警告使用者。預設: 開啟。", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", "compile": "編譯", "compile.experimental": "IDE 處理多個編譯器錯誤。 預設: 關閉", @@ -432,7 +433,7 @@ "newLineCarriageReturn": "NL和CR字元", "noLineEndings": "沒有斷行字元", "notConnected": "未連上。請選擇開發板及連接埠後自動連接", - "openSerialPlotter": "開啟序列繪圖家", + "openSerialPlotter": "序列埠繪圖", "timestamp": "時間戳記", "toggleTimestamp": "切換時戳" }, From 77136687d374dce1660191059427f1941f4cef16 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:30:58 +0200 Subject: [PATCH 323/384] Use `macos-latest` runner for macOS ARM build (#2513) --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb94fbe05..865c0562e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -113,10 +113,9 @@ env: name: macOS_X86-64_dmg - path: '*macOS_64bit.zip' name: macOS_X86-64_zip - PAID_RUNNER_BUILD_DATA: | - config: name: macOS ARM - runs-on: macos-latest-xlarge + runs-on: macos-latest container: | null certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 From 91bb75ca9771634cae653ffd3406dce748e5d6d1 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 22 Oct 2024 07:30:52 -0700 Subject: [PATCH 324/384] Bump version metadata post release On every startup, Arduino IDE checks for new versions of the IDE. If a newer version is available, a notification/dialog is shown offering an update. "Newer" is determined by comparing the version of the user's IDE to the latest available version on the update channel. This comparison is done according to the Semantic Versioning Specification ("SemVer"). In order to facilitate beta testing, builds are generated of the Arduino IDE at the current stage in development. These builds are given an identifying version of the following form: - <version>-snapshot-<short hash> - builds generated for every push and pull request that modifies relevant files - <version>-nightly-<YYYYMMDD> - daily builds of the tip of the default branch In order to cause these builds to be correctly considered "newer" than the release version, the version metadata must be bumped immediately following each release. This will also serve as the metadata bump for the next release in the event that release is a minor release. In case it is instead a minor or major release, the version metadata will need to be updated once more before the release tag is created. --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index bef1f07b7..b97808e5f 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.3", + "version": "2.3.4", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 0451107f1..c959f3548 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.3", + "version": "2.3.4", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.41.0", "@theia/terminal": "1.41.0", "@theia/workspace": "1.41.0", - "arduino-ide-extension": "2.3.3" + "arduino-ide-extension": "2.3.4" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/package.json b/package.json index 2e4dd1a64..88ebc27c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.3", + "version": "2.3.4", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 4a3abf542c770fbc20d9a08401a38446261350bd Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:01:45 +0200 Subject: [PATCH 325/384] fix: prevent parsing CLI errors without metadata When parsing a CLI error, check if any metadata from grpc is present before trying to parse it. Closes #2516 --- .../src/node/service-error.ts | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/arduino-ide-extension/src/node/service-error.ts b/arduino-ide-extension/src/node/service-error.ts index a42c05d8a..0b6021ff0 100644 --- a/arduino-ide-extension/src/node/service-error.ts +++ b/arduino-ide-extension/src/node/service-error.ts @@ -6,7 +6,7 @@ import { ProgrammerIsRequiredForUploadError } from './cli-protocol/cc/arduino/cl type ProtoError = typeof ProgrammerIsRequiredForUploadError; const protoErrorsMap = new Map<string, ProtoError>([ [ - 'type.googleapis.com/cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', + 'cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', ProgrammerIsRequiredForUploadError, ], // handle other cli defined errors here @@ -22,30 +22,33 @@ export namespace ServiceError { return arg instanceof Error && isStatusObject(arg); } - export function isInstanceOf(arg: unknown, type: unknown): boolean { + export function isInstanceOf<ProtoError>( + arg: unknown, + type: new (...args: unknown[]) => ProtoError + ): arg is ProtoError { if (!isStatusObject(arg)) { return false; } - const bin = arg.metadata.get('grpc-status-details-bin')[0]; + try { + const bin = arg.metadata.get('grpc-status-details-bin')[0]; + const uint8Array = + typeof bin === 'string' + ? stringToUint8Array(bin) + : new Uint8Array(bin.buffer, bin.byteOffset, bin.byteLength); - const uint8Array = - typeof bin === 'string' - ? stringToUint8Array(bin) - : new Uint8Array(bin.buffer, bin.byteOffset, bin.byteLength); + const errors = Status.deserializeBinary(uint8Array) + .getDetailsList() + .map((details) => { + const typeName = details.getTypeName(); + const ErrorType = protoErrorsMap.get(typeName); + return ErrorType?.deserializeBinary(details.getValue_asU8()); + }); - const errors = Status.deserializeBinary(uint8Array) - .getDetailsList() - .map((details) => { - const typeUrl = details.getTypeUrl(); - const ErrorType = protoErrorsMap.get(typeUrl); - return ErrorType?.deserializeBinary(details.getValue_asU8()); - }); - - return !!errors.find((error) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return error && error instanceof <any>type; - }); + return !!errors.find((error) => error && error instanceof type); + } catch { + return false; + } } function isStatusObject(arg: unknown): arg is StatusObject { From 44f15238d6ddeb27054ac9bc45f1f3ebc5c92a74 Mon Sep 17 00:00:00 2001 From: Dave Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Thu, 24 Oct 2024 09:26:49 +0200 Subject: [PATCH 326/384] chore: switch to version `2.3.4` after the release (#2514) From 3ccc864453866c9273428779680e4fe2b91b1ce6 Mon Sep 17 00:00:00 2001 From: dankeboy36 <111981763+dankeboy36@users.noreply.github.com> Date: Sun, 27 Oct 2024 02:15:23 +0200 Subject: [PATCH 327/384] fix(doc): add missing prerequisites to dev docs (#2531) Document prerequisites of the Arduino CLI, LS, etc. tools when built from a Git commitish. --------- Signed-off-by: dankeboy36 <dankeboy36@gmail.com> Co-authored-by: per1234 <accounts@perglass.com> --- docs/development.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/development.md b/docs/development.md index 367d2139b..84cd32c66 100644 --- a/docs/development.md +++ b/docs/development.md @@ -50,6 +50,7 @@ This repository contains the main code, but two more repositories are included d - To build the application, follow the Theia IDE [prerequisites](https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites). - This project recommends using [Visual Studio Code (VS Code)](https://code.visualstudio.com/) for the development. +- The build system might also need to build the [Arduino CLI](https://github.com/arduino/arduino-cli), the [Arduino Language Server](https://github.com/arduino/arduino-language-server), and other tools from the sources. In this case it is also necessary to have the build prerequisites for those projects installed. For more details, refer to the Arduino CLI's [prerequisites section](https://arduino.github.io/arduino-cli/latest/CONTRIBUTING/#prerequisites). ## Build from source From 63e9dfd7f5949c77ffbfb6175e2e9c2991317bca Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:50:05 +0200 Subject: [PATCH 328/384] fix: disable local windows signing for forks PR Resolves https://github.com/arduino/arduino-ide/issues/2545 --- .github/workflows/build.yml | 2 ++ electron-app/scripts/windowsCustomSign.js | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 865c0562e..f35d97f16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -286,6 +286,8 @@ jobs: SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" WIN_CERT_PASSWORD: ${{ secrets.INSTALLER_CERT_WINDOWS_PASSWORD }} WIN_CERT_CONTAINER_NAME: ${{ secrets.INSTALLER_CERT_WINDOWS_CONTAINER }} + WIN_SIGNING_ENABLED: ${{ !github.event.pull_request.head.repo.fork }} + strategy: matrix: config: ${{ fromJson(needs.select-targets.outputs.build-matrix) }} diff --git a/electron-app/scripts/windowsCustomSign.js b/electron-app/scripts/windowsCustomSign.js index 29fbc5fad..41fc6d3b2 100644 --- a/electron-app/scripts/windowsCustomSign.js +++ b/electron-app/scripts/windowsCustomSign.js @@ -1,7 +1,10 @@ const childProcess = require('child_process'); exports.default = async function (configuration) { - if (!process.env.GITHUB_ACTIONS) { + if ( + !process.env.GITHUB_ACTIONS || + process.env.WIN_SIGNING_ENABLED !== 'true' + ) { return; } From 9cbee0eacf50c613422131cfe9b414759c6fb5f6 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Mon, 11 Nov 2024 23:18:44 -0800 Subject: [PATCH 329/384] Trim trailing whitespace in build workflow --- .github/workflows/build.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f35d97f16..6486e207a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,7 +40,7 @@ on: - Push Container Images branches: - main - types: + types: - completed env: @@ -397,7 +397,7 @@ jobs: yarn --cwd electron-app rebuild yarn --cwd electron-app build yarn --cwd electron-app package - + # Both macOS jobs generate a "channel update info file" with same path and name. The second job to complete would # overwrite the file generated by the first in the workflow artifact. - name: Stage channel file for merge @@ -425,14 +425,13 @@ jobs: if-no-files-found: error name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} path: ${{ runner.os == 'Windows' && matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} - - name: Upload [GitHub Actions] uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ runner.os == 'Windows' && matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} - + - name: Manual Clean up for self-hosted runners if: runner.os == 'Windows' && matrix.config.working-directory shell: cmd From 3d82cb3525b281bb39b3625e068fcb6902d85f5b Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Tue, 12 Nov 2024 00:01:07 -0800 Subject: [PATCH 330/384] Add `PAID_RUNNER_BUILD_DATA` environment variable back to build workflow The build workflow produces builds for a range of target host architectures, including macOS Apple Silicon. This is done by running a native build in a machine of the target architecture. At the time the support for producing Apple Silicon builds was added to the workflow, use of GitHub-hosted Apple Silicon runner machines was charged by the minute (while use of the other runners is free). In order to avoid excessive expenses, the workflow was configured so that the Apple Silicon builds were only produced when absolutely necessary. This was done by defining two sets of job matrix arrays, one for jobs using free runners, and the other for jobs using paid runners. Due to the limitations of the GitHub Actions framework, it was necessary to use workflow environment variables for this purpose. Since that time, GitHub made free GitHub-hosted Apple Silicon runners available. When the workflow was adjusted to use that runner, the configuration for the Apple Silicon build job was moved to the free runner job matrix array. The system for supporting selective use of paid GitHub-hosted runners to produce builds was not removed at that time. This is reasonable since it is possible the need will arise for using paid runners at some point in the future (e.g., only legacy older versions of free macOS "Intel" runners are now provided and it is likely that even these will eventually be phased out forcing us to use the paid runner to produce builds for that target). However, the environment variable for the paid runner job matrix array data was removed. The absence of that variable made it very difficult to understand the workflow code for the system. For this reason, the environment variable is replaced, but empty of data. A comment is added to explain the reason for this. --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6486e207a..4c87567ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -127,6 +127,10 @@ env: name: macOS_arm64_dmg - path: '*macOS_arm64.zip' name: macOS_arm64_zip + PAID_RUNNER_BUILD_DATA: | + # This system was implemented to allow selective use of paid GitHub-hosted runners, due to the Apple Silicon runner + # incurring a charge at that time. Free Apple Silicon runners are now available so the configuration was moved to + # `BASE_BUILD_DATA`, but the system was left in place for future use. jobs: run-determination: From c0b0b84d799906062d8d4d4add683257c8ee7ab0 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sat, 16 Nov 2024 04:56:38 -0800 Subject: [PATCH 331/384] Simplify and generalize configurable working directory code in build workflow The Windows builds of the application are cryptographically signed. The signing requires an "eToken" hardware authentication device be connected to the machine performing the signing. This means that it is necessary to use a self-hosted GitHub Actions runner for the Windows job of the build workflow rather than the runners hosted by GitHub. There are some unique characteristics of the self-hosted runner which the workflow code must accommodate. The default working directory of the self-hosted runner is not suitable to perform the build under because the the resulting folder structure produced paths that exceeded the ridiculously small maximum path length of Windows. So the workflow must be configured to use a custom working directory with a short path (`C:\a`). This custom working directory must be used only for the job running on the self-hosted Windows runner so the working directory of the relevant workflow steps are configured using a ternary expression. Previously, this expression had multiple conditions: * the value of the `runner.os` context item * the definition of a custom working directory value in the job matrix The second condition is entirely sufficient. The use of the first condition only added unnecessary complexity to the workflow code, and imposed a pointless limitation of only allowing the use of the custom working directory system on Windows runners. Removing the unnecessary condition makes the workflow easier to understand and maintain, and makes it possible to configure any job to use a custom working directory if necessary. --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4c87567ff..1cc2a86bd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -378,7 +378,7 @@ jobs: CREATE_USERNAME: ${{ secrets.CREATE_USERNAME }} CREATE_PASSWORD: ${{ secrets.CREATE_PASSWORD }} CREATE_CLIENT_SECRET: ${{ secrets.CREATE_CLIENT_SECRET }} - working-directory: ${{ runner.os == 'Windows' && matrix.config.working-directory || './' }} + working-directory: ${{ matrix.config.working-directory || './' }} run: | # See: https://www.electron.build/code-signing if [ $CAN_SIGN = false ] || [ $IS_WINDOWS_CONFIG = true ]; then @@ -408,7 +408,7 @@ jobs: if: > needs.select-targets.outputs.merge-channel-files == 'true' && matrix.config.mergeable-channel-file == 'true' - working-directory: ${{ runner.os == 'Windows' && matrix.config.working-directory || './' }} + working-directory: ${{ matrix.config.working-directory || './' }} run: | staged_channel_files_path="${{ runner.temp }}/staged-channel-files" mkdir "$staged_channel_files_path" @@ -428,13 +428,13 @@ jobs: with: if-no-files-found: error name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} - path: ${{ runner.os == 'Windows' && matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} + path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} - name: Upload [GitHub Actions] uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ runner.os == 'Windows' && matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} + path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} - name: Manual Clean up for self-hosted runners if: runner.os == 'Windows' && matrix.config.working-directory From 43f0ccb250005b84a4f630e36771d13f1d5b3974 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sat, 16 Nov 2024 05:12:25 -0800 Subject: [PATCH 332/384] Use appropriate indicator for dependency installation conditionals in build workflow The Windows builds of the application are cryptographically signed. The signing requires an "eToken" hardware authentication device be connected to the machine performing the signing. This means that it is necessary to use a self-hosted GitHub Actions runner for the Windows job of the build workflow rather than the runners hosted by GitHub. There are some unique characteristics of the self-hosted runner which the workflow code must accommodate. One of these is that, rather than installing dependencies of the build process during the workflow run as is done for the GitHub-hosted runners, the dependencies are preinstalled in the self-hosted runner machine. So the dependency installation steps must be configured so that they will be skipped when the job is running on the self-hosted runner. This is done by adding a conditional to the steps. Previously the conditional was based on the value of the `runner.os` context item. This is not an appropriate indicator of the job running on the self-hosted runner because `runner.os` will have the same value if the job was running on a GitHub-hosted Windows runner. That might seem like only a hypothetical problem since the workflow does not use a GitHub-hosted Windows runner. However, it is important to support the use of the workflow in forks of the repository. In addition to the possible value to hard forked projects, this is essential to allow conscientious contributors to test contributions to the build and release system in their own fork prior to submitting a pull request. The conditionals are changed to use the more appropriate indicator of the specific name of the self-hosted Windows runner (via the `runner.name` context item). --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1cc2a86bd..6b817e416 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -321,7 +321,7 @@ jobs: uses: actions/checkout@v3 - name: Install Node.js - if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' + if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} @@ -329,26 +329,26 @@ jobs: cache: 'yarn' - name: Install Python 3.x - if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' + if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' uses: actions/setup-python@v5 with: python-version: '3.11.x' - name: Install Go - if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' + if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install Go # actions/setup-go@v5 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null && runner.os != 'Windows' + if: fromJSON(matrix.config.container) != null && runner.name != 'WINDOWS-SIGN-PC' uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - name: Install Taskfile - if: fromJSON(matrix.config.container) == null && runner.os != 'Windows' + if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} @@ -356,7 +356,7 @@ jobs: - name: Install Taskfile # actions/setup-task@v2 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null && runner.os != 'Windows' + if: fromJSON(matrix.config.container) != null && runner.name != 'WINDOWS-SIGN-PC' uses: arduino/setup-task@v1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} From 0fe0feace4b31b4fc8505cd01095a7d62b2a9777 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sat, 16 Nov 2024 05:50:27 -0800 Subject: [PATCH 333/384] Get job-specific configuration from matrix in build workflow The "build" workflow builds the application for a range of target hosts. This is done by using a job matrix. A separate parallel job runs for each target. The target-specific configuration data is defined in the job matrix array. This configuration data includes the information related to the code signing certificates. Inexplicably, during the work to add support for signing the Windows builds with an "eToken" hardware authentication device, this data was not used for the Windows code signing configuration. Instead the certificate data was redundantly hardcoded into the workflow code. The Windows code signing certificate configuration is hereby changed to use the established flexible job configuration data system. This makes the workflow easier to understand and maintain. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6b817e416..02de77393 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -288,8 +288,8 @@ jobs: # We are hardcoding the path for signtool because is not present on the windows PATH env var by default. # Keep in mind that this path could change when upgrading to a new runner version SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" - WIN_CERT_PASSWORD: ${{ secrets.INSTALLER_CERT_WINDOWS_PASSWORD }} - WIN_CERT_CONTAINER_NAME: ${{ secrets.INSTALLER_CERT_WINDOWS_CONTAINER }} + WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }} + WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }} WIN_SIGNING_ENABLED: ${{ !github.event.pull_request.head.repo.fork }} strategy: From f72d1f0ac853681968d311d57ecf34e0d32f3d08 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sat, 16 Nov 2024 05:54:59 -0800 Subject: [PATCH 334/384] Use appropriate indicator for Windows signing determination in build workflow The "build" workflow signs the Windows builds of the application. The signing process relies on access to GitHub Actions secrets. For this reason, the workflow is configured to only sign the builds when it has access to GitHub Actions secrets to avoid spurious failures of the workflow that would otherwise be caused by signing failure. Previously the signing was determined based on the value of the `github.event.pull_request.head.repo.fork` context item. That was effective for the use case of the workflow being triggered by a pull request from a fork (for security reasons, GitHub Actions does not give access to secrets under these conditions). However, there is another context under which the workflow might run without access to the signing secrets, for which the use of context item is not appropriate. It is important to support the use of the workflow in forks of the repository. In addition to the possible value to hard forked projects, this is essential to allow conscientious contributors to test contributions to the build and release system in their own fork prior to submitting a pull request. The previous configuration would cause a workflow run performed by a contributor in a fork to attempt to sign the Windows build. Unless the contributor had set up the ridiculously complex infrastructure required to perform the signing for the Windows build, which is utterly infeasible, this would cause the workflow to fail spuriously. The appropriate approach, which has been the established convention in the rest of the workflow code, is to use the secret itself when determining whether to attempt the signing process. If the secret is not defined (resulting in it having an empty string value), then the signing should be skipped. If it is defined, then the signing should be performed. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 02de77393..294284d48 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -290,7 +290,7 @@ jobs: SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }} WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }} - WIN_SIGNING_ENABLED: ${{ !github.event.pull_request.head.repo.fork }} + WIN_SIGNING_ENABLED: ${{ secrets[matrix.config.certificate-password-secret] != '' }} strategy: matrix: From 4f8b9800a01d8599f334c1e6175e25f5b97a1d3d Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sat, 16 Nov 2024 05:55:48 -0800 Subject: [PATCH 335/384] Remove redundant signing determination code from build system The "build" workflow signs the macOS and Windows builds of the application. The signing process relies on access to GitHub Actions secrets. For this reason, the workflow is configured to only sign the builds when it has access to GitHub Actions secrets to avoid spurious failures of the workflow that would otherwise be caused by signing failure. A flexible general purpose system for determining whether to attempt signing of a build was established years ago. However, a redundant system was added specific to the Windows build instead of using the existing system. The redundant system is hereby removed. This makes the workflow easier to understand and maintain. --- .github/workflows/build.yml | 1 - electron-app/scripts/windowsCustomSign.js | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 294284d48..b729931ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -290,7 +290,6 @@ jobs: SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }} WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }} - WIN_SIGNING_ENABLED: ${{ secrets[matrix.config.certificate-password-secret] != '' }} strategy: matrix: diff --git a/electron-app/scripts/windowsCustomSign.js b/electron-app/scripts/windowsCustomSign.js index 41fc6d3b2..5e9585bc2 100644 --- a/electron-app/scripts/windowsCustomSign.js +++ b/electron-app/scripts/windowsCustomSign.js @@ -1,10 +1,7 @@ const childProcess = require('child_process'); exports.default = async function (configuration) { - if ( - !process.env.GITHUB_ACTIONS || - process.env.WIN_SIGNING_ENABLED !== 'true' - ) { + if (!process.env.GITHUB_ACTIONS || process.env.CAN_SIGN !== 'true') { return; } From 6e695429ccbc5b8e1f7d1e19d12885519060e28c Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sun, 17 Nov 2024 22:37:42 -0800 Subject: [PATCH 336/384] Use a dedicated GitHub Actions workflow for linting TypeScript/JavaScript code The "build" workflow builds the application for all supported targets, generates workflow artifacts from which the builds can be downloaded by users and beta testers, and publishes nightly and production releases. As if that wasn't enough, the workflow was also configured to perform the unrelated operation of linting the project's TypeScript and JavaScript code. This monolithic approach is harmful for multiple reasons: * Makes it difficult to interpret a failed workflow run * Unnecessarily adds a significant amount of extra content to the already extensive logs produced by the build process * Makes the build workflow more difficult to maintain * Increases the length of a build workflow run * Increases the impact of a spurious failure * Increases the turnaround time for contributors and maintainers to get feedback from the CI system The linting operation is hereby moved to a dedicated workflow, consistent with standard practices for Arduino Tooling projects. --- .github/workflows/build.yml | 1 - .github/workflows/check-javascript.yml | 88 ++++++++++++++++++++++++++ README.md | 1 + 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/check-javascript.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b729931ce..7c45d875d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -395,7 +395,6 @@ jobs: 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 diff --git a/.github/workflows/check-javascript.yml b/.github/workflows/check-javascript.yml new file mode 100644 index 000000000..23162a19e --- /dev/null +++ b/.github/workflows/check-javascript.yml @@ -0,0 +1,88 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-javascript-task.md +name: Check JavaScript + +env: + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 18.17 + +# See: https://docs.github.com/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows +on: + create: + push: + paths: + - '.github/workflows/check-javascript.ya?ml' + - '**/.eslintignore' + - '**/.eslintrc*' + - '**/.npmrc' + - '**/package.json' + - '**/package-lock.json' + - '**/yarn.lock' + - '**.jsx?' + pull_request: + paths: + - '.github/workflows/check-javascript.ya?ml' + - '**/.eslintignore' + - '**/.eslintrc*' + - '**/.npmrc' + - '**/package.json' + - '**/package-lock.json' + - '**/yarn.lock' + - '**.jsx?' + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: yarn + node-version: ${{ env.NODE_VERSION }} + + - name: Install npm package dependencies + env: + # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: + # https://github.com/microsoft/vscode-ripgrep#github-api-limit-note + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn install + + - name: Lint + run: | + yarn \ + --cwd arduino-ide-extension \ + lint diff --git a/README.md b/README.md index 68d635a94..666434d00 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ # Arduino IDE 2.x [![Arduino IDE](https://github.com/arduino/arduino-ide/workflows/Arduino%20IDE/badge.svg)](https://github.com/arduino/arduino-ide/actions?query=workflow%3A%22Arduino+IDE%22) +[![Check JavaScript status](https://github.com/arduino/arduino-ide/actions/workflows/check-javascript.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/check-javascript.yml) This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the [repository of the 1.x version](https://github.com/arduino/Arduino). From 9331d2ec0d625026b7b73edbe6f3ba8c75012f62 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Sun, 17 Nov 2024 23:15:45 -0800 Subject: [PATCH 337/384] Use a dedicated GitHub Actions workflow for testing TypeScript/JavaScript code The "build" workflow builds the application for all supported targets, generates workflow artifacts from which the builds can be downloaded by users and beta testers, and publishes nightly and production releases. As if that wasn't enough, the workflow was also configured to perform the unrelated operation of running the project's test suites. This monolithic approach is harmful for multiple reasons: * Makes it difficult to interpret a failed workflow run * Unnecessarily adds a significant amount of extra content to the already extensive logs produced by the build process * Makes the build workflow more difficult to maintain * Increases the length of a build workflow run * Increases the impact of a spurious failure * Increases the turnaround time for contributors and maintainers to get feedback from the CI system The test run operation is hereby moved to a dedicated workflow, consistent with standard practices for Arduino Tooling projects. --- .github/workflows/build.yml | 8 -- .github/workflows/test-javascript.yml | 134 ++++++++++++++++++++++++++ README.md | 3 +- 3 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/test-javascript.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7c45d875d..30194a433 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -372,11 +372,6 @@ jobs: IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }} IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }} - # The CREATE_* environment vars are only used to run tests. These secrets are optional. Dependent tests will - # be skipped if not available. - CREATE_USERNAME: ${{ secrets.CREATE_USERNAME }} - CREATE_PASSWORD: ${{ secrets.CREATE_PASSWORD }} - CREATE_CLIENT_SECRET: ${{ secrets.CREATE_CLIENT_SECRET }} working-directory: ${{ matrix.config.working-directory || './' }} run: | # See: https://www.electron.build/code-signing @@ -393,9 +388,6 @@ jobs: yarn install --immutable yarn --cwd arduino-ide-extension build - yarn test - yarn --cwd arduino-ide-extension test:slow - yarn --cwd electron-app rebuild yarn --cwd electron-app build yarn --cwd electron-app package diff --git a/.github/workflows/test-javascript.yml b/.github/workflows/test-javascript.yml new file mode 100644 index 000000000..2ae001c7d --- /dev/null +++ b/.github/workflows/test-javascript.yml @@ -0,0 +1,134 @@ +name: Test JavaScript + +env: + # See vars.GO_VERSION field of https://github.com/arduino/arduino-cli/blob/master/DistTasks.yml + GO_VERSION: '1.21' + # See: https://github.com/actions/setup-node/#readme + NODE_VERSION: 18.17 + +on: + push: + paths: + - ".github/workflows/test-javascript.ya?ml" + - "**/.mocharc.js" + - "**/.mocharc.jsonc?" + - "**/.mocharc.ya?ml" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + - "tests/testdata/**" + - "**/tsconfig.json" + - "**.[jt]sx?" + pull_request: + paths: + - ".github/workflows/test-javascript.ya?ml" + - "**/.mocharc.js" + - "**/.mocharc.jsonc?" + - "**/.mocharc.ya?ml" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + - "tests/testdata/**" + - "**/tsconfig.json" + - "**.[jt]sx?" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + test: + name: test (${{ matrix.project.path }}, ${{ matrix.operating-system }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ${{ matrix.operating-system }} + defaults: + run: + shell: bash + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + operating-system: + - macos-latest + - ubuntu-latest + - windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: yarn + node-version: ${{ env.NODE_VERSION }} + + # See: https://github.com/eclipse-theia/theia/blob/master/doc/Developing.md#prerequisites + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: '3.11.x' + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Taskfile + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install npm package dependencies + env: + # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: + # https://github.com/microsoft/vscode-ripgrep#github-api-limit-note + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn install + + - name: Compile TypeScript + run: | + yarn \ + --cwd arduino-ide-extension \ + build + + - name: Run tests + env: + # These secrets are optional. Dependent tests will be skipped if not available. + CREATE_USERNAME: ${{ secrets.CREATE_USERNAME }} + CREATE_PASSWORD: ${{ secrets.CREATE_PASSWORD }} + CREATE_CLIENT_SECRET: ${{ secrets.CREATE_CLIENT_SECRET }} + run: | + yarn test + yarn \ + --cwd arduino-ide-extension \ + test:slow diff --git a/README.md b/README.md index 666434d00..a7a88f491 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ # Arduino IDE 2.x -[![Arduino IDE](https://github.com/arduino/arduino-ide/workflows/Arduino%20IDE/badge.svg)](https://github.com/arduino/arduino-ide/actions?query=workflow%3A%22Arduino+IDE%22) +[![Build status](https://github.com/arduino/arduino-ide/actions/workflows/build.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/build.yml) [![Check JavaScript status](https://github.com/arduino/arduino-ide/actions/workflows/check-javascript.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/check-javascript.yml) +[![Test JavaScript status](https://github.com/arduino/arduino-ide/actions/workflows/test-javascript.yml/badge.svg)](https://github.com/arduino/arduino-ide/actions/workflows/test-javascript.yml) This repository contains the source code of the Arduino IDE 2.x. If you're looking for the old IDE, go to the [repository of the 1.x version](https://github.com/arduino/Arduino). From 788017bb994b9d8fda04df33d7ad3b5feb4879fd Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Mon, 18 Nov 2024 01:09:27 -0800 Subject: [PATCH 338/384] Use a dedicated GitHub workflow to check for problems with Yarn configuration The "build" workflow builds the application for all supported targets, generates workflow artifacts from which the builds can be downloaded by users and beta testers, and publishes nightly and production releases. As if that wasn't enough, the workflow was also configured to check the sync of the Yarn lockfile. This monolithic approach is harmful for multiple reasons: * Makes it difficult to interpret a failed workflow run * Makes the build workflow more difficult to maintain * Increases the turnaround time for contributors and maintainers to get feedback from the CI system The sync check operation is hereby moved to a dedicated workflow, consistent with standard practices for Arduino Tooling projects. --- .github/workflows/build.yml | 2 +- .github/workflows/check-yarn.yml | 91 ++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/check-yarn.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30194a433..cd93b347f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -385,7 +385,7 @@ jobs: fi npx node-gyp install - yarn install --immutable + yarn install yarn --cwd arduino-ide-extension build yarn --cwd electron-app rebuild diff --git a/.github/workflows/check-yarn.yml b/.github/workflows/check-yarn.yml new file mode 100644 index 000000000..3b2efe92c --- /dev/null +++ b/.github/workflows/check-yarn.yml @@ -0,0 +1,91 @@ +name: Check Yarn + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-yarn.ya?ml" + - "**/.yarnrc" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + pull_request: + paths: + - ".github/workflows/check-yarn.ya?ml" + - "**/.yarnrc" + - "**/package.json" + - "**/package-lock.json" + - "**/yarn.lock" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-sync: + name: check-sync (${{ matrix.project.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + cache: yarn + node-version: ${{ env.NODE_VERSION }} + + - name: Install npm package dependencies + env: + # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: + # https://github.com/microsoft/vscode-ripgrep#github-api-limit-note + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + yarn \ + install \ + --ignore-scripts + + - name: Check yarn.lock + run: | + git \ + diff \ + --color \ + --exit-code \ + "${{ matrix.project.path }}/yarn.lock" From f232010bec647763b7a1080d12f41befe5d7f972 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Mon, 18 Nov 2024 20:24:20 -0800 Subject: [PATCH 339/384] Correct eslint command in `lint` script The `lint` script of the "arduino-ide-extension" package is intended to use the ESLint linter tool to check for problems in all the package's JavaScript and TypeScript code files. It is used by the continuous integration system to validate contributions. Previously, the command invoked `eslint` without any arguments. With the 8.x version of ESLint used by the project, it is necessary to provide a path argument in order to cause it to lint the contents of files. Because that argument was not provided, the script didn't do anything at all and so would return a 0 exit status even if the code had linting rule violations. This is fixed by adding a `.` path argument to the command invoked by the script. This will cause ESLint to recurse through the `arduino-ide-extension` folder and lint the code in all relevant files. --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index b97808e5f..5ef831049 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -13,7 +13,7 @@ "download-ls": "node ./scripts/download-ls.js", "download-examples": "node ./scripts/download-examples.js", "generate-protocol": "node ./scripts/generate-protocol.js", - "lint": "eslint", + "lint": "eslint .", "prebuild": "rimraf lib", "build": "tsc", "build:dev": "yarn build", From d377d000426c926d342d1b85567294761a7de78f Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Mon, 18 Nov 2024 20:47:10 -0800 Subject: [PATCH 340/384] Use appropriate equality operator in changelog script It is considered good practice to use JavaScript's type-safe strict equality operator === instead of the equality operator ==. Compliance with this practice is enforced by the project's ESLint configuration, via the "eqeqeq" rule. The script used to generate the changelog for Arduino IDE's auto-update dialog contained an inappropriate usage of the equality operator. This caused linting runs to fail: arduino-ide-extension/scripts/compose-changelog.js 37:19 error Expected '===' and instead saw '==' eqeqeq --- arduino-ide-extension/scripts/compose-changelog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/scripts/compose-changelog.js b/arduino-ide-extension/scripts/compose-changelog.js index aba9dae46..f8a4c42ba 100755 --- a/arduino-ide-extension/scripts/compose-changelog.js +++ b/arduino-ide-extension/scripts/compose-changelog.js @@ -34,7 +34,7 @@ }, ''); const args = process.argv.slice(2); - if (args.length == 0) { + if (args.length === 0) { console.error('Missing argument to destination file'); process.exit(1); } From d6235f0a0ca2c7e4a02af8f67ce24c77ad8ecb09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:39:15 +0000 Subject: [PATCH 341/384] build(deps): Bump svenstaro/upload-release-action from 2.7.0 to 2.9.0 Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.7.0 to 2.9.0. - [Release notes](https://github.com/svenstaro/upload-release-action/releases) - [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/svenstaro/upload-release-action/compare/2.7.0...2.9.0) --- updated-dependencies: - dependency-name: svenstaro/upload-release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd93b347f..535298d8e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -629,7 +629,7 @@ jobs: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] - uses: svenstaro/upload-release-action@2.7.0 + uses: svenstaro/upload-release-action@2.9.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} From 7c231fff76f45ffc3b7cd5e7175d458acbd6d3cc Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:40:52 +0100 Subject: [PATCH 342/384] fix: memory leak when scanning sketchbooks with large files (#2555) Resolves https://github.com/arduino/arduino-ide/issues/2537 Fix memory leak issue caused by inflight dependency, see https://github.com/isaacs/node-glob/issues/435 --- arduino-ide-extension/package.json | 6 +- .../scripts/generate-protocol.js | 20 +- .../src/node/sketches-service-impl.ts | 30 +- electron-app/scripts/post-package.js | 2 +- yarn.lock | 280 ++++++++++++++---- 5 files changed, 244 insertions(+), 94 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 5ef831049..528dafcf2 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -73,7 +73,7 @@ "fast-safe-stringify": "^2.1.1", "filename-reserved-regex": "^2.0.0", "fqbn": "^1.0.5", - "glob": "^7.1.6", + "glob": "10.4.4", "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", "is-online": "^10.0.0", @@ -127,8 +127,8 @@ "rimraf": "^2.6.1" }, "optionalDependencies": { - "grpc-tools": "^1.12.4", - "@pingghost/protoc": "^1.0.2" + "@pingghost/protoc": "^1.0.2", + "grpc-tools": "^1.12.4" }, "mocha": { "require": [ diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index f2b1ce8e8..9857e597f 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -5,7 +5,7 @@ const path = require('node:path'); const { mkdirSync, promises: fs, rmSync } = require('node:fs'); const { exec } = require('./utils'); - const glob = require('glob'); + const { glob } = require('glob'); const { SemVer, gte, valid: validSemVer } = require('semver'); // Use a node-protoc fork until apple arm32 is supported // https://github.com/YePpHa/node-protoc/pull/10 @@ -147,16 +147,14 @@ rmSync(out, { recursive: true, maxRetries: 5, force: true }); mkdirSync(out, { recursive: true }); - const protos = await new Promise((resolve) => - glob('**/*.proto', { cwd: rpc }, (error, matches) => { - if (error) { - console.log(error.stack ?? error.message); - resolve([]); - return; - } - resolve(matches.map((filename) => path.join(rpc, filename))); - }) - ); + let protos = []; + try { + const matches = await glob('**/*.proto', { cwd: rpc }); + protos = matches.map((filename) => path.join(rpc, filename)); + } catch (error) { + console.log(error.stack ?? error.message); + } + if (!protos || protos.length === 0) { console.log(`Could not find any .proto files under ${rpc}.`); process.exit(1); diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index 3a72c31d7..e219d80e9 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -8,7 +8,7 @@ import type { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable, named } from '@theia/core/shared/inversify'; -import glob from 'glob'; +import { glob } from 'glob'; import crypto from 'node:crypto'; import { CopyOptions, @@ -853,13 +853,13 @@ export async function discoverSketches( container: Mutable<SketchContainer>, logger?: ILogger ): Promise<SketchContainer> { - const pathToAllSketchFiles = await globSketches( + const pathToAllSketchFiles = await glob( '/!(libraries|hardware)/**/*.{ino,pde}', - root + { root } ); // if no match try to glob the sketchbook as a sketch folder if (!pathToAllSketchFiles.length) { - pathToAllSketchFiles.push(...(await globSketches('/*.{ino,pde}', root))); + pathToAllSketchFiles.push(...(await glob('/*.{ino,pde}', { root }))); } // Sort by path length to filter out nested sketches, such as the `Nested_folder` inside the `Folder` sketch. @@ -873,7 +873,14 @@ export async function discoverSketches( // +--Nested_folder // | // +--Nested_folder.ino - pathToAllSketchFiles.sort((left, right) => left.length - right.length); + pathToAllSketchFiles.sort((left, right) => { + if (left.length === right.length) { + // Sort alphabetically for tests consistency + return left.localeCompare(right); + } + return left.length - right.length; + }); + const getOrCreateChildContainer = ( container: SketchContainer, segments: string[] @@ -974,17 +981,6 @@ export async function discoverSketches( uri: FileUri.create(path.dirname(pathToSketchFile)).toString(), }); } - return prune(container); -} -async function globSketches(pattern: string, root: string): Promise<string[]> { - return new Promise<string[]>((resolve, reject) => { - glob(pattern, { root }, (error, results) => { - if (error) { - reject(error); - } else { - resolve(results); - } - }); - }); + return prune(container); } diff --git a/electron-app/scripts/post-package.js b/electron-app/scripts/post-package.js index 23e837e4d..b346f558f 100644 --- a/electron-app/scripts/post-package.js +++ b/electron-app/scripts/post-package.js @@ -4,7 +4,7 @@ const isCI = require('is-ci'); const fs = require('fs'); const path = require('path'); -const glob = require('glob'); +const { glob } = require('glob'); const { isRelease } = require('./utils'); const { isZip, adjustArchiveStructure } = require('./archive'); diff --git a/yarn.lock b/yarn.lock index d0912ee7d..ae52d6e5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -938,7 +938,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.23.0", "@babel/traverse@^7.23.2": +"@babel/traverse@^7.23.0": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -1399,35 +1399,35 @@ semver "^7.3.5" tar "^6.1.11" -"@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.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz#901c5937e1441572ea23e631fe6deca68482fe76" + integrity sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ== -"@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.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz#fb877fe6bae3c4d3cea29786737840e2ae689066" + integrity sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw== -"@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.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz#986179c38b10ac41fbdaf7d036c825cbc72855d9" + integrity sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA== -"@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.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz#15f2c6fe9e0adc06c21af7e95f484ff4880d79ce" + integrity sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg== -"@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.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz#30cae5c9a202f3e1fa1deb3191b18ffcb2f239a2" + integrity sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw== -"@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.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz#016d855b6bc459fd908095811f6826e45dd4ba64" + integrity sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3195,6 +3195,11 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== +"@types/tough-cookie@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/trusted-types@*": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" @@ -4152,7 +4157,22 @@ available-typed-arrays@^1.0.6: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== -axios@^1.0.0, axios@^1.6.2, axios@^1.6.7: +axios-cookiejar-support@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz#7b32af7d932508546c68b1fc5ba8f562884162e1" + integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== + dependencies: + is-redirect "^1.0.0" + pify "^5.0.0" + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^1.0.0: version "1.6.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== @@ -4593,6 +4613,17 @@ call-bind@^1.0.5: get-intrinsic "^1.2.3" set-function-length "^1.2.0" +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5624,6 +5655,15 @@ define-data-property@^1.1.2: gopd "^1.0.1" has-property-descriptors "^1.0.1" +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -6172,6 +6212,13 @@ es-abstract@^1.22.1: unbox-primitive "^1.0.2" which-typed-array "^1.1.11" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -6910,6 +6957,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +follow-redirects@^1.14.0: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + follow-redirects@^1.15.4: version "1.15.5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" @@ -7173,7 +7225,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" -get-intrinsic@^1.2.2, get-intrinsic@^1.2.3: +get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -7308,6 +7360,18 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@10.4.4: + version "10.4.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.4.tgz#d60943feb6f8140522117e6576a923b715718380" + integrity sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" @@ -7565,6 +7629,13 @@ has-property-descriptors@^1.0.1: dependencies: get-intrinsic "^1.2.2" +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" @@ -7983,7 +8054,7 @@ ip-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^2.0.0, ip@^2.0.1: +ip@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== @@ -8231,6 +8302,11 @@ is-potential-custom-element-name@^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" + integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -8398,6 +8474,15 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -9042,6 +9127,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -9601,6 +9691,13 @@ minimatch@^9.0.0, minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -9684,6 +9781,11 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -9792,26 +9894,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@^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== +msgpackr-extract@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz#4bb749b58d9764cfdc0d91c7977a007b08e8f262" + integrity sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog== dependencies: - node-gyp-build-optional-packages "5.0.7" + node-gyp-build-optional-packages "5.0.3" optionalDependencies: - "@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, msgpackr@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.10.1.tgz#51953bb4ce4f3494f0c4af3f484f01cfbb306555" - integrity sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ== + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-arm" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-x64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-win32-x64" "2.2.0" + +msgpackr@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.6.1.tgz#4f3c94d6a5b819b838ffc736eddaf60eba436d20" + integrity sha512-Je+xBEfdjtvA4bKaOv8iRhjC8qX2oJwpYH4f7JrG4uMVJVmnmkAT4pjKdbztKprGj3iwjcxPzb5umVZ02Qq3tA== optionalDependencies: - msgpackr-extract "^3.0.2" + msgpackr-extract "^2.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -9852,14 +9954,16 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nano@^10.1.3, nano@^9.0.5: - version "10.1.3" - resolved "https://registry.yarnpkg.com/nano/-/nano-10.1.3.tgz#5cb1ad14add4c9c82d53a79159848dafa84e7a13" - integrity sha512-q/hKQJJH3FhkkuJ3ojbgDph2StlSXFBPNkpZBZlsvZDbuYfxKJ4VtunEeilthcZtuIplIk1zVX5o2RgKTUTO+Q== +nano@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/nano/-/nano-9.0.5.tgz#2b767819f612907a3ac09b21f2929d4097407262" + integrity sha512-fEAhwAdXh4hDDnC8cYJtW6D8ivOmpvFAqT90+zEuQREpRkzA/mJPcI4EKv15JUdajaqiLTXNoKK6PaRF+/06DQ== dependencies: - axios "^1.6.2" - node-abort-controller "^3.0.1" - qs "^6.11.0" + "@types/tough-cookie" "^4.0.0" + axios "^0.21.1" + axios-cookiejar-support "^1.0.1" + qs "^6.9.4" + tough-cookie "^4.0.0" nanoid@3.3.3: version "3.3.3" @@ -9940,11 +10044,6 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" -node-abort-controller@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== - node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" @@ -9995,10 +10094,10 @@ node-fetch@^3.2.10: 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-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-gyp-build@^4.2.1: version "4.6.1" @@ -10352,6 +10451,11 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" @@ -10645,6 +10749,11 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + pacote@^15.2.0: version "15.2.0" resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" @@ -10804,6 +10913,14 @@ path-scurry@^1.10.1, path-scurry@^1.6.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.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" @@ -10858,7 +10975,7 @@ 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@5.0.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== @@ -11235,6 +11352,13 @@ qs@^6.10.1, qs@^6.10.3, qs@^6.11.0: dependencies: side-channel "^1.0.4" +qs@^6.9.4: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + query-string@^7.0.1: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -12066,6 +12190,18 @@ set-function-length@^1.2.0: gopd "^1.0.1" has-property-descriptors "^1.0.1" +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -12129,6 +12265,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + 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" @@ -12984,6 +13130,16 @@ token-types@^5.0.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" +tough-cookie@^4.0.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tough-cookie@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" From 41844c94702ace8217b45f6f58170c1dcde38fda Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:41:26 +0100 Subject: [PATCH 343/384] feat: implement menu action to reload current board data (#2553) --- .../src/browser/boards/boards-data-store.ts | 24 +++++++++- .../browser/contributions/board-selection.ts | 44 +++++++++++++++++++ .../src/common/protocol/boards-service.ts | 5 ++- .../src/node/boards-service-impl.ts | 4 ++ i18n/en.json | 3 ++ 5 files changed, 77 insertions(+), 3 deletions(-) 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 1c23fb38f..d4204c703 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -222,6 +222,20 @@ export class BoardsDataStore return data; } + async reloadBoardData(fqbn: string | undefined): Promise<void> { + if (!fqbn) { + return; + } + const key = this.getStorageKey(fqbn); + const details = await this.loadBoardDetails(fqbn, true); + if (!details) { + return; + } + const data = createDataStoreEntry(details); + await this.storageService.setData(key, data); + this.fireChanged({ fqbn, data }); + } + async selectProgrammer({ fqbn, selectedProgrammer, @@ -299,9 +313,15 @@ export class BoardsDataStore return `.arduinoIDE-configOptions-${fqbn}`; } - async loadBoardDetails(fqbn: string): Promise<BoardDetails | undefined> { + async loadBoardDetails( + fqbn: string, + forceRefresh = false + ): Promise<BoardDetails | undefined> { try { - const details = await this.boardsService.getBoardDetails({ fqbn }); + const details = await this.boardsService.getBoardDetails({ + fqbn, + forceRefresh, + }); return details; } catch (err) { if ( diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index ddeda87bc..f9c2d2b36 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -20,6 +20,7 @@ import { } from '../../common/protocol'; import type { BoardList } from '../../common/protocol/board-list'; import { BoardsListWidget } from '../boards/boards-list-widget'; +import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ArduinoMenus, @@ -39,6 +40,8 @@ export class BoardSelection extends SketchContribution { private readonly menuModelRegistry: MenuModelRegistry; @inject(NotificationCenter) private readonly notificationCenter: NotificationCenter; + @inject(BoardsDataStore) + private readonly boardsDataStore: BoardsDataStore; @inject(BoardsService) private readonly boardsService: BoardsService; @inject(BoardsServiceProvider) @@ -74,6 +77,29 @@ SN: ${SN} }); }, }); + + registry.registerCommand(BoardSelection.Commands.RELOAD_BOARD_DATA, { + execute: async () => { + const selectedFqbn = + this.boardsServiceProvider.boardList.boardsConfig.selectedBoard?.fqbn; + let message: string; + + if (selectedFqbn) { + await this.boardsDataStore.reloadBoardData(selectedFqbn); + message = nls.localize( + 'arduino/board/boardDataReloaded', + 'Board data reloaded.' + ); + } else { + message = nls.localize( + 'arduino/board/selectBoardToReload', + 'Please select a board first.' + ); + } + + this.messageService.info(message, { timeout: 2000 }); + }, + }); } override onStart(): void { @@ -151,6 +177,21 @@ SN: ${SN} ) ); + const reloadBoardData = { + commandId: BoardSelection.Commands.RELOAD_BOARD_DATA.id, + label: nls.localize('arduino/board/reloadBoardData', 'Reload Board Data'), + order: '102', + }; + this.menuModelRegistry.registerMenuAction( + ArduinoMenus.TOOLS__BOARD_SELECTION_GROUP, + reloadBoardData + ); + this.toDisposeBeforeMenuRebuild.push( + Disposable.create(() => + this.menuModelRegistry.unregisterMenuAction(reloadBoardData) + ) + ); + const getBoardInfo = { commandId: BoardSelection.Commands.GET_BOARD_INFO.id, label: nls.localize('arduino/board/getBoardInfo', 'Get Board Info'), @@ -361,5 +402,8 @@ SN: ${SN} export namespace BoardSelection { export namespace Commands { export const GET_BOARD_INFO: Command = { id: 'arduino-get-board-info' }; + export const RELOAD_BOARD_DATA: Command = { + id: 'arduino-reload-board-data', + }; } } diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index d76406216..a97dc9057 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -67,7 +67,10 @@ export interface BoardsService skipPostInstall?: boolean; }): Promise<void>; getDetectedPorts(): Promise<DetectedPorts>; - getBoardDetails(options: { fqbn: string }): Promise<BoardDetails | undefined>; + getBoardDetails(options: { + fqbn: string; + forceRefresh?: boolean; + }): Promise<BoardDetails | undefined>; getBoardPackage(options: { id: string /* TODO: change to PlatformIdentifier type? */; }): Promise<BoardsPackage | undefined>; diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index ea77f8a5f..a5572a1f6 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -73,7 +73,11 @@ export class BoardsServiceImpl async getBoardDetails(options: { fqbn: string; + forceRefresh?: boolean; }): Promise<BoardDetails | undefined> { + if (options.forceRefresh) { + await this.refresh(); + } const coreClient = await this.coreClient; const { client, instance } = coreClient; const { fqbn } = options; diff --git a/i18n/en.json b/i18n/en.json index 22babc740..37c90e2e6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", From 4cf9909a0763c06284ad3e21a718871000e15f1e Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:42:14 +0100 Subject: [PATCH 344/384] fix: retry compilation if grpc client needs to be reinitialized (#2548) * fix: use `Status` enum for status code in `ServiceError` type guards This change resolves the issue where the intersection of `ServiceError` error codes of type `number` resulted in the `never` type due to conflict between number and `State` enum if `StatusObject` * feat: add `isInvalidArgument` type guard to `ServiceError` * fix: retry compilation if grpc client needs to be reinitialized See https://github.com/arduino/arduino-ide/issues/2547 --- .../src/node/core-service-impl.ts | 115 ++++++++++++------ .../src/node/service-error.ts | 16 ++- 2 files changed, 91 insertions(+), 40 deletions(-) diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index b8eba0335..285c05f72 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -36,6 +36,7 @@ import { Instance } from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; import { CompileRequest, CompileResponse, + InstanceNeedsReinitializationError, } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; import { @@ -89,48 +90,84 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { compileSummaryHandler ); const toDisposeOnFinally = new DisposableCollection(handler); + return new Promise<void>((resolve, reject) => { - const call = client.compile(request); - if (cancellationToken) { - toDisposeOnFinally.push( - cancellationToken.onCancellationRequested(() => call.cancel()) + let hasRetried = false; + + const handleUnexpectedError = (error: Error) => { + console.error( + 'Unexpected error occurred while compiling the sketch.', + error ); - } - call - .on('data', handler.onData) - .on('error', (error) => { - if (!ServiceError.is(error)) { - console.error( - 'Unexpected error occurred while compiling the sketch.', - error - ); - reject(error); - return; - } - if (ServiceError.isCancel(error)) { - console.log(userAbort); - reject(UserAbortApplicationError()); - return; - } - const compilerErrors = tryParseError({ - content: handler.content, - sketch: options.sketch, - }); - const message = nls.localize( - 'arduino/compile/error', - 'Compilation error: {0}', - compilerErrors - .map(({ message }) => message) - .filter(notEmpty) - .shift() ?? error.details - ); - this.sendResponse( - error.details + '\n\n' + message, - OutputMessage.Severity.Error + reject(error); + }; + + const handleCancellationError = () => { + console.log(userAbort); + reject(UserAbortApplicationError()); + }; + + const handleInstanceNeedsReinitializationError = async ( + error: ServiceError & InstanceNeedsReinitializationError + ) => { + if (hasRetried) { + // If error persists, send the error message to the output + return parseAndSendErrorResponse(error); + } + + hasRetried = true; + await this.refresh(); + return startCompileStream(); + }; + + const parseAndSendErrorResponse = (error: ServiceError) => { + const compilerErrors = tryParseError({ + content: handler.content, + sketch: options.sketch, + }); + const message = nls.localize( + 'arduino/compile/error', + 'Compilation error: {0}', + compilerErrors + .map(({ message }) => message) + .filter(notEmpty) + .shift() ?? error.details + ); + this.sendResponse( + error.details + '\n\n' + message, + OutputMessage.Severity.Error + ); + reject(CoreError.VerifyFailed(message, compilerErrors)); + }; + + const handleError = async (error: Error) => { + if (!ServiceError.is(error)) return handleUnexpectedError(error); + if (ServiceError.isCancel(error)) return handleCancellationError(); + + if ( + ServiceError.isInstanceOf(error, InstanceNeedsReinitializationError) + ) { + return await handleInstanceNeedsReinitializationError(error); + } + + parseAndSendErrorResponse(error); + }; + + const startCompileStream = () => { + const call = client.compile(request); + if (cancellationToken) { + toDisposeOnFinally.push( + cancellationToken.onCancellationRequested(() => call.cancel()) ); - reject(CoreError.VerifyFailed(message, compilerErrors)); - }) - .on('end', resolve); + } + + call + .on('data', handler.onData) + .on('error', handleError) + .on('end', resolve); + }; + + startCompileStream(); }).finally(() => { toDisposeOnFinally.dispose(); if (!isCompileSummary(compileSummary)) { diff --git a/arduino-ide-extension/src/node/service-error.ts b/arduino-ide-extension/src/node/service-error.ts index 0b6021ff0..681896a03 100644 --- a/arduino-ide-extension/src/node/service-error.ts +++ b/arduino-ide-extension/src/node/service-error.ts @@ -1,7 +1,9 @@ import { Metadata, StatusObject } from '@grpc/grpc-js'; import { Status } from './cli-protocol/google/rpc/status_pb'; import { stringToUint8Array } from '../common/utils'; +import { Status as StatusCode } from '@grpc/grpc-js/build/src/constants'; import { ProgrammerIsRequiredForUploadError } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; +import { InstanceNeedsReinitializationError } from './cli-protocol/cc/arduino/cli/commands/v1/compile_pb'; type ProtoError = typeof ProgrammerIsRequiredForUploadError; const protoErrorsMap = new Map<string, ProtoError>([ @@ -9,15 +11,27 @@ const protoErrorsMap = new Map<string, ProtoError>([ 'cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError', ProgrammerIsRequiredForUploadError, ], + [ + 'cc.arduino.cli.commands.v1.InstanceNeedsReinitializationError', + InstanceNeedsReinitializationError, + ], // handle other cli defined errors here ]); export type ServiceError = StatusObject & Error; export namespace ServiceError { - export function isCancel(arg: unknown): arg is ServiceError & { code: 1 } { + export function isCancel( + arg: unknown + ): arg is ServiceError & { code: StatusCode.CANCELLED } { return is(arg) && arg.code === 1; // https://grpc.github.io/grpc/core/md_doc_statuscodes.html } + export function isInvalidArgument( + arg: unknown + ): arg is ServiceError & { code: StatusCode.INVALID_ARGUMENT } { + return is(arg) && arg.code === 3; // https://grpc.github.io/grpc/core/md_doc_statuscodes.html + } + export function is(arg: unknown): arg is ServiceError { return arg instanceof Error && isStatusObject(arg); } From 3fc8474d71f134264ded9cf1cb06610e961a3178 Mon Sep 17 00:00:00 2001 From: dankeboy36 <111981763+dankeboy36@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:43:04 +0100 Subject: [PATCH 345/384] fix: align `viewsWelcome` behavior to VS Code (#2543) * fix: align `viewsWelcome` behavior to VS Code Ref: eclipse-theia/theia#14309 Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix: update change proposal from Theia as is Ref: arduino/arduino-ide#2543 Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --------- Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- arduino-ide-extension/package.json | 1 + .../browser/arduino-ide-frontend-module.ts | 56 +++- .../theia/plugin-ext/tree-view-widget.tsx | 241 ++++++++++++++++++ .../src/node/arduino-ide-backend-module.ts | 11 +- .../theia/plugin-ext-vscode/scanner-vscode.ts | 44 ++++ 5 files changed, 351 insertions(+), 2 deletions(-) create mode 100644 arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx create mode 100644 arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 528dafcf2..de9c192ef 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -39,6 +39,7 @@ "@theia/outline-view": "1.41.0", "@theia/output": "1.41.0", "@theia/plugin-ext": "1.41.0", + "@theia/plugin-ext-vscode": "1.41.0", "@theia/preferences": "1.41.0", "@theia/scm": "1.41.0", "@theia/search-in-workspace": "1.41.0", 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 89b2b218d..2b170dd7b 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,9 @@ import '../../src/browser/style/index.css'; -import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { + Container, + ContainerModule, + interfaces, +} 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'; @@ -53,6 +57,8 @@ import { DockPanelRenderer as TheiaDockPanelRenderer, TabBarRendererFactory, ContextMenuRenderer, + createTreeContainer, + TreeWidget, } from '@theia/core/lib/browser'; import { MenuContribution } from '@theia/core/lib/common/menu'; import { @@ -372,6 +378,15 @@ import { DebugSessionWidget } from '@theia/debug/lib/browser/view/debug-session- import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget'; import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget'; import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; +import { + PluginTree, + PluginTreeModel, + TreeViewWidgetOptions, + VIEW_ITEM_CONTEXT_MENU, +} from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget'; +import { TreeViewDecoratorService } from '@theia/plugin-ext/lib/main/browser/view/tree-view-decorator-service'; +import { PLUGIN_VIEW_DATA_FACTORY_ID } from '@theia/plugin-ext/lib/main/browser/view/plugin-view-registry'; +import { TreeViewWidget } from './theia/plugin-ext/tree-view-widget'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -1082,4 +1097,43 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(TheiaTerminalFrontendContribution).toService( TerminalFrontendContribution ); + + bindViewsWelcome_TheiaGH14309({ bind, widget: TreeViewWidget }); }); + +// Align the viewsWelcome rendering with VS Code (https://github.com/eclipse-theia/theia/issues/14309) +// Copied from Theia code but with customized TreeViewWidget with the customized viewsWelcome rendering +// https://github.com/eclipse-theia/theia/blob/0c5f69455d9ee355b1a7ca510ffa63d2b20f0c77/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts#L159-L181 +function bindViewsWelcome_TheiaGH14309({ + bind, + widget, +}: { + bind: interfaces.Bind; + widget: interfaces.Newable<TreeWidget>; +}) { + bind(WidgetFactory) + .toDynamicValue(({ container }) => ({ + id: PLUGIN_VIEW_DATA_FACTORY_ID, + createWidget: (options: TreeViewWidgetOptions) => { + const props = { + contextMenuPath: VIEW_ITEM_CONTEXT_MENU, + expandOnlyOnExpansionToggleClick: true, + expansionTogglePadding: 22, + globalSelection: true, + leftPadding: 8, + search: true, + multiSelect: options.multiSelect, + }; + const child = createTreeContainer(container, { + props, + tree: PluginTree, + model: PluginTreeModel, + widget, + decoratorService: TreeViewDecoratorService, + }); + child.bind(TreeViewWidgetOptions).toConstantValue(options); + return child.get(TreeWidget); + }, + })) + .inSingletonScope(); +} diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx b/arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx new file mode 100644 index 000000000..dc83272c2 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx @@ -0,0 +1,241 @@ +import { LabelIcon } from '@theia/core/lib/browser/label-parser'; +import { OpenerService, open } from '@theia/core/lib/browser/opener-service'; +import { codicon } from '@theia/core/lib/browser/widgets/widget'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { URI } from '@theia/core/lib/common/uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import React from '@theia/core/shared/react'; +import { URI as CodeUri } from '@theia/core/shared/vscode-uri'; +import { TreeViewWidget as TheiaTreeViewWidget } from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget'; + +// Copied back from https://github.com/eclipse-theia/theia/pull/14391 +// Remove the patching when Arduino uses Eclipse Theia >1.55.0 +// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L37-L54 +// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L146-L298 + +interface ViewWelcome { + readonly view: string; + readonly content: string; + readonly when?: string; + readonly enablement?: string; + readonly order: number; +} + +export interface IItem { + readonly welcomeInfo: ViewWelcome; + visible: boolean; +} + +export interface ILink { + readonly label: string; + readonly href: string; + readonly title?: string; +} + +type LinkedTextItem = string | ILink; + +@injectable() +export class TreeViewWidget extends TheiaTreeViewWidget { + @inject(OpenerService) + private readonly openerService: OpenerService; + + private readonly toDisposeBeforeUpdateViewWelcomeNodes = + new DisposableCollection(); + + protected override updateViewWelcomeNodes(): void { + this.viewWelcomeNodes = []; + this.toDisposeBeforeUpdateViewWelcomeNodes.dispose(); + const items = this.visibleItems.sort((a, b) => a.order - b.order); + + const enablementKeys: Set<string>[] = []; + // the plugin-view-registry will push the changes when there is a change in the `when` prop which controls the visibility + // this listener is to update the enablement of the components in the view welcome + this.toDisposeBeforeUpdateViewWelcomeNodes.push( + this.contextService.onDidChange((event) => { + if (enablementKeys.some((keys) => event.affects(keys))) { + this.updateViewWelcomeNodes(); + this.update(); + } + }) + ); + // Note: VS Code does not support the `renderSecondaryButtons` prop in welcome content either. + for (const item of items) { + const { content } = item; + const enablement = isEnablementAware(item) ? item.enablement : undefined; + const itemEnablementKeys = enablement + ? this.contextService.parseKeys(enablement) + : undefined; + if (itemEnablementKeys) { + enablementKeys.push(itemEnablementKeys); + } + const lines = content.split('\n'); + + for (let line of lines) { + line = line.trim(); + + if (!line) { + continue; + } + + const linkedTextItems = this.parseLinkedText_patch14309(line); + + if ( + linkedTextItems.length === 1 && + typeof linkedTextItems[0] !== 'string' + ) { + const node = linkedTextItems[0]; + this.viewWelcomeNodes.push( + this.renderButtonNode_patch14309( + node, + this.viewWelcomeNodes.length, + enablement + ) + ); + } else { + const renderNode = (item: LinkedTextItem, index: number) => + typeof item == 'string' + ? this.renderTextNode_patch14309(item, index) + : this.renderLinkNode_patch14309(item, index, enablement); + + this.viewWelcomeNodes.push( + <p key={`p-${this.viewWelcomeNodes.length}`}> + {...linkedTextItems.flatMap(renderNode)} + </p> + ); + } + } + } + } + + private renderButtonNode_patch14309( + node: ILink, + lineKey: string | number, + enablement: string | undefined + ): React.ReactNode { + return ( + <div key={`line-${lineKey}`} className="theia-WelcomeViewButtonWrapper"> + <button + title={node.title} + className="theia-button theia-WelcomeViewButton" + disabled={!this.isEnabledClick_patch14309(enablement)} + onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)} + > + {node.label} + </button> + </div> + ); + } + + private renderTextNode_patch14309( + node: string, + textKey: string | number + ): React.ReactNode { + return ( + <span key={`text-${textKey}`}> + {this.labelParser + .parse(node) + .map((segment, index) => + LabelIcon.is(segment) ? ( + <span key={index} className={codicon(segment.name)} /> + ) : ( + <span key={index}>{segment}</span> + ) + )} + </span> + ); + } + + private renderLinkNode_patch14309( + node: ILink, + linkKey: string | number, + enablement: string | undefined + ): React.ReactNode { + return ( + <a + key={`link-${linkKey}`} + className={this.getLinkClassName_patch14309(node.href, enablement)} + title={node.title || ''} + onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)} + > + {node.label} + </a> + ); + } + + private getLinkClassName_patch14309( + href: string, + enablement: string | undefined + ): string { + const classNames = ['theia-WelcomeViewCommandLink']; + // Only command-backed links can be disabled. All other, https:, file: remain enabled + if ( + href.startsWith('command:') && + !this.isEnabledClick_patch14309(enablement) + ) { + classNames.push('disabled'); + } + return classNames.join(' '); + } + + private isEnabledClick_patch14309(enablement: string | undefined): boolean { + return typeof enablement === 'string' + ? this.contextService.match(enablement) + : true; + } + + private openLinkOrCommand_patch14309 = ( + event: React.MouseEvent, + value: string + ): void => { + event.stopPropagation(); + + if (value.startsWith('command:')) { + const command = value.replace('command:', ''); + this.commands.executeCommand(command); + } else if (value.startsWith('file:')) { + const uri = value.replace('file:', ''); + open(this.openerService, new URI(CodeUri.file(uri).toString())); + } else { + this.windowService.openNewWindow(value, { external: true }); + } + }; + + private parseLinkedText_patch14309(text: string): LinkedTextItem[] { + const result: LinkedTextItem[] = []; + + const linkRegex = + /\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi; + let index = 0; + let match: RegExpExecArray | null; + + while ((match = linkRegex.exec(text))) { + if (match.index - index > 0) { + result.push(text.substring(index, match.index)); + } + + const [, label, href, , title] = match; + + if (title) { + result.push({ label, href, title }); + } else { + result.push({ label, href }); + } + + index = match.index + match[0].length; + } + + if (index < text.length) { + result.push(text.substring(index)); + } + + return result; + } +} + +interface EnablementAware { + readonly enablement: string | undefined; +} + +function isEnablementAware(arg: unknown): arg is EnablementAware { + return !!arg && typeof arg === 'object' && 'enablement' in arg; +} 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 02d534044..4eb572b3b 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -116,12 +116,16 @@ 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'; import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader'; -import { PluginDeployer } from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { + PluginDeployer, + PluginScanner, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; import { LocalDirectoryPluginDeployerResolverWithFallback, PluginDeployer_GH_12064, } from './theia/plugin-ext/plugin-deployer'; import { SettingsReader } from './settings-reader'; +import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -410,6 +414,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(PluginDeployer).to(PluginDeployer_GH_12064).inSingletonScope(); bind(SettingsReader).toSelf().inSingletonScope(); + + // To read the enablement property of the viewsWelcome + // https://github.com/eclipse-theia/theia/issues/14309 + bind(VsCodePluginScanner).toSelf().inSingletonScope(); + rebind(PluginScanner).toService(VsCodePluginScanner); }); function bindChildLogger(bind: interfaces.Bind, name: string): void { diff --git a/arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts b/arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts new file mode 100644 index 000000000..0fd68c9b4 --- /dev/null +++ b/arduino-ide-extension/src/node/theia/plugin-ext-vscode/scanner-vscode.ts @@ -0,0 +1,44 @@ +import { injectable, postConstruct } from '@theia/core/shared/inversify'; +import { VsCodePluginScanner as TheiaVsCodePluginScanner } from '@theia/plugin-ext-vscode/lib/node/scanner-vscode'; +import { + PluginPackageViewWelcome, + ViewWelcome, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; + +@injectable() +export class VsCodePluginScanner extends TheiaVsCodePluginScanner { + @postConstruct() + protected init(): void { + this['readViewWelcome'] = ( + rawViewWelcome: PluginPackageViewWelcome, + pluginViewsIds: string[] + ) => { + const result = { + view: rawViewWelcome.view, + content: rawViewWelcome.contents, + when: rawViewWelcome.when, + // if the plugin contributes Welcome view to its own view - it will be ordered first + order: + pluginViewsIds.findIndex((v) => v === rawViewWelcome.view) > -1 + ? 0 + : 1, + }; + return maybeSetEnablement(rawViewWelcome, result); + }; + } +} + +// This is not yet supported by Theia but available in Code (https://github.com/microsoft/vscode/issues/114304) +function maybeSetEnablement( + rawViewWelcome: PluginPackageViewWelcome, + result: ViewWelcome +) { + const enablement = + 'enablement' in rawViewWelcome && + typeof rawViewWelcome['enablement'] === 'string' && + rawViewWelcome['enablement']; + if (enablement) { + Object.assign(result, { enablement }); + } + return result; +} From 4189b086de8f0dcbe46b60b06de7c2060c00503a Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:13:28 +0100 Subject: [PATCH 346/384] fix: update `yarn.lock` --- yarn.lock | 273 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 173 insertions(+), 100 deletions(-) diff --git a/yarn.lock b/yarn.lock index ae52d6e5b..f70c3a914 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,6 +35,15 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" +"@babel/code-frame@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" @@ -71,6 +80,17 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== + dependencies: + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@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" @@ -232,11 +252,21 @@ 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-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" @@ -274,6 +304,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" 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.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" @@ -938,6 +975,15 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/traverse@^7.23.0": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" @@ -954,6 +1000,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.23.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" @@ -963,6 +1022,14 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@develar/schema-utils@~2.6.5": version "2.6.5" resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" @@ -1244,6 +1311,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" @@ -1254,6 +1330,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@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" @@ -1275,6 +1356,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@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" @@ -1399,35 +1488,35 @@ semver "^7.3.5" tar "^6.1.11" -"@msgpackr-extract/msgpackr-extract-darwin-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz#901c5937e1441572ea23e631fe6deca68482fe76" - integrity sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ== +"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11" + integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw== -"@msgpackr-extract/msgpackr-extract-darwin-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz#fb877fe6bae3c4d3cea29786737840e2ae689066" - integrity sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw== +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855" + integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw== -"@msgpackr-extract/msgpackr-extract-linux-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz#986179c38b10ac41fbdaf7d036c825cbc72855d9" - integrity sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA== +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb" + integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg== -"@msgpackr-extract/msgpackr-extract-linux-arm@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz#15f2c6fe9e0adc06c21af7e95f484ff4880d79ce" - integrity sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg== +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159" + integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw== -"@msgpackr-extract/msgpackr-extract-linux-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz#30cae5c9a202f3e1fa1deb3191b18ffcb2f239a2" - integrity sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw== +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3" + integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg== -"@msgpackr-extract/msgpackr-extract-win32-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz#016d855b6bc459fd908095811f6826e45dd4ba64" - integrity sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA== +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242" + integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3195,11 +3284,6 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== -"@types/tough-cookie@^4.0.0": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" - integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== - "@types/trusted-types@*": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" @@ -4157,21 +4241,6 @@ available-typed-arrays@^1.0.6: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== -axios-cookiejar-support@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz#7b32af7d932508546c68b1fc5ba8f562884162e1" - integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== - dependencies: - is-redirect "^1.0.0" - pify "^5.0.0" - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@^1.0.0: version "1.6.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" @@ -4181,6 +4250,15 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.7, axios@^1.7.4: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + 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" @@ -6957,16 +7035,16 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -follow-redirects@^1.14.0: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - follow-redirects@^1.15.4: version "1.15.5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" @@ -8054,7 +8132,7 @@ ip-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^2.0.0: +ip@^2.0.0, ip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== @@ -8302,11 +8380,6 @@ is-potential-custom-element-name@^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" - integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -8589,6 +8662,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -9894,26 +9972,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.0.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz#4bb749b58d9764cfdc0d91c7977a007b08e8f262" - integrity sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog== +msgpackr-extract@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz#e9d87023de39ce714872f9e9504e3c1996d61012" + integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== dependencies: - node-gyp-build-optional-packages "5.0.3" + node-gyp-build-optional-packages "5.2.2" optionalDependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-arm" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-x64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-win32-x64" "2.2.0" - -msgpackr@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.6.1.tgz#4f3c94d6a5b819b838ffc736eddaf60eba436d20" - integrity sha512-Je+xBEfdjtvA4bKaOv8iRhjC8qX2oJwpYH4f7JrG4uMVJVmnmkAT4pjKdbztKprGj3iwjcxPzb5umVZ02Qq3tA== + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" + +msgpackr@1.6.1, msgpackr@^1.10.1: + version "1.11.2" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.2.tgz#4463b7f7d68f2e24865c395664973562ad24473d" + integrity sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g== optionalDependencies: - msgpackr-extract "^2.0.2" + msgpackr-extract "^3.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -9954,16 +10032,14 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nano@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/nano/-/nano-9.0.5.tgz#2b767819f612907a3ac09b21f2929d4097407262" - integrity sha512-fEAhwAdXh4hDDnC8cYJtW6D8ivOmpvFAqT90+zEuQREpRkzA/mJPcI4EKv15JUdajaqiLTXNoKK6PaRF+/06DQ== +nano@^10.1.3, nano@^9.0.5: + version "10.1.4" + resolved "https://registry.yarnpkg.com/nano/-/nano-10.1.4.tgz#cb4cabd677733ddb81c88c1b8635101e2d84e926" + integrity sha512-bJOFIPLExIbF6mljnfExXX9Cub4W0puhDjVMp+qV40xl/DBvgKao7St4+6/GB6EoHZap7eFnrnx4mnp5KYgwJA== dependencies: - "@types/tough-cookie" "^4.0.0" - axios "^0.21.1" - axios-cookiejar-support "^1.0.1" - qs "^6.9.4" - tough-cookie "^4.0.0" + axios "^1.7.4" + node-abort-controller "^3.1.1" + qs "^6.13.0" nanoid@3.3.3: version "3.3.3" @@ -10044,6 +10120,11 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" @@ -10094,10 +10175,12 @@ node-fetch@^3.2.10: fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" -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-gyp-build-optional-packages@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4" + integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== + dependencies: + detect-libc "^2.0.1" node-gyp-build@^4.2.1: version "4.6.1" @@ -10975,7 +11058,7 @@ 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@5.0.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== @@ -11352,10 +11435,10 @@ qs@^6.10.1, qs@^6.10.3, qs@^6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.9.4: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +qs@^6.13.0: + version "6.13.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" + integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== dependencies: side-channel "^1.0.6" @@ -13130,16 +13213,6 @@ token-types@^5.0.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -tough-cookie@^4.0.0: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - tough-cookie@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" From 8773bd67ab5f5c15a6b8dc3f2f9c6131533be5b5 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:47:24 +0100 Subject: [PATCH 347/384] fix: use missing `google` proto files in CLI --- .../scripts/generate-protocol.js | 159 +++++++++++------- 1 file changed, 102 insertions(+), 57 deletions(-) diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index 9857e597f..68a92c026 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -6,11 +6,10 @@ const { mkdirSync, promises: fs, rmSync } = require('node:fs'); const { exec } = require('./utils'); const { glob } = require('glob'); - const { SemVer, gte, valid: validSemVer } = require('semver'); + const { SemVer, gte, valid: validSemVer, gt } = require('semver'); // Use a node-protoc fork until apple arm32 is supported // https://github.com/YePpHa/node-protoc/pull/10 const protoc = path.dirname(require('@pingghost/protoc/protoc')); - const repository = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); const { owner, repo, commitish } = (() => { const pkg = require(path.join(__dirname, '..', 'package.json')); @@ -57,11 +56,6 @@ return { owner, repo, commitish }; })(); - const url = `https://github.com/${owner}/${repo}.git`; - console.log(`>>> Cloning repository from '${url}'...`); - exec('git', ['clone', url, repository], { logStdout: true }); - console.log(`<<< Repository cloned.`); - const { platform } = process; const resourcesFolder = path.join( __dirname, @@ -87,59 +81,90 @@ // - `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" - } - */ + { + "Application": "arduino-cli", + "VersionString": "nightly-20210126", + "Commit": "079bb6c6", + "Status": "alpha", + "Date": "2021-01-26T01:46:31Z" + } + */ const versionObject = JSON.parse(versionJson); - let version = versionObject.VersionString; - if (validSemVer(version)) { - // https://github.com/arduino/arduino-cli/pull/2374 - if (gte(new SemVer(version, { loose: true }), new SemVer('0.35.0-rc.1'))) { - version = `v${version}`; + const version = versionObject.VersionString; + + // Clone the repository and check out the tagged version + // Return folder with proto files + async function getProtoPath(forceCliVersion) { + const repository = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); + + const url = `https://github.com/${owner}/${repo}.git`; + console.log(`>>> Cloning repository from '${url}'...`); + exec('git', ['clone', url, repository], { logStdout: true }); + console.log(`<<< Repository cloned.`); + + let cliVersion = forceCliVersion || version; + if (validSemVer(cliVersion)) { + // https://github.com/arduino/arduino-cli/pull/2374 + if ( + gte(new SemVer(version, { loose: true }), new SemVer('0.35.0-rc.1')) + ) { + cliVersion = `v${cliVersion}`; + } + console.log(`>>> Checking out tagged version: '${cliVersion}'...`); + exec('git', ['-C', repository, 'fetch', '--all', '--tags'], { + logStdout: true, + }); + exec( + 'git', + ['-C', repository, 'checkout', `tags/${cliVersion}`, '-b', cliVersion], + { logStdout: true } + ); + console.log(`<<< Checked out tagged version: '${cliVersion}'.`); + } else if (forceCliVersion) { + console.log(`WARN: invalid semver: '${forceCliVersion}'.`); + // If the forced version is invalid, do not proceed with fallbacks. + return undefined; + } else if (commitish) { + console.log( + `>>> Checking out commitish from 'package.json': '${commitish}'...` + ); + exec('git', ['-C', repository, 'checkout', commitish], { + logStdout: true, + }); + console.log( + `<<< Checked out commitish from 'package.json': '${commitish}'.` + ); + } else if (versionObject.Commit) { + console.log( + `>>> Checking out commitish from the CLI: '${versionObject.Commit}'...` + ); + exec('git', ['-C', repository, 'checkout', versionObject.Commit], { + logStdout: true, + }); + console.log( + `<<< Checked out commitish from the CLI: '${versionObject.Commit}'.` + ); + } else { + console.log( + `WARN: no 'git checkout'. Generating from the HEAD revision.` + ); } - console.log(`>>> Checking out tagged version: '${version}'...`); - exec('git', ['-C', repository, 'fetch', '--all', '--tags'], { - logStdout: true, - }); - exec( - 'git', - ['-C', repository, 'checkout', `tags/${version}`, '-b', version], - { logStdout: true } - ); - console.log(`<<< Checked out tagged version: '${version}'.`); - } else if (commitish) { - console.log( - `>>> Checking out commitish from 'package.json': '${commitish}'...` - ); - exec('git', ['-C', repository, 'checkout', commitish], { logStdout: true }); - console.log( - `<<< Checked out commitish from 'package.json': '${commitish}'.` - ); - } else if (versionObject.Commit) { - console.log( - `>>> Checking out commitish from the CLI: '${versionObject.Commit}'...` - ); - exec('git', ['-C', repository, 'checkout', versionObject.Commit], { - logStdout: true, - }); - console.log( - `<<< Checked out commitish from the CLI: '${versionObject.Commit}'.` - ); - } else { - console.log(`WARN: no 'git checkout'. Generating from the HEAD revision.`); + + return path.join(repository, 'rpc'); + } + + const protoPath = await getProtoPath(); + + if (!protoPath) { + console.log(`Could not find the proto files folder.`); + process.exit(1); } console.log('>>> Generating TS/JS API from:'); - exec('git', ['-C', repository, 'rev-parse', '--abbrev-ref', 'HEAD'], { + exec('git', ['-C', protoPath, 'rev-parse', '--abbrev-ref', 'HEAD'], { logStdout: true, }); - const rpc = path.join(repository, 'rpc'); const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol'); // Must wipe the gen output folder. Otherwise, dangling service implementation remain in IDE2 code, // although it has been removed from the proto file. @@ -147,16 +172,36 @@ rmSync(out, { recursive: true, maxRetries: 5, force: true }); mkdirSync(out, { recursive: true }); + if (gt(new SemVer(version, { loose: true }), new SemVer('1.0.4'))) { + // Patch for https://github.com/arduino/arduino-cli/issues/2755 + // Credit https://github.com/dankeboy36/ardunno-cli-gen/pull/9/commits/64a5ac89aae605249261c8ceff7255655ecfafca + // Download the 1.0.4 version and use the missing google/rpc/status.proto file. + console.log('<<< Generating missing google proto files'); + const v104ProtoPath = await getProtoPath('1.0.4'); + if (!v104ProtoPath) { + console.log(`Could not find the proto files folder for version 1.0.4.`); + process.exit(1); + } + await fs.cp( + path.join(v104ProtoPath, 'google'), + path.join(protoPath, 'google'), + { + recursive: true, + } + ); + console.log(`>>> Generated missing google file`); + } + let protos = []; try { - const matches = await glob('**/*.proto', { cwd: rpc }); - protos = matches.map((filename) => path.join(rpc, filename)); + const matches = await glob('**/*.proto', { cwd: protoPath }); + protos = matches.map((filename) => path.join(protoPath, filename)); } catch (error) { console.log(error.stack ?? error.message); } if (!protos || protos.length === 0) { - console.log(`Could not find any .proto files under ${rpc}.`); + console.log(`Could not find any .proto files under ${protoPath}.`); process.exit(1); } @@ -167,7 +212,7 @@ `--js_out=import_style=commonjs,binary:${out}`, `--grpc_out=generate_package_definition:${out}`, '-I', - rpc, + protoPath, ...protos, ], { logStdout: true } @@ -186,7 +231,7 @@ )}`, `--ts_out=generate_package_definition:${out}`, '-I', - rpc, + protoPath, ...protos, ], { logStdout: true } From d1065886efd7f1867b289c51797a98a3f428a395 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:51:54 +0100 Subject: [PATCH 348/384] feat: use Arduino CLI 1.1.0 --- arduino-ide-extension/package.json | 2 +- .../src/browser/contributions/debug.ts | 4 +- .../src/common/protocol/sketches-service.ts | 3 +- .../cli/commands/v1/commands_grpc_pb.d.ts | 8 +- .../cli/commands/v1/commands_grpc_pb.js | 52 +- .../arduino/cli/commands/v1/commands_pb.d.ts | 8 +- .../cc/arduino/cli/commands/v1/commands_pb.js | 16 +- .../cc/arduino/cli/commands/v1/common_pb.d.ts | 63 +++ .../cc/arduino/cli/commands/v1/common_pb.js | 530 +++++++++++++++++- .../cc/arduino/cli/commands/v1/debug_pb.d.ts | 10 + .../cc/arduino/cli/commands/v1/debug_pb.js | 120 +++- .../arduino/cli/commands/v1/monitor_pb.d.ts | 63 +-- .../cc/arduino/cli/commands/v1/monitor_pb.js | 394 +------------ .../cc/arduino/cli/commands/v1/upload_pb.d.ts | 15 + .../cc/arduino/cli/commands/v1/upload_pb.js | 180 +++++- .../src/node/monitor-service.ts | 6 +- .../src/node/sketches-service-impl.ts | 79 ++- .../test/node/core-service-impl.slow-test.ts | 2 +- 18 files changed, 1035 insertions(+), 520 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index de9c192ef..d900bfbfb 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -171,7 +171,7 @@ ], "arduino": { "arduino-cli": { - "version": "1.0.4" + "version": "1.1.0" }, "arduino-fwuploader": { "version": "2.4.1" diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index e94755c46..93dd2aa51 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -289,8 +289,8 @@ export class Debug ): Promise<boolean> { if (err instanceof Error) { try { - const tempBuildPaths = await this.sketchesService.tempBuildPath(sketch); - return tempBuildPaths.some((tempBuildPath) => + const buildPaths = await this.sketchesService.getBuildPath(sketch); + return buildPaths.some((tempBuildPath) => err.message.includes(tempBuildPath) ); } catch { diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 4cc253d79..fa009e22f 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -141,13 +141,14 @@ export interface SketchesService { /** * This is the JS/TS re-implementation of [`GenBuildPath`](https://github.com/arduino/arduino-cli/blob/c0d4e4407d80aabad81142693513b3306759cfa6/arduino/sketch/sketch.go#L296-L306) of the CLI. * Pass in a sketch and get the build temporary folder filesystem path calculated from the main sketch file location. Can be multiple ones. This method does not check the existence of the sketch. + * Since CLI v1.1.0 the default sketch folder is the os user cache dir. See https://github.com/arduino/arduino-cli/pull/2673/commits/d2ffeb06ca6360a211d5aa7ddd11505212ffb1b9 * * The case sensitivity of the drive letter on Windows matters when the CLI calculates the MD5 hash of the temporary build folder. * IDE2 does not know and does not want to rely on how the CLI treats the paths: with lowercase or uppercase drive letters. * Hence, IDE2 has to provide multiple build paths on Windows. This hack will be obsolete when the CLI can provide error codes: * https://github.com/arduino/arduino-cli/issues/1762. */ - tempBuildPath(sketch: SketchRef): Promise<string[]>; + getBuildPath(sketch: SketchRef): Promise<string[]>; } export interface SketchRef { 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 993a3cd0f..c267fec60 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 @@ -6,16 +6,16 @@ import * as grpc from "@grpc/grpc-js"; import * as cc_arduino_cli_commands_v1_commands_pb from "../../../../../cc/arduino/cli/commands/v1/commands_pb"; -import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_board_pb from "../../../../../cc/arduino/cli/commands/v1/board_pb"; +import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_compile_pb from "../../../../../cc/arduino/cli/commands/v1/compile_pb"; import * as cc_arduino_cli_commands_v1_core_pb from "../../../../../cc/arduino/cli/commands/v1/core_pb"; import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/cli/commands/v1/debug_pb"; -import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; -import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; +import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; import * as cc_arduino_cli_commands_v1_settings_pb from "../../../../../cc/arduino/cli/commands/v1/settings_pb"; +import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; +import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> { create: IArduinoCoreServiceService_ICreate; 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 4decb58e0..17ea5b8c4 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 @@ -19,16 +19,16 @@ // 'use strict'; var cc_arduino_cli_commands_v1_commands_pb = require('../../../../../cc/arduino/cli/commands/v1/commands_pb.js'); -var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); var cc_arduino_cli_commands_v1_board_pb = require('../../../../../cc/arduino/cli/commands/v1/board_pb.js'); +var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); var cc_arduino_cli_commands_v1_compile_pb = require('../../../../../cc/arduino/cli/commands/v1/compile_pb.js'); var cc_arduino_cli_commands_v1_core_pb = require('../../../../../cc/arduino/cli/commands/v1/core_pb.js'); var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli/commands/v1/debug_pb.js'); -var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); -var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); +var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/cli/commands/v1/settings_pb.js'); +var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); +var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); function serialize_cc_arduino_cli_commands_v1_ArchiveSketchRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_commands_pb.ArchiveSketchRequest)) { @@ -1109,9 +1109,9 @@ function deserialize_cc_arduino_cli_commands_v1_ZipLibraryInstallResponse(buffer } -// The main Arduino Platform service API +// The main Arduino Platform service API. var ArduinoCoreServiceService = exports['cc.arduino.cli.commands.v1.ArduinoCoreService'] = { - // Create a new Arduino Core instance + // Create a new Arduino Core instance. create: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Create', requestStream: false, @@ -1124,7 +1124,7 @@ create: { responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CreateResponse, }, // Initializes an existing Arduino Core instance by loading platforms and -// libraries +// libraries. init: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Init', requestStream: false, @@ -1136,7 +1136,7 @@ init: { responseSerialize: serialize_cc_arduino_cli_commands_v1_InitResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_InitResponse, }, - // Destroy an instance of the Arduino Core Service + // Destroy an instance of the Arduino Core Service. destroy: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Destroy', requestStream: false, @@ -1148,7 +1148,7 @@ destroy: { responseSerialize: serialize_cc_arduino_cli_commands_v1_DestroyResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_DestroyResponse, }, - // Update package index of the Arduino Core Service + // Update package index of the Arduino Core Service. updateIndex: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateIndex', requestStream: false, @@ -1160,7 +1160,7 @@ updateIndex: { responseSerialize: serialize_cc_arduino_cli_commands_v1_UpdateIndexResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_UpdateIndexResponse, }, - // Update libraries index + // Update libraries index. updateLibrariesIndex: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/UpdateLibrariesIndex', requestStream: false, @@ -1184,7 +1184,7 @@ version: { responseSerialize: serialize_cc_arduino_cli_commands_v1_VersionResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_VersionResponse, }, - // Create a new Sketch + // Create a new Sketch. newSketch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/NewSketch', requestStream: false, @@ -1196,7 +1196,7 @@ newSketch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_NewSketchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_NewSketchResponse, }, - // Returns all files composing a Sketch + // Returns all files composing a Sketch. loadSketch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/LoadSketch', requestStream: false, @@ -1208,7 +1208,7 @@ loadSketch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_LoadSketchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_LoadSketchResponse, }, - // Creates a zip file containing all files of specified Sketch + // Creates a zip file containing all files of specified Sketch. archiveSketch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ArchiveSketch', requestStream: false, @@ -1234,10 +1234,7 @@ setSketchDefaults: { responseSerialize: serialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SetSketchDefaultsResponse, }, - // BOARD COMMANDS -// -------------- -// -// Requests details about a board + // Requests details about a board. boardDetails: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardDetails', requestStream: false, @@ -1469,7 +1466,7 @@ libraryUpgrade: { responseSerialize: serialize_cc_arduino_cli_commands_v1_LibraryUpgradeResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_LibraryUpgradeResponse, }, - // Install a library from a Zip File + // Install a library from a Zip File. zipLibraryInstall: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ZipLibraryInstall', requestStream: false, @@ -1481,7 +1478,7 @@ zipLibraryInstall: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ZipLibraryInstallResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ZipLibraryInstallResponse, }, - // Download and install a library from a git url + // Download and install a library from a git url. gitLibraryInstall: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/GitLibraryInstall', requestStream: false, @@ -1554,7 +1551,7 @@ libraryList: { responseSerialize: serialize_cc_arduino_cli_commands_v1_LibraryListResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_LibraryListResponse, }, - // Open a monitor connection to a board port + // Open a monitor connection to a board port. monitor: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/Monitor', requestStream: true, @@ -1566,7 +1563,7 @@ monitor: { responseSerialize: serialize_cc_arduino_cli_commands_v1_MonitorResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_MonitorResponse, }, - // Returns the parameters that can be set in the MonitorRequest calls + // Returns the parameters that can be set in the MonitorRequest calls. enumerateMonitorPortSettings: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/EnumerateMonitorPortSettings', requestStream: false, @@ -1638,7 +1635,7 @@ cleanDownloadCacheDirectory: { responseSerialize: serialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_CleanDownloadCacheDirectoryResponse, }, - // Writes the settings currently stored in memory in a YAML file + // Writes the settings currently stored in memory in a YAML file. configurationSave: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationSave', requestStream: false, @@ -1650,7 +1647,7 @@ configurationSave: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationSaveResponse, }, - // Read the settings from a YAML file + // Read the settings from a YAML file. configurationOpen: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationOpen', requestStream: false, @@ -1662,7 +1659,8 @@ configurationOpen: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationOpenResponse, }, - configurationGet: { + // Get the current configuration. +configurationGet: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/ConfigurationGet', requestStream: false, responseStream: false, @@ -1673,7 +1671,7 @@ configurationOpen: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ConfigurationGetResponse, }, - // Enumerate all the keys/values pairs available in the configuration + // Enumerate all the keys/values pairs available in the configuration. settingsEnumerate: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsEnumerate', requestStream: false, @@ -1685,7 +1683,7 @@ settingsEnumerate: { responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsEnumerateResponse, }, - // Get a single configuration value + // Get a single configuration value. settingsGetValue: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsGetValue', requestStream: false, @@ -1697,7 +1695,7 @@ settingsGetValue: { responseSerialize: serialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_SettingsGetValueResponse, }, - // Set a single configuration value + // Set a single configuration value. settingsSetValue: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/SettingsSetValue', requestStream: false, 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 53107cc5a..f8f4155ca 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.d.ts @@ -5,16 +5,16 @@ /* eslint-disable */ import * as jspb from "google-protobuf"; -import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; -import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_board_pb from "../../../../../cc/arduino/cli/commands/v1/board_pb"; +import * as cc_arduino_cli_commands_v1_common_pb from "../../../../../cc/arduino/cli/commands/v1/common_pb"; import * as cc_arduino_cli_commands_v1_compile_pb from "../../../../../cc/arduino/cli/commands/v1/compile_pb"; import * as cc_arduino_cli_commands_v1_core_pb from "../../../../../cc/arduino/cli/commands/v1/core_pb"; import * as cc_arduino_cli_commands_v1_debug_pb from "../../../../../cc/arduino/cli/commands/v1/debug_pb"; -import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; -import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; import * as cc_arduino_cli_commands_v1_lib_pb from "../../../../../cc/arduino/cli/commands/v1/lib_pb"; +import * as cc_arduino_cli_commands_v1_monitor_pb from "../../../../../cc/arduino/cli/commands/v1/monitor_pb"; import * as cc_arduino_cli_commands_v1_settings_pb from "../../../../../cc/arduino/cli/commands/v1/settings_pb"; +import * as cc_arduino_cli_commands_v1_upload_pb from "../../../../../cc/arduino/cli/commands/v1/upload_pb"; +import * as google_rpc_status_pb from "../../../../../google/rpc/status_pb"; export class CreateRequest extends jspb.Message { 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 b3ba4786b..447cb5f9c 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_pb.js @@ -21,26 +21,26 @@ var global = (function() { return Function('return this')(); }.call(null)); -var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); -goog.object.extend(proto, google_rpc_status_pb); -var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_board_pb = require('../../../../../cc/arduino/cli/commands/v1/board_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_board_pb); +var cc_arduino_cli_commands_v1_common_pb = require('../../../../../cc/arduino/cli/commands/v1/common_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_common_pb); var cc_arduino_cli_commands_v1_compile_pb = require('../../../../../cc/arduino/cli/commands/v1/compile_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_compile_pb); var cc_arduino_cli_commands_v1_core_pb = require('../../../../../cc/arduino/cli/commands/v1/core_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_core_pb); var cc_arduino_cli_commands_v1_debug_pb = require('../../../../../cc/arduino/cli/commands/v1/debug_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_debug_pb); -var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_monitor_pb); -var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); -goog.object.extend(proto, cc_arduino_cli_commands_v1_upload_pb); var cc_arduino_cli_commands_v1_lib_pb = require('../../../../../cc/arduino/cli/commands/v1/lib_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_lib_pb); +var cc_arduino_cli_commands_v1_monitor_pb = require('../../../../../cc/arduino/cli/commands/v1/monitor_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_monitor_pb); var cc_arduino_cli_commands_v1_settings_pb = require('../../../../../cc/arduino/cli/commands/v1/settings_pb.js'); goog.object.extend(proto, cc_arduino_cli_commands_v1_settings_pb); +var cc_arduino_cli_commands_v1_upload_pb = require('../../../../../cc/arduino/cli/commands/v1/upload_pb.js'); +goog.object.extend(proto, cc_arduino_cli_commands_v1_upload_pb); +var google_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); +goog.object.extend(proto, google_rpc_status_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.CheckForArduinoCLIUpdatesRequest', null, global); 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 5cfa42a8a..114e96560 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts @@ -471,6 +471,11 @@ export class Sketch extends jspb.Message { getDefaultProgrammer(): string; setDefaultProgrammer(value: string): Sketch; + hasDefaultPortConfig(): boolean; + clearDefaultPortConfig(): void; + getDefaultPortConfig(): MonitorPortConfiguration | undefined; + setDefaultPortConfig(value?: MonitorPortConfiguration): Sketch; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Sketch.AsObject; static toObject(includeInstance: boolean, msg: Sketch): Sketch.AsObject; @@ -494,6 +499,52 @@ export namespace Sketch { profilesList: Array<SketchProfile.AsObject>, defaultProfile?: SketchProfile.AsObject, defaultProgrammer: string, + defaultPortConfig?: MonitorPortConfiguration.AsObject, + } +} + +export class MonitorPortConfiguration extends jspb.Message { + clearSettingsList(): void; + getSettingsList(): Array<MonitorPortSetting>; + setSettingsList(value: Array<MonitorPortSetting>): MonitorPortConfiguration; + addSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MonitorPortConfiguration.AsObject; + static toObject(includeInstance: boolean, msg: MonitorPortConfiguration): MonitorPortConfiguration.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MonitorPortConfiguration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MonitorPortConfiguration; + static deserializeBinaryFromReader(message: MonitorPortConfiguration, reader: jspb.BinaryReader): MonitorPortConfiguration; +} + +export namespace MonitorPortConfiguration { + export type AsObject = { + settingsList: Array<MonitorPortSetting.AsObject>, + } +} + +export class MonitorPortSetting extends jspb.Message { + getSettingId(): string; + setSettingId(value: string): MonitorPortSetting; + getValue(): string; + setValue(value: string): MonitorPortSetting; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MonitorPortSetting.AsObject; + static toObject(includeInstance: boolean, msg: MonitorPortSetting): MonitorPortSetting.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MonitorPortSetting, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MonitorPortSetting; + static deserializeBinaryFromReader(message: MonitorPortSetting, reader: jspb.BinaryReader): MonitorPortSetting; +} + +export namespace MonitorPortSetting { + export type AsObject = { + settingId: string, + value: string, } } @@ -504,6 +555,15 @@ export class SketchProfile extends jspb.Message { setFqbn(value: string): SketchProfile; getProgrammer(): string; setProgrammer(value: string): SketchProfile; + getPort(): string; + setPort(value: string): SketchProfile; + + hasPortConfig(): boolean; + clearPortConfig(): void; + getPortConfig(): MonitorPortConfiguration | undefined; + setPortConfig(value?: MonitorPortConfiguration): SketchProfile; + getProtocol(): string; + setProtocol(value: string): SketchProfile; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SketchProfile.AsObject; @@ -520,5 +580,8 @@ export namespace SketchProfile { name: string, fqbn: string, programmer: string, + port: string, + portConfig?: MonitorPortConfiguration.AsObject, + protocol: string, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js index 79d1e7660..0b959a33e 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js @@ -31,6 +31,8 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.HelpResources', null, global goog.exportSymbol('proto.cc.arduino.cli.commands.v1.InstalledPlatformReference', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Instance', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MissingProgrammerError', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSetting', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.Platform', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformMetadata', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.PlatformRelease', null, global); @@ -375,6 +377,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.Sketch.displayName = 'proto.cc.arduino.cli.commands.v1.Sketch'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortSetting, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortSetting'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -3553,7 +3597,8 @@ proto.cc.arduino.cli.commands.v1.Sketch.toObject = function(includeInstance, msg profilesList: jspb.Message.toObjectList(msg.getProfilesList(), proto.cc.arduino.cli.commands.v1.SketchProfile.toObject, includeInstance), defaultProfile: (f = msg.getDefaultProfile()) && proto.cc.arduino.cli.commands.v1.SketchProfile.toObject(includeInstance, f), - defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 11, "") + defaultProgrammer: jspb.Message.getFieldWithDefault(msg, 11, ""), + defaultPortConfig: (f = msg.getDefaultPortConfig()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f) }; if (includeInstance) { @@ -3636,6 +3681,11 @@ proto.cc.arduino.cli.commands.v1.Sketch.deserializeBinaryFromReader = function(m var value = /** @type {string} */ (reader.readString()); msg.setDefaultProgrammer(value); break; + case 12: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setDefaultPortConfig(value); + break; default: reader.skipField(); break; @@ -3744,6 +3794,14 @@ proto.cc.arduino.cli.commands.v1.Sketch.serializeBinaryToWriter = function(messa f ); } + f = message.getDefaultPortConfig(); + if (f != null) { + writer.writeMessage( + 12, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + ); + } }; @@ -4041,6 +4099,363 @@ proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultProgrammer = functio }; +/** + * optional MonitorPortConfiguration default_port_config = 12; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.getDefaultPortConfig = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 12)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this +*/ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.setDefaultPortConfig = function(value) { + return jspb.Message.setWrapperField(this, 12, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.Sketch} returns this + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.clearDefaultPortConfig = function() { + return this.setDefaultPortConfig(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Sketch.prototype.hasDefaultPortConfig = function() { + return jspb.Message.getField(this, 12) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.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.MonitorPortConfiguration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject = function(includeInstance, msg) { + var f, obj = { + settingsList: jspb.Message.toObjectList(msg.getSettingsList(), + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader); + msg.addSettings(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.MonitorPortConfiguration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.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.MonitorPortConfiguration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSettingsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated MonitorPortSetting settings = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.getSettingsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, 1)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this +*/ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.setSettingsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.addSettings = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.clearSettingsList = function() { + return this.setSettingsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject = function(includeInstance, msg) { + var f, obj = { + settingId: jspb.Message.getFieldWithDefault(msg, 1, ""), + value: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; + return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setSettingId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSettingId(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getValue(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string setting_id = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getSettingId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setSettingId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string value = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this + */ +proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setValue = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + @@ -4075,7 +4490,10 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.toObject = function(includeInstan var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), - programmer: jspb.Message.getFieldWithDefault(msg, 3, "") + programmer: jspb.Message.getFieldWithDefault(msg, 3, ""), + port: jspb.Message.getFieldWithDefault(msg, 4, ""), + portConfig: (f = msg.getPortConfig()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f), + protocol: jspb.Message.getFieldWithDefault(msg, 6, "") }; if (includeInstance) { @@ -4124,6 +4542,19 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.deserializeBinaryFromReader = fun var value = /** @type {string} */ (reader.readString()); msg.setProgrammer(value); break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setPort(value); + break; + case 5: + var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + msg.setPortConfig(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setProtocol(value); + break; default: reader.skipField(); break; @@ -4174,6 +4605,28 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.serializeBinaryToWriter = functio f ); } + f = message.getPort(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getPortConfig(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + ); + } + f = message.getProtocol(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } }; @@ -4231,4 +4684,77 @@ proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setProgrammer = functio }; +/** + * optional string port = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getPort = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setPort = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional MonitorPortConfiguration port_config = 5; + * @return {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getPortConfig = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( + jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 5)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this +*/ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setPortConfig = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.clearPortConfig = function() { + return this.setPortConfig(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.hasPortConfig = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional string protocol = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.getProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SketchProfile} returns this + */ +proto.cc.arduino.cli.commands.v1.SketchProfile.prototype.setProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts index d36f20ec2..5a3c99ac8 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.d.ts @@ -119,6 +119,10 @@ export class IsDebugSupportedRequest extends jspb.Message { setInterpreter(value: string): IsDebugSupportedRequest; getProgrammer(): string; setProgrammer(value: string): IsDebugSupportedRequest; + clearDebugPropertiesList(): void; + getDebugPropertiesList(): Array<string>; + setDebugPropertiesList(value: Array<string>): IsDebugSupportedRequest; + addDebugProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): IsDebugSupportedRequest.AsObject; @@ -137,6 +141,7 @@ export namespace IsDebugSupportedRequest { port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, interpreter: string, programmer: string, + debugPropertiesList: Array<string>, } } @@ -184,6 +189,10 @@ export class GetDebugConfigRequest extends jspb.Message { setImportDir(value: string): GetDebugConfigRequest; getProgrammer(): string; setProgrammer(value: string): GetDebugConfigRequest; + clearDebugPropertiesList(): void; + getDebugPropertiesList(): Array<string>; + setDebugPropertiesList(value: Array<string>): GetDebugConfigRequest; + addDebugProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GetDebugConfigRequest.AsObject; @@ -204,6 +213,7 @@ export namespace GetDebugConfigRequest { interpreter: string, importDir: string, programmer: string, + debugPropertiesList: Array<string>, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js index e0d781543..f6dfc3a92 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/debug_pb.js @@ -111,7 +111,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -153,7 +153,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -841,6 +841,13 @@ proto.cc.arduino.cli.commands.v1.DebugResponse.prototype.hasResult = function() +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.repeatedFields_ = [6]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -876,7 +883,8 @@ proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.toObject = function(inc fqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), interpreter: jspb.Message.getFieldWithDefault(msg, 4, ""), - programmer: jspb.Message.getFieldWithDefault(msg, 5, "") + programmer: jspb.Message.getFieldWithDefault(msg, 5, ""), + debugPropertiesList: (f = jspb.Message.getRepeatedField(msg, 6)) == null ? undefined : f }; if (includeInstance) { @@ -935,6 +943,10 @@ proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.deserializeBinaryFromRe var value = /** @type {string} */ (reader.readString()); msg.setProgrammer(value); break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.addDebugProperties(value); + break; default: reader.skipField(); break; @@ -1001,6 +1013,13 @@ proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.serializeBinaryToWriter f ); } + f = message.getDebugPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 6, + f + ); + } }; @@ -1132,6 +1151,43 @@ proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setProgrammer }; +/** + * repeated string debug_properties = 6; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.getDebugPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 6)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.setDebugPropertiesList = function(value) { + return jspb.Message.setField(this, 6, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.addDebugProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 6, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.IsDebugSupportedRequest.prototype.clearDebugPropertiesList = function() { + return this.setDebugPropertiesList([]); +}; + + @@ -1293,6 +1349,13 @@ proto.cc.arduino.cli.commands.v1.IsDebugSupportedResponse.prototype.setDebugFqbn +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.repeatedFields_ = [10]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1330,7 +1393,8 @@ proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.toObject = function(inclu port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), interpreter: jspb.Message.getFieldWithDefault(msg, 5, ""), importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), - programmer: jspb.Message.getFieldWithDefault(msg, 9, "") + programmer: jspb.Message.getFieldWithDefault(msg, 9, ""), + debugPropertiesList: (f = jspb.Message.getRepeatedField(msg, 10)) == null ? undefined : f }; if (includeInstance) { @@ -1397,6 +1461,10 @@ proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.deserializeBinaryFromRead var value = /** @type {string} */ (reader.readString()); msg.setProgrammer(value); break; + case 10: + var value = /** @type {string} */ (reader.readString()); + msg.addDebugProperties(value); + break; default: reader.skipField(); break; @@ -1477,6 +1545,13 @@ proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.serializeBinaryToWriter = f ); } + f = message.getDebugPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 10, + f + ); + } }; @@ -1644,6 +1719,43 @@ proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setProgrammer = }; +/** + * repeated string debug_properties = 10; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.getDebugPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 10)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.setDebugPropertiesList = function(value) { + return jspb.Message.setField(this, 10, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.addDebugProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 10, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.GetDebugConfigRequest.prototype.clearDebugPropertiesList = function() { + return this.setDebugPropertiesList([]); +}; + + 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 8f6fefdd7..9af18f09d 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.d.ts @@ -24,8 +24,8 @@ export class MonitorRequest extends jspb.Message { hasUpdatedConfiguration(): boolean; clearUpdatedConfiguration(): void; - getUpdatedConfiguration(): MonitorPortConfiguration | undefined; - setUpdatedConfiguration(value?: MonitorPortConfiguration): MonitorRequest; + getUpdatedConfiguration(): cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration | undefined; + setUpdatedConfiguration(value?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration): MonitorRequest; hasClose(): boolean; clearClose(): void; @@ -48,7 +48,7 @@ export namespace MonitorRequest { export type AsObject = { openRequest?: MonitorPortOpenRequest.AsObject, txData: Uint8Array | string, - updatedConfiguration?: MonitorPortConfiguration.AsObject, + updatedConfiguration?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.AsObject, close: boolean, } @@ -78,8 +78,8 @@ export class MonitorPortOpenRequest extends jspb.Message { hasPortConfiguration(): boolean; clearPortConfiguration(): void; - getPortConfiguration(): MonitorPortConfiguration | undefined; - setPortConfiguration(value?: MonitorPortConfiguration): MonitorPortOpenRequest; + getPortConfiguration(): cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration | undefined; + setPortConfiguration(value?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration): MonitorPortOpenRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorPortOpenRequest.AsObject; @@ -96,29 +96,7 @@ export namespace MonitorPortOpenRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, port?: cc_arduino_cli_commands_v1_port_pb.Port.AsObject, fqbn: string, - portConfiguration?: MonitorPortConfiguration.AsObject, - } -} - -export class MonitorPortConfiguration extends jspb.Message { - clearSettingsList(): void; - getSettingsList(): Array<MonitorPortSetting>; - setSettingsList(value: Array<MonitorPortSetting>): MonitorPortConfiguration; - addSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): MonitorPortConfiguration.AsObject; - static toObject(includeInstance: boolean, msg: MonitorPortConfiguration): MonitorPortConfiguration.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MonitorPortConfiguration, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MonitorPortConfiguration; - static deserializeBinaryFromReader(message: MonitorPortConfiguration, reader: jspb.BinaryReader): MonitorPortConfiguration; -} - -export namespace MonitorPortConfiguration { - export type AsObject = { - settingsList: Array<MonitorPortSetting.AsObject>, + portConfiguration?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.AsObject, } } @@ -138,8 +116,8 @@ export class MonitorResponse extends jspb.Message { hasAppliedSettings(): boolean; clearAppliedSettings(): void; - getAppliedSettings(): MonitorPortConfiguration | undefined; - setAppliedSettings(value?: MonitorPortConfiguration): MonitorResponse; + getAppliedSettings(): cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration | undefined; + setAppliedSettings(value?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration): MonitorResponse; hasSuccess(): boolean; clearSuccess(): void; @@ -162,7 +140,7 @@ export namespace MonitorResponse { export type AsObject = { error: string, rxData: Uint8Array | string, - appliedSettings?: MonitorPortConfiguration.AsObject, + appliedSettings?: cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.AsObject, success: boolean, } @@ -176,29 +154,6 @@ 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; - static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; - static serializeBinaryToWriter(message: MonitorPortSetting, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): MonitorPortSetting; - static deserializeBinaryFromReader(message: MonitorPortSetting, reader: jspb.BinaryReader): MonitorPortSetting; -} - -export namespace MonitorPortSetting { - export type AsObject = { - settingId: string, - value: string, - } -} - export class EnumerateMonitorPortSettingsRequest extends jspb.Message { hasInstance(): boolean; 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 893592ea4..46039c58b 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/monitor_pb.js @@ -27,9 +27,7 @@ var cc_arduino_cli_commands_v1_port_pb = require('../../../../../cc/arduino/cli/ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.EnumerateMonitorPortSettingsRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.EnumerateMonitorPortSettingsResponse', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest', null, global); -goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSetting', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorPortSettingDescriptor', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.MonitorRequest.MessageCase', null, global); @@ -77,27 +75,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -119,27 +96,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.MonitorResponse.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorResponse'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.cc.arduino.cli.commands.v1.MonitorPortSetting, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.displayName = 'proto.cc.arduino.cli.commands.v1.MonitorPortSetting'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -265,7 +221,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.toObject = function(includeInsta var f, obj = { openRequest: (f = msg.getOpenRequest()) && proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject(includeInstance, f), txData: msg.getTxData_asB64(), - updatedConfiguration: (f = msg.getUpdatedConfiguration()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f), + updatedConfiguration: (f = msg.getUpdatedConfiguration()) && cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.toObject(includeInstance, f), close: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; @@ -313,8 +269,8 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.deserializeBinaryFromReader = fu msg.setTxData(value); break; case 3: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + var value = new cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.deserializeBinaryFromReader); msg.setUpdatedConfiguration(value); break; case 4: @@ -370,7 +326,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.serializeBinaryToWriter = functi writer.writeMessage( 3, f, - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.serializeBinaryToWriter ); } f = /** @type {boolean} */ (jspb.Message.getField(message, 4)); @@ -486,7 +442,7 @@ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.hasTxData = function() */ proto.cc.arduino.cli.commands.v1.MonitorRequest.prototype.getUpdatedConfiguration = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 3)); + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration, 3)); }; @@ -588,7 +544,7 @@ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.toObject = function(incl instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), port: (f = msg.getPort()) && cc_arduino_cli_commands_v1_port_pb.Port.toObject(includeInstance, f), fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), - portConfiguration: (f = msg.getPortConfiguration()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f) + portConfiguration: (f = msg.getPortConfiguration()) && cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.toObject(includeInstance, f) }; if (includeInstance) { @@ -640,8 +596,8 @@ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.deserializeBinaryFromRea msg.setFqbn(value); break; case 4: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + var value = new cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.deserializeBinaryFromReader); msg.setPortConfiguration(value); break; default: @@ -701,7 +657,7 @@ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.serializeBinaryToWriter writer.writeMessage( 4, f, - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.serializeBinaryToWriter ); } }; @@ -805,7 +761,7 @@ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.setFqbn = func */ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.getPortConfiguration = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 4)); + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration, 4)); }; @@ -837,166 +793,6 @@ proto.cc.arduino.cli.commands.v1.MonitorPortOpenRequest.prototype.hasPortConfigu -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.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.MonitorPortConfiguration} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject = function(includeInstance, msg) { - var f, obj = { - settingsList: jspb.Message.toObjectList(msg.getSettingsList(), - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; - return proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader); - msg.addSettings(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.MonitorPortConfiguration.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.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.MonitorPortConfiguration} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getSettingsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter - ); - } -}; - - -/** - * repeated MonitorPortSetting settings = 1; - * @return {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.getSettingsList = function() { - return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, 1)); -}; - - -/** - * @param {!Array<!proto.cc.arduino.cli.commands.v1.MonitorPortSetting>} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this -*/ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.setSettingsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting=} opt_value - * @param {number=} opt_index - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.addSettings = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.MonitorPortSetting, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} returns this - */ -proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.prototype.clearSettingsList = function() { - return this.setSettingsList([]); -}; - - - /** * Oneof group definitions for this message. Each group defines the field * numbers belonging to that group. When of these fields' value is set, all @@ -1058,7 +854,7 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.toObject = function(includeInst var f, obj = { error: jspb.Message.getFieldWithDefault(msg, 1, ""), rxData: msg.getRxData_asB64(), - appliedSettings: (f = msg.getAppliedSettings()) && proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.toObject(includeInstance, f), + appliedSettings: (f = msg.getAppliedSettings()) && cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.toObject(includeInstance, f), success: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; @@ -1105,8 +901,8 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.deserializeBinaryFromReader = f msg.setRxData(value); break; case 3: - var value = new proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration; - reader.readMessage(value,proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.deserializeBinaryFromReader); + var value = new cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.deserializeBinaryFromReader); msg.setAppliedSettings(value); break; case 4: @@ -1161,7 +957,7 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.serializeBinaryToWriter = funct writer.writeMessage( 3, f, - proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration.serializeBinaryToWriter + cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration.serializeBinaryToWriter ); } f = /** @type {boolean} */ (jspb.Message.getField(message, 4)); @@ -1276,7 +1072,7 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasRxData = function( */ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.getAppliedSettings = function() { return /** @type{?proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration} */ ( - jspb.Message.getWrapperField(this, proto.cc.arduino.cli.commands.v1.MonitorPortConfiguration, 3)); + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.MonitorPortConfiguration, 3)); }; @@ -1346,166 +1142,6 @@ proto.cc.arduino.cli.commands.v1.MonitorResponse.prototype.hasSuccess = function -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.toObject = function(opt_includeInstance) { - return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.toObject = function(includeInstance, msg) { - var f, obj = { - settingId: jspb.Message.getFieldWithDefault(msg, 1, ""), - value: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.cc.arduino.cli.commands.v1.MonitorPortSetting; - return proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setSettingId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getSettingId(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getValue(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional string setting_id = 1; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getSettingId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setSettingId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -/** - * optional string value = 2; - * @return {string} - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.getValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.cc.arduino.cli.commands.v1.MonitorPortSetting} returns this - */ -proto.cc.arduino.cli.commands.v1.MonitorPortSetting.prototype.setValue = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. 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 b16f167e2..19add9232 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.d.ts @@ -38,6 +38,10 @@ export class UploadRequest extends jspb.Message { getUserFieldsMap(): jspb.Map<string, string>; clearUserFieldsMap(): void; + clearUploadPropertiesList(): void; + getUploadPropertiesList(): Array<string>; + setUploadPropertiesList(value: Array<string>): UploadRequest; + addUploadProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadRequest.AsObject; @@ -63,6 +67,7 @@ export namespace UploadRequest { dryRun: boolean, userFieldsMap: Array<[string, string]>, + uploadPropertiesList: Array<string>, } } @@ -185,6 +190,10 @@ export class UploadUsingProgrammerRequest extends jspb.Message { getUserFieldsMap(): jspb.Map<string, string>; clearUserFieldsMap(): void; + clearUploadPropertiesList(): void; + getUploadPropertiesList(): Array<string>; + setUploadPropertiesList(value: Array<string>): UploadUsingProgrammerRequest; + addUploadProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadUsingProgrammerRequest.AsObject; @@ -210,6 +219,7 @@ export namespace UploadUsingProgrammerRequest { dryRun: boolean, userFieldsMap: Array<[string, string]>, + uploadPropertiesList: Array<string>, } } @@ -279,6 +289,10 @@ export class BurnBootloaderRequest extends jspb.Message { getUserFieldsMap(): jspb.Map<string, string>; clearUserFieldsMap(): void; + clearUploadPropertiesList(): void; + getUploadPropertiesList(): Array<string>; + setUploadPropertiesList(value: Array<string>): BurnBootloaderRequest; + addUploadProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BurnBootloaderRequest.AsObject; @@ -301,6 +315,7 @@ export namespace BurnBootloaderRequest { dryRun: boolean, userFieldsMap: Array<[string, string]>, + uploadPropertiesList: Array<string>, } } 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 3ff6946e1..d49f1b0d7 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/upload_pb.js @@ -52,7 +52,7 @@ goog.exportSymbol('proto.cc.arduino.cli.commands.v1.UserField', null, global); * @constructor */ proto.cc.arduino.cli.commands.v1.UploadRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.UploadRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -136,7 +136,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -178,7 +178,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.repeatedFields_, null); }; goog.inherits(proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -315,6 +315,13 @@ if (goog.DEBUG && !COMPILED) { proto.cc.arduino.cli.commands.v1.SupportedUserFieldsResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SupportedUserFieldsResponse'; } +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.repeatedFields_ = [12]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -356,7 +363,8 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.toObject = function(includeInstan importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), programmer: jspb.Message.getFieldWithDefault(msg, 9, ""), dryRun: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [] + userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [], + uploadPropertiesList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f }; if (includeInstance) { @@ -441,6 +449,10 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.deserializeBinaryFromReader = fun jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 12: + var value = /** @type {string} */ (reader.readString()); + msg.addUploadProperties(value); + break; default: reader.skipField(); break; @@ -546,6 +558,13 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.serializeBinaryToWriter = functio if (f && f.getLength() > 0) { f.serializeBinary(11, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getUploadPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 12, + f + ); + } }; @@ -789,6 +808,43 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.clearUserFieldsMap = fu return this;}; +/** + * repeated string upload_properties = 12; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.getUploadPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.setUploadPropertiesList = function(value) { + return jspb.Message.setField(this, 12, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.UploadRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.addUploadProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 12, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.UploadRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.clearUploadPropertiesList = function() { + return this.setUploadPropertiesList([]); +}; + + /** * Oneof group definitions for this message. Each group defines the field @@ -1364,6 +1420,13 @@ proto.cc.arduino.cli.commands.v1.ProgrammerIsRequiredForUploadError.serializeBin +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.repeatedFields_ = [12]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1405,7 +1468,8 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.toObject = functio importDir: jspb.Message.getFieldWithDefault(msg, 8, ""), programmer: jspb.Message.getFieldWithDefault(msg, 9, ""), dryRun: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), - userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [] + userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [], + uploadPropertiesList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f }; if (includeInstance) { @@ -1490,6 +1554,10 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.deserializeBinaryF jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 12: + var value = /** @type {string} */ (reader.readString()); + msg.addUploadProperties(value); + break; default: reader.skipField(); break; @@ -1595,6 +1663,13 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.serializeBinaryToW if (f && f.getLength() > 0) { f.serializeBinary(11, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getUploadPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 12, + f + ); + } }; @@ -1838,6 +1913,43 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.clearUse return this;}; +/** + * repeated string upload_properties = 12; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.getUploadPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.setUploadPropertiesList = function(value) { + return jspb.Message.setField(this, 12, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.addUploadProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 12, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerRequest.prototype.clearUploadPropertiesList = function() { + return this.setUploadPropertiesList([]); +}; + + /** * Oneof group definitions for this message. Each group defines the field @@ -2109,6 +2221,13 @@ proto.cc.arduino.cli.commands.v1.UploadUsingProgrammerResponse.prototype.hasErrS +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.repeatedFields_ = [12]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2147,7 +2266,8 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.toObject = function(inclu verify: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), programmer: jspb.Message.getFieldWithDefault(msg, 6, ""), dryRun: jspb.Message.getBooleanFieldWithDefault(msg, 7, false), - userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [] + userFieldsMap: (f = msg.getUserFieldsMap()) ? f.toObject(includeInstance, undefined) : [], + uploadPropertiesList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f }; if (includeInstance) { @@ -2220,6 +2340,10 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.deserializeBinaryFromRead jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); }); break; + case 12: + var value = /** @type {string} */ (reader.readString()); + msg.addUploadProperties(value); + break; default: reader.skipField(); break; @@ -2304,6 +2428,13 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.serializeBinaryToWriter = if (f && f.getLength() > 0) { f.serializeBinary(11, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); } + f = message.getUploadPropertiesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 12, + f + ); + } }; @@ -2493,6 +2624,43 @@ proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.clearUserFields return this;}; +/** + * repeated string upload_properties = 12; + * @return {!Array<string>} + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.getUploadPropertiesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12)); +}; + + +/** + * @param {!Array<string>} value + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.setUploadPropertiesList = function(value) { + return jspb.Message.setField(this, 12, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.addUploadProperties = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 12, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BurnBootloaderRequest.prototype.clearUploadPropertiesList = function() { + return this.setUploadPropertiesList([]); +}; + + /** * Oneof group definitions for this message. Each group defines the field diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index 2e48f7f79..99145fddc 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -22,9 +22,7 @@ import { import { EnumerateMonitorPortSettingsRequest, EnumerateMonitorPortSettingsResponse, - MonitorPortConfiguration, MonitorPortOpenRequest, - MonitorPortSetting, MonitorRequest, MonitorResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/monitor_pb'; @@ -39,6 +37,10 @@ import { } from '@theia/core/lib/common/promise-util'; import { MonitorServiceFactoryOptions } from './monitor-service-factory'; import { ServiceError } from './service-error'; +import { + MonitorPortConfiguration, + MonitorPortSetting, +} from './cli-protocol/cc/arduino/cli/commands/v1/common_pb'; export const MonitorServiceName = 'monitor-service'; type DuplexHandlerKeys = diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index e219d80e9..bbd511bd1 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -668,47 +668,43 @@ export class SketchesServiceImpl ); } - async tempBuildPath(sketch: Sketch): Promise<string[]> { + async getBuildPath(sketch: Sketch): Promise<string[]> { const sketchPath = FileUri.fsPath(sketch.uri); - const { tempDirRealpath } = this.isTempSketch; - const tempBuildPaths = [ - this.tempBuildPathMD5Hash(tempDirRealpath, sketchPath), - ]; + + let basePath: string; + try { + basePath = userCacheDir(); + } catch { + // Fallback to /tmp + const { tempDirRealpath } = this.isTempSketch; + basePath = tempDirRealpath; + } + const buildPaths = [this.buildPathMD5Hash(basePath, sketchPath)]; // If on Windows, provide both the upper and the lowercase drive letter MD5 hashes. All together four paths are expected: // One of them should match if the sketch is not yet compiled. // https://github.com/arduino/arduino-ide/pull/1809#discussion_r1071031040 - if (isWindows && Win32DriveRegex.test(tempDirRealpath)) { + if (isWindows && Win32DriveRegex.test(basePath)) { const toggleFirstCharCasing = (s: string) => startsWithUpperCase(s) ? firstToLowerCase(s) : firstToUpperCase(s); - const otherCaseTempDirRealPath = toggleFirstCharCasing(tempDirRealpath); - tempBuildPaths.push( - this.tempBuildPathMD5Hash(otherCaseTempDirRealPath, sketchPath) - ); + const otherCaseDirRealPath = toggleFirstCharCasing(basePath); + buildPaths.push(this.buildPathMD5Hash(otherCaseDirRealPath, sketchPath)); if (Win32DriveRegex.test(sketchPath)) { const otherCaseSketchPath = toggleFirstCharCasing(sketchPath); - tempBuildPaths.push( - this.tempBuildPathMD5Hash(tempDirRealpath, otherCaseSketchPath), - this.tempBuildPathMD5Hash( - otherCaseTempDirRealPath, - otherCaseSketchPath - ) + buildPaths.push( + this.buildPathMD5Hash(basePath, otherCaseSketchPath), + this.buildPathMD5Hash(otherCaseDirRealPath, otherCaseSketchPath) ); } } - return tempBuildPaths; + return buildPaths; } - private tempBuildPathMD5Hash(tempFolderPath: string, path: string): string { - return join( - tempFolderPath, - 'arduino', - 'sketches', - this.tempBuildFolderMD5Hash(path) - ); + private buildPathMD5Hash(basePath: string, path: string): string { + return join(basePath, 'arduino', 'sketches', this.buildFolderMD5Hash(path)); } - private tempBuildFolderMD5Hash(path: string): string { + private buildFolderMD5Hash(path: string): string { return crypto.createHash('md5').update(path).digest('hex').toUpperCase(); } @@ -984,3 +980,36 @@ export async function discoverSketches( return prune(container); } + +/** + * Replica of Go `os.UserCacheDir()`. + * https://github.com/golang/go/blob/777f43ab27bde4c662cd0a663f807f74f3fbab0f/src/os/file.go#L477 + */ +export function userCacheDir(): string { + let dir: string | undefined; + const platform = os.platform(); + + switch (platform) { + case 'darwin': { + dir = path.join(os.homedir(), '/Library/Caches'); + break; + } + case 'win32': { + dir = process.env.LocalAppData || undefined; + if (!dir) { + throw new Error('%LocalAppData% is not defined'); + } + break; + } + default: { + dir = process.env.XDG_CACHE_HOME || undefined; + if (!dir) { + dir = path.join(os.homedir() + '/.cache'); + } else if (!path.isAbsolute(dir)) { + throw new Error('path in $XDG_CACHE_HOME is relative'); + } + } + } + + return dir; +} diff --git a/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts b/arduino-ide-extension/src/test/node/core-service-impl.slow-test.ts index 5bf9e5381..dd80bca56 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 @@ -61,7 +61,7 @@ describe('core-service-impl', () => { expect('buildOutputUri' in arg).to.be.true; expect(arg.buildOutputUri).to.be.not.undefined; - const tempBuildPaths = await sketchesService.tempBuildPath(sketch); + const tempBuildPaths = await sketchesService.getBuildPath(sketch); if (isWindows) { expect(tempBuildPaths.length).to.be.greaterThan(1); } else { From 48d6d375397ec4c98b503ed1107300380bd49787 Mon Sep 17 00:00:00 2001 From: dankeboy36 <dankeboy36@gmail.com> Date: Sun, 10 Mar 2024 09:54:43 +0100 Subject: [PATCH 349/384] feat: can skip verify before upload Adds a new preference to control whether the verify command should automatically run before the upload. If the `arduino.upload.autoVerify` setting value is `false`, IDE does not recompile the sketch code before uploading it to the board. Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- .../src/browser/arduino-preferences.ts | 13 +++++++ .../browser/contributions/upload-sketch.ts | 3 +- .../browser/contributions/verify-sketch.ts | 37 +++++++++++++------ i18n/en.json | 2 + 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index c7e1698a5..40ae222d1 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -137,6 +137,18 @@ const properties: ArduinoPreferenceSchemaProperties = { 'arduino.upload.verify': { type: 'boolean', default: false, + description: nls.localize( + 'arduino/preferences/upload.verify', + 'After upload, verify that the contents of the memory on the board match the uploaded binary.' + ), + }, + 'arduino.upload.autoVerify': { + type: 'boolean', + default: true, + description: nls.localize( + 'arduino/preferences/upload.autoVerify', + "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing." + ), }, 'arduino.window.autoScale': { type: 'boolean', @@ -327,6 +339,7 @@ export interface ArduinoConfiguration { 'arduino.compile.warnings': CompilerWarnings; 'arduino.upload.verbose': boolean; 'arduino.upload.verify': boolean; + 'arduino.upload.autoVerify': boolean; 'arduino.window.autoScale': boolean; 'arduino.ide.updateChannel': UpdateChannel; 'arduino.ide.updateBaseUrl': string; diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index c21b86190..0c2418797 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -104,6 +104,7 @@ export class UploadSketch extends CoreServiceContribution { } try { + const autoVerify = this.preferences['arduino.upload.autoVerify']; // toggle the toolbar button and menu item state. // uploadInProgress will be set to false whether the upload fails or not this.uploadInProgress = true; @@ -116,7 +117,7 @@ export class UploadSketch extends CoreServiceContribution { 'arduino-verify-sketch', <VerifySketchParams>{ exportBinaries: false, - silent: true, + mode: autoVerify ? 'auto' : 'dry-run', } ); if (!verifyOptions) { diff --git a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts index 999c3ec5c..4d8b445e3 100644 --- a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts @@ -15,23 +15,35 @@ import { } from './contribution'; import { CoreErrorHandler } from './core-error-handler'; +export type VerifySketchMode = + /** + * When the user explicitly triggers the verify command from the primary UI: menu, toolbar, or keybinding. The UI shows the output, updates the toolbar items state, etc. + */ + | 'explicit' + /** + * When the verify phase automatically runs as part of the upload but there is no UI indication of the command: the toolbar items do not update. + */ + | 'auto' + /** + * The verify does not run. There is no UI indication of the command. For example, when the user decides to disable the auto verify (`'arduino.upload.autoVerify'`) to skips the code recompilation phase. + */ + | 'dry-run'; + export interface VerifySketchParams { /** * Same as `CoreService.Options.Compile#exportBinaries` */ readonly exportBinaries?: boolean; /** - * If `true`, there won't be any UI indication of the verify command in the toolbar. It's `false` by default. + * The mode specifying how verify should run. It's `'explicit'` by default. */ - readonly silent?: boolean; + readonly mode?: VerifySketchMode; } /** - * - `"idle"` when neither verify, nor upload is running, - * - `"explicit-verify"` when only verify is running triggered by the user, and - * - `"automatic-verify"` is when the automatic verify phase is running as part of an upload triggered by the user. + * - `"idle"` when neither verify, nor upload is running */ -type VerifyProgress = 'idle' | 'explicit-verify' | 'automatic-verify'; +type VerifyProgress = 'idle' | VerifySketchMode; @injectable() export class VerifySketch extends CoreServiceContribution { @@ -54,10 +66,10 @@ export class VerifySketch extends CoreServiceContribution { registry.registerCommand(VerifySketch.Commands.VERIFY_SKETCH_TOOLBAR, { isVisible: (widget) => ArduinoToolbar.is(widget) && widget.side === 'left', - isEnabled: () => this.verifyProgress !== 'explicit-verify', + isEnabled: () => this.verifyProgress !== 'explicit', // toggled only when verify is running, but not toggled when automatic verify is running before the upload // https://github.com/arduino/arduino-ide/pull/1750#pullrequestreview-1214762975 - isToggled: () => this.verifyProgress === 'explicit-verify', + isToggled: () => this.verifyProgress === 'explicit', execute: () => registry.executeCommand(VerifySketch.Commands.VERIFY_SKETCH.id), }); @@ -113,19 +125,22 @@ export class VerifySketch extends CoreServiceContribution { } try { - this.verifyProgress = params?.silent - ? 'automatic-verify' - : 'explicit-verify'; + this.verifyProgress = params?.mode ?? 'explicit'; this.onDidChangeEmitter.fire(); this.menuManager.update(); this.clearVisibleNotification(); this.coreErrorHandler.reset(); + const dryRun = this.verifyProgress === 'dry-run'; const options = await this.options(params?.exportBinaries); if (!options) { return undefined; } + if (dryRun) { + return options; + } + await this.doWithProgress({ progressText: nls.localize( 'arduino/sketch/compile', diff --git a/i18n/en.json b/i18n/en.json index 37c90e2e6..17cd55547 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -415,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { From 8462d8a391e180cea87159070d60ccef24cf1abf Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 22 Nov 2024 17:50:58 +0100 Subject: [PATCH 350/384] refactor: `generate-protocol` now fetch proto files from `arduino_cli_{version}_proto.zip` - Use the CLI release proto.zip to get proto files for production versions of CLI - Extract the proto files from repo if CLI version is declared as `commitsh` or version is 1.1.0 See https://github.com/arduino/arduino-cli/pull/2761 --- .../scripts/generate-protocol.js | 256 +++++++++++------- 1 file changed, 152 insertions(+), 104 deletions(-) diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index 68a92c026..7e0cf8a55 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -3,10 +3,12 @@ (async () => { const os = require('node:os'); const path = require('node:path'); - const { mkdirSync, promises: fs, rmSync } = require('node:fs'); + const decompress = require('decompress'); + const unzip = require('decompress-unzip'); + const { mkdirSync, promises: fs, rmSync, existsSync } = require('node:fs'); const { exec } = require('./utils'); const { glob } = require('glob'); - const { SemVer, gte, valid: validSemVer, gt } = require('semver'); + const { SemVer, gte, valid: validSemVer, eq } = require('semver'); // Use a node-protoc fork until apple arm32 is supported // https://github.com/YePpHa/node-protoc/pull/10 const protoc = path.dirname(require('@pingghost/protoc/protoc')); @@ -90,152 +92,198 @@ } */ const versionObject = JSON.parse(versionJson); - const version = versionObject.VersionString; - // Clone the repository and check out the tagged version - // Return folder with proto files - async function getProtoPath(forceCliVersion) { - const repository = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); + async function globProtos(folder, pattern = '**/*.proto') { + let protos = []; + try { + const matches = await glob(pattern, { cwd: folder }); + protos = matches.map((filename) => path.join(folder, filename)); + } catch (error) { + console.log(error.stack ?? error.message); + } + return protos; + } + + async function getProtosFromRepo( + commitish = '', + version = '', + owner = 'arduino', + repo = 'arduino-cli' + ) { + const repoFolder = await fs.mkdtemp(path.join(os.tmpdir(), 'arduino-cli-')); const url = `https://github.com/${owner}/${repo}.git`; console.log(`>>> Cloning repository from '${url}'...`); - exec('git', ['clone', url, repository], { logStdout: true }); + exec('git', ['clone', url, repoFolder], { logStdout: true }); console.log(`<<< Repository cloned.`); - let cliVersion = forceCliVersion || version; - if (validSemVer(cliVersion)) { + if (validSemVer(version)) { + let versionTag = version; // https://github.com/arduino/arduino-cli/pull/2374 if ( gte(new SemVer(version, { loose: true }), new SemVer('0.35.0-rc.1')) ) { - cliVersion = `v${cliVersion}`; + versionTag = `v${version}`; } - console.log(`>>> Checking out tagged version: '${cliVersion}'...`); - exec('git', ['-C', repository, 'fetch', '--all', '--tags'], { + console.log(`>>> Checking out tagged version: '${versionTag}'...`); + exec('git', ['-C', repoFolder, 'fetch', '--all', '--tags'], { logStdout: true, }); exec( 'git', - ['-C', repository, 'checkout', `tags/${cliVersion}`, '-b', cliVersion], + ['-C', repoFolder, 'checkout', `tags/${versionTag}`, '-b', versionTag], { logStdout: true } ); - console.log(`<<< Checked out tagged version: '${cliVersion}'.`); - } else if (forceCliVersion) { - console.log(`WARN: invalid semver: '${forceCliVersion}'.`); - // If the forced version is invalid, do not proceed with fallbacks. - return undefined; + console.log(`<<< Checked out tagged version: '${versionTag}'.`); } else if (commitish) { - console.log( - `>>> Checking out commitish from 'package.json': '${commitish}'...` - ); - exec('git', ['-C', repository, 'checkout', commitish], { + console.log(`>>> Checking out commitish: '${commitish}'...`); + exec('git', ['-C', repoFolder, 'checkout', commitish], { logStdout: true, }); - console.log( - `<<< Checked out commitish from 'package.json': '${commitish}'.` - ); - } else if (versionObject.Commit) { - console.log( - `>>> Checking out commitish from the CLI: '${versionObject.Commit}'...` - ); - exec('git', ['-C', repository, 'checkout', versionObject.Commit], { - logStdout: true, - }); - console.log( - `<<< Checked out commitish from the CLI: '${versionObject.Commit}'.` - ); + console.log(`<<< Checked out commitish: '${commitish}'.`); } else { console.log( `WARN: no 'git checkout'. Generating from the HEAD revision.` ); } - return path.join(repository, 'rpc'); + const rpcFolder = await fs.mkdtemp( + path.join(os.tmpdir(), 'arduino-cli-rpc') + ); + + // Copy the the repository rpc folder so we can remove the repository + await fs.cp(path.join(repoFolder, 'rpc'), path.join(rpcFolder), { + recursive: true, + }); + rmSync(repoFolder, { recursive: true, maxRetries: 5, force: true }); + + // Patch for https://github.com/arduino/arduino-cli/issues/2755 + // Google proto files are removed from source since v1.1.0 + if (!existsSync(path.join(rpcFolder, 'google'))) { + // Include packaged google proto files from v1.1.1 + // See https://github.com/arduino/arduino-cli/pull/2761 + console.log(`>>> Missing google proto files. Including from v1.1.1...`); + const v111ProtoFolder = await getProtosFromZip('1.1.1'); + + // Create an return a folder name google in rpcFolder + const googleFolder = path.join(rpcFolder, 'google'); + await fs.cp(path.join(v111ProtoFolder, 'google'), googleFolder, { + recursive: true, + }); + console.log(`<<< Included google proto files from v1.1.1.`); + } + + return rpcFolder; } - const protoPath = await getProtoPath(); + async function getProtosFromZip(version) { + if (!version) { + console.log(`Could not download proto files: CLI version not provided.`); + process.exit(1); + } + console.log(`>>> Downloading proto files from zip for ${version}.`); + + const url = `https://downloads.arduino.cc/arduino-cli/arduino-cli_${version}_proto.zip`; + const protos = await fs.mkdtemp( + path.join(os.tmpdir(), 'arduino-cli-proto') + ); - if (!protoPath) { - console.log(`Could not find the proto files folder.`); + const { default: download } = await import('@xhmikosr/downloader'); + /** @type {import('node:buffer').Buffer} */ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const data = await download(url); + + await decompress(data, protos, { + plugins: [unzip()], + filter: (file) => file.path.endsWith('.proto'), + }); + + console.log( + `<<< Finished downloading and extracting proto files for ${version}.` + ); + + return protos; + } + + let protosFolder; + + if (commitish) { + protosFolder = await getProtosFromRepo(commitish, undefined, owner, repo); + } else if ( + versionObject.VersionString && + validSemVer(versionObject.VersionString) + ) { + const version = versionObject.VersionString; + // v1.1.0 does not contains google proto files in zip + // See https://github.com/arduino/arduino-cli/issues/2755 + const isV110 = eq(new SemVer(version, { loose: true }), '1.1.0'); + protosFolder = isV110 + ? await getProtosFromRepo(undefined, version) + : await getProtosFromZip(version); + } else if (versionObject.Commit) { + protosFolder = await getProtosFromRepo(versionObject.Commit); + } + + if (!protosFolder) { + console.log(`Could not get proto files: missing commitish or version.`); + process.exit(1); + } + + const protos = await globProtos(protosFolder); + + if (!protos || protos.length === 0) { + rmSync(protosFolder, { recursive: true, maxRetries: 5, force: true }); + console.log(`Could not find any .proto files under ${protosFolder}.`); process.exit(1); } console.log('>>> Generating TS/JS API from:'); - exec('git', ['-C', protoPath, 'rev-parse', '--abbrev-ref', 'HEAD'], { - logStdout: true, - }); const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol'); // Must wipe the gen output folder. Otherwise, dangling service implementation remain in IDE2 code, // although it has been removed from the proto file. // For example, https://github.com/arduino/arduino-cli/commit/50a8bf5c3e61d5b661ccfcd6a055e82eeb510859. - rmSync(out, { recursive: true, maxRetries: 5, force: true }); + // rmSync(out, { recursive: true, maxRetries: 5, force: true }); mkdirSync(out, { recursive: true }); - if (gt(new SemVer(version, { loose: true }), new SemVer('1.0.4'))) { - // Patch for https://github.com/arduino/arduino-cli/issues/2755 - // Credit https://github.com/dankeboy36/ardunno-cli-gen/pull/9/commits/64a5ac89aae605249261c8ceff7255655ecfafca - // Download the 1.0.4 version and use the missing google/rpc/status.proto file. - console.log('<<< Generating missing google proto files'); - const v104ProtoPath = await getProtoPath('1.0.4'); - if (!v104ProtoPath) { - console.log(`Could not find the proto files folder for version 1.0.4.`); - process.exit(1); - } - await fs.cp( - path.join(v104ProtoPath, 'google'), - path.join(protoPath, 'google'), - { - recursive: true, - } + try { + // 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', + protosFolder, + ...protos, + ], + { logStdout: true } ); - console.log(`>>> Generated missing google file`); - } - let protos = []; - try { - const matches = await glob('**/*.proto', { cwd: protoPath }); - protos = matches.map((filename) => path.join(protoPath, filename)); + // 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', + protosFolder, + ...protos, + ], + { logStdout: true } + ); } catch (error) { - console.log(error.stack ?? error.message); - } - - if (!protos || protos.length === 0) { - console.log(`Could not find any .proto files under ${protoPath}.`); - process.exit(1); + console.log(error); + } finally { + rmSync(protosFolder, { recursive: true, maxRetries: 5, force: true }); } - // 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', - protoPath, - ...protos, - ], - { logStdout: true } - ); - - // 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', - protoPath, - ...protos, - ], - { logStdout: true } - ); - console.log('<<< Generation was successful.'); })(); From de265694ee425afeb9397ceb0a188f9f42a15680 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 22 Nov 2024 17:57:47 +0100 Subject: [PATCH 351/384] feat: use Arduino CLI v1.1.1 --- arduino-ide-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index d900bfbfb..6dfb8e35a 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -171,7 +171,7 @@ ], "arduino": { "arduino-cli": { - "version": "1.1.0" + "version": "1.1.1" }, "arduino-fwuploader": { "version": "2.4.1" From 86c7fd7b5989bc0c06b18442c4677d8bbe6cb454 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 07:58:50 +0000 Subject: [PATCH 352/384] build(deps): Bump actions/upload-artifact from 3 to 4 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 10 +++++----- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 535298d8e..eb7aadfaf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -411,7 +411,7 @@ jobs: echo "STAGED_CHANNEL_FILES_PATH=$staged_channel_files_path" >> "$GITHUB_ENV" - name: Upload staged-for-merge channel file artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: > needs.select-targets.outputs.merge-channel-files == 'true' && matrix.config.mergeable-channel-file == 'true' @@ -421,7 +421,7 @@ jobs: path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} - name: Upload [GitHub Actions] - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} @@ -489,7 +489,7 @@ jobs: --input "${{ env.CHANNEL_FILES_PATH }}" - name: Upload merged channel files to job transfer artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: if-no-files-found: error name: ${{ env.JOB_TRANSFER_ARTIFACT }} @@ -515,7 +515,7 @@ jobs: path: ${{ env.JOB_TRANSFER_ARTIFACT }} - name: Upload tester build artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact.name }} path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} @@ -563,7 +563,7 @@ jobs: - name: Upload Changelog [GitHub Actions] if: needs.build-type-determination.outputs.is-nightly == 'true' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: CHANGELOG.txt diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 0ec11e7f3..7b255da9c 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -71,7 +71,7 @@ jobs: file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} - name: Pass configuration files to next job via workflow artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: | *.yaml From 84d2dfd13ea496ace097a396d8f43e94ce14eebf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 19:56:22 +0000 Subject: [PATCH 353/384] build(deps): Bump actions/download-artifact from 3 to 4 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 8 ++++---- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb7aadfaf..c41e369ab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -450,7 +450,7 @@ jobs: uses: actions/checkout@v4 - name: Download staged-for-merge channel files artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} path: ${{ env.CHANNEL_FILES_PATH }} @@ -509,7 +509,7 @@ jobs: steps: - name: Download job transfer artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} @@ -586,7 +586,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} @@ -618,7 +618,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 7b255da9c..5c3a0a7e9 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -109,7 +109,7 @@ jobs: uses: actions/checkout@v4 - name: Download configuration files artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} path: ${{ env.CONFIGURATIONS_FOLDER }} From 0aec778e846ca58a04f134bf420752334b9dc8f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 19:37:50 +0000 Subject: [PATCH 354/384] build(deps): Bump geekyeggo/delete-artifact from 2 to 5 Bumps [geekyeggo/delete-artifact](https://github.com/geekyeggo/delete-artifact) from 2 to 5. - [Release notes](https://github.com/geekyeggo/delete-artifact/releases) - [Changelog](https://github.com/GeekyEggo/delete-artifact/blob/main/CHANGELOG.md) - [Commits](https://github.com/geekyeggo/delete-artifact/compare/v2...v5) --- updated-dependencies: - dependency-name: geekyeggo/delete-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/build.yml | 4 ++-- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c41e369ab..4a4204a7f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -456,7 +456,7 @@ jobs: path: ${{ env.CHANNEL_FILES_PATH }} - name: Remove no longer needed artifact - uses: geekyeggo/delete-artifact@v2 + uses: geekyeggo/delete-artifact@v5 with: name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} @@ -662,6 +662,6 @@ jobs: steps: - name: Remove unneeded job transfer artifact - uses: geekyeggo/delete-artifact@v2 + uses: geekyeggo/delete-artifact@v5 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 5c3a0a7e9..6dfdaacbc 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -115,7 +115,7 @@ jobs: path: ${{ env.CONFIGURATIONS_FOLDER }} - name: Remove unneeded artifact - uses: geekyeggo/delete-artifact@v2 + uses: geekyeggo/delete-artifact@v5 with: name: ${{ env.CONFIGURATIONS_ARTIFACT }} From 90d3d77ca41bf8d928ff086a8f7c082d297f858b Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Wed, 20 Nov 2024 22:09:31 -0800 Subject: [PATCH 355/384] Don't upload multiple times to same artifact in label sync workflow The "Sync Labels" GitHub Actions workflow is configured to allow the use of multiple shared label configuration files. This is done by using a job matrix in the GitHub Actions workflow to download each of the files from the source repository in a parallel GitHub Actions workflow job. A GitHub Actions workflow artifact was used to transfer the generated files between sequential jobs in the workflow. The "actions/upload-artifact" and "actions/download-artifact" actions are used for this purpose. Previously, a single artifact was used for the transfer of all the shared label configuration files, with each of the parallel jobs uploading its own generated files to that artifact. However, support for uploading multiple times to a single artifact was dropped in version 4.0.0 of the "actions/upload-artifact" action. So it is now necessary to use a dedicated artifact for each of the builds. These can be downloaded in aggregate by using the artifact name globbing and merging features which were introduced in version 4.1.0 of the "actions/download-artifact" action. --- .github/workflows/sync-labels.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 6dfdaacbc..22fa0d0e9 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -19,7 +19,7 @@ on: env: CONFIGURATIONS_FOLDER: .github/label-configuration-files - CONFIGURATIONS_ARTIFACT: label-configuration-files + CONFIGURATIONS_ARTIFACT_PREFIX: label-configuration-file- jobs: check: @@ -77,7 +77,7 @@ jobs: *.yaml *.yml if-no-files-found: error - name: ${{ env.CONFIGURATIONS_ARTIFACT }} + name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}${{ matrix.filename }} sync: needs: download @@ -108,16 +108,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Download configuration files artifact + - name: Download configuration file artifacts uses: actions/download-artifact@v4 with: - name: ${{ env.CONFIGURATIONS_ARTIFACT }} + merge-multiple: true + pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* path: ${{ env.CONFIGURATIONS_FOLDER }} - - name: Remove unneeded artifact + - name: Remove unneeded artifacts uses: geekyeggo/delete-artifact@v5 with: - name: ${{ env.CONFIGURATIONS_ARTIFACT }} + name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* - name: Merge label configuration files run: | From dba57b312cf1c78a41afd3d95b8e4a30b8d62ce7 Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Thu, 21 Nov 2024 00:04:20 -0800 Subject: [PATCH 356/384] Don't upload multiple times to same artifact in build workflow The build workflow produces binaries for a range of target hosts. This is done by using a job matrix in the GitHub Actions workflow that produces each build in a parallel job. GitHub Actions workflow artifacts are used to transfer the generated files between sequential jobs in the workflow. The "actions/upload-artifact" action is used for this purpose. Previously, a single artifact was used for this purpose, with each of the parallel jobs uploading its own generated files to that artifact. However, support for uploading multiple times to a single artifact was dropped in version 4.0.0 of the "actions/upload-artifact" action. So it is now necessary to use a dedicated artifact for each of the builds. These can be downloaded in aggregate by using the artifact name globbing and merging features which were introduced in version 4.1.0 of the "actions/download-artifact" action. --- .github/workflows/build.yml | 83 +++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4a4204a7f..cdc2b0f4e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,9 +48,9 @@ env: GO_VERSION: '1.21' # See: https://github.com/actions/setup-node/#readme NODE_VERSION: '18.17' - JOB_TRANSFER_ARTIFACT: build-artifacts + JOB_TRANSFER_ARTIFACT_PREFIX: build-artifacts- CHANGELOG_ARTIFACTS: changelog - STAGED_CHANNEL_FILES_ARTIFACT: staged-channel-files + STAGED_CHANNEL_FILE_ARTIFACT_PREFIX: staged-channel-file- BASE_BUILD_DATA: | - config: # Human identifier for the job. @@ -68,6 +68,8 @@ env: certificate-extension: pfx # Container for windows cert signing certificate-container: INSTALLER_CERT_WINDOWS_CONTAINER + # Arbitrary identifier used to give the workflow artifact uploaded by each "build" matrix job a unique name. + job-transfer-artifact-suffix: Windows_64bit # Quoting on the value is required here to allow the same comparison expression syntax to be used for this # and the companion needs.select-targets.outputs.merge-channel-files property (output values always have string # type). @@ -91,6 +93,7 @@ env: { \"image\": \"ghcr.io/arduino/arduino-ide/linux:main\" } + job-transfer-artifact-suffix: Linux_64bit mergeable-channel-file: 'false' artifacts: - path: '*Linux_64bit.zip' @@ -107,6 +110,7 @@ env: certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 certificate-password-secret: KEYCHAIN_PASSWORD certificate-extension: p12 + job-transfer-artifact-suffix: macOS_64bit mergeable-channel-file: 'true' artifacts: - path: '*macOS_64bit.dmg' @@ -121,6 +125,7 @@ env: certificate-secret: APPLE_SIGNING_CERTIFICATE_P12 certificate-password-secret: KEYCHAIN_PASSWORD certificate-extension: p12 + job-transfer-artifact-suffix: macOS_arm64 mergeable-channel-file: 'true' artifacts: - path: '*macOS_arm64.dmg' @@ -233,7 +238,7 @@ jobs: ) | \ yq \ --output-format json \ - '[.[].artifacts.[]]' + 'map(.artifacts[] + (.config | pick(["job-transfer-artifact-suffix"])))' )" # The build matrix produces two macOS jobs (x86 and ARM) so the "channel update info files" @@ -252,7 +257,7 @@ jobs: echo "${{ env.BASE_BUILD_DATA }}" | \ yq \ --output-format json \ - '[.[].artifacts.[]]' + 'map(.artifacts[] + (.config | pick(["job-transfer-artifact-suffix"])))' )" merge_channel_files="false" @@ -417,13 +422,13 @@ jobs: matrix.config.mergeable-channel-file == 'true' with: if-no-files-found: error - name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} + name: ${{ env.STAGED_CHANNEL_FILE_ARTIFACT_PREFIX }}${{ matrix.config.job-transfer-artifact-suffix }} path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.STAGED_CHANNEL_FILES_PATH) || env.STAGED_CHANNEL_FILES_PATH }} - - name: Upload [GitHub Actions] + - name: Upload builds to job transfer artifact uses: actions/upload-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.config.job-transfer-artifact-suffix }} path: ${{ matrix.config.working-directory && format('{0}/{1}', matrix.config.working-directory, env.BUILD_ARTIFACTS_PATH) || env.BUILD_ARTIFACTS_PATH }} - name: Manual Clean up for self-hosted runners @@ -449,16 +454,17 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Download staged-for-merge channel files artifact + - name: Download staged-for-merge channel file artifacts uses: actions/download-artifact@v4 with: - name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} + merge-multiple: true path: ${{ env.CHANNEL_FILES_PATH }} + pattern: ${{ env.STAGED_CHANNEL_FILE_ARTIFACT_PREFIX }}* - - name: Remove no longer needed artifact + - name: Remove no longer needed artifacts uses: geekyeggo/delete-artifact@v5 with: - name: ${{ env.STAGED_CHANNEL_FILES_ARTIFACT }} + name: ${{ env.STAGED_CHANNEL_FILE_ARTIFACT_PREFIX }}* - name: Install Node.js uses: actions/setup-node@v4 @@ -488,11 +494,11 @@ jobs: --channel "${{ needs.build-type-determination.outputs.channel-name }}" \ --input "${{ env.CHANNEL_FILES_PATH }}" - - name: Upload merged channel files to job transfer artifact + - name: Upload merged channel files job transfer artifact uses: actions/upload-artifact@v4 with: if-no-files-found: error - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}channel-files path: ${{ env.CHANNEL_FILES_PATH }} artifacts: @@ -503,22 +509,25 @@ jobs: if: always() && needs.build.result != 'skipped' runs-on: ubuntu-latest + env: + BUILD_ARTIFACTS_FOLDER: build-artifacts + strategy: matrix: artifact: ${{ fromJson(needs.select-targets.outputs.artifact-matrix) }} steps: - - name: Download job transfer artifact + - name: Download job transfer artifact that contains ${{ matrix.artifact.name }} tester build uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.artifact.job-transfer-artifact-suffix }} + path: ${{ env.BUILD_ARTIFACTS_FOLDER }} - name: Upload tester build artifact uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact.name }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} + path: ${{ env.BUILD_ARTIFACTS_FOLDER }}/${{ matrix.artifact.path }} changelog: needs: @@ -561,11 +570,11 @@ jobs: echo "$BODY" > CHANGELOG.txt - - name: Upload Changelog [GitHub Actions] + - name: Upload changelog job transfer artifact if: needs.build-type-determination.outputs.is-nightly == 'true' uses: actions/upload-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}changelog path: CHANGELOG.txt publish: @@ -584,18 +593,23 @@ jobs: needs.build-type-determination.outputs.publish-to-s3 == 'true' && needs.build-type-determination.outputs.is-nightly == 'true' runs-on: ubuntu-latest + + env: + ARTIFACTS_FOLDER: build-artifacts + steps: - - name: Download [GitHub Actions] + - name: Download all job transfer artifacts uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + merge-multiple: true + path: ${{ env.ARTIFACTS_FOLDER }} + pattern: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}* - name: Publish Nightly [S3] uses: docker://plugins/s3 env: - PLUGIN_SOURCE: '${{ env.JOB_TRANSFER_ARTIFACT }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.JOB_TRANSFER_ARTIFACT }}/' + PLUGIN_SOURCE: '${{ env.ARTIFACTS_FOLDER }}/*' + PLUGIN_STRIP_PREFIX: '${{ env.ARTIFACTS_FOLDER }}/' PLUGIN_TARGET: '/arduino-ide/nightly' PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} @@ -616,12 +630,17 @@ jobs: needs.changelog.result == 'success' && needs.build-type-determination.outputs.is-release == 'true' runs-on: ubuntu-latest + + env: + ARTIFACTS_FOLDER: build-artifacts + steps: - - name: Download [GitHub Actions] + - name: Download all job transfer artifacts uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + merge-multiple: true + path: ${{ env.ARTIFACTS_FOLDER }} + pattern: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}* - name: Get Tag id: tag_name @@ -633,7 +652,7 @@ jobs: with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} - file: ${{ env.JOB_TRANSFER_ARTIFACT }}/* + file: ${{ env.ARTIFACTS_FOLDER }}/* tag: ${{ github.ref }} file_glob: true body: ${{ needs.changelog.outputs.BODY }} @@ -642,8 +661,8 @@ jobs: if: needs.build-type-determination.outputs.publish-to-s3 == 'true' uses: docker://plugins/s3 env: - PLUGIN_SOURCE: '${{ env.JOB_TRANSFER_ARTIFACT }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.JOB_TRANSFER_ARTIFACT }}/' + PLUGIN_SOURCE: '${{ env.ARTIFACTS_FOLDER }}/*' + PLUGIN_STRIP_PREFIX: '${{ env.ARTIFACTS_FOLDER }}/' PLUGIN_TARGET: '/arduino-ide' PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} @@ -661,7 +680,7 @@ jobs: runs-on: ubuntu-latest steps: - - name: Remove unneeded job transfer artifact + - name: Remove unneeded job transfer artifacts uses: geekyeggo/delete-artifact@v5 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}* From c09b5f718a5a14c420c1649ac5bf117d8fd68d9e Mon Sep 17 00:00:00 2001 From: per1234 <accounts@perglass.com> Date: Thu, 21 Nov 2024 20:39:25 -0800 Subject: [PATCH 357/384] Use Ubuntu 18.10 in Linux build container Background ========== Shared Library Dependencies --------------------------- The Linux build of Arduino IDE has dynamic linkage against the libstdc++ and glibc shared libraries. This results in it having a dependency on the version of the libraries that happens to be present in the environment it is built in. Although newer versions of the shared libraries are compatible with executables linked against an older version, the reverse is not true. This means that building Arduino IDE on a Linux machine with a recent distro version installed causes the IDE to error on startup for users who have a distro with older versions of the dependencies. For example, if Arduino IDE were built on a machine with version 3.4.33 of libstdc++, then attempting to run it on a machine with an older version of libstdc++ would fail with an error like: ``` Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.33' not found (required by /home/foo/arduino-ide/resources/app/lib/backend/native/nsfw.node) ``` Likewise, if Arduino IDE were built on a machine with version 2.39 of glibc, then attempting to run it on a machine with an older version of glibc would fail with an error like: ``` Error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.39' not found (required by /home/foo/arduino-ide/resources/app/node_modules/nsfw/build/Release/nsfw.node) ``` Build Machine Requirements -------------------------- The IDE builds distributed by Arduino should be compatible with a reasonable range of Linux distribution versions. In order to achieve this, the builds must be performed in a machine with an older version of the shared libraries. The shared libraries are part of the Linux distro, and installing a different version is not feasible. So this imposes a maximum limit on the build machine's distro version. The distributed builds are generated via a GitHub Actions workflow. The most simple approach is to run the build in the machine of the GitHub-hosted runners provided for each operating system. However, GitHub provides a limited range of operating system versions in their runners, and removes the older versions as newer versions are added. This means that building in the GitHub-hosted runner machine would not allow for the desired range of Linux distro version compatibility. For this reason, the Linux build is performed in a Docker container that provides an older version of Ubuntu. The same situation of incompatibility with Linux distro versions that have a version of the shared library dependencies older than the version present on the build machine occurs for several of the tools and frameworks used by the build process (e.g., Node.js, Python). In this case, the tables are turned as we are now the user rather than the distributor and so are at the mercy of the Linux distro version compatibility range provided by the distributor. So this imposes a minimum limit on the build machine's distro version. Although several of the dependencies used by the standard build system have dependencies on versions of glibc higher than the version 2.27 present in Ubuntu 18.04, it was possible to use this distro version in the Linux build container by using alternative distributions and/or versions of these dependencies. Workflow Artifacts ------------------ The build workflow uses GitHub actions workflow artifacts to transfer the files generated by the build job to subsequent jobs in the workflow. The "actions/upload-artifact" action is used for this purpose. Problem ======= GitHub is dropping support for the workflow artifacts produced by the version 3.x of the "actions/upload-artifact" action that was previously used by the build job. So the action version used in the build workflow was updated to the current version 4.x. This version of the action uses a newer version of the Node.js runtime (20). Unfortunately the the Node.js 20 runtime used by the action has a dependency on glibc version 2.28, which causes the Linux build job to fail after the update of the "actions/upload-artifact" action: ``` Run actions/upload-artifact@v4 /__e/node20/bin/node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /__e/node20/bin/node) ``` Unlike the other dependencies of the build process, it is no longer possible to work around this incompatibility by continuing to use the older compatible version of the "actions/upload-artifact" action. It is also impossible to replace the incompatible Node.js 20.x distribution used by the action, since it comes from the read-only file system of the runner image. Likewise, it is not possible to configure or force the action to use a Node.js installation at a different path on the runner machine. Resolution ========== Compatibility with the new version of the "actions/upload-artifact" action is attained by updating the version of Linux in the build container to 18.10, which is the oldest version that has glibc 2.28. The presence of a newer glibc version in the container also makes it compatible with several other dependencies of the build process, meaning the code in the Dockerfile and workflow for working around the incompatibilities of Ubuntu 18.04 can be removed. Consequences ============ Unfortunately this means the loss of compatibility of the Linux Arduino IDE builds with distros that use glibc 2.27 (e.g., Ubuntu 18.04). User of those distros will now find that Arduino IDE fails to start with an error like: ``` Error: node-loader: Error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /home/foo/arduino-ide/resources/app/lib/backend/native/pty.node) at 85467 (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:2766) at __webpack_require__ (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:6663105) at 23571 (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:3374073) at __webpack_require__ (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:6663105) at 55444 (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:3369761) at __webpack_require__ (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:6663105) at 24290 (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:1780542) at __webpack_require__ (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:6663105) at 43416 (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:1770138) at __webpack_require__ (/home/foo/arduino-ide/resources/app/lib/backend/main.js:2:6663105) ``` --- .github/workflows/assets/linux.Dockerfile | 93 ++++++----------------- .github/workflows/build.yml | 39 ++++------ 2 files changed, 37 insertions(+), 95 deletions(-) diff --git a/.github/workflows/assets/linux.Dockerfile b/.github/workflows/assets/linux.Dockerfile index 35d546ca0..9124f0365 100644 --- a/.github/workflows/assets/linux.Dockerfile +++ b/.github/workflows/assets/linux.Dockerfile @@ -1,43 +1,28 @@ # The Arduino IDE Linux build workflow job runs in this container. # syntax=docker/dockerfile:1 -FROM ubuntu:18.04 - -# See: https://unofficial-builds.nodejs.org/download/release/ -ARG node_version="18.17.1" +# See: https://hub.docker.com/_/ubuntu/tags +FROM ubuntu:18.10 +# This is required in order to use the Ubuntu package repositories for EOL Ubuntu versions: +# https://help.ubuntu.com/community/EOLUpgrades#Update_sources.list RUN \ - apt-get \ - --yes \ - update + sed \ + --in-place \ + --regexp-extended \ + --expression='s/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' \ + "/etc/apt/sources.list" -# This is required to get add-apt-repository RUN \ apt-get \ --yes \ - install \ - "software-properties-common=0.96.24.32.22" + update -# Install Git -# The PPA is required to get a modern version of Git. The version in the Ubuntu 18.04 package repository is 2.17.1, -# while action/checkout@v3 requires 2.18 or higher. RUN \ - add-apt-repository \ - --yes \ - "ppa:git-core/ppa" && \ - apt-get \ - --yes \ - update && \ - \ apt-get \ --yes \ install \ - "git" && \ - \ - apt-get \ - --yes \ - purge \ - "software-properties-common" + "git" # The repository path must be added to safe.directory, otherwise any Git operations on it would fail with a # "dubious ownership" error. actions/checkout configures this, but it is not applied to containers. @@ -51,18 +36,12 @@ ENV \ # Install Python # The Python installed by actions/setup-python has dependency on a higher version of glibc than available in the -# ubuntu:18.04 container. +# container. RUN \ apt-get \ --yes \ install \ - "python3.8-minimal=3.8.0-3ubuntu1~18.04.2" && \ - \ - ln \ - --symbolic \ - --force \ - "$(which python3.8)" \ - "/usr/bin/python3" + "python3.7-minimal=3.7.3-2~18.10" # Install Theia's package dependencies # These are pre-installed in the GitHub Actions hosted runner machines. @@ -70,43 +49,15 @@ RUN \ apt-get \ --yes \ install \ - "libsecret-1-dev=0.18.6-1" \ - "libx11-dev=2:1.6.4-3ubuntu0.4" \ + "libsecret-1-dev=0.18.6-3" \ + "libx11-dev=2:1.6.7-1" \ "libxkbfile-dev=1:1.0.9-2" -# Install Node.js -# It is necessary to use the "unofficial" linux-x64-glibc-217 build because the official Node.js 18.x is dynamically -# linked against glibc 2.28, while Ubuntu 18.04 has glibc 2.27. -ARG node_installation_path="/tmp/node-installation" -ARG artifact_name="node-v${node_version}-linux-x64-glibc-217" -RUN \ - mkdir "$node_installation_path" && \ - cd "$node_installation_path" && \ - \ - apt-get \ - --yes \ - install \ - "wget=1.19.4-1ubuntu2.2" && \ - \ - archive_name="${artifact_name}.tar.xz" && \ - wget \ - "https://unofficial-builds.nodejs.org/download/release/v${node_version}/${archive_name}" && \ - \ - apt-get \ - --yes \ - purge \ - "wget" && \ - \ - tar \ - --file="$archive_name" \ - --extract && \ - rm "$archive_name" -ENV PATH="${PATH}:${node_installation_path}/${artifact_name}/bin" - -# Install Yarn -# Yarn is pre-installed in the GitHub Actions hosted runner machines. +# Target python3 symlink to Python 3.7 installation. It would otherwise target version 3.6 due to the installation of +# the `python3` package as a transitive dependency. RUN \ - npm \ - install \ - --global \ - "yarn@1.22.19" + ln \ + --symbolic \ + --force \ + "$(which python3.7)" \ + "/usr/bin/python3" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cdc2b0f4e..e4e09b73f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,6 +48,7 @@ env: GO_VERSION: '1.21' # See: https://github.com/actions/setup-node/#readme NODE_VERSION: '18.17' + YARN_VERSION: '1.22' JOB_TRANSFER_ARTIFACT_PREFIX: build-artifacts- CHANGELOG_ARTIFACTS: changelog STAGED_CHANNEL_FILE_ARTIFACT_PREFIX: staged-channel-file- @@ -316,21 +317,26 @@ jobs: if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide" - name: Checkout - if: fromJSON(matrix.config.container) == null uses: actions/checkout@v4 - - name: Checkout - # actions/checkout@v4 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null - uses: actions/checkout@v3 - name: Install Node.js - if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' + if: runner.name != 'WINDOWS-SIGN-PC' uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' - cache: 'yarn' + # Yarn is a prerequisite for the action's cache feature, so caching should be disabled when running in the + # container where Yarn is not pre-installed. + cache: ${{ fromJSON(matrix.config.container) == null && 'yarn' || null }} + + - name: Install Yarn + if: runner.name != 'WINDOWS-SIGN-PC' + run: | + npm \ + install \ + --global \ + "yarn@${{ env.YARN_VERSION }}" - name: Install Python 3.x if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' @@ -339,33 +345,18 @@ jobs: python-version: '3.11.x' - name: Install Go - if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' + if: runner.name != 'WINDOWS-SIGN-PC' uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - name: Install Go - # actions/setup-go@v5 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null && runner.name != 'WINDOWS-SIGN-PC' - uses: actions/setup-go@v4 - with: - go-version: ${{ env.GO_VERSION }} - - name: Install Taskfile - if: fromJSON(matrix.config.container) == null && runner.name != 'WINDOWS-SIGN-PC' + if: runner.name != 'WINDOWS-SIGN-PC' uses: arduino/setup-task@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x - - name: Install Taskfile - # actions/setup-task@v2 has dependency on a higher version of glibc than available in the Linux container. - if: fromJSON(matrix.config.container) != null && runner.name != 'WINDOWS-SIGN-PC' - uses: arduino/setup-task@v1 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - version: 3.x - - name: Package env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 284dd83d7daa82fa4fa4783d3aaf46bef4edb3f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 19:52:20 +0000 Subject: [PATCH 358/384] build(deps): Bump peter-evans/create-pull-request from 5 to 7 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 5 to 7. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v5...v7) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 88157a7fa..ef87c8bbb 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -46,7 +46,7 @@ jobs: TRANSIFEX_API_KEY: ${{ secrets.TRANSIFEX_API_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v7 with: commit-message: Updated translation files title: Update translation files diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index bd9f845c1..0590e421f 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -55,7 +55,7 @@ jobs: run: yarn run themes:generate - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v7 with: commit-message: Updated themes title: Update themes From 3aedafa306076fa02ebfd421aab368819313c15e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 08:53:58 +0000 Subject: [PATCH 359/384] build(deps): Bump docker/build-push-action from 5 to 6 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5...v6) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/check-containers.yml | 2 +- .github/workflows/push-container-images.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-containers.yml b/.github/workflows/check-containers.yml index 21e9c74ee..964867cdd 100644 --- a/.github/workflows/check-containers.yml +++ b/.github/workflows/check-containers.yml @@ -43,7 +43,7 @@ jobs: uses: actions/checkout@v4 - name: Build and push to local registry - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . file: ${{ matrix.image.path }} diff --git a/.github/workflows/push-container-images.yml b/.github/workflows/push-container-images.yml index 52f638bd2..f6a2c9a5b 100644 --- a/.github/workflows/push-container-images.yml +++ b/.github/workflows/push-container-images.yml @@ -59,7 +59,7 @@ jobs: images: ${{ matrix.image.registry }}/${{ matrix.image.name }} - name: Build and push image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . file: ${{ matrix.image.path }} From 71b11ed82993f7b93b1dedfa15884f3466c27c6d Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 26 Nov 2024 19:01:07 +0100 Subject: [PATCH 360/384] feat: add donate footer to updater dialog --- .../ide-updater/ide-updater-dialog.tsx | 45 +++++++++++++++++++ .../src/browser/icons/link-open-icon.svg | 3 ++ .../src/browser/style/ide-updater-dialog.css | 32 +++++++++++++ i18n/en.json | 3 ++ 4 files changed, 83 insertions(+) create mode 100644 arduino-ide-extension/src/browser/icons/link-open-icon.svg diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index 0c6abbfaa..e73de643f 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -165,6 +165,50 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { goToDownloadPageButton.focus(); } + private appendDonateFooter() { + const footer = document.createElement('div'); + footer.classList.add('ide-updater-dialog--footer'); + const footerContent = document.createElement('div'); + footerContent.classList.add('ide-updater-dialog--footer-content'); + footer.appendChild(footerContent); + + const footerLink = document.createElement('a'); + footerLink.innerText = nls.localize( + 'arduino/ide-updater/donateLinkText', + 'donate to support us' + ); + footerLink.classList.add('ide-updater-dialog--footer-link'); + footerLink.onclick = () => + this.openExternal('https://www.arduino.cc/en/donate'); + + const footerLinkIcon = document.createElement('span'); + footerLinkIcon.title = nls.localize( + 'arduino/ide-updater/donateLinkIconTitle', + 'open donation page' + ); + footerLinkIcon.classList.add('ide-updater-dialog--footer-link-icon'); + footerLink.appendChild(footerLinkIcon); + + const placeholderKey = '%%link%%'; + const footerText = nls.localize( + 'arduino/ide-updater/donateText', + 'Open source is love, {0}', + placeholderKey + ); + const placeholder = footerText.indexOf(placeholderKey); + if (placeholder !== -1) { + const parts = footerText.split(placeholderKey); + footerContent.appendChild(document.createTextNode(parts[0])); + footerContent.appendChild(footerLink); + footerContent.appendChild(document.createTextNode(parts[1])); + } else { + footerContent.appendChild(document.createTextNode(footerText)); + footerContent.appendChild(footerLink); + } + + this.controlPanel.insertAdjacentElement('afterend', footer); + } + private openDownloadPage(): void { this.openExternal('https://www.arduino.cc/en/software'); this.close(); @@ -187,6 +231,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { downloadStarted: true, }); this.clearButtons(); + this.appendDonateFooter(); this.updater.downloadUpdate(); } diff --git a/arduino-ide-extension/src/browser/icons/link-open-icon.svg b/arduino-ide-extension/src/browser/icons/link-open-icon.svg new file mode 100644 index 000000000..21136c806 --- /dev/null +++ b/arduino-ide-extension/src/browser/icons/link-open-icon.svg @@ -0,0 +1,3 @@ +<svg width="12" height="11" viewBox="0 0 12 11" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M0.878141 10.6219C0.960188 10.7039 1.07147 10.75 1.1875 10.75H10.8125C10.9285 10.75 11.0398 10.7039 11.1219 10.6219C11.2039 10.5398 11.25 10.4285 11.25 10.3125V6.81252C11.25 6.69648 11.2039 6.5852 11.1219 6.50316C11.0398 6.42111 10.9285 6.37502 10.8125 6.37502C10.6965 6.37502 10.5852 6.42111 10.5031 6.50316C10.4211 6.5852 10.375 6.69648 10.375 6.81252V9.87502H1.625V1.12502H4.6875C4.80353 1.12502 4.91481 1.07892 4.99686 0.996874C5.07891 0.914827 5.125 0.803548 5.125 0.687515C5.125 0.571483 5.07891 0.460203 4.99686 0.378156C4.91481 0.296109 4.80353 0.250015 4.6875 0.250015H1.1875C1.07147 0.250015 0.960188 0.296109 0.878141 0.378156C0.796094 0.460203 0.75 0.571483 0.75 0.687515V10.3125C0.75 10.4285 0.796094 10.5398 0.878141 10.6219ZM11.25 4.62502V0.687515C11.25 0.571483 11.2039 0.460203 11.1219 0.378156C11.0398 0.296109 10.9285 0.250015 10.8125 0.250015H6.875C6.75897 0.250015 6.64769 0.296109 6.56564 0.378156C6.48359 0.460203 6.4375 0.571483 6.4375 0.687515C6.4375 0.803548 6.48359 0.914827 6.56564 0.996874C6.64769 1.07892 6.75897 1.12502 6.875 1.12502H9.75375L5.68937 5.18939C5.64837 5.23006 5.61582 5.27845 5.59361 5.33176C5.5714 5.38508 5.55996 5.44226 5.55996 5.50002C5.55996 5.55777 5.5714 5.61495 5.59361 5.66827C5.61582 5.72158 5.64837 5.76997 5.68937 5.81064C5.73005 5.85165 5.77843 5.88419 5.83175 5.90641C5.88506 5.92862 5.94224 5.94005 6 5.94005C6.05776 5.94005 6.11494 5.92862 6.16825 5.90641C6.22157 5.88419 6.26995 5.85165 6.31062 5.81064L10.375 1.74627V4.62502C10.375 4.74105 10.4211 4.85233 10.5031 4.93437C10.5852 5.01642 10.6965 5.06252 10.8125 5.06252C10.9285 5.06252 11.0398 5.01642 11.1219 4.93437C11.2039 4.85233 11.25 4.74105 11.25 4.62502Z" fill="#008184"/> +</svg> diff --git a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css index 5d5592baf..8d722c9d1 100644 --- a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css +++ b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css @@ -34,6 +34,37 @@ min-width: 0; } +.ide-updater-dialog--footer { + display: inline-block; + margin-top: -16px; + padding: 12px 0 24px 0; + border-top: 1px solid var(--theia-editorWidget-border); +} +.ide-updater-dialog--footer-content { + float: right; +} + +.ide-updater-dialog--footer-link { + display: inline-block; + color: var(--theia-textLink-foreground); + font-weight: 500; + line-height: 13px; +} +.ide-updater-dialog--footer-link:hover { + color: var(--theia-textLink-foreground); + cursor: pointer; +} +.ide-updater-dialog--footer-link-icon { + display: inline-block; + -webkit-mask: url(../icons/link-open-icon.svg) center no-repeat; + background-color: var(--theia-textLink-foreground); + height: 12px; + width: 12px; + cursor: pointer; + transform: translateY(2px); + margin-left: 4px; +} + .ide-updater-dialog .changelog { color: var(--theia-editor-foreground); background-color: var(--theia-editor-background); @@ -109,6 +140,7 @@ max-height: 100%; overflow: hidden; display: flex; + padding-bottom: 20px !important; } #ide-updater-dialog-container .skip-version-button { diff --git a/i18n/en.json b/i18n/en.json index 17cd55547..d7bd68b4f 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", From 4788bfbc3ff4db4dbecb3078187f7b0a733abffe Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 26 Nov 2024 21:59:42 +0100 Subject: [PATCH 361/384] feat: introduce `VersionWelcomeDialog` Show donate dialog after the first time a first IDE version is loaded --- .../browser/arduino-ide-frontend-module.ts | 9 ++ .../contributions/check-for-ide-updates.ts | 58 +++++++++- .../dialogs/version-welcome-dialog.tsx | 104 ++++++++++++++++++ .../src/browser/style/index.css | 1 + .../browser/style/version-welcome-dialog.css | 7 ++ .../src/common/protocol/ide-updater.ts | 1 + i18n/en.json | 8 ++ 7 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx create mode 100644 arduino-ide-extension/src/browser/style/version-welcome-dialog.css 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 2b170dd7b..d6779c302 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -387,6 +387,10 @@ import { import { TreeViewDecoratorService } from '@theia/plugin-ext/lib/main/browser/view/tree-view-decorator-service'; import { PLUGIN_VIEW_DATA_FACTORY_ID } from '@theia/plugin-ext/lib/main/browser/view/plugin-view-registry'; import { TreeViewWidget } from './theia/plugin-ext/tree-view-widget'; +import { + VersionWelcomeDialog, + VersionWelcomeDialogProps, +} from './dialogs/version-welcome-dialog'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -1014,6 +1018,11 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { title: 'IDEUpdater', }); + bind(VersionWelcomeDialog).toSelf().inSingletonScope(); + bind(VersionWelcomeDialogProps).toConstantValue({ + title: 'VersionWelcomeDialog', + }); + bind(UserFieldsDialog).toSelf().inSingletonScope(); bind(UserFieldsDialogProps).toConstantValue({ title: 'UserFields', diff --git a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts index ab5f62ac2..7ac57ac01 100644 --- a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts +++ b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts @@ -3,10 +3,14 @@ import { LocalStorageService } from '@theia/core/lib/browser/storage-service'; import { inject, injectable } from '@theia/core/shared/inversify'; import { IDEUpdater, + LAST_USED_IDE_VERSION, SKIP_IDE_VERSION, } from '../../common/protocol/ide-updater'; import { IDEUpdaterDialog } from '../dialogs/ide-updater/ide-updater-dialog'; import { Contribution } from './contribution'; +import { VersionWelcomeDialog } from '../dialogs/version-welcome-dialog'; +import { AppService } from '../app-service'; +import { SemVer } from 'semver'; @injectable() export class CheckForIDEUpdates extends Contribution { @@ -16,9 +20,15 @@ export class CheckForIDEUpdates extends Contribution { @inject(IDEUpdaterDialog) private readonly updaterDialog: IDEUpdaterDialog; + @inject(VersionWelcomeDialog) + private readonly versionWelcomeDialog: VersionWelcomeDialog; + @inject(LocalStorageService) private readonly localStorage: LocalStorageService; + @inject(AppService) + private readonly appService: AppService; + override onStart(): void { this.preferences.onPreferenceChanged( ({ preferenceName, newValue, oldValue }) => { @@ -36,7 +46,7 @@ export class CheckForIDEUpdates extends Contribution { ); } - override onReady(): void { + override async onReady(): Promise<void> { this.updater .init( this.preferences.get('arduino.ide.updateChannel'), @@ -49,7 +59,13 @@ export class CheckForIDEUpdates extends Contribution { return this.updater.checkForUpdates(true); }) .then(async (updateInfo) => { - if (!updateInfo) return; + if (!updateInfo) { + const isNewVersion = await this.isNewStableVersion(); + if (isNewVersion) { + this.versionWelcomeDialog.open(); + } + return; + } const versionToSkip = await this.localStorage.getData<string>( SKIP_IDE_VERSION ); @@ -64,6 +80,44 @@ export class CheckForIDEUpdates extends Contribution { e.message ) ); + }) + .finally(() => { + this.setCurrentIDEVersion(); }); } + + private async setCurrentIDEVersion(): Promise<void> { + try { + const { appVersion } = await this.appService.info(); + const currSemVer = new SemVer(appVersion ?? ''); + this.localStorage.setData(LAST_USED_IDE_VERSION, currSemVer.format()); + } catch { + // ignore invalid versions + } + } + + /** + * Check if user is running a new IDE version for the first time. + * @returns true if the current IDE version is greater than the last used version + * and both are non-prerelease versions. + */ + private async isNewStableVersion(): Promise<boolean> { + try { + const { appVersion } = await this.appService.info(); + const prevVersion = await this.localStorage.getData<string>( + LAST_USED_IDE_VERSION + ); + + const prevSemVer = new SemVer(prevVersion ?? ''); + const currSemVer = new SemVer(appVersion ?? ''); + + if (prevSemVer.prerelease.length || currSemVer.prerelease.length) { + return false; + } + + return currSemVer.compare(prevSemVer) === 1; + } catch (e) { + return false; + } + } } diff --git a/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx new file mode 100644 index 000000000..6d5a71db0 --- /dev/null +++ b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx @@ -0,0 +1,104 @@ +import React from '@theia/core/shared/react'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Message } from '@theia/core/shared/@phosphor/messaging'; +import { ReactDialog } from '../theia/dialogs/dialogs'; +import { nls } from '@theia/core'; +import { DialogProps } from '@theia/core/lib/browser'; +import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { AppService } from '../app-service'; + +@injectable() +export class VersionWelcomeDialogProps extends DialogProps {} + +@injectable() +export class VersionWelcomeDialog extends ReactDialog<void> { + @inject(AppService) + private readonly appService: AppService; + + @inject(WindowService) + private readonly windowService: WindowService; + + constructor( + @inject(VersionWelcomeDialogProps) + protected override readonly props: VersionWelcomeDialogProps + ) { + super({ + title: nls.localize( + 'arduino/versionWelcome/title', + 'Welcome to a new version of the Arduino IDE!' + ), + }); + this.node.id = 'version-welcome-dialog-container'; + this.contentNode.classList.add('version-welcome-dialog'); + } + + protected render(): React.ReactNode { + return ( + <div> + <p> + {nls.localize( + 'arduino/versionWelcome/donateMessage', + 'Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.' + )} + </p> + <p className="bold"> + {nls.localize( + 'arduino/versionWelcome/donateMessage2', + 'Please consider supporting our work on the free open source Arduino IDE.' + )} + </p> + </div> + ); + } + + override get value(): void { + return; + } + + private appendButtons(): void { + const cancelButton = this.createButton( + nls.localize('arduino/versionWelcome/cancelButton', 'Maybe later') + ); + cancelButton.classList.add('secondary'); + cancelButton.classList.add('cancel-button'); + this.addAction(cancelButton, this.close.bind(this), 'click'); + this.controlPanel.appendChild(cancelButton); + + const donateButton = this.createButton( + nls.localize('arduino/versionWelcome/donateButton', 'Donate now') + ); + this.addAction(donateButton, this.onDonateButtonClick.bind(this), 'click'); + this.controlPanel.appendChild(donateButton); + donateButton.focus(); + } + + private onDonateButtonClick(): void { + this.openDonationPage(); + this.close(); + } + + private readonly openDonationPage = () => { + const url = 'https://www.arduino.cc/en/donate'; + this.windowService.openNewWindow(url, { external: true }); + }; + + private async updateTitleVersion(): Promise<void> { + const appInfo = await this.appService.info(); + const { appVersion } = appInfo; + + if (appVersion) { + this.titleNode.innerHTML = nls.localize( + 'arduino/versionWelcome/titleWithVersion', + 'Welcome to the new Arduino IDE {0}!', + appVersion + ); + } + } + + protected override onAfterAttach(msg: Message): void { + this.update(); + this.appendButtons(); + this.updateTitleVersion(); + super.onAfterAttach(msg); + } +} diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index fd7887ae1..593cf1eaf 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -10,6 +10,7 @@ @import "./settings-dialog.css"; @import "./firmware-uploader-dialog.css"; @import "./ide-updater-dialog.css"; +@import "./version-welcome-dialog.css"; @import "./certificate-uploader-dialog.css"; @import "./user-fields-dialog.css"; @import "./debug.css"; diff --git a/arduino-ide-extension/src/browser/style/version-welcome-dialog.css b/arduino-ide-extension/src/browser/style/version-welcome-dialog.css new file mode 100644 index 000000000..80d6f71e4 --- /dev/null +++ b/arduino-ide-extension/src/browser/style/version-welcome-dialog.css @@ -0,0 +1,7 @@ +#version-welcome-dialog-container > .dialogBlock { + width: 546px; + + .bold { + font-weight: bold; + } +} diff --git a/arduino-ide-extension/src/common/protocol/ide-updater.ts b/arduino-ide-extension/src/common/protocol/ide-updater.ts index 5608e63be..ebc8bfef2 100644 --- a/arduino-ide-extension/src/common/protocol/ide-updater.ts +++ b/arduino-ide-extension/src/common/protocol/ide-updater.ts @@ -71,3 +71,4 @@ export interface IDEUpdaterClient { } export const SKIP_IDE_VERSION = 'skipIDEVersion'; +export const LAST_USED_IDE_VERSION = 'lastUsedIDEVersion'; diff --git a/i18n/en.json b/i18n/en.json index d7bd68b4f..b769cd868 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -528,6 +528,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } From 8e18c47d300cdc0cafaed31429ce467d826278eb Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Mon, 2 Dec 2024 10:01:18 +0100 Subject: [PATCH 362/384] feat: use `dompurify` to sanitize translations Pin same version of `dompurify` used in Theia --- arduino-ide-extension/package.json | 1 + .../dialogs/ide-updater/ide-updater-dialog.tsx | 16 +++++++++------- .../browser/dialogs/version-welcome-dialog.tsx | 11 +++++++---- yarn.lock | 5 +++++ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 6dfb8e35a..79d087742 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -67,6 +67,7 @@ "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", "deepmerge": "^4.2.2", + "dompurify": "^2.4.7", "drivelist": "^9.2.4", "electron-updater": "^4.6.5", "fast-deep-equal": "^3.1.3", diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index e73de643f..0598b2853 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -17,6 +17,7 @@ import { } from '../../../common/protocol/ide-updater'; import { LocalStorageService } from '@theia/core/lib/browser'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { sanitize } from 'dompurify'; @injectable() export class IDEUpdaterDialogProps extends DialogProps {} @@ -173,9 +174,8 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { footer.appendChild(footerContent); const footerLink = document.createElement('a'); - footerLink.innerText = nls.localize( - 'arduino/ide-updater/donateLinkText', - 'donate to support us' + footerLink.innerText = sanitize( + nls.localize('arduino/ide-updater/donateLinkText', 'donate to support us') ); footerLink.classList.add('ide-updater-dialog--footer-link'); footerLink.onclick = () => @@ -190,10 +190,12 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { footerLink.appendChild(footerLinkIcon); const placeholderKey = '%%link%%'; - const footerText = nls.localize( - 'arduino/ide-updater/donateText', - 'Open source is love, {0}', - placeholderKey + const footerText = sanitize( + nls.localize( + 'arduino/ide-updater/donateText', + 'Open source is love, {0}', + placeholderKey + ) ); const placeholder = footerText.indexOf(placeholderKey); if (placeholder !== -1) { diff --git a/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx index 6d5a71db0..380d980df 100644 --- a/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx @@ -6,6 +6,7 @@ import { nls } from '@theia/core'; import { DialogProps } from '@theia/core/lib/browser'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; import { AppService } from '../app-service'; +import { sanitize } from 'dompurify'; @injectable() export class VersionWelcomeDialogProps extends DialogProps {} @@ -87,10 +88,12 @@ export class VersionWelcomeDialog extends ReactDialog<void> { const { appVersion } = appInfo; if (appVersion) { - this.titleNode.innerHTML = nls.localize( - 'arduino/versionWelcome/titleWithVersion', - 'Welcome to the new Arduino IDE {0}!', - appVersion + this.titleNode.innerText = sanitize( + nls.localize( + 'arduino/versionWelcome/titleWithVersion', + 'Welcome to the new Arduino IDE {0}!', + appVersion + ) ); } } diff --git a/yarn.lock b/yarn.lock index f70c3a914..0c3367a1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5937,6 +5937,11 @@ dompurify@^2.2.9: resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== +dompurify@^2.4.7: + version "2.5.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.7.tgz#6e0d36b9177db5a99f18ade1f28579db5ab839d7" + integrity sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q== + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" From 1112057979aa28f20c0ca184dfd8462c28ed5cf5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 16:02:58 +0100 Subject: [PATCH 363/384] Updated translation files (#2523) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 5 + i18n/ar.json | 31 +-- i18n/az.json | 5 + i18n/be.json | 7 +- i18n/bg.json | 5 + i18n/ca_ES.json | 5 + i18n/cs.json | 21 +- i18n/da.json | 5 + i18n/de.json | 5 + i18n/el.json | 5 + i18n/es.json | 17 +- i18n/eu.json | 5 + i18n/fa.json | 5 + i18n/fil.json | 5 + i18n/fr.json | 5 + i18n/he.json | 5 + i18n/hu.json | 5 + i18n/hy.json | 5 + i18n/id.json | 5 + i18n/it.json | 5 + i18n/ja.json | 5 + i18n/ko.json | 7 +- i18n/my_MM.json | 5 + i18n/ne.json | 5 + i18n/nl.json | 5 + i18n/no.json | 5 + i18n/pl.json | 5 + i18n/pt.json | 5 + i18n/ro.json | 5 + i18n/ru.json | 5 + i18n/si.json | 5 + i18n/sk.json | 557 ++++++++++++++++++++++++++++++++++++++++++++++ i18n/sr.json | 5 + i18n/th.json | 5 + i18n/tr.json | 5 + i18n/uk.json | 5 + i18n/vi.json | 5 + i18n/zh-Hant.json | 5 + i18n/zh.json | 5 + i18n/zh_TW.json | 7 +- 40 files changed, 782 insertions(+), 30 deletions(-) create mode 100644 i18n/sk.json diff --git a/i18n/af.json b/i18n/af.json index cf5ee6560..c6f4d2b10 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Programeerder", + "reloadBoardData": "Reload Board Data", "reselectLater": "Herselekteer later", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Kies Bord", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "oplaai", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifieer kode na oplaai ", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/ar.json b/i18n/ar.json index 3caadecc5..c0df39480 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -8,13 +8,14 @@ "goToCloudEditor": "الانتقال الى المحرر السحابي", "goToIoTCloud": "الانتقال الى سحابة الIoT", "goToProfile": "الانتقال الى ملف التعريف الشخصي", - "menuTitle": "Arduino Cloud" + "menuTitle": "الخدمة السحابية للأردوينو" }, "board": { "board": "اللوحة {0}", - "boardConfigDialogTitle": "أختر متحكم و منفذ مختلفين ", + "boardConfigDialogTitle": "اختر لوحة أخرى ومنفذها", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "معلومات اللوحة", - "boards": "المتحكمات", + "boards": "اللوحات", "configDialog1": "اختر لوحة و منفذ معا اذا اردت ان ترفع السكتش", "configDialog2": "اذا قمت باختيار لوحة فقط ستسطيع ان تترجم لكن بدون ان ترفع المشروع", "couldNotFindPreviouslySelected": "تعذر ايجاد اللوحة '{0}' المختارة مسبقا في المنصة المثبتة '{1}' . الرجاء اعادة اختيار اللوحة التي تريد استعمالها يدويا . هل تريد باعادة الاختيار الان؟", @@ -22,19 +23,21 @@ "getBoardInfo": "الحصول على معلومات اللوحة", "inSketchbook": "(داخل ملف المشاريع)", "installNow": "نواة \"{0} {1}\" يجب تثبيتها للوحة \"{2}\" التي تم اختيارها . هل تريد تثبيتها الان ؟", - "noBoardsFound": "لا يوجد لوحات ل \"{0}\"", + "noBoardsFound": "لم يتم العثور على لوحة لـ \"{0}\"", "noNativeSerialPort": "منفذ الاتصال التسلسلي الاساسي , تعذر الحصول على معلومات", - "noPortsDiscovered": "تعذر ايجاد منافذ", + "noPortsDiscovered": "لم يتم العثور على منفذ متصل", "nonSerialPort": "منفذ اتصال غير تسلسلي , تعذر الحصول على معلومات", "openBoardsConfig": "قم باختيار لوحة و منفذ مختلفين", "pleasePickBoard": "من فضلك اختر لوحة متصلة على المنفذ الذي اخترته", "port": "المنفذ {0}", "ports": "منافذ", "programmer": "المبرمجة", + "reloadBoardData": "Reload Board Data", "reselectLater": "اعد الاختيار لاحقا", "revertBoardsConfig": "استخدم '{0}' تعامل مع '{1}'", "searchBoard": "أبحث عن متحكم", "selectBoard": "اختر لوحة", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "الرجاء اختيار منفذ من اجل الحصول على معلومات اللوحة", "showAllAvailablePorts": "يظهر كل المنافذ المتاحة عند تفعيله", "showAllPorts": "أظهر جميع المنافذ", @@ -139,7 +142,7 @@ "installManually": "ثبّت يدويا", "later": "لاحقا", "noBoardSelected": "لم يتم اختيار اي لوحة", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "لم يتم فتح صفحة كتابة الكود", "notConnected": "[غير متصل]", "offlineIndicator": "انت غير متصل بالانترنت على الارجح , بدون الاتصال بالانترنت لن تستطيع واجهة سطر الاوامر الخاصة بالاردوينو \"Arduino CLI\" تحميل الموارد المطلوبة و من الممكن ان تسبب باخطاء , الرجاء الاتصال بالانترنت و اعادة تشغيل البرنامج", "oldFormat": "ال '{0}' ما زالت تستخدم صيغة `.pde` القديمة . هل تريد الانتقال الى صيغة `.ino`  الجديدة ؟", @@ -147,13 +150,13 @@ "processing": "تتم المعالجة", "recommended": "يُنصح به", "retired": "متقاعد", - "selectManually": "Select Manually", + "selectManually": "اختر يدوياً", "selectedOn": "{0} شغّل", "serialMonitor": "مراقب المنفذ التسلسلي \"سيريال بورت\"\n ", "type": "النوع", "unknown": "غير معروف", "updateable": "يمكن تحديثه", - "userAbort": "User abort" + "userAbort": "إلغاء المستخدم" }, "compile": { "error": "خطا في الترجمة : {0}" @@ -212,7 +215,7 @@ "debug": { "debugWithMessage": "تصحيح برمجي - {0}", "debuggingNotSupported": "'{0}' لا يقبل التصحيح البرمجي", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "الحصول على معلومات التصحيح", "noPlatformInstalledFor": "المنصة غير مثبتة ل '{0}'", "optimizeForDebugging": "التحسين من اجل التصحيح البرمجي", "sketchIsNotCompiled": "المشروع '{0}' يجب ان يتم التحقق منه قبل بدء جلسة تصحيح الاخطاء . الرجاء التحقق من المشروع و اعادة تشغيل مصحح الاخطاء مرة اخرى .\nهل تريد التحقق من المشروع الان؟" @@ -368,7 +371,7 @@ "cloud.pull.warn": "True اذا كان يجب تحذير المستخدمين قبل سحب مشروع من السحابة . True افتراضيا", "cloud.push.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع الى السحابة . True افتراضيا", "cloud.pushpublic.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع عام الى السحابة . True افتراضيا", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sharedSpaceId": "معرّف مساحة Arduino Cloud المشتركة لتحميل مجموعة المشاريع منها. إذا تُركت فارغة، يتم اختيار مساحتك الخاصة", "cloud.sketchSyncEndpoint": "الوجهة المستخدمة لدفع و سحب المشاريع من الخلفية . تشير افتراضيا الى Arduino Cloud API.", "compile": "الترجمة", "compile.experimental": "مُفعل اذا وَجَبَ على الIDE التعامل مع عدة اخطاء اثناء الترجمة . غير مفعل بشكل افتراضي ", @@ -386,7 +389,7 @@ "invalid.editorFontSize": "حجم خط المحرّر غير صالح . يجب ان يكون عدد موجب", "invalid.sketchbook.location": "موقع ملف المشروع غير صالح : {0}", "invalid.theme": "سمة غير صالحة", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.asyncWorkers": "عدد العاملين غير المتزامنين المستخدمين من قبل خادم لغة Arduino (clangd). يستخدم الفهرس الخلفي أيضاً نفس عدد العاملين. الحد الأدنى للقيمة هو 0، والحد الأقصى هو 8. عندما تكون القيمة 0، يستخدم خادم اللغة جميع النوى المتاحة. القيمة الافتراضية هي 0", "language.log": "\"True\" اذا كان مخدم اللغات الخاص بArduino يستطيع توليد سجلات الى ملف المشروع , و الا \"False\", و هي كذلك بشكل افتراضي.", "language.realTimeDiagnostics": "اذا تم تفعيله , سيقوم سيرفر اللغة باعطاء تشخيصات للاخطاء خلال الوقت الحقيقي اثناء الكتابة ضمن المحرر . غير مفعل بشكل افتراضي", "manualProxy": "اعدادات الوكيل يدوياً", @@ -412,7 +415,9 @@ "survey.notification": "مفعل اذا اراد المستخدم ان يتم تبليغه في حالوجود استطلاع راي . مفعل بشكل افتراضي", "unofficialBoardSupport": "انقر لعرض قائمة عناوين URL للوحات المدعومة بشكل غير رسمي", "upload": "الرفع", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True لخرج الرفع المطول . False افتراضيا", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "التحقق من الكود بعد الرفع", "window.autoScale": "True اذا كان مقياس الواجهة يتزامن تلقائيا مع حجم الخط ", "window.zoomLevel": { @@ -466,8 +471,8 @@ "saveSketchAs": "حفظ ملف المشروع باسم ...", "showFolder": "اعرض ملف المشروع", "sketch": "مشروع", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchAlreadyContainsThisFileError": "السكيتش يحتوي بالفعل على ملف باسم{0}", + "sketchAlreadyContainsThisFileMessage": "فشل في حفظ السكيتش {0} كـ {1} {2}", "sketchbook": "مجلد المشاريع", "titleLocalSketchbook": "مجلد المشاريع المحلي", "titleSketchbook": "مجلد المشاريع", diff --git a/i18n/az.json b/i18n/az.json index 1027d9092..a462a8dae 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Proqramlayıcı", + "reloadBoardData": "Reload Board Data", "reselectLater": "Daha Sonra Yenidən Seç", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/be.json b/i18n/be.json index ff3779efb..8890f2c35 100644 --- a/i18n/be.json +++ b/i18n/be.json @@ -13,6 +13,7 @@ "board": { "board": "Плата{0}", "boardConfigDialogTitle": "Абярыце іншую плату і порт", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Інфармацыя пра плату", "boards": "платы", "configDialog1": "Абярыце як плату, так і порт, калі вы жадаеце загрузіць сцэнар.", @@ -31,10 +32,12 @@ "port": "Порт{0}", "ports": "порты", "programmer": "Сродак праграмавання", + "reloadBoardData": "Reload Board Data", "reselectLater": "Абярыце паўторна пазней", "revertBoardsConfig": "Ужыта '{0}' выяўлена ў '{1}'", "searchBoard": "Знайсці плату", "selectBoard": "Знайсці плату", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Калі ласка, абярыце порт, каб атрымаць інфармацыю пра плату.", "showAllAvailablePorts": "Паказвае ўсе даступныя порты, калі яны ўключаныя", "showAllPorts": "Паказаць усе порты", @@ -368,7 +371,7 @@ "cloud.pull.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад стварэннем сцэнара ў воблаку.\nПершапачаткова true.", "cloud.push.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад запускам сцэнара ў воблаку.\nПершапачаткова true.", "cloud.pushpublic.warn": "Калі true, карыстальнікі павінны быць папярэджаныя перад адпраўкай агульнадаступнага сцэнара ў воблака.\nПершапачаткова true.", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sharedSpaceId": "Ідэнтыфікатар агульнай прасторы воблака Arduino, з якога можна загрузіць альбом сцэнараў.\nКалі пустое, абрана вашая асабістая прастора.", "cloud.sketchSyncEndpoint": "Канчатковая кропка, якая ўжываецца для адпраўкі і выцягвання сцэнара з сервернай часткі.\nПершапачаткова яна паказвае на API воблака Arduino.", "compile": "кампіляваць", "compile.experimental": "Калі true, асяроддзе IDE павінна апрацоўваць некалькі памылак кампілятара.\nПершапачаткова false", @@ -412,7 +415,9 @@ "survey.notification": "Калі true, карыстальнікі павінны атрымліваць апавяшчэнні аб даступнасці апытання.\nПершапачаткова true.", "unofficialBoardSupport": "Пстрыкніце, каб праглядзець спіс адрасоў URL падтрымкі неафіцыйных плат", "upload": "выгрузіць", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Калі true, каб быў падрабязны вывад пры загрузцы.\nПершапачаткова false.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Праверыць код пасля выгрузкі", "window.autoScale": "Калі true, карыстальніцкі інтэрфейс аўтаматычна маштабуецца ў адпаведнасці з памерам шрыфту.", "window.zoomLevel": { diff --git a/i18n/bg.json b/i18n/bg.json index e8102ac80..a36be5219 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -13,6 +13,7 @@ "board": { "board": "Платка{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Информация за платка", "boards": "boards", "configDialog1": "Изберете както платка, така и порт, ако искате да качите скица.", @@ -31,10 +32,12 @@ "port": "Порт{0}", "ports": "ports", "programmer": "Програматор", + "reloadBoardData": "Reload Board Data", "reselectLater": "Изберете отново по-късно", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Изберете платка", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Моля, изберете порт, за да получите информация за платката.", "showAllAvailablePorts": "Показва всички налични портове, когато е активиран", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Щракнете за списък с неофициално поддържаните URL адреси на платки", "upload": "качване", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True за подробен изход за качване. False по подразбиране.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Потвърдете кода след качване", "window.autoScale": "True , ако потребителският интерфейс автоматично се мащабира с размера на шрифта.", "window.zoomLevel": { diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index 8d59ff87c..c39300d87 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -13,6 +13,7 @@ "board": { "board": "Placa {0}", "boardConfigDialogTitle": "Selecciona una altra placa i port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informació de la placa", "boards": "plaques", "configDialog1": "Selecciona una placa i un port si vols carregar un programa.", @@ -31,10 +32,12 @@ "port": "Port {0}", "ports": "ports", "programmer": "Programador", + "reloadBoardData": "Reload Board Data", "reselectLater": "Torna a triar més tard", "revertBoardsConfig": "Fes servir ' {0} ' descobert a ' {1} '", "searchBoard": "Busca una placa", "selectBoard": "Tria una placa", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Tria un port per obtenir informació de la placa.", "showAllAvailablePorts": "Mostra tots els ports disponibles habilitats", "showAllPorts": "Mostra tots els ports", @@ -412,7 +415,9 @@ "survey.notification": "Si està activat els usuaris seran notificats si hi ha una enquesta disponible. Per defecte està activat.", "unofficialBoardSupport": "Fes clic per obtenir una llista d'URLs de suport de plaques no oficials", "upload": "carrega", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Si està activat es mostrarà l'eixida detallada de la càrrega. Per defecte està desactivat.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifica el codi després de pujar-lo", "window.autoScale": "Si està activat la interfície s'escalarà automàticament amb la mida de la lletra.", "window.zoomLevel": { diff --git a/i18n/cs.json b/i18n/cs.json index 5f66422af..4226e419e 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -5,43 +5,46 @@ "label": "O {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", + "goToCloudEditor": "Otevřít v cloudovém editoru", "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToProfile": "Jdi do profilu", "menuTitle": "Arduino Cloud" }, "board": { "board": "Deska {0}", "boardConfigDialogTitle": "Zvolit jinou Desku a Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Info o desce", "boards": "Desky", "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í? ", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Editovat Desku a Port", "getBoardInfo": "Získat info o desce.", "inSketchbook": "(v projektech)", "installNow": "\"{0}{1}\" jádro musí být instalováno pro aktuálně zvolenou \"{2}\" desku. Chcete ho nyní nainstalovat?", "noBoardsFound": "Nenalezeny žádné desky pro \"{0}\"", - "noNativeSerialPort": "Native serial port, can't obtain info.", + "noNativeSerialPort": "Fyzický sériový port, nemohu získat informace.", "noPortsDiscovered": "Nenalezeny žádné porty", - "nonSerialPort": "Non-serial port, can't obtain info.", + "nonSerialPort": "Nemohu získat informace, tohle není sériový port.", "openBoardsConfig": "Zvolte jinou desku a port...", "pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ", "port": "Port {0}", "ports": "porty", "programmer": "Programátor", + "reloadBoardData": "Reload Board Data", "reselectLater": "Zvolit později", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "Použij '{0}' objeven na '{1}'", "searchBoard": "Vyhledat desku", "selectBoard": "Zvolit desku", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", "showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)", "showAllPorts": "Ukázat všechny porty", "succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.", "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.", "typeOfPorts": "{0}porty", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "Nepotvrzená deska", "unknownBoard": "Neznámá deska" }, "boardsManager": "Manažér desek", @@ -84,7 +87,7 @@ }, "cli-error-parser": { "keyboardError": "'Keyboard' nebylo nalezeno. Obsahuje váš projekt řádek '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "mouseError": "'Myš' nebyla nalezena. Obsahuje váš projekt řádek '#include <Mouse.h>'?" }, "cloud": { "chooseSketchVisibility": "Zvolte viditelnost sketche:", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Zde klikněte pro seznam adres neoficiálně podporovaných desek", "upload": "nahrát", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Ano pro podrobný výstup při nahrávání. Ne je výchozí hodnota. ", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Kontrolovat kód po nahrání", "window.autoScale": "Ano pokud se měřítko uživatelského prostředí automaticky mění s velikostí písma. ", "window.zoomLevel": { diff --git a/i18n/da.json b/i18n/da.json index 22babc740..17cd55547 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/de.json b/i18n/de.json index 7c4125363..392096cb1 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": " Anderes Board und anderen Ports wählen", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board-Informationen", "boards": "Boards", "configDialog1": " Wähle ein Board und einen Port, wenn du den Sketch hochladen möchtest.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "Ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Später auswählen", "revertBoardsConfig": "'{0}' an '{1}' verwenden", "searchBoard": "Board suchen", "selectBoard": "Board wählen", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": " Wähle einen Port, um Infos über das Board zu erhalten.", "showAllAvailablePorts": " Alle verfügbaren Ports anzeigen, wenn aktiviert.", "showAllPorts": "Alle Ports anzeigen", @@ -412,7 +415,9 @@ "survey.notification": "Wenn diese Option aktiviert ist, werden Nutzer über eine verfügbare Umfrage informiert. Standardmäßig aktiviert.", "unofficialBoardSupport": "Klicke hier, um eine URL-Liste von inoffiziell unterstützten Boards anzuzeigen.", "upload": "Hochladen", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Wenn die Option aktiviert ist, werden ausführliche Compiler-Meldungen angezeigt. Standardmäßig deaktiviert.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Code nach Hochladen überprüfen ", "window.autoScale": "Wenn die Option aktiviert ist, skaliert die Nutzeroberfläche automatisch mit der Schriftgröße.", "window.zoomLevel": { diff --git a/i18n/el.json b/i18n/el.json index 17bbb8e44..45a2e65a9 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -13,6 +13,7 @@ "board": { "board": "Πλακέτα{0}", "boardConfigDialogTitle": "Επιλέξτε Άλλη Πλακέτα & Θύρα", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Πληροφορίες Πλακέτας", "boards": "Πίνακες - Πλακέτες", "configDialog1": "Επίλεξε Πλακέτα και Θύρα αν θέλεις να ανεβάσεις ένα έργο.", @@ -31,10 +32,12 @@ "port": "Θύρα{0}", "ports": "Θύρες", "programmer": "Προγραμματιστής", + "reloadBoardData": "Reload Board Data", "reselectLater": "Επιλογή αργότερα", "revertBoardsConfig": "Χρησιμοποιήστε '{0}' που ανακαλύφθηκε στο '{1}'", "searchBoard": "Αναζήτηση πλακέτας", "selectBoard": "Επιλογή Πλακέτας", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", "showAllAvailablePorts": "Εμφανίζει όλες τις διαθέσιμες θύρες όταν είναι ενεργοποιημένο.", "showAllPorts": "Εμφάνιση όλων των θυρών", @@ -412,7 +415,9 @@ "survey.notification": "Σωστό εάν οι χρήστες πρέπει να ειδοποιούνται εάν υπάρχει διαθέσιμη έρευνα. Αληθές από προεπιλογή.", "unofficialBoardSupport": "Κλικ για λίστα Συνδέσμων ανεπίσημης υποστήριξης πλακετών", "upload": "ανέβασμα", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Αληθές για λεπτομερή έξοδο ανεβάσματος. Ψευδές απο προεπιλογή.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Επιβεβαίωση κώδικα μετά το ανέβασμα", "window.autoScale": "Αληθές αν η διεπαφή χρήστη κλιμακλωνεται αυτόματα μαζί με το μέγεθος γραμματοσειράς.", "window.zoomLevel": { diff --git a/i18n/es.json b/i18n/es.json index 60dfe189f..c606772d4 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -13,6 +13,7 @@ "board": { "board": "Placa{0}", "boardConfigDialogTitle": "Seleccionar Otra Placa y Puerto", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Información de la placa", "boards": "Placas", "configDialog1": "Selecciona tanto una placa como un puerto si quieres cargar un sketch.", @@ -31,10 +32,12 @@ "port": "Puerto {0}", "ports": "puertos", "programmer": "Programador", + "reloadBoardData": "Reload Board Data", "reselectLater": "Vuelve a seleccionar más tarde", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Buscar placa", "selectBoard": "Seleccionar Placa", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.", "showAllAvailablePorts": "Muestra todos los puertos disponibles cuando está activado", "showAllPorts": "Mostrar todos los puertos", @@ -78,9 +81,9 @@ "installAll": "Instalar todo", "noUpdates": "No se han encontrado actualizaciones recientes disponibles", "promptUpdateBoards": "Actualizaciones disponibles para alguna de tus placas", - "promptUpdateLibraries": "Actualizaciones disponibles para algunas de tus librerías", + "promptUpdateLibraries": "Actualizaciones disponibles para algunas de tus bibliotecas.", "updatingBoards": "Actualizando placas...", - "updatingLibraries": "Actualizando librerías..." + "updatingLibraries": "Actualizando bibliotecas..." }, "cli-error-parser": { "keyboardError": "'Keyboard' no encontrado. ¿Tiene tu proyecto incluida la linea '#include <Keyboard.h>'?", @@ -361,7 +364,7 @@ "automatic": "Automático", "board.certificates": "Listado de certificados que pueden ser cargados en las placas", "browse": "Explorar", - "checkForUpdate": "Recibe notificaciones sobre actualizaciones disponibles del IDE, placas y librerías. Requiere reiniciar el IDE despues de hacer cambios. Por defecto está habilitado.", + "checkForUpdate": "Recibe notificaciones sobre actualizaciones disponibles del IDE, placas y bibliotecas. Requiere reiniciar el IDE despues de hacer cambios. Por defecto está habilitado.", "choose": "Elija", "cli.daemonDebug": "Habilitar logueo de depuración de las llamadas gRPC al Arduino CLI. Requiere un reinicio del IDE para tener efecto. Deshabilitado por defecto.", "cloud.enabled": "Verdadero si las funciones de sincronización del sketch están activadas. Verdadero por defecto.", @@ -412,7 +415,9 @@ "survey.notification": "Verdadero si usuarios deberían ser notificados cuando una encuesta esté disponible. Verdadero es predeterminado.", "unofficialBoardSupport": "Pulsa para listar las URLs de las tarjetas no oficiales", "upload": "Carga", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Verdadero para una salida verbosa de la carga. Falso por defecto.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verificar el código después de cargarlo", "window.autoScale": "Verdadero si la interfaz de usuario se escala automáticamente con el tamaño de la fuente.", "window.zoomLevel": { @@ -497,11 +502,11 @@ "user": "{0} (user)" }, "title": { - "cloud": "Cloud" + "cloud": "Nube" }, "updateIndexes": { - "updateIndexes": "Actualizar indices", - "updateLibraryIndex": "Actualizar Indice de librerías", + "updateIndexes": "Actualizar índices", + "updateLibraryIndex": "Actualizar índice de bibliotecas", "updatePackageIndex": "Actualizar índice de paquete" }, "upload": { diff --git a/i18n/eu.json b/i18n/eu.json index 3e9f0675f..a0e3163ea 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -13,6 +13,7 @@ "board": { "board": "{0} plaka", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Plakaren informazioa", "boards": "boards", "configDialog1": "Hautatu plaka bat eta ataka bat programa bat kargatu nahi baduzu.", @@ -31,10 +32,12 @@ "port": "{0} ataka", "ports": "ports", "programmer": "Programatzailea", + "reloadBoardData": "Reload Board Data", "reselectLater": "Hautatu berriz geroago", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Hautatu plaka", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Hautatu ataka bat plakaren informazioa eskuratzeko.", "showAllAvailablePorts": "Gaituta dagoenean erabilgarri dauden ataka guztiak erakusten ditu", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Egin klik ofizialak ez diren plaken laguntza-URL zerrenda ikusteko", "upload": "karga", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Egia kargaren irteera xehatua izateko. Lehenetsia Gezurra.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Egiaztatu kodea kargatu ondoren", "window.autoScale": "Egia erabiltzaile interfazea letra-tamainarekin automatikoki eskalatzen bada.", "window.zoomLevel": { diff --git a/i18n/fa.json b/i18n/fa.json index 3e3adf901..8fba4156e 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -13,6 +13,7 @@ "board": { "board": "بورد {0}", "boardConfigDialogTitle": "انتخاب یک بورد و پورت دیگر", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "مشخصات برد", "boards": "بردها", "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", @@ -31,10 +32,12 @@ "port": "پورت {0}", "ports": "پورت ها", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "بعدا انتخاب کنید", "revertBoardsConfig": "استفاده از «{0}» پیدا شده در «{1}»", "searchBoard": "جستجوی بورد", "selectBoard": "انتخاب برد", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", "showAllAvailablePorts": "نمایش تمام پورت های موجود در صورت فعال بودن", "showAllPorts": "نمایش تمام پورت ها", @@ -412,7 +415,9 @@ "survey.notification": "درست است اگر در صورت وجود نظرسنجی به کاربران اطلاع داده شود. به طور پیش فرض درست است.", "unofficialBoardSupport": "برای لیستی از آدرس های اینترنتی پشتیبانی هیئت مدیره غیررسمی کلیک کنید", "upload": "بارگذاری", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "برای خروجی آپلود پرمخاطب درست است. به طور پیش فرض نادرست است.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "تائید کد بعد از بارگذاری", "window.autoScale": "اگر رابط کاربری به طور خودکار با اندازه فونت تغییر کند درست است.", "window.zoomLevel": { diff --git a/i18n/fil.json b/i18n/fil.json index 8ebbcaac5..e8bcc9c4e 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Pumili ng board", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True para sa verbose upload output. Ito ay naka-false by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True kung nais mong awtomatikong mag-adjust ang scaling ng user interface depende sa laki ng font o letra sa screen.", "window.zoomLevel": { diff --git a/i18n/fr.json b/i18n/fr.json index 090c4f643..29b80f3f3 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -13,6 +13,7 @@ "board": { "board": "Carte{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Information de la carte", "boards": "boards", "configDialog1": "Sélectionnez une carte et un port si vous souhaitez téléverser un croquis.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Programmeur", + "reloadBoardData": "Reload Board Data", "reselectLater": "Re-sélectionner plus tard", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Selectionner une carte", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Merci de choisir un port pour obtenir des informations sur la carte.", "showAllAvailablePorts": "Affiche les ports disponibles quand activer.", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "Vrai si les utilisateurs doivent être avertis si une enquête est disponible. Vrai par défaut.", "unofficialBoardSupport": "Cliquer pour la liste non-officielle des URLs des support de cartes", "upload": "téléverser", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Vrai si le téléchargement en mode verbose. Faux par défaut.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Vérifier le code après le téléversement", "window.autoScale": "Vrai si l'interface utilisateur s'ajuste avec la taille de la police.", "window.zoomLevel": { diff --git a/i18n/he.json b/i18n/he.json index 3f3cbb3bb..66ed4846b 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -13,6 +13,7 @@ "board": { "board": "לוח{0}", "boardConfigDialogTitle": "יש לבחור לוח ופורט אחר", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "פרטי הלוח", "boards": "boards", "configDialog1": "נא לבחור סוג לוח ופורט כדי להעלות את הסקיצה.", @@ -31,10 +32,12 @@ "port": "פורט{0}", "ports": "ports", "programmer": "תכנת", + "reloadBoardData": "Reload Board Data", "reselectLater": "בחר מחדש מאוחר יותר", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "חפש לוח", "selectBoard": "בחר לוח", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "אנא בחר פורט לקבלת מידע אודותיו.", "showAllAvailablePorts": "הצג את כל הפורטים הזמינים כשמופעל", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/hu.json b/i18n/hu.json index 93e7180e3..0e4b75a22 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -13,6 +13,7 @@ "board": { "board": "Alaplap {0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Alaplapi információk", "boards": "boards", "configDialog1": "Válassz ki egy alaplapot és egy portot is - csak ekkor lehetséges a feltöltés. ", @@ -31,10 +32,12 @@ "port": "Port {0}", "ports": "ports", "programmer": "Programozó", + "reloadBoardData": "Reload Board Data", "reselectLater": "Később újra válaszd ki", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Alaplap választás", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Válassz egy portot az alaplap információinak megtekintéséhez. ", "showAllAvailablePorts": "Elérhető portok mutatása - ha engedélyezett", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Kattints ide a nem hivatalos alaplapok fordítási URL-jeinek listájához ", "upload": "feltöltés", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Kipipálva: a részletes feltöltési üzenetek kiírása a képernyőre. Alapértelmezés szerint hamis/nincs kipipálva.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Kód ellenőrzése feltöltés után", "window.autoScale": "Kipipálva, ha a felhasználói felület automatikusan méreteződik a betűmérettel együtt. ", "window.zoomLevel": { diff --git a/i18n/hy.json b/i18n/hy.json index 22babc740..17cd55547 100644 --- a/i18n/hy.json +++ b/i18n/hy.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Reselect later", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/id.json b/i18n/id.json index 7ff8cae03..8c60f75d2 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -13,6 +13,7 @@ "board": { "board": "Papan{0}", "boardConfigDialogTitle": "Pilih Papan dan Port Lain", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informasi Papan", "boards": "papan", "configDialog1": "Pilih antara Papan dan Port jika kamu ingin mengunggah sebuah sketsa.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "port", "programmer": "Pemrogram", + "reloadBoardData": "Reload Board Data", "reselectLater": "Pilih ulang nanti", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Cari papan", "selectBoard": "Pilih Papan", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Mohon pilih port untuk memperoleh informasi papan.", "showAllAvailablePorts": "Tampilkan semua port yang tersedia saat dinyalakan", "showAllPorts": "Tampilkan semua port", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/it.json b/i18n/it.json index 35400398d..bdc3885df 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -13,6 +13,7 @@ "board": { "board": "Scheda{0}", "boardConfigDialogTitle": "Seleziona un'altra scheda e un'altra porta", + "boardDataReloaded": "Dati della scheda ricaricati.", "boardInfo": "Informazioni sulla scheda", "boards": "schede", "configDialog1": "Seleziona una scheda ed una porta se vuoi caricare uno sketch.", @@ -31,10 +32,12 @@ "port": "Porta{0}", "ports": "porte", "programmer": "Programmatore", + "reloadBoardData": "Ricarica i dati della scheda", "reselectLater": "Riselezionare più tardi", "revertBoardsConfig": "Usa '{0}' rilevato su '{1}'", "searchBoard": "Cerca la scheda", "selectBoard": "Seleziona la scheda", + "selectBoardToReload": "Seleziona una scheda.", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", "showAllAvailablePorts": "Quando abilitato, mostra tutte le porte disponibili", "showAllPorts": "Mostra tutte le porte", @@ -412,7 +415,9 @@ "survey.notification": "Vero se gli utenti devono essere avvisati quando è disponibile un sondaggio. Vero per impostazione predefinita.", "unofficialBoardSupport": "Clicca per ottenere la lista di collegamenti per le schede di terze parti, non schede ufficiali.", "upload": "caricamento", + "upload.autoVerify": "Vero se l'IDE deve verificare automaticamente il codice prima del caricamento. Vero per impostazione predefinita. Quando questo valore è falso, l'IDE non ricompila il codice prima di caricare il binario sulla scheda. Si consiglia di impostare questo valore su false solo se si sa cosa si sta facendo.", "upload.verbose": "Vero per un rapporto dettagliato durante l'upload. Il valore predefinito è impostato su falso.", + "upload.verify": "Dopo il caricamento, verificare che il contenuto della memoria sulla scheda corrisponda al binario caricato.", "verifyAfterUpload": "Verifica il codice dopo il caricamento", "window.autoScale": "Vero se l'interfaccia scala automaticamente in base alla dimensione del font.", "window.zoomLevel": { diff --git a/i18n/ja.json b/i18n/ja.json index 4e36e6b46..aca3aeaf0 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -13,6 +13,7 @@ "board": { "board": "ボード{0}", "boardConfigDialogTitle": "他のボードとポートを選択", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "ボード情報", "boards": "ボード", "configDialog1": "スケッチを書き込みたい場合には、ボードとポートの両方を選択してください。", @@ -31,10 +32,12 @@ "port": "ポート{0}", "ports": "ポート", "programmer": "書き込み装置", + "reloadBoardData": "Reload Board Data", "reselectLater": "後で選択しなおす", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "ボードを検索", "selectBoard": "ボードを選択", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "ボード情報を得るには、ポートを選択してください。", "showAllAvailablePorts": "有効な場合、利用可能なすべてのポートを表示", "showAllPorts": "全てのポートを表示", @@ -412,7 +415,9 @@ "survey.notification": "アンケートが利用可能になったとき、通知を受け取る場合はTrueを指定します。デフォルトではTrue。", "unofficialBoardSupport": "クリックして非公式ボードをサポートするURLのリストを表示", "upload": "書き込み", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "書き込み時に詳細な出力を行うにはtrueを指定。デフォルトではfalse。", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "書き込み後にコードを検証する", "window.autoScale": "ユーザーインターフェイスをフォントサイズに合わせて自動的に拡大縮小させるにはtrueを指定。", "window.zoomLevel": { diff --git a/i18n/ko.json b/i18n/ko.json index ddeae53a9..e00e56133 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -13,7 +13,8 @@ "board": { "board": "보드{0}", "boardConfigDialogTitle": "보드 및 포트 선택", - "boardInfo": "보드정보", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "보드 정보", "boards": "boards", "configDialog1": "스케치를 업로드할 보드 및 포트를 선택", "configDialog2": "보드를 선택하면 컴파일은 가능하지만, 스케치를 업로드 할 수 없습니다.", @@ -31,10 +32,12 @@ "port": "포트{0}", "ports": "ports", "programmer": "프로그래머", + "reloadBoardData": "Reload Board Data", "reselectLater": "나중에 선택", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "보드 검색", "selectBoard": "보드 선택", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "보드 정보를 얻으려면 포트를 선택하십시오.", "showAllAvailablePorts": "활성화된 사용 가능한 모든 포트를 표시합니다.", "showAllPorts": "모든 포트 보이기", @@ -412,7 +415,9 @@ "survey.notification": "설문조사를 사용할 수 있는 경우 사용자에게 알림을 보내야 하는 경우 True입니다. 기본은 True입니다.", "unofficialBoardSupport": "비공식 보드 지원 URL 목록을 보려면 클릭하십시오.", "upload": "업로드", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "자세한 업로드 출력의 경우 True이고 기본적으로 False입니다.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "업로드 후 코드확인", "window.autoScale": "사용자 인터페이스가 글꼴 크기에 따라 자동으로 조정되는 경우 True입니다.", "window.zoomLevel": { diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 626fdad02..88037a95a 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -13,6 +13,7 @@ "board": { "board": "ဘုတ်{0}", "boardConfigDialogTitle": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ပါ", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်", "boards": "ဘုတ်များ", "configDialog1": "ကုတ်ဖိုင်တစ်ခုကို upload တင်လိုပါက ဘုတ်နှင့်အပေါက် နှစ်ခုလုံးကို ရွေးပေးပါ။", @@ -31,10 +32,12 @@ "port": "အပေါက်{0}", "ports": "အပေါက်များ", "programmer": "ပရိုဂရမ်မာ", + "reloadBoardData": "Reload Board Data", "reselectLater": "နောက်မှ ပြန်ရွေးချယ်မည်", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "ဘုတ်ရှာမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် အပေါက်ကို ရွေးချယ်ပါ။", "showAllAvailablePorts": "အမှန်ခြစ်ထားပါက ရွေးချယ်နိုင်သော အပေါက်များအားလုံးကို ဖော်ပြပေးမည်", "showAllPorts": "အပေါက်အားလုံးပြ", @@ -412,7 +415,9 @@ "survey.notification": "စစ်တမ်းကောက်ပါက အသုံးပြုသူကို အသိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", "unofficialBoardSupport": "တရားမဝင်ဘုတ် ထောက်ပံ့မှုURLစာရင်းအတွက် ကလစ်လိုက်ပါ", "upload": "အပ်လုတ်တင်", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "အပ်လုတ်တင်မှုဆိုင်အချက်အလက်များ အသေးစိတ်ဖော်ပြမည်။ မူရင်းတန်ဖိုး - အမှား", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "အပ်လုတ်တင်ပြီးလျှင်ကုတ်ကိုစစ်ဆေးပါ", "window.autoScale": "အမှန်ဖြစ်နေပါက အသုံးပြုသူအင်တာဖေ့သည် ဖောင့်အရွယ်အစားနှင့်အတူ အလိုလိုချိန်ညှိမည်။", "window.zoomLevel": { diff --git a/i18n/ne.json b/i18n/ne.json index f5617ebb7..264a12494 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -13,6 +13,7 @@ "board": { "board": "बोर्ड {0}", "boardConfigDialogTitle": "अन्य बोर्ड र पोर्ट चयन गर्नुहोस् |", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "बोर्डको जानकारी", "boards": "बोर्डहरू", "configDialog1": "यदि तपाइँ स्केच अपलोड गर्न चाहनुहुन्छ भने बोर्ड र पोर्ट दुवै चयन गर्नुहोस्।", @@ -31,10 +32,12 @@ "port": "पोर्ट {0}", "ports": "पोर्टहरू", "programmer": "प्रोग्रामर", + "reloadBoardData": "Reload Board Data", "reselectLater": "पुन: चयन गर्नुहोस्", "revertBoardsConfig": "'{1}' मा फेला परेको '{0}' प्रयोग गर्नुहोस्", "searchBoard": "बोर्ड खोज्नुहोस। ", "selectBoard": "बोर्ड छान्नुहोस । ", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "बोर्ड जानकारी प्राप्त गर्न पोर्ट चयन गर्नुहोस्।", "showAllAvailablePorts": "अनुमति हुँदा सबै उपलब्ध पोर्टहरू देखाउँछ।", "showAllPorts": "पोर्टहरु हेर्नुहोस |", @@ -412,7 +415,9 @@ "survey.notification": "यदि सर्वेक्षण उपलब्ध छ भने प्रयोगकर्ताहरूलाई सूचित गरिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा सही छ।", "unofficialBoardSupport": "अनौपचारिक बोर्ड समर्थन गर्ने URL को सूचीको लागि क्लिक गर्नुहोस्", "upload": "अपलोड ", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "वर्बोज अपलोड आउटपुट को लागी सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा असक्षम छ। ", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "कोड अपलोड गरेपछि प्रमाणित गर्नुहोस्", "window.autoScale": "प्रयोगकर्ता इन्टरफेसले स्वचालित रूपमा फन्ट साइजसँग मापन गरेमा सही संकेत गर्नुहोस्।", "window.zoomLevel": { diff --git a/i18n/nl.json b/i18n/nl.json index 9b3aba52f..ddfa0dd30 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -13,6 +13,7 @@ "board": { "board": "Bord{0}", "boardConfigDialogTitle": "Selecteer Ander Bord en Poort", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Bord Informatie", "boards": "borden", "configDialog1": "Selecteer een Bord en een Poort als je een schets wilt opladen.", @@ -31,10 +32,12 @@ "port": "Poort{0}", "ports": "poorten", "programmer": "Programmeerapparaat", + "reloadBoardData": "Reload Board Data", "reselectLater": "Later opnieuw selecteren", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Bord zoeken", "selectBoard": "Bord selecteren", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", "showAllAvailablePorts": "Toont alle beschikbare poorten indien ingeschakeld", "showAllPorts": "Toon alle poorten", @@ -412,7 +415,9 @@ "survey.notification": "Waar als gebruikers een melding moeten krijgen als er een enquête beschikbaar is. Standaard is dit waar.", "unofficialBoardSupport": "Klik voor een lijst met onofficiële borden ondersteuning URL's", "upload": "uploaden", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Waar voor uitgebreide uploaduitvoer. Standaard onwaar.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifieer de code na het uploaden", "window.autoScale": "Waar als de gebruikersinterface automatisch wordt geschaald met de lettergrootte.", "window.zoomLevel": { diff --git a/i18n/no.json b/i18n/no.json index fa6f0f253..4fe18ad78 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -13,6 +13,7 @@ "board": { "board": "Kort{0}", "boardConfigDialogTitle": "Velg et annet kort og port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informasjon om kort", "boards": "Kort", "configDialog1": "Velg kort og portnummer for å laste opp skissen", @@ -31,10 +32,12 @@ "port": "Port {0}", "ports": "porter", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Velg igjen senere", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Søk etter kort", "selectBoard": "Velg kort", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Velg en port for å få info om kort", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Vis alle porter", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/pl.json b/i18n/pl.json index 1b19d20e5..201faf2b0 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -13,6 +13,7 @@ "board": { "board": "Płytka{0}", "boardConfigDialogTitle": "Wybierz inną płytkę i port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informacje o płytce", "boards": "Płytki", "configDialog1": "Wybierz płytkę oraz port, aby wgrać szkic.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "Porty", "programmer": "Programator", + "reloadBoardData": "Reload Board Data", "reselectLater": "Wybierz ponownie później", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Szukaj płytki", "selectBoard": "Wybierz płytkę", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Wybierz port, aby uzyskać informacje o płytce.", "showAllAvailablePorts": "Po włączeniu pokazuje wszystkie dostępne porty", "showAllPorts": "Pokaż wszystkie dostępne porty", @@ -412,7 +415,9 @@ "survey.notification": "Prawdziwy, jeśli użytkownicy powinni być powiadamiani o dostępności ankiety. Domyślnie prawdwdziwy.", "unofficialBoardSupport": "Kliknij, aby przejść do listy linków nieoficjalnego wsparcia dla płytek.", "upload": "przesyłanie", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Prawda, aby pokazywać szczegółowe informacje podczas wgrywania. Fałsz jest wartością domyślną.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Weryfikuj kod po przesłaniu", "window.autoScale": "Prawda, jeśli interfejs użytkownika skaluje się automatycznie z rozmiarem czcionki.", "window.zoomLevel": { diff --git a/i18n/pt.json b/i18n/pt.json index fdc604356..4c33e7dae 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -13,6 +13,7 @@ "board": { "board": "Placa{0}", "boardConfigDialogTitle": "Selecionar Outra Placa e Porta", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Informações da Placa", "boards": "placas", "configDialog1": "Selecione uma placa e uma porta se quiser fazer o upload de um sketch.", @@ -31,10 +32,12 @@ "port": "Porta{0}", "ports": "portas", "programmer": "Programador/Gravador", + "reloadBoardData": "Reload Board Data", "reselectLater": "Selecionar novamente mais tarde", "revertBoardsConfig": "Uso '{0}' descoberto em '{1}'", "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", "showAllAvailablePorts": "Mostrar todas as portas disponíveis quando habilitado", "showAllPorts": "Mostrar todas as portas", @@ -412,7 +415,9 @@ "survey.notification": "Verdadeiro se o usuário deve ser notificado se uma pesquisa estiver disponível. Verdadeiro por padrão", "unofficialBoardSupport": "Clique para obter uma lista de URLs de placas não oficiais suportadas", "upload": "enviar", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "Verdadeiro para saída de upload detalhada. Falsa é padrão.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verificar o código após enviar", "window.autoScale": "Verdadeiro se a interface do usuário for dimensionada automaticamente com o tamanho da fonte.", "window.zoomLevel": { diff --git a/i18n/ro.json b/i18n/ro.json index a5a37a99a..38e52b4d0 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "boards", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Portul{0}", "ports": "ports", "programmer": "Programator", + "reloadBoardData": "Reload Board Data", "reselectLater": "Re-selectează mai târziu", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Selectează Placa", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "încarcă", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verifică codul după încarcare", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/ru.json b/i18n/ru.json index 046070f98..1ee05dfad 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -13,6 +13,7 @@ "board": { "board": "Плата{0}", "boardConfigDialogTitle": "Выберите другую плату и порт", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Информация о плате", "boards": "платы", "configDialog1": "Выберите плату и порт, если Вы хотите загрузить скетч в плату.", @@ -31,10 +32,12 @@ "port": "Порт{0}", "ports": "порты", "programmer": "Программатор", + "reloadBoardData": "Reload Board Data", "reselectLater": "Перевыбрать позже", "revertBoardsConfig": "Используйте '{0}', обнаруженный на '{1}'", "searchBoard": "Поиск платы", "selectBoard": "Выбор платы", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Пожалуйста, выберите порт в меню инструментов для получения информации с платы.", "showAllAvailablePorts": "Показать все доступные порты при включении", "showAllPorts": "Показать все порты", @@ -412,7 +415,9 @@ "survey.notification": "Включите, если пользователи должны получать уведомления, когда появится новый опрос. Включено по умолчанию.", "unofficialBoardSupport": "Список URL-адресов поддержки неофициальных плат", "upload": "выгрузке на плату", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True - подробный вывод при загрузке скетча на плату. По умолчанию - false.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Проверять содержимое памяти платы после загрузки", "window.autoScale": "True, если пользовательский интерфейс автоматически масштабируется в зависимости от размера шрифта.", "window.zoomLevel": { diff --git a/i18n/si.json b/i18n/si.json index 1c6490617..6015c08fa 100644 --- a/i18n/si.json +++ b/i18n/si.json @@ -13,6 +13,7 @@ "board": { "board": "Board{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Board Info", "boards": "පුවරු", "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "ports", "programmer": "ක්‍රමලේඛක", + "reloadBoardData": "Reload Board Data", "reselectLater": "පසුව තෝරන්න", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "පුවරුව සොයන්න", "selectBoard": "පුවරුව තෝරන්න", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/sk.json b/i18n/sk.json new file mode 100644 index 000000000..17cd55547 --- /dev/null +++ b/i18n/sk.json @@ -0,0 +1,557 @@ +{ + "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", + "boardDataReloaded": "Board data reloaded.", + "boardInfo": "Board Info", + "boards": "boards", + "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", + "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", + "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", + "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}\"", + "noNativeSerialPort": "Native serial port, can't obtain info.", + "noPortsDiscovered": "No ports discovered", + "nonSerialPort": "Non-serial port, can't obtain info.", + "openBoardsConfig": "Select other board and port…", + "pleasePickBoard": "Please pick a board connected to the port you have selected.", + "port": "Port{0}", + "ports": "ports", + "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", + "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Search board", + "selectBoard": "Select Board", + "selectBoardToReload": "Please select a board first.", + "selectPortForInfo": "Please select a port to obtain board info.", + "showAllAvailablePorts": "Shows all available ports when enabled", + "showAllPorts": "Show all ports", + "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", + "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", + "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Unknown board" + }, + "boardsManager": "Boards Manager", + "boardsType": { + "arduinoCertified": "Arduino Certified" + }, + "bootloader": { + "burnBootloader": "Burn Bootloader", + "burningBootloader": "Burning bootloader...", + "doneBurningBootloader": "Done burning bootloader." + }, + "burnBootloader": { + "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 <Keyboard.h>'?", + "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + }, + "cloud": { + "chooseSketchVisibility": "Choose visibility of your Sketch:", + "cloudSketchbook": "Cloud Sketchbook", + "connected": "Connected", + "continue": "Continue", + "donePulling": "Done pulling '{0}'.", + "donePushing": "Done pushing '{0}'.", + "embed": "Embed:", + "emptySketchbook": "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", + "noSketchOpened": "No sketch opened", + "notConnected": "[not connected]", + "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", + "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", + "partner": "Partner", + "processing": "Processing", + "recommended": "Recommended", + "retired": "Retired", + "selectManually": "Select Manually", + "selectedOn": "on {0}", + "serialMonitor": "Serial Monitor", + "type": "Type", + "unknown": "Unknown", + "updateable": "Updatable", + "userAbort": "User abort" + }, + "compile": { + "error": "Compilation error: {0}" + }, + "component": { + "boardsIncluded": "Boards included in this package:", + "by": "by", + "clickToOpen": "Click to open in browser: {0}", + "filterSearch": "Filter your search...", + "install": "Install", + "installLatest": "Install Latest", + "installVersion": "Install {0}", + "installed": "{0} installed", + "moreInfo": "More info", + "otherVersions": "Other Versions", + "remove": "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}'", + "getDebugInfo": "Getting debug info...", + "noPlatformInstalledFor": "Platform is not installed for '{0}'", + "optimizeForDebugging": "Optimize for Debugging", + "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, + "dialog": { + "dontAskAgain": "Don't ask again" + }, + "editor": { + "autoFormat": "Auto Format", + "commentUncomment": "Comment/Uncomment", + "copyForForum": "Copy for Forum (Markdown)", + "decreaseFontSize": "Decrease Font Size", + "decreaseIndent": "Decrease Indent", + "increaseFontSize": "Increase Font Size", + "increaseIndent": "Increase Indent", + "nextError": "Next Error", + "previousError": "Previous Error", + "revealError": "Reveal Error" + }, + "examples": { + "builtInExamples": "Built-in examples", + "couldNotInitializeExamples": "Could not initialize built-in examples.", + "customLibrary": "Examples from Custom Libraries", + "for": "Examples for {0}", + "forAny": "Examples for any board", + "menu": "Examples" + }, + "firmware": { + "checkUpdates": "Check Updates", + "failedInstall": "Installation failed. Please try again.", + "install": "Install", + "installingFirmware": "Installing firmware.", + "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "selectBoard": "Select Board", + "selectVersion": "Select firmware version", + "successfullyInstalled": "Firmware successfully installed.", + "updater": "Firmware Updater" + }, + "help": { + "environment": "Environment", + "faq": "Frequently Asked Questions", + "findInReference": "Find in Reference", + "gettingStarted": "Getting Started", + "keyword": "Type a keyword", + "privacyPolicy": "Privacy Policy", + "reference": "Reference", + "search": "Search on Arduino.cc", + "troubleshooting": "Troubleshooting", + "visit": "Visit Arduino.cc" + }, + "ide-updater": { + "checkForUpdates": "Check for Arduino IDE Updates", + "closeAndInstallButton": "Close and Install", + "closeToInstallNotice": "Close the software and install the update on your machine.", + "downloadButton": "Download", + "downloadingNotice": "Downloading the latest version of the Arduino IDE.", + "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", + "goToDownloadButton": "Go To Download", + "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "ideUpdaterDialog": "Software Update", + "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", + "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", + "notNowButton": "Not now", + "skipVersionButton": "Skip Version", + "updateAvailable": "Update Available", + "versionDownloaded": "Arduino IDE {0} has been downloaded." + }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, + "library": { + "addZip": "Add .ZIP Library...", + "arduinoLibraries": "Arduino libraries", + "contributedLibraries": "Contributed libraries", + "include": "Include Library", + "installAll": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", + "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", + "overwriteExistingLibrary": "Do you want to overwrite the existing library?", + "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", + "title": "Library Manager", + "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", + "zipLibrary": "Library" + }, + "librarySearchProperty": { + "topic": "Topic" + }, + "libraryTopic": { + "communication": "Communication", + "dataProcessing": "Data Processing", + "dataStorage": "Data Storage", + "deviceControl": "Device Control", + "display": "Display", + "other": "Other", + "sensors": "Sensors", + "signalInputOutput": "Signal Input/Output", + "timing": "Timing", + "uncategorized": "Uncategorized" + }, + "libraryType": { + "installed": "Installed" + }, + "menu": { + "advanced": "Advanced", + "sketch": "Sketch", + "tools": "Tools" + }, + "monitor": { + "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "baudRate": "{0} baud", + "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", + "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", + "notConnectedError": "Not connected to {0} {1} port.", + "unableToCloseWebSocket": "Unable to close websocket", + "unableToConnectToWebSocket": "Unable to connect to websocket" + }, + "newCloudSketch": { + "newSketchTitle": "Name of the new Cloud Sketch" + }, + "portProtocol": { + "network": "Network", + "serial": "Serial" + }, + "preferences": { + "additionalManagerURLs": "Additional Boards Manager URLs", + "auth.audience": "The OAuth2 audience.", + "auth.clientID": "The OAuth2 client ID.", + "auth.domain": "The OAuth2 domain.", + "auth.registerUri": "The URI used to register a new user.", + "automatic": "Automatic", + "board.certificates": "List of certificates that can be uploaded to boards", + "browse": "Browse", + "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "choose": "Choose", + "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", + "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", + "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", + "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", + "compile": "compile", + "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", + "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.verbose": "True for verbose compile output. False by default", + "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", + "compilerWarnings": "Compiler warnings", + "editorFontSize": "Editor font size", + "editorQuickSuggestions": "Editor Quick Suggestions", + "enterAdditionalURLs": "Enter additional URLs, one for each row", + "files.inside.sketches": "Show files inside Sketches", + "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "interfaceScale": "Interface scale", + "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", + "invalid.sketchbook.location": "Invalid sketchbook location: {0}", + "invalid.theme": "Invalid theme.", + "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", + "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", + "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "manualProxy": "Manual proxy configuration", + "monitor": { + "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + }, + "network": "Network", + "newSketchbookLocation": "Select new sketchbook location", + "noCliConfig": "Could not load the CLI configuration", + "noProxy": "No proxy", + "proxySettings": { + "hostname": "Host name", + "password": "Password", + "port": "Port number", + "username": "Username" + }, + "showVerbose": "Show verbose output during", + "sketch": { + "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." + }, + "sketchbook.location": "Sketchbook location", + "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", + "survey.notification": "True if users should be notified if a survey is available. True by default.", + "unofficialBoardSupport": "Click for a list of unofficial board support URLs", + "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "verifyAfterUpload": "Verify code after upload", + "window.autoScale": "True if the user interface automatically scales with the font size.", + "window.zoomLevel": { + "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + } + }, + "renameCloudSketch": { + "renameSketchTitle": "New name of the Cloud Sketch" + }, + "replaceMsg": "Replace the existing version of {0}?", + "selectZip": "Select a zip file containing the library you'd like to add", + "serial": { + "autoscroll": "Autoscroll", + "carriageReturn": "Carriage Return", + "connecting": "Connecting to '{0}' on '{1}'...", + "message": "Message (Enter to send message to '{0}' on '{1}')", + "newLine": "New Line", + "newLineCarriageReturn": "Both NL & CR", + "noLineEndings": "No Line Ending", + "notConnected": "Not connected. Select a board and a port to connect automatically.", + "openSerialPlotter": "Serial Plotter", + "timestamp": "Timestamp", + "toggleTimestamp": "Toggle Timestamp" + }, + "sketch": { + "archiveSketch": "Archive Sketch", + "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", + "compile": "Compiling sketch...", + "configureAndUpload": "Configure and Upload", + "createdArchive": "Created archive '{0}'.", + "doneCompiling": "Done compiling.", + "doneUploading": "Done uploading.", + "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", + "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", + "exportBinary": "Export Compiled Binary", + "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", + "moving": "Moving", + "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", + "new": "New Sketch", + "noTrailingPeriod": "A filename cannot end with a dot", + "openFolder": "Open Folder", + "openRecent": "Open Recent", + "openSketchInNewWindow": "Open Sketch in New Window", + "reservedFilename": "'{0}' is a reserved filename.", + "saveFolderAs": "Save sketch folder as...", + "saveSketch": "Save your sketch to open it again later.", + "saveSketchAs": "Save sketch folder as...", + "showFolder": "Show Sketch Folder", + "sketch": "Sketch", + "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", + "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "Local Sketchbook", + "titleSketchbook": "Sketchbook", + "upload": "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": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Light", + "user": "{0} (user)" + }, + "title": { + "cloud": "Cloud" + }, + "updateIndexes": { + "updateIndexes": "Update Indexes", + "updateLibraryIndex": "Update Library Index", + "updatePackageIndex": "Update Package Index" + }, + "upload": { + "error": "{0} error: {1}" + }, + "userFields": { + "cancel": "Cancel", + "enterField": "Enter {0}", + "upload": "Upload" + }, + "validateSketch": { + "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", + "abortFixTitle": "Invalid sketch", + "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", + "renameSketchFileTitle": "Invalid sketch filename", + "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", + "renameSketchFolderTitle": "Invalid sketch name" + }, + "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/sr.json b/i18n/sr.json index fa4bc38bb..d1bad70cb 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -13,6 +13,7 @@ "board": { "board": "Плоча{0}", "boardConfigDialogTitle": "Select Other Board and Port", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Информације о плочи", "boards": "boards", "configDialog1": "Одабери и плочу и порт ако желиш да спустиш рад.", @@ -31,10 +32,12 @@ "port": "Порт{0}", "ports": "ports", "programmer": "Програмер", + "reloadBoardData": "Reload Board Data", "reselectLater": "Одабери поново касније", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Одабери плочу", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Одабери порт да добијеш информације о плочи", "showAllAvailablePorts": "Приказује све доступне портове када је укључено", "showAllPorts": "Show all ports", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "спусти", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Провјери код након спуштања", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/th.json b/i18n/th.json index 8d3247c8c..656e98e00 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -13,6 +13,7 @@ "board": { "board": "บอร์ด{0}", "boardConfigDialogTitle": "เลือกบอร์ดและพอร์ตอื่นๆ", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "ข้อมูลบอร์ด", "boards": "บอร์ด", "configDialog1": "เลือกบอร์ดและพอร์ตที่คุณต้องการอัปโหลดโปรแกรมของคุณ", @@ -31,10 +32,12 @@ "port": "พอร์ต {0}", "ports": "พอร์ต", "programmer": "เครื่องโปรแกรม", + "reloadBoardData": "Reload Board Data", "reselectLater": "เลือกใหม่ในภายหลัง", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "ค้นหาบอร์ด", "selectBoard": "เลือกบอร์ด", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "กรุณาเลือกพอร์ตเพื่อดึงข้อมูลของบอร์ด", "showAllAvailablePorts": "แสดงพอร์ตทั้งหมดที่มีอยู่เมื่อเลือก", "showAllPorts": "แสดงพอร์ตทั้งหมด", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True for verbose upload output. False by default.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", "window.autoScale": "True if the user interface automatically scales with the font size.", "window.zoomLevel": { diff --git a/i18n/tr.json b/i18n/tr.json index 52fce53da..32cd6720c 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -13,6 +13,7 @@ "board": { "board": "Kart{0}", "boardConfigDialogTitle": "Başka Kart ve Port Seç", + "boardDataReloaded": "Kart bilgisi yeniden yüklendi.", "boardInfo": "Kart Bilgisi", "boards": "kartlar", "configDialog1": "Bir eskiz yüklemek istiyorsanız Kart ve Port seçmelisiniz.", @@ -31,10 +32,12 @@ "port": "Port{0}", "ports": "portlar", "programmer": "Programlayıcı", + "reloadBoardData": "Kart Bilgisini Yeniden Yükle", "reselectLater": "Daha sonra tekrar seç", "revertBoardsConfig": " '{1}''da bulunan '{0}''i kullan", "searchBoard": "Kart ara", "selectBoard": "Kart Seç", + "selectBoardToReload": "Lütfen önce bir kart seçin.", "selectPortForInfo": "Kart bilgisi almak için lütfen bir port seçin.", "showAllAvailablePorts": "Etkinleştirildiğinde tüm mevcut portları görüntüler", "showAllPorts": "Tüm portları göster", @@ -412,7 +415,9 @@ "survey.notification": "Bir anket bulunduğunda kullanıcılara gösterilecekse açın. Varsayılan olarak açıktır.", "unofficialBoardSupport": "Desteklenmeyen kart destek URL'leri listesi için tıklayın", "upload": "yükle", + "upload.autoVerify": "Açıldığında IDE yükleme öncesinde kodu otomatik olarak doğrular. Varsayılan olarak açıktır. Bu değer kapalı olduğunda, IDE ikili dosyayı karta yüklemeden önce tekrar derlemez. Bu ayarı sadece gerçekten ne yaptığınızı biliyor olduğunuz durumlarda kapatmanız önerilir.", "upload.verbose": " Ayrıntılı yükleme çıktısı için açın. Varsayılan: Kapalı", + "upload.verify": "Yüklemeden sonra, kart üzerindeki belleğin içeriğini yüklenen ikili dosya ile doğrula.", "verifyAfterUpload": "Yüklemeden sonra kodu doğrula", "window.autoScale": "Kullanıcı arayüzü yazı tipi boyutu ile otomatik olarak ölçeklenecekse açın", "window.zoomLevel": { diff --git a/i18n/uk.json b/i18n/uk.json index 8aec50d7e..408b39bbe 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -13,6 +13,7 @@ "board": { "board": "Плата {0}", "boardConfigDialogTitle": "Оберіть іншу плату або порт", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Інформація про плату", "boards": "плати", "configDialog1": "Оберіть плату та порт якщо бажаєте завантажити скетч", @@ -31,10 +32,12 @@ "port": "Порт{0}", "ports": "порти", "programmer": "Програматор", + "reloadBoardData": "Reload Board Data", "reselectLater": "Переобрати пізніше", "revertBoardsConfig": "Використовувати '{0}' знайдену на '{1}'", "searchBoard": "Шукати плату", "selectBoard": "Оберіть плату", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Оберіть порт для оновлення інформації про плату.", "showAllAvailablePorts": "Відображати усі доступні порти коли увімкнено", "showAllPorts": "Показати всі порти", @@ -412,7 +415,9 @@ "survey.notification": "\"Так\", якщо треба повідомляти про доступні опитування користувачів. \"Так\" за замовчуванням.", "unofficialBoardSupport": "Клацніть, щоб переглянути список неофіційних форумів підтримки", "upload": "завантажити", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "\"Так\" для докладного виводу процесу завантаження. \"Ні\" за замовчуванням.", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Перевіряти код після завантаження", "window.autoScale": "\"Так\", якщо інтерфейс користувача автоматично масштабується відповідно до розміру шрифту.", "window.zoomLevel": { diff --git a/i18n/vi.json b/i18n/vi.json index e650cc5bb..3105486f0 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -13,6 +13,7 @@ "board": { "board": "Bo mạch {0}", "boardConfigDialogTitle": "Chọn Bảng và Cổng khác", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "Thông tin bo mạch", "boards": "bảng", "configDialog1": "Chọn đồng thời một bo mạch và một cổng nếu bạn muốn nạp một sketch.", @@ -31,10 +32,12 @@ "port": "Cổng {0}", "ports": "cổng", "programmer": "Programmer", + "reloadBoardData": "Reload Board Data", "reselectLater": "Chọn lại sau", "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Tìm kiếm bảng", "selectBoard": "Lựa chọn bo mạch", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "Hãy chọn một cổng để lấy thông tin bo mạch.", "showAllAvailablePorts": "Hiển thị tất cả các cổng khả dụng khi được kích hoạt", "showAllPorts": "Hiển thị tất cả các cổng", @@ -412,7 +415,9 @@ "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Nhấp vào đây để hiển thị danh sách các URLs hỗ trợ các bo mạch không chính thức", "upload": "nạp ", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "'True' để bật đầu ra nạp lệnh chi tiết (verbose upload output). Mặc định là 'false'", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Xác minh mã sau khi nạp", "window.autoScale": "'True' nếu giao diện người dùng tự động thay đổi theo cỡ chữ.", "window.zoomLevel": { diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index a6d3ce1c7..17eb473ce 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -13,6 +13,7 @@ "board": { "board": "{0} 開發板", "boardConfigDialogTitle": "選擇其他開發板及連接埠", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "開發板資訊", "boards": "開發板", "configDialog1": "若要上傳 Sketch 請選擇開發板及連接埠", @@ -31,10 +32,12 @@ "port": "連接埠: {0}", "ports": "連接埠", "programmer": "燒錄器", + "reloadBoardData": "Reload Board Data", "reselectLater": "請稍後再選擇", "revertBoardsConfig": "使用在 '{1}' 發現的 '{0}'", "searchBoard": "搜尋開發板", "selectBoard": "選擇開發版", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", "showAllPorts": "顯示所有連接埠", @@ -412,7 +415,9 @@ "survey.notification": "有新問卷時會通知使用者, 預設為: true。", "unofficialBoardSupport": "點擊來取得非官方開發版的支援網址", "upload": "上傳", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "上傳時輸出的詳細資訊。預設: False", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "上傳後驗證程式碼", "window.autoScale": "使用者介面隨字體大小自動縮放。", "window.zoomLevel": { diff --git a/i18n/zh.json b/i18n/zh.json index d06007f7b..68fd336c7 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -13,6 +13,7 @@ "board": { "board": "开发板 {0}", "boardConfigDialogTitle": "选择其他开发板和端口", + "boardDataReloaded": "Board data reloaded.", "boardInfo": "开发板信息", "boards": "开发板", "configDialog1": "如果要上传项目,请选择开发板和端口。", @@ -31,10 +32,12 @@ "port": "端口 {0}", "ports": "端口", "programmer": "编程器", + "reloadBoardData": "Reload Board Data", "reselectLater": "稍后重新选择", "revertBoardsConfig": "使用在 '{1}' 上发现的 '{0}'", "searchBoard": "搜索开发坂", "selectBoard": "选择开发板", + "selectBoardToReload": "Please select a board first.", "selectPortForInfo": "请选择一个端口以获取开发板信息。", "showAllAvailablePorts": "启用时显示所有可用端口", "showAllPorts": "显示所有端口", @@ -412,7 +415,9 @@ "survey.notification": "True 则在有调查时应通知用户。默认为 True。", "unofficialBoardSupport": "点击获取支持的非官方开发板地址列表", "upload": "上传", + "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", "upload.verbose": "True 则输出详细上传信息。默认情况下为 False。", + "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "上传后验证代码", "window.autoScale": "True 则用户界面随字体大小自动缩放。", "window.zoomLevel": { diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 268b010cb..ffad200de 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -13,6 +13,7 @@ "board": { "board": "{0} 開發板", "boardConfigDialogTitle": "選擇其他開發板及連接埠", + "boardDataReloaded": "開發板資料已重新載入。", "boardInfo": "開發板資訊", "boards": "開發板", "configDialog1": "若要上傳 Sketch 請選擇開發板及連接埠", @@ -31,10 +32,12 @@ "port": "連接埠: {0}", "ports": "連接埠", "programmer": "燒錄器", + "reloadBoardData": "重新載入開發板資料", "reselectLater": "請稍後再選擇", "revertBoardsConfig": "使用在 '{1}' 發現的 '{0}'", "searchBoard": "搜尋開發板", "selectBoard": "選擇開發板", + "selectBoardToReload": "請先選取開發板。", "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", "showAllPorts": "顯示所有連接埠", @@ -368,7 +371,7 @@ "cloud.pull.warn": "讀取雲端 sketch 前會警告使用者。預設: 開啟。", "cloud.push.warn": "推送雲端 sketch 前會警告使用者。預設: 開啟。", "cloud.pushpublic.warn": "推送公開的 sketch 到雲端前會警告使用者。預設: 開啟。", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sharedSpaceId": "用來載入 sketchbook 的 Arduino 雲共享空間帳號。如留白,只會使用您的私人空間。", "cloud.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", "compile": "編譯", "compile.experimental": "IDE 處理多個編譯器錯誤。 預設: 關閉", @@ -412,7 +415,9 @@ "survey.notification": "有新問卷時會通知使用者, 預設為: true。", "unofficialBoardSupport": "點擊來取得非官方開發板的支援網址", "upload": "上傳", + "upload.autoVerify": "預設為是,IDE會在上載前自動驗証。如選否,IDE在上載前不會重編譯程式碼。強烈建議除非你知道自己在幹嘛才這麼做。", "upload.verbose": "上傳時輸出的詳細資訊。預設: False", + "upload.verify": "上載後,驗証開發板上的記憶體內容和上傳的二進位碼是一致的。", "verifyAfterUpload": "上傳後驗證程式碼", "window.autoScale": "使用者介面隨字體大小自動縮放。", "window.zoomLevel": { From 6eef09efd8f49827cabb4eabd8cb2ff99ffae09a Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 3 Dec 2024 13:21:25 +0100 Subject: [PATCH 364/384] chore: switch to version `2.3.5` after the release (#2587) To produce a correctly versioned nightly build. See the [docs](https://github.com/arduino/arduino-ide/blob/1b9c7e93e029e65765010eb84e1604b5e483a963/docs/internal/release-procedure.md#7-%EF%B8%8F-bump-version-metadata-of-packages) for more details. --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 79d087742..45e852988 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.4", + "version": "2.3.5", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index c959f3548..d9a6e3682 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.4", + "version": "2.3.5", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.41.0", "@theia/terminal": "1.41.0", "@theia/workspace": "1.41.0", - "arduino-ide-extension": "2.3.4" + "arduino-ide-extension": "2.3.5" }, "devDependencies": { "@theia/cli": "1.41.0", diff --git a/package.json b/package.json index 88ebc27c1..6f66bf55a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.4", + "version": "2.3.5", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From 1712f9ea9dfb3b93b5d50b6fa967dd568eb39e88 Mon Sep 17 00:00:00 2001 From: dankeboy36 <dankeboy36@gmail.com> Date: Tue, 25 Feb 2025 15:49:36 +0100 Subject: [PATCH 365/384] fix: install missing linux dependencies Install `libx11-dev`, `libxkbfile-dev`, `libsecret-1-dev` libraries as the most recent update to ubuntu-latest does not include them Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --- .github/workflows/check-i18n-task.yml | 6 ++++++ .github/workflows/check-javascript.yml | 6 ++++++ .github/workflows/check-yarn.yml | 6 ++++++ .github/workflows/i18n-nightly-push.yml | 6 ++++++ .github/workflows/i18n-weekly-pull.yml | 6 ++++++ .github/workflows/test-javascript.yml | 6 ++++++ .github/workflows/themes-weekly-pull.yml | 6 ++++++ 7 files changed, 42 insertions(+) diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 22426313a..3064dc602 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -76,6 +76,12 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install dependencies run: yarn install --immutable env: diff --git a/.github/workflows/check-javascript.yml b/.github/workflows/check-javascript.yml index 23162a19e..26720d48b 100644 --- a/.github/workflows/check-javascript.yml +++ b/.github/workflows/check-javascript.yml @@ -73,6 +73,12 @@ jobs: cache: yarn node-version: ${{ env.NODE_VERSION }} + - name: Install Dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install npm package dependencies env: # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: diff --git a/.github/workflows/check-yarn.yml b/.github/workflows/check-yarn.yml index 3b2efe92c..019cfec88 100644 --- a/.github/workflows/check-yarn.yml +++ b/.github/workflows/check-yarn.yml @@ -72,6 +72,12 @@ jobs: cache: yarn node-version: ${{ env.NODE_VERSION }} + - name: Install Dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install npm package dependencies env: # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 6f401a526..7b3ba2efc 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -34,6 +34,12 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install dependencies run: yarn install --immutable diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index ef87c8bbb..6d75556d3 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -34,6 +34,12 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install dependencies run: yarn install --immutable diff --git a/.github/workflows/test-javascript.yml b/.github/workflows/test-javascript.yml index 2ae001c7d..a1665f4f5 100644 --- a/.github/workflows/test-javascript.yml +++ b/.github/workflows/test-javascript.yml @@ -107,6 +107,12 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install Dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install npm package dependencies env: # Avoid failure of @vscode/ripgrep installation due to GitHub API rate limiting: diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 0590e421f..4daa767ba 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -36,6 +36,12 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install dependencies run: yarn install --immutable From 6d96e227eb9471ce923fcad4400c26c27cc32ed1 Mon Sep 17 00:00:00 2001 From: Per Tillisch <accounts@perglass.com> Date: Wed, 26 Feb 2025 12:33:32 -0800 Subject: [PATCH 366/384] Bump built-in example sketches version to 1.10.2 The Arduino IDE installation includes a collection of example sketches demonstrating fundamental concepts. These examples are hosted in a dedicated repository, which is a dependency of this project. A new release has been made in that `arduino/arduino-examples` repository. The infrastructure for downloading the examples during the Arduino IDE build is hereby updated to use the latest release of the `arduino/arduino-examples` repository. --- arduino-ide-extension/scripts/download-examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index 557c34089..f58b465e2 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -1,7 +1,7 @@ // @ts-check // The version to use. -const version = '1.10.1'; +const version = '1.10.2'; (async () => { const os = require('node:os'); From 5ec191500028582e687c950b78966e4b7aefaad8 Mon Sep 17 00:00:00 2001 From: dankeboy36 <111981763+dankeboy36@users.noreply.github.com> Date: Mon, 10 Mar 2025 09:20:22 +0100 Subject: [PATCH 367/384] fix(plugin): decouple state update from the LS (#2643) * fix(plugin): decouple state update from the LS To enhance the reliability of Arduino IDE extensions, the update process for `ArduinoState` has been modified to ensure independence from the language server's availability. This change addresses issues caused by `compileSummary` being `undefined` due to potential startup failures of the Arduino Language Server, as noted in https://github.com/dankeboy36/esp-exception-decoder/issues/28#issuecomment-2681800772. The `compile` command now resolves with a `CompileSummary` rather than `void`, facilitating a more reliable way for extensions to access necessary data. Furthermore, the command has been adjusted to allow resolution with `undefined` when the compiled data is partial. By transitioning to direct usage of the resolved compile value for state updates, the reliance on executed commands for extensions is eliminated. This update also moves the VSIX command execution to the frontend without altering existing IDE behavior. Closes arduino/arduino-ide#2642 Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix: install missing libx11-dev and libxkbfile-dev Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix: pick better GH step name Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix: install the required dependencies on Linux Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix(revert): do not manually install deps on Linux Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * chore: pin `ubuntu-22.04` for linux actions * fix: restore accidentally removed dispose on finally Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix(test): align mock naming :lipstick: Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix: let the ino contribution notify the LS + event emitter dispatches the new state. Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * fix(test): emit the new compiler summary state Signed-off-by: dankeboy36 <dankeboy36@gmail.com> * chore(revert): unpin linux version, use latest revert of https://github.com/arduino/arduino-ide/commit/b11bde1c473322c86dfde2dd3cec3ebbf92011fa Signed-off-by: dankeboy36 <dankeboy36@gmail.com> --------- Signed-off-by: dankeboy36 <dankeboy36@gmail.com> Co-authored-by: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> --- .../browser/arduino-ide-frontend-module.ts | 7 ++- .../src/browser/contributions/ino-language.ts | 39 +++++++++++++ .../contributions/update-arduino-state.ts | 25 ++++---- .../browser/contributions/verify-sketch.ts | 39 +++++++++++-- .../src/common/protocol/core-service.ts | 2 +- .../src/node/core-service-impl.ts | 55 +++++------------- .../test/browser/update-arduino-state.test.ts | 18 ++++-- .../test/node/core-service-impl.slow-test.ts | 58 +++---------------- 8 files changed, 132 insertions(+), 111 deletions(-) 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 d6779c302..342516c0d 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -131,7 +131,10 @@ import { OpenSketch } from './contributions/open-sketch'; import { Close } from './contributions/close'; import { SaveAsSketch } from './contributions/save-as-sketch'; import { SaveSketch } from './contributions/save-sketch'; -import { VerifySketch } from './contributions/verify-sketch'; +import { + CompileSummaryProvider, + VerifySketch, +} from './contributions/verify-sketch'; import { UploadSketch } from './contributions/upload-sketch'; import { CommonFrontendContribution } from './theia/core/common-frontend-contribution'; import { EditContributions } from './contributions/edit-contributions'; @@ -788,6 +791,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, BoardsDataMenuUpdater); Contribution.configure(bind, AutoSelectProgrammer); + bind(CompileSummaryProvider).toService(VerifySketch); + bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index 4f336ef3d..4f42d399c 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -8,6 +8,7 @@ import { ArduinoDaemon, BoardIdentifier, BoardsService, + CompileSummary, ExecutableService, isBoardIdentifierChangeEvent, sanitizeFqbn, @@ -23,6 +24,7 @@ import { HostedPluginEvents } from '../hosted/hosted-plugin-events'; import { NotificationCenter } from '../notification-center'; import { CurrentSketch } from '../sketches-service-client-impl'; import { SketchContribution, URI } from './contribution'; +import { CompileSummaryProvider } from './verify-sketch'; interface DaemonAddress { /** @@ -107,6 +109,8 @@ export class InoLanguage extends SketchContribution { private readonly notificationCenter: NotificationCenter; @inject(BoardsDataStore) private readonly boardDataStore: BoardsDataStore; + @inject(CompileSummaryProvider) + private readonly compileSummaryProvider: CompileSummaryProvider; private readonly toDispose = new DisposableCollection(); private readonly languageServerStartMutex = new Mutex(); @@ -173,6 +177,13 @@ export class InoLanguage extends SketchContribution { } } }), + this.compileSummaryProvider.onDidChangeCompileSummary( + (compileSummary) => { + if (compileSummary) { + this.fireBuildDidComplete(compileSummary); + } + } + ), ]); Promise.all([ this.boardsServiceProvider.ready, @@ -317,4 +328,32 @@ export class InoLanguage extends SketchContribution { params ); } + + // Execute the a command contributed by the Arduino Tools VSIX to send the `ino/buildDidComplete` notification to the language server + private async fireBuildDidComplete( + compileSummary: CompileSummary + ): Promise<void> { + const params = { + ...compileSummary, + }; + console.info( + `Executing 'arduino.languageserver.notifyBuildDidComplete' with ${JSON.stringify( + params.buildOutputUri + )}` + ); + + try { + await this.commandService.executeCommand( + 'arduino.languageserver.notifyBuildDidComplete', + params + ); + } catch (err) { + console.error( + `Unexpected error when firing event on build did complete. ${JSON.stringify( + params.buildOutputUri + )}`, + err + ); + } + } } diff --git a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts index 767fbbf8c..bce3fa850 100644 --- a/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -1,13 +1,11 @@ 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 '../hosted/hosted-plugin-support'; import type { ArduinoState } from 'vscode-arduino-api'; import { + BoardsConfig, BoardsService, CompileSummary, - isCompileSummary, - BoardsConfig, PortIdentifier, resolveDetectedPort, } from '../../common/protocol'; @@ -18,8 +16,10 @@ import { } from '../../common/protocol/arduino-context-mapper'; import { BoardsDataStore } from '../boards/boards-data-store'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; +import { HostedPluginSupport } from '../hosted/hosted-plugin-support'; import { CurrentSketch } from '../sketches-service-client-impl'; import { SketchContribution } from './contribution'; +import { CompileSummaryProvider } from './verify-sketch'; /** * (non-API) exported for tests @@ -43,6 +43,8 @@ export class UpdateArduinoState extends SketchContribution { private readonly boardsDataStore: BoardsDataStore; @inject(HostedPluginSupport) private readonly hostedPluginSupport: HostedPluginSupport; + @inject(CompileSummaryProvider) + private readonly compileSummaryProvider: CompileSummaryProvider; private readonly toDispose = new DisposableCollection(); @@ -60,14 +62,13 @@ export class UpdateArduinoState extends SketchContribution { 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.compileSummaryProvider.onDidChangeCompileSummary( + (compilerSummary) => { + if (compilerSummary) { + this.updateCompileSummary(compilerSummary); + } } - }), + ), this.boardsDataStore.onDidChange((event) => { const selectedFqbn = this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; @@ -88,6 +89,10 @@ export class UpdateArduinoState extends SketchContribution { this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch()); this.updateUserDirPath(this.configService.tryGetSketchDirUri()); this.updateDataDirPath(this.configService.tryGetDataDirUri()); + const { compileSummary } = this.compileSummaryProvider; + if (compileSummary) { + this.updateCompileSummary(compileSummary); + } } onStop(): void { diff --git a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts index 4d8b445e3..22693085e 100644 --- a/arduino-ide-extension/src/browser/contributions/verify-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/verify-sketch.ts @@ -1,7 +1,7 @@ -import { Emitter } from '@theia/core/lib/common/event'; +import { Emitter, Event } from '@theia/core/lib/common/event'; import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; -import type { CoreService } from '../../common/protocol'; +import type { CompileSummary, CoreService } from '../../common/protocol'; import { ArduinoMenus } from '../menu/arduino-menus'; import { CurrentSketch } from '../sketches-service-client-impl'; import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; @@ -15,6 +15,12 @@ import { } from './contribution'; import { CoreErrorHandler } from './core-error-handler'; +export const CompileSummaryProvider = Symbol('CompileSummaryProvider'); +export interface CompileSummaryProvider { + readonly compileSummary: CompileSummary | undefined; + readonly onDidChangeCompileSummary: Event<CompileSummary | undefined>; +} + export type VerifySketchMode = /** * When the user explicitly triggers the verify command from the primary UI: menu, toolbar, or keybinding. The UI shows the output, updates the toolbar items state, etc. @@ -46,13 +52,20 @@ export interface VerifySketchParams { type VerifyProgress = 'idle' | VerifySketchMode; @injectable() -export class VerifySketch extends CoreServiceContribution { +export class VerifySketch + extends CoreServiceContribution + implements CompileSummaryProvider +{ @inject(CoreErrorHandler) private readonly coreErrorHandler: CoreErrorHandler; private readonly onDidChangeEmitter = new Emitter<void>(); private readonly onDidChange = this.onDidChangeEmitter.event; + private readonly onDidChangeCompileSummaryEmitter = new Emitter< + CompileSummary | undefined + >(); private verifyProgress: VerifyProgress = 'idle'; + private _compileSummary: CompileSummary | undefined; override registerCommands(registry: CommandRegistry): void { registry.registerCommand(VerifySketch.Commands.VERIFY_SKETCH, { @@ -117,6 +130,21 @@ export class VerifySketch extends CoreServiceContribution { super.handleError(error); } + get compileSummary(): CompileSummary | undefined { + return this._compileSummary; + } + + private updateCompileSummary( + compileSummary: CompileSummary | undefined + ): void { + this._compileSummary = compileSummary; + this.onDidChangeCompileSummaryEmitter.fire(this._compileSummary); + } + + get onDidChangeCompileSummary(): Event<CompileSummary | undefined> { + return this.onDidChangeCompileSummaryEmitter.event; + } + private async verifySketch( params?: VerifySketchParams ): Promise<CoreService.Options.Compile | undefined> { @@ -141,7 +169,7 @@ export class VerifySketch extends CoreServiceContribution { return options; } - await this.doWithProgress({ + const compileSummary = await this.doWithProgress({ progressText: nls.localize( 'arduino/sketch/compile', 'Compiling sketch...' @@ -160,6 +188,9 @@ export class VerifySketch extends CoreServiceContribution { nls.localize('arduino/sketch/doneCompiling', 'Done compiling.'), { timeout: 3000 } ); + + this.updateCompileSummary(compileSummary); + // Returns with the used options for the compilation // so that follow-up tasks (such as upload) can reuse the compiled code. // Note that the `fqbn` is already decorated with the board settings, if any. diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 2b4a07652..f4b0d8f02 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -171,7 +171,7 @@ export interface CoreService { compile( options: CoreService.Options.Compile, cancellationToken?: CancellationToken - ): Promise<void>; + ): Promise<CompileSummary | undefined>; upload( options: CoreService.Options.Upload, cancellationToken?: CancellationToken diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 285c05f72..2e2eb21a2 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,7 +1,6 @@ import { type ClientReadableStream } from '@grpc/grpc-js'; import { ApplicationError } from '@theia/core/lib/common/application-error'; import type { CancellationToken } from '@theia/core/lib/common/cancellation'; -import { CommandService } from '@theia/core/lib/common/command'; import { Disposable, DisposableCollection, @@ -69,15 +68,13 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { 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, cancellationToken?: CancellationToken - ): Promise<void> { + ): Promise<CompileSummary | undefined> { const coreClient = await this.coreClient; const { client, instance } = coreClient; const request = this.compileRequest(options, instance); @@ -91,7 +88,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { ); const toDisposeOnFinally = new DisposableCollection(handler); - return new Promise<void>((resolve, reject) => { + return new Promise<CompileSummary | undefined>((resolve, reject) => { let hasRetried = false; const handleUnexpectedError = (error: Error) => { @@ -164,50 +161,26 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { call .on('data', handler.onData) .on('error', handleError) - .on('end', resolve); + .on('end', () => { + if (isCompileSummary(compileSummary)) { + resolve(compileSummary); + } else { + console.error( + `Have not received the full compile summary from the CLI while running the compilation. ${JSON.stringify( + compileSummary + )}` + ); + resolve(undefined); + } + }); }; startCompileStream(); }).finally(() => { toDisposeOnFinally.dispose(); - if (!isCompileSummary(compileSummary)) { - if (cancellationToken && cancellationToken.isCancellationRequested) { - // NOOP - return; - } - console.error( - `Have not received the full compile summary from the CLI while running the compilation. ${JSON.stringify( - compileSummary - )}` - ); - } else { - this.fireBuildDidComplete(compileSummary); - } }); } - // This executes on the frontend, the VS Code extension receives it, and sends an `ino/buildDidComplete` notification to the language server. - private fireBuildDidComplete(compileSummary: CompileSummary): void { - const params = { - ...compileSummary, - }; - console.info( - `Executing 'arduino.languageserver.notifyBuildDidComplete' with ${JSON.stringify( - params.buildOutputUri - )}` - ); - this.commandService - .executeCommand('arduino.languageserver.notifyBuildDidComplete', params) - .catch((err) => - console.error( - `Unexpected error when firing event on build did complete. ${JSON.stringify( - params.buildOutputUri - )}`, - err - ) - ); - } - private compileRequest( options: CoreService.Options.Compile & { exportBinaries?: boolean; diff --git a/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts index 31a534f33..fbbf17510 100644 --- a/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts +++ b/arduino-ide-extension/src/test/browser/update-arduino-state.test.ts @@ -31,6 +31,7 @@ import { UpdateArduinoState, UpdateStateParams, } from '../../browser/contributions/update-arduino-state'; +import { CompileSummaryProvider } from '../../browser/contributions/verify-sketch'; import { NotificationCenter } from '../../browser/notification-center'; import { CurrentSketch, @@ -61,10 +62,12 @@ describe('update-arduino-state', function () { let currentSketchMock: CurrentSketch | undefined; let sketchDirUriMock: URI | undefined; let dataDirUriMock: URI | undefined; + let compileSummaryMock: CompileSummary | undefined; let onCurrentSketchDidChangeEmitter: Emitter<CurrentSketch>; let onDataDirDidChangeEmitter: Emitter<URI | undefined>; let onSketchDirDidChangeEmitter: Emitter<URI | undefined>; let onDataStoreDidChangeEmitter: Emitter<BoardsDataStoreChangeEvent>; + let compileSummaryDidChangeEmitter: Emitter<CompileSummary | undefined>; beforeEach(async () => { toDisposeAfterEach = new DisposableCollection(); @@ -76,15 +79,18 @@ describe('update-arduino-state', function () { currentSketchMock = undefined; sketchDirUriMock = undefined; dataDirUriMock = undefined; + compileSummaryMock = undefined; onCurrentSketchDidChangeEmitter = new Emitter(); onDataDirDidChangeEmitter = new Emitter(); onSketchDirDidChangeEmitter = new Emitter(); onDataStoreDidChangeEmitter = new Emitter(); + compileSummaryDidChangeEmitter = new Emitter(); toDisposeAfterEach.pushAll([ onCurrentSketchDidChangeEmitter, onDataDirDidChangeEmitter, onSketchDirDidChangeEmitter, onDataStoreDidChangeEmitter, + compileSummaryDidChangeEmitter, ]); const container = createContainer(); @@ -418,10 +424,8 @@ describe('update-arduino-state', function () { buildPlatform: undefined, buildOutputUri: 'file:///path/to/build', }; - await commandRegistry.executeCommand( - 'arduino.languageserver.notifyBuildDidComplete', - summary - ); + compileSummaryMock = summary; + compileSummaryDidChangeEmitter.fire(compileSummaryMock); await wait(50); const params = stateUpdateParams.filter( @@ -585,6 +589,12 @@ describe('update-arduino-state', function () { new ContainerModule((bind, unbind, isBound, rebind) => { bindSketchesContribution(bind, unbind, isBound, rebind); bind(UpdateArduinoState).toSelf().inSingletonScope(); + bind(CompileSummaryProvider).toConstantValue(<CompileSummaryProvider>{ + get compileSummary(): CompileSummary | undefined { + return compileSummaryMock; + }, + onDidChangeCompileSummary: compileSummaryDidChangeEmitter.event, + }); rebind(BoardsService).toConstantValue(<BoardsService>{ getDetectedPorts() { return {}; 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 dd80bca56..52b0d0444 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 @@ -1,12 +1,11 @@ -import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; -import { CommandRegistry } from '@theia/core/lib/common/command'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { isWindows } from '@theia/core/lib/common/os'; import { FileUri } from '@theia/core/lib/node/file-uri'; -import { Container, injectable } from '@theia/core/shared/inversify'; +import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { BoardsService, + CompileSummary, CoreService, SketchesService, isCompileSummary, @@ -36,11 +35,9 @@ describe('core-service-impl', () => { this.timeout(testTimeout); const coreService = container.get<CoreService>(CoreService); const sketchesService = container.get<SketchesService>(SketchesService); - const commandService = - container.get<TestCommandRegistry>(TestCommandRegistry); const sketch = await sketchesService.createNewSketch(); - await coreService.compile({ + const compileSummary = await coreService.compile({ fqbn: uno, sketch, optimizeForDebug: false, @@ -48,18 +45,9 @@ describe('core-service-impl', () => { verbose: true, }); - const executedBuildDidCompleteCommands = - commandService.executedCommands.filter( - ([command]) => - command === 'arduino.languageserver.notifyBuildDidComplete' - ); - expect(executedBuildDidCompleteCommands.length).to.be.equal(1); - const [, args] = executedBuildDidCompleteCommands[0]; - expect(args.length).to.be.equal(1); - const arg = args[0]; - expect(isCompileSummary(arg)).to.be.true; - expect('buildOutputUri' in arg).to.be.true; - expect(arg.buildOutputUri).to.be.not.undefined; + expect(isCompileSummary(compileSummary)).to.be.true; + expect((<CompileSummary>compileSummary).buildOutputUri).to.be.not + .undefined; const tempBuildPaths = await sketchesService.getBuildPath(sketch); if (isWindows) { @@ -68,7 +56,7 @@ describe('core-service-impl', () => { expect(tempBuildPaths.length).to.be.equal(1); } - const { buildOutputUri } = arg; + const { buildOutputUri } = <CompileSummary>compileSummary; const buildOutputPath = FileUri.fsPath(buildOutputUri).toString(); expect(tempBuildPaths.includes(buildOutputPath)).to.be.true; }); @@ -91,35 +79,5 @@ async function start( } async function createContainer(): Promise<Container> { - return createBaseContainer({ - additionalBindings: (bind, rebind) => { - bind(TestCommandRegistry).toSelf().inSingletonScope(); - rebind(CommandRegistry).toService(TestCommandRegistry); - }, - }); -} - -@injectable() -class TestCommandRegistry extends CommandRegistry { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly executedCommands: [string, any[]][] = []; - - override async executeCommand<T>( - commandId: string, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...args: any[] - ): Promise<T | undefined> { - const { token } = new CancellationTokenSource(); - this.onWillExecuteCommandEmitter.fire({ - commandId, - args, - token, - waitUntil: () => { - // NOOP - }, - }); - this.executedCommands.push([commandId, args]); - this.onDidExecuteCommandEmitter.fire({ commandId, args }); - return undefined; - } + return createBaseContainer(); } From 9ab87bf8b5740e3126088a738af2aa0c16935dd0 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:46:08 +0700 Subject: [PATCH 368/384] chore: use AWS OpenID Connect for S3 publish --- .github/workflows/build.yml | 51 ++++++++++++-------- .github/workflows/compose-full-changelog.yml | 21 +++++--- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e4e09b73f..5bb25811a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -203,7 +203,7 @@ jobs: echo "is-nightly=$is_nightly" >> $GITHUB_OUTPUT echo "channel-name=$channel_name" >> $GITHUB_OUTPUT # Only attempt upload to Amazon S3 if the credentials are available. - echo "publish-to-s3=${{ secrets.AWS_SECRET_ACCESS_KEY != '' }}" >> $GITHUB_OUTPUT + echo "publish-to-s3=${{ secrets.AWS_ROLE_ARN != '' }}" >> $GITHUB_OUTPUT select-targets: needs: build-type-determination @@ -284,8 +284,6 @@ jobs: - build-type-determination - select-targets env: - # https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/ - ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true # Location of artifacts generated by build. BUILD_ARTIFACTS_PATH: electron-app/dist/build-artifacts # to skip passing signing credentials to electron-builder @@ -363,8 +361,6 @@ jobs: AC_USERNAME: ${{ secrets.AC_USERNAME }} AC_PASSWORD: ${{ secrets.AC_PASSWORD }} AC_TEAM_ID: ${{ secrets.AC_TEAM_ID }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} IS_NIGHTLY: ${{ needs.build-type-determination.outputs.is-nightly }} IS_RELEASE: ${{ needs.build-type-determination.outputs.is-release }} CAN_SIGN: ${{ secrets[matrix.config.certificate-secret] != '' }} @@ -588,6 +584,12 @@ jobs: env: ARTIFACTS_FOLDER: build-artifacts + environment: production + + permissions: + id-token: write + contents: read + steps: - name: Download all job transfer artifacts uses: actions/download-artifact@v4 @@ -596,15 +598,15 @@ jobs: path: ${{ env.ARTIFACTS_FOLDER }} pattern: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}* + - name: Configure AWS Credentials for Nightly [S3] + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_ROLE_ARN }} + aws-region: us-east-1 + - name: Publish Nightly [S3] - uses: docker://plugins/s3 - env: - PLUGIN_SOURCE: '${{ env.ARTIFACTS_FOLDER }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.ARTIFACTS_FOLDER }}/' - PLUGIN_TARGET: '/arduino-ide/nightly' - PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + aws s3 sync ${{ env.ARTIFACTS_FOLDER }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide/nightly release: needs: @@ -625,6 +627,12 @@ jobs: env: ARTIFACTS_FOLDER: build-artifacts + environment: production + + permissions: + id-token: write + contents: read + steps: - name: Download all job transfer artifacts uses: actions/download-artifact@v4 @@ -648,16 +656,17 @@ jobs: file_glob: true body: ${{ needs.changelog.outputs.BODY }} + - name: Configure AWS Credentials for Release [S3] + if: needs.build-type-determination.outputs.publish-to-s3 == 'true' + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_ROLE_ARN }} + aws-region: us-east-1 + - name: Publish Release [S3] if: needs.build-type-determination.outputs.publish-to-s3 == 'true' - uses: docker://plugins/s3 - env: - PLUGIN_SOURCE: '${{ env.ARTIFACTS_FOLDER }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.ARTIFACTS_FOLDER }}/' - PLUGIN_TARGET: '/arduino-ide' - PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + aws s3 sync ${{ env.ARTIFACTS_FOLDER }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide clean: # This job must run after all jobs that use the transfer artifact. diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index d126f37f4..2c328e52e 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -14,6 +14,11 @@ jobs: create-changelog: if: github.repository == 'arduino/arduino-ide' runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + environment: production + steps: - name: Checkout uses: actions/checkout@v4 @@ -44,12 +49,12 @@ jobs: # Compose changelog yarn run compose-changelog "${{ github.workspace }}/${{ env.CHANGELOG_ARTIFACTS }}/$CHANGELOG_FILE_NAME" + - name: Configure AWS Credentials for Changelog [S3] + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_ROLE_ARN }} + aws-region: us-east-1 + - name: Publish Changelog [S3] - uses: docker://plugins/s3 - env: - PLUGIN_SOURCE: '${{ env.CHANGELOG_ARTIFACTS }}/*' - PLUGIN_STRIP_PREFIX: '${{ env.CHANGELOG_ARTIFACTS }}/' - PLUGIN_TARGET: '/arduino-ide/changelog' - PLUGIN_BUCKET: ${{ secrets.DOWNLOADS_BUCKET }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + aws s3 sync ${{ env.CHANGELOG_ARTIFACTS }} s3://${{ secrets.DOWNLOADS_BUCKET }}/arduino-ide/changelog \ No newline at end of file From d298b3ffc94008e89066cd999d891e84190da18f Mon Sep 17 00:00:00 2001 From: Christian Sarnataro <csarnataro@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:42:48 +0000 Subject: [PATCH 369/384] fix: sanitize message in notification component (#2664) fix: sanitize messages in notification component --- .../src/browser/theia/messages/notification-component.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx b/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx index 2f1203b97..8cfe66543 100644 --- a/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx +++ b/arduino-ide-extension/src/browser/theia/messages/notification-component.tsx @@ -2,6 +2,7 @@ import React from '@theia/core/shared/react'; import { NotificationComponent as TheiaNotificationComponent } from '@theia/messages/lib/browser/notification-component'; import { nls } from '@theia/core/lib/common'; import { codicon } from '@theia/core/lib/browser'; +import { sanitize } from 'dompurify'; export class NotificationComponent extends TheiaNotificationComponent { override render(): React.ReactNode { @@ -20,7 +21,7 @@ export class NotificationComponent extends TheiaNotificationComponent { /> <div className="theia-notification-message"> <span - dangerouslySetInnerHTML={{ __html: message }} + dangerouslySetInnerHTML={{ __html: sanitize(message) }} onClick={this.onMessageClick} /> </div> From 859d29d41af2146537abedb42c9798011b452983 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:33:25 +0900 Subject: [PATCH 370/384] feat: use `theia@1.57.0` (#2654) --- .github/workflows/build.yml | 1 + arduino-ide-extension/package.json | 50 +- .../browser/arduino-frontend-contribution.tsx | 2 +- .../browser/arduino-ide-frontend-module.ts | 91 +- .../src/browser/arduino-preferences.ts | 9 - .../auth/authentication-client-service.ts | 2 +- .../browser/boards/boards-auto-installer.ts | 2 +- .../browser/boards/boards-config-dialog.tsx | 3 +- .../src/browser/boards/boards-data-store.ts | 2 +- .../browser/boards/boards-service-provider.ts | 2 +- .../browser/config/config-service-client.ts | 2 +- .../contributions/check-for-ide-updates.ts | 2 +- .../src/browser/contributions/close.ts | 6 +- .../browser/contributions/compiler-errors.ts | 2 +- .../src/browser/contributions/contribution.ts | 6 +- .../contributions/edit-contributions.ts | 17 +- .../contributions/open-boards-config.ts | 2 +- .../contributions/survey-notification.ts | 78 - .../src/browser/create/create-features.ts | 2 +- .../src/browser/create/create-fs-provider.ts | 2 +- .../ide-updater/ide-updater-dialog.tsx | 3 +- .../ide-updater/ide-updater-commands.ts | 2 +- .../src/browser/notification-center.ts | 2 +- .../browser/sketches-service-client-impl.ts | 5 +- .../src/browser/style/cloud-sketchbook.css | 8 +- .../core/common-frontend-contribution.ts | 2 +- .../theia/core/connection-status-service.ts | 18 +- .../theia/core/sidebar-bottom-menu-widget.tsx | 47 +- .../theia/debug/debug-session-contribution.ts | 11 +- .../browser/theia/editor/editor-command.ts | 21 - .../theia/editor/editor-contribution.ts | 9 +- .../browser/theia/filesystem/file-resource.ts | 2 +- .../theia/monaco/monaco-editor-provider.ts | 2 +- .../theia/monaco/monaco-text-model-service.ts | 2 +- .../theia/monaco/monaco-theming-service.ts | 2 +- .../browser/theia/plugin-ext/hosted-plugin.ts | 10 +- .../theia/plugin-ext/tree-view-widget.tsx | 241 - .../theia/test/test-view-contribution.ts | 9 + .../src/browser/toolbar/arduino-toolbar.tsx | 23 +- .../list-widget-frontend-contribution.ts | 2 +- .../sketchbook-widget-contribution.ts | 2 +- .../src/common/protocol/survey-service.ts | 7 - .../theia/core/electron-main-menu-factory.ts | 28 +- .../theia/core/electron-window-service.ts | 11 +- .../arduino-electron-main-module.ts | 6 +- .../theia/electron-main-application.ts | 116 +- .../theia/theia-electron-window.ts | 2 +- .../src/node/arduino-daemon-impl.ts | 2 +- .../src/node/arduino-ide-backend-module.ts | 28 +- .../src/node/clang-formatter.ts | 2 +- .../src/node/cli-error-parser.ts | 2 +- .../src/node/config-service-impl.ts | 2 +- .../src/node/core-service-impl.ts | 6 +- .../src/node/examples-service-impl.ts | 2 +- .../src/node/executable-service-impl.ts | 2 +- .../monitor-settings-provider-impl.ts | 2 +- .../src/node/node-filesystem-ext.ts | 2 +- .../src/node/settings-reader.ts | 2 +- .../src/node/sketches-service-impl.ts | 2 +- .../src/node/survey-service-impl.ts | 20 - ...-contribution.ts => websocket-endpoint.ts} | 5 +- .../env-variables/env-variables-server.ts | 2 +- .../node/theia/filesystem/nsfw-bindings.ts | 42 - .../node/theia/filesystem/parcel-bindings.ts | 42 + .../{nsfw-watcher => parcel-watcher}/index.ts | 4 +- .../parcel-filesystem-service.ts} | 12 +- .../node/theia/plugin-ext/plugin-reader.ts | 4 +- .../src/test/node/clang-formatter.test.ts | 2 +- .../node/core-client-provider.slow-test.ts | 16 +- .../test/node/core-service-impl.slow-test.ts | 2 +- .../src/test/node/node-test-bindings.ts | 2 +- .../node/sketches-service-impl.slow-test.ts | 6 +- .../test/node/sketches-service-impl.test.ts | 2 +- arduino-ide-extension/tsconfig.json | 1 - electron-app/package.json | 72 +- electron-app/scripts/package.js | 2 +- electron-app/webpack.config.js | 4 +- i18n/en.json | 6 - package.json | 15 +- yarn.lock | 7544 +++++++++-------- 80 files changed, 4307 insertions(+), 4428 deletions(-) delete mode 100644 arduino-ide-extension/src/browser/contributions/survey-notification.ts delete mode 100644 arduino-ide-extension/src/browser/theia/editor/editor-command.ts delete mode 100644 arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx create mode 100644 arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts delete mode 100644 arduino-ide-extension/src/common/protocol/survey-service.ts delete mode 100644 arduino-ide-extension/src/node/survey-service-impl.ts rename arduino-ide-extension/src/node/theia/core/{messaging-contribution.ts => websocket-endpoint.ts} (58%) delete mode 100644 arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts create mode 100644 arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts rename arduino-ide-extension/src/node/theia/filesystem/{nsfw-watcher => parcel-watcher}/index.ts (83%) rename arduino-ide-extension/src/node/theia/filesystem/{nsfw-watcher/nsfw-filesystem-service.ts => parcel-watcher/parcel-filesystem-service.ts} (71%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5bb25811a..a4dcfa052 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -294,6 +294,7 @@ jobs: SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe" WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }} WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }} + PUPPETEER_SKIP_DOWNLOAD: true strategy: matrix: diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 45e852988..603398edb 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -24,28 +24,29 @@ }, "dependencies": { "@grpc/grpc-js": "^1.8.14", - "@theia/application-package": "1.41.0", - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/electron": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/keymaps": "1.41.0", - "@theia/markers": "1.41.0", - "@theia/messages": "1.41.0", - "@theia/monaco": "1.41.0", - "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.41.0", - "@theia/outline-view": "1.41.0", - "@theia/output": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/plugin-ext-vscode": "1.41.0", - "@theia/preferences": "1.41.0", - "@theia/scm": "1.41.0", - "@theia/search-in-workspace": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/typehierarchy": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/application-package": "1.57.0", + "@theia/core": "1.57.0", + "@theia/debug": "1.57.0", + "@theia/editor": "1.57.0", + "@theia/electron": "1.57.0", + "@theia/filesystem": "1.57.0", + "@theia/keymaps": "1.57.0", + "@theia/markers": "1.57.0", + "@theia/messages": "1.57.0", + "@theia/monaco": "1.57.0", + "@theia/monaco-editor-core": "1.83.101", + "@theia/navigator": "1.57.0", + "@theia/outline-view": "1.57.0", + "@theia/output": "1.57.0", + "@theia/plugin-ext": "1.57.0", + "@theia/plugin-ext-vscode": "1.57.0", + "@theia/preferences": "1.57.0", + "@theia/scm": "1.57.0", + "@theia/search-in-workspace": "1.57.0", + "@theia/terminal": "1.57.0", + "@theia/test": "1.57.0", + "@theia/typehierarchy": "1.57.0", + "@theia/workspace": "1.57.0", "@tippyjs/react": "^4.2.5", "@types/auth0-js": "^9.21.3", "@types/btoa": "^1.2.3", @@ -57,7 +58,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", "arduino-serial-plotter-webapp": "0.2.0", "async-mutex": "^0.3.0", @@ -99,7 +99,7 @@ "react-markdown": "^8.0.0", "react-perfect-scrollbar": "^1.5.8", "react-select": "^5.6.0", - "react-tabs": "^3.1.2", + "react-tabs": "^6.1.0", "react-window": "^1.8.6", "semver": "^7.3.2", "string-natural-compare": "^2.0.3", @@ -126,7 +126,7 @@ "mockdate": "^3.0.5", "moment": "^2.24.0", "ncp": "^2.0.0", - "rimraf": "^2.6.1" + "rimraf": "^5.0.0" }, "optionalDependencies": { "@pingghost/protoc": "^1.0.2", diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 9ca0a9c61..d5969aedf 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -1,7 +1,7 @@ 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 { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { TabBarToolbarContribution, 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 342516c0d..9625ffae5 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -1,18 +1,12 @@ import '../../src/browser/style/index.css'; -import { - Container, - ContainerModule, - interfaces, -} from '@theia/core/shared/inversify'; +import { Container, ContainerModule } from '@theia/core/shared/inversify'; import { WidgetFactory } from '@theia/core/lib/browser/widget-manager'; import { CommandContribution } from '@theia/core/lib/common/command'; import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/ws-connection-provider'; -import { - FrontendApplicationContribution, - FrontendApplication as TheiaFrontendApplication, -} from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplication as TheiaFrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { LibraryListWidget } from './library/library-list-widget'; import { ArduinoFrontendContribution } from './arduino-frontend-contribution'; import { @@ -57,8 +51,6 @@ import { DockPanelRenderer as TheiaDockPanelRenderer, TabBarRendererFactory, ContextMenuRenderer, - createTreeContainer, - TreeWidget, } from '@theia/core/lib/browser'; import { MenuContribution } from '@theia/core/lib/common/menu'; import { @@ -97,7 +89,6 @@ import { ArduinoDaemonPath, ArduinoDaemon, } from '../common/protocol/arduino-daemon'; -import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser'; import { FrontendConnectionStatusService, ApplicationConnectionStatusContribution, @@ -186,7 +177,6 @@ import { import { About } from './contributions/about'; import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service'; import { TabBarRenderer } from './theia/core/tab-bars'; -import { EditorCommandContribution } from './theia/editor/editor-command'; import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator'; import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator'; import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug'; @@ -275,7 +265,7 @@ import { IDEUpdaterDialog, IDEUpdaterDialogProps, } from './dialogs/ide-updater/ide-updater-dialog'; -import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-provider'; +import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-source'; import { MonitorModel } from './monitor-model'; import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl'; import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager'; @@ -295,10 +285,6 @@ import { PreferenceTreeGenerator } from './theia/preferences/preference-tree-gen import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator'; import { AboutDialog } from './theia/core/about-dialog'; import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog'; -import { - SurveyNotificationService, - SurveyNotificationServicePath, -} from '../common/protocol/survey-service'; import { WindowContribution } from './theia/core/window-contribution'; import { WindowContribution as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution'; import { CoreErrorHandler } from './contributions/core-error-handler'; @@ -381,19 +367,13 @@ import { DebugSessionWidget } from '@theia/debug/lib/browser/view/debug-session- import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget'; import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget'; import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; -import { - PluginTree, - PluginTreeModel, - TreeViewWidgetOptions, - VIEW_ITEM_CONTEXT_MENU, -} from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget'; -import { TreeViewDecoratorService } from '@theia/plugin-ext/lib/main/browser/view/tree-view-decorator-service'; -import { PLUGIN_VIEW_DATA_FACTORY_ID } from '@theia/plugin-ext/lib/main/browser/view/plugin-view-registry'; -import { TreeViewWidget } from './theia/plugin-ext/tree-view-widget'; + import { VersionWelcomeDialog, VersionWelcomeDialogProps, } from './dialogs/version-welcome-dialog'; +import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution'; +import { TestViewContribution } from './theia/test/test-view-contribution'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -574,15 +554,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { WorkspaceVariableContribution ); - bind(SurveyNotificationService) - .toDynamicValue((context) => { - return ElectronIpcConnectionProvider.createProxy( - context.container, - SurveyNotificationServicePath - ); - }) - .inSingletonScope(); - // Layout and shell customizations. rebind(TheiaOutlineViewContribution) .to(OutlineViewContribution) @@ -856,13 +827,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); }); - // Workaround for https://github.com/eclipse-theia/theia/issues/8722 - // Do not trigger a save on IDE startup if `"editor.autoSave": "on"` was set as a preference. - // Note: `"editor.autoSave" was renamed to `"files.autoSave" and `"on"` was replaced with three - // different cases, but we treat `!== 'off'` as auto save enabled. (https://github.com/eclipse-theia/theia/issues/10812) - bind(EditorCommandContribution).toSelf().inSingletonScope(); - rebind(TheiaEditorCommandContribution).toService(EditorCommandContribution); - // Silent the badge decoration in the Explorer view. bind(NavigatorTabBarDecorator).toSelf().inSingletonScope(); rebind(TheiaNavigatorTabBarDecorator).toService(NavigatorTabBarDecorator); @@ -1112,42 +1076,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { TerminalFrontendContribution ); - bindViewsWelcome_TheiaGH14309({ bind, widget: TreeViewWidget }); + // Hides the Test Explorer from the side-bar + bind(TestViewContribution).toSelf().inSingletonScope(); + rebind(TheiaTestViewContribution).toService(TestViewContribution); }); - -// Align the viewsWelcome rendering with VS Code (https://github.com/eclipse-theia/theia/issues/14309) -// Copied from Theia code but with customized TreeViewWidget with the customized viewsWelcome rendering -// https://github.com/eclipse-theia/theia/blob/0c5f69455d9ee355b1a7ca510ffa63d2b20f0c77/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts#L159-L181 -function bindViewsWelcome_TheiaGH14309({ - bind, - widget, -}: { - bind: interfaces.Bind; - widget: interfaces.Newable<TreeWidget>; -}) { - bind(WidgetFactory) - .toDynamicValue(({ container }) => ({ - id: PLUGIN_VIEW_DATA_FACTORY_ID, - createWidget: (options: TreeViewWidgetOptions) => { - const props = { - contextMenuPath: VIEW_ITEM_CONTEXT_MENU, - expandOnlyOnExpansionToggleClick: true, - expansionTogglePadding: 22, - globalSelection: true, - leftPadding: 8, - search: true, - multiSelect: options.multiSelect, - }; - const child = createTreeContainer(container, { - props, - tree: PluginTree, - model: PluginTreeModel, - widget, - decoratorService: TreeViewDecoratorService, - }); - child.bind(TreeViewWidgetOptions).toConstantValue(options); - return child.get(TreeWidget); - }, - })) - .inSingletonScope(); -} diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index 40ae222d1..77c65cbbe 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -280,14 +280,6 @@ const properties: ArduinoPreferenceSchemaProperties = { ), 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( @@ -355,7 +347,6 @@ export interface ArduinoConfiguration { 'arduino.auth.domain': string; 'arduino.auth.audience': string; 'arduino.auth.registerUri': string; - 'arduino.survey.notification': boolean; 'arduino.cli.daemon.debug': boolean; 'arduino.sketch.inoBlueprint': string; 'arduino.checkForUpdates': boolean; 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 bf92eb1c7..9f1b05b1c 100644 --- a/arduino-ide-extension/src/browser/auth/authentication-client-service.ts +++ b/arduino-ide-extension/src/browser/auth/authentication-client-service.ts @@ -3,7 +3,7 @@ import { Emitter } from '@theia/core/lib/common/event'; import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { CommandRegistry, CommandContribution, 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 4b0f45e69..d5b548556 100644 --- a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts +++ b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { MessageService } from '@theia/core/lib/common/message-service'; import { MessageType } from '@theia/core/lib/common/message-service-protocol'; diff --git a/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx b/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx index 79e5e9183..39aebaadd 100644 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx +++ b/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx @@ -98,6 +98,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> { } override async open( + disposeOnResolve = true, params?: EditBoardsConfigActionParams ): Promise<BoardsConfig | undefined> { this._searchSet = undefined; @@ -119,7 +120,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> { this._searchSet = params.searchSet.slice(); } } - return super.open(); + return super.open(disposeOnResolve); } protected override onAfterAttach(msg: Message): void { 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 d4204c703..65fd90290 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { StorageService } from '@theia/core/lib/browser/storage-service'; import type { 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 29bccb242..864bae190 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { StorageService } from '@theia/core/lib/browser/storage-service'; import { diff --git a/arduino-ide-extension/src/browser/config/config-service-client.ts b/arduino-ide-extension/src/browser/config/config-service-client.ts index 65e678180..ff671da20 100644 --- a/arduino-ide-extension/src/browser/config/config-service-client.ts +++ b/arduino-ide-extension/src/browser/config/config-service-client.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; diff --git a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts index 7ac57ac01..a2f76d15f 100644 --- a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts +++ b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts @@ -70,7 +70,7 @@ export class CheckForIDEUpdates extends Contribution { SKIP_IDE_VERSION ); if (versionToSkip === updateInfo.version) return; - this.updaterDialog.open(updateInfo); + this.updaterDialog.open(true, updateInfo); }) .catch((e) => { this.messageService.error( diff --git a/arduino-ide-extension/src/browser/contributions/close.ts b/arduino-ide-extension/src/browser/contributions/close.ts index c5bab561f..93b4a62e4 100644 --- a/arduino-ide-extension/src/browser/contributions/close.ts +++ b/arduino-ide-extension/src/browser/contributions/close.ts @@ -1,8 +1,6 @@ import { Dialog } from '@theia/core/lib/browser/dialogs'; -import type { - FrontendApplication, - OnWillStopAction, -} from '@theia/core/lib/browser/frontend-application'; +import type { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution'; import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; import { nls } from '@theia/core/lib/common/nls'; import type { MaybePromise } from '@theia/core/lib/common/types'; diff --git a/arduino-ide-extension/src/browser/contributions/compiler-errors.ts b/arduino-ide-extension/src/browser/contributions/compiler-errors.ts index a689ea3df..19c322d21 100644 --- a/arduino-ide-extension/src/browser/contributions/compiler-errors.ts +++ b/arduino-ide-extension/src/browser/contributions/compiler-errors.ts @@ -779,7 +779,7 @@ export class CompilerErrors return undefined; } else { return this.editorManager - .getByUri(new URI(uriOrWidget)) + .getByUri(new URI(uriOrWidget.toString())) .then((editor) => { if (editor) { return this.monacoEditor(editor); diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 1a8ff5798..781b832fc 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -1,8 +1,6 @@ import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; -import { - FrontendApplication, - FrontendApplicationContribution, -} from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { KeybindingContribution, diff --git a/arduino-ide-extension/src/browser/contributions/edit-contributions.ts b/arduino-ide-extension/src/browser/contributions/edit-contributions.ts index d8e439088..1e6414a34 100644 --- a/arduino-ide-extension/src/browser/contributions/edit-contributions.ts +++ b/arduino-ide-extension/src/browser/contributions/edit-contributions.ts @@ -1,7 +1,11 @@ +import { nls } from '@theia/core/lib/common'; import { inject, injectable } from '@theia/core/shared/inversify'; import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution'; import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; -import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service'; +import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; +import { ICodeEditorService } from '@theia/monaco-editor-core/esm/vs/editor/browser/services/codeEditorService'; +import type { ICodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/browser/editorBrowser'; +import type { StandaloneCodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneCodeEditor'; import { Contribution, Command, @@ -10,17 +14,11 @@ import { CommandRegistry, } from './contribution'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { nls } from '@theia/core/lib/common'; -import type { ICodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/browser/editorBrowser'; -import type { StandaloneCodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneCodeEditor'; // TODO: [macOS]: to remove `Start Dictation...` and `Emoji & Symbol` see this thread: https://github.com/electron/electron/issues/8283#issuecomment-269522072 // Depends on https://github.com/eclipse-theia/theia/pull/7964 @injectable() export class EditContributions extends Contribution { - @inject(MonacoEditorService) - private readonly codeEditorService: MonacoEditorService; - @inject(ClipboardService) private readonly clipboardService: ClipboardService; @@ -208,9 +206,10 @@ ${value} protected async current(): Promise< ICodeEditor | StandaloneCodeEditor | undefined > { + const codeEditorService = StandaloneServices.get(ICodeEditorService); return ( - this.codeEditorService.getFocusedCodeEditor() || - this.codeEditorService.getActiveCodeEditor() || + codeEditorService.getFocusedCodeEditor() || + codeEditorService.getActiveCodeEditor() || undefined ); } 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 443c3e5e4..90210b5fa 100644 --- a/arduino-ide-extension/src/browser/contributions/open-boards-config.ts +++ b/arduino-ide-extension/src/browser/contributions/open-boards-config.ts @@ -12,7 +12,7 @@ export class OpenBoardsConfig extends Contribution { override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenBoardsConfig.Commands.OPEN_DIALOG, { execute: async (params?: EditBoardsConfigActionParams) => - this.boardsConfigDialog.open(params), + this.boardsConfigDialog.open(true, params), }); } } diff --git a/arduino-ide-extension/src/browser/contributions/survey-notification.ts b/arduino-ide-extension/src/browser/contributions/survey-notification.ts deleted file mode 100644 index e1a4817a6..000000000 --- a/arduino-ide-extension/src/browser/contributions/survey-notification.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { MessageService } from '@theia/core'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { LocalStorageService } from '@theia/core/lib/browser'; -import { nls } from '@theia/core/lib/common'; -import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { ArduinoPreferences } from '../arduino-preferences'; -import { SurveyNotificationService } from '../../common/protocol/survey-service'; - -const SURVEY_MESSAGE = nls.localize( - 'arduino/survey/surveyMessage', - 'Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better.' -); -const DO_NOT_SHOW_AGAIN = nls.localize( - 'arduino/survey/dismissSurvey', - "Don't show again" -); -const GO_TO_SURVEY = nls.localize( - 'arduino/survey/answerSurvey', - 'Answer survey' -); - -const SURVEY_BASE_URL = 'https://surveys.hotjar.com/'; -const surveyId = '17887b40-e1f0-4bd6-b9f0-a37f229ccd8b'; - -@injectable() -export class SurveyNotification implements FrontendApplicationContribution { - @inject(MessageService) - private readonly messageService: MessageService; - - @inject(LocalStorageService) - private readonly localStorageService: LocalStorageService; - - @inject(WindowService) - private readonly windowService: WindowService; - - @inject(ArduinoPreferences) - private readonly arduinoPreferences: ArduinoPreferences; - - @inject(SurveyNotificationService) - private readonly surveyNotificationService: SurveyNotificationService; - - onStart(): void { - this.arduinoPreferences.ready.then(async () => { - if ( - (await this.surveyNotificationService.isFirstInstance()) && - this.arduinoPreferences.get('arduino.survey.notification') - ) { - const surveyAnswered = await this.localStorageService.getData( - this.surveyKey(surveyId) - ); - if (surveyAnswered !== undefined) { - return; - } - const answer = await this.messageService.info( - SURVEY_MESSAGE, - DO_NOT_SHOW_AGAIN, - GO_TO_SURVEY - ); - switch (answer) { - case GO_TO_SURVEY: - this.windowService.openNewWindow(SURVEY_BASE_URL + surveyId, { - external: true, - }); - this.localStorageService.setData(this.surveyKey(surveyId), true); - break; - case DO_NOT_SHOW_AGAIN: - this.localStorageService.setData(this.surveyKey(surveyId), false); - break; - } - } - }); - } - - private surveyKey(id: string): string { - return `answered_survey:${id}`; - } -} diff --git a/arduino-ide-extension/src/browser/create/create-features.ts b/arduino-ide-extension/src/browser/create/create-features.ts index 2bbb32170..e49b3c576 100644 --- a/arduino-ide-extension/src/browser/create/create-features.ts +++ b/arduino-ide-extension/src/browser/create/create-features.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; import URI from '@theia/core/lib/common/uri'; diff --git a/arduino-ide-extension/src/browser/create/create-fs-provider.ts b/arduino-ide-extension/src/browser/create/create-fs-provider.ts index 7908d0556..1deaa9d6c 100644 --- a/arduino-ide-extension/src/browser/create/create-fs-provider.ts +++ b/arduino-ide-extension/src/browser/create/create-fs-provider.ts @@ -5,7 +5,7 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { Stat, FileType, diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index 0598b2853..52eebd9c5 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -261,6 +261,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { } override async open( + disposeOnResolve = true, data: UpdateInfo | undefined = undefined ): Promise<UpdateInfo | undefined> { if (data && data.version) { @@ -271,7 +272,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> { error: undefined, }); this.updateInfo = data; - return super.open(); + return super.open(disposeOnResolve); } } diff --git a/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts b/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts index 167c83120..7e9c2c75f 100644 --- a/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts +++ b/arduino-ide-extension/src/browser/ide-updater/ide-updater-commands.ts @@ -30,7 +30,7 @@ export class IDEUpdaterCommands implements CommandContribution { try { const updateInfo = await this.updater.checkForUpdates(initialCheck); if (!!updateInfo) { - this.updaterDialog.open(updateInfo); + this.updaterDialog.open(true, updateInfo); } else { this.messageService.info( nls.localize( diff --git a/arduino-ide-extension/src/browser/notification-center.ts b/arduino-ide-extension/src/browser/notification-center.ts index 9bb0e2ae4..f74ee3cf2 100644 --- a/arduino-ide-extension/src/browser/notification-center.ts +++ b/arduino-ide-extension/src/browser/notification-center.ts @@ -6,7 +6,7 @@ import { import { Emitter } from '@theia/core/lib/common/event'; import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { IndexUpdateDidCompleteParams, IndexUpdateDidFailParams, diff --git a/arduino-ide-extension/src/browser/sketches-service-client-impl.ts b/arduino-ide-extension/src/browser/sketches-service-client-impl.ts index 9b3cdac94..6955f080c 100644 --- a/arduino-ide-extension/src/browser/sketches-service-client-impl.ts +++ b/arduino-ide-extension/src/browser/sketches-service-client-impl.ts @@ -9,7 +9,7 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { Sketch, SketchesService } from '../common/protocol'; import { ConfigServiceClient } from './config/config-service-client'; import { @@ -74,6 +74,7 @@ export class SketchesServiceClientImpl const sketchDirUri = this.configService.tryGetSketchDirUri(); this.watchSketchbookDir(sketchDirUri); const refreshCurrentSketch = async () => { + await this.workspaceService.ready; const currentSketch = await this.loadCurrentSketch(); const ideTempFolderUri = await this.getIdeTempFolderUriForSketch( currentSketch @@ -287,7 +288,7 @@ export class SketchesServiceClientImpl * `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`. */ isReadOnly(uri: URI | monaco.Uri | string): boolean { - const toCheck = uri instanceof URI ? uri : new URI(uri); + const toCheck = uri instanceof URI ? uri : new URI(uri.toString()); if (toCheck.scheme === 'user-storage') { return false; } diff --git a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css index 62938e219..e905a315a 100644 --- a/arduino-ide-extension/src/browser/style/cloud-sketchbook.css +++ b/arduino-ide-extension/src/browser/style/cloud-sketchbook.css @@ -98,16 +98,12 @@ color: var(--theia-textLink-foreground); } -.account-icon { +img.arduino-account-picture { width: var(--theia-private-sidebar-icon-size); height: var(--theia-private-sidebar-icon-size); - border-radius: 50%; - overflow: hidden; -} - -.account-icon > img { max-width: 100%; max-height: 100%; + border-radius: 50%; } .connected-status-icon { diff --git a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts index 3affee1f4..34ea17187 100644 --- a/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/core/common-frontend-contribution.ts @@ -2,7 +2,7 @@ import { CommonCommands, CommonFrontendContribution as TheiaCommonFrontendContribution, } from '@theia/core/lib/browser/common-frontend-contribution'; -import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application'; +import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution'; import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding'; import type { CommandRegistry } from '@theia/core/lib/common/command'; import type { MenuModelRegistry } from '@theia/core/lib/common/menu'; diff --git a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts index f876f7c0a..f892d7eb8 100644 --- a/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts +++ b/arduino-ide-extension/src/browser/theia/core/connection-status-service.ts @@ -1,10 +1,10 @@ import { - ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, ConnectionStatus, + ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution, FrontendConnectionStatusService as TheiaFrontendConnectionStatusService, } from '@theia/core/lib/browser/connection-status-service'; -import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { WebSocketConnectionProvider } from '@theia/core/lib/browser/index'; +import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; +import { WebSocketConnectionSource } from '@theia/core/lib/browser/messaging/ws-connection-source'; import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar'; import { Disposable } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; @@ -114,8 +114,8 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat private readonly daemonPort: DaemonPort; @inject(IsOnline) private readonly isOnline: IsOnline; - @inject(WebSocketConnectionProvider) - private readonly connectionProvider: WebSocketConnectionProvider; + @inject(WebSocketConnectionSource) + private readonly connectionSource: WebSocketConnectionSource; @postConstruct() protected override init(): void { @@ -128,7 +128,7 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat } protected override async performPingRequest(): Promise<void> { - if (!this.connectionProvider['socket'].connected) { + if (!this.connectionSource['socket'].connected) { this.updateStatus(false); return; } @@ -171,8 +171,8 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon private readonly notificationManager: NotificationManager; @inject(CreateFeatures) private readonly createFeatures: CreateFeatures; - @inject(WebSocketConnectionProvider) - private readonly connectionProvider: WebSocketConnectionProvider; + @inject(WebSocketConnectionSource) + private readonly connectionSource: WebSocketConnectionSource; private readonly offlineStatusDidChangeEmitter = new Emitter< OfflineConnectionStatus | undefined @@ -202,7 +202,7 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon const params = <OfflineMessageParams>{ port: this.daemonPort.port, online: this.isOnline.online, - backendConnected: this.connectionProvider['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081 + backendConnected: this.connectionSource['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081 }; this._offlineStatus = offlineConnectionStatusType(params); const { text, tooltip } = offlineMessage(params); diff --git a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx index 042e9a01f..124604098 100644 --- a/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx +++ b/arduino-ide-extension/src/browser/theia/core/sidebar-bottom-menu-widget.tsx @@ -1,5 +1,5 @@ import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget'; -import type { SidebarMenu } from '@theia/core/lib/browser/shell/sidebar-menu-widget'; +import type { SidebarMenuItem } from '@theia/core/lib/browser/shell/sidebar-menu-widget'; import type { MenuPath } from '@theia/core/lib/common/menu'; import { nls } from '@theia/core/lib/common/nls'; import { @@ -46,46 +46,45 @@ export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget { this.contextMenuRenderer.render(options); } - protected override render(): React.ReactNode { - return ( - <React.Fragment> - {this.menus.map((menu) => this.renderMenu(menu))} - </React.Fragment> - ); - } - - private renderMenu(menu: SidebarMenu): React.ReactNode { + override renderItem(item: SidebarMenuItem): React.ReactNode { // Removes the _Settings_ (cog) icon from the left sidebar - if (menu.id === 'settings-menu') { + if (item.menu.id === 'settings-menu') { return undefined; } - const arduinoAccount = menu.id === accountMenu.id; - const picture = + const arduinoAccount = item.menu.id === accountMenu.id; + const arduinoAccountPicture = arduinoAccount && this.connectionStatue.offlineStatus !== 'internet' && this.createFeatures.session?.account.picture; - const className = typeof picture === 'string' ? undefined : menu.iconClass; + return ( - <i - key={menu.id} - className={className} - title={menu.title} - onClick={(e) => this.onClick(e, menu.menuPath)} + <div + key={item.menu.id} + className="theia-sidebar-menu-item" + title={item.menu.title} + onClick={(e) => this.onClick(e, item.menu.menuPath)} onMouseDown={this.onMouseDown} + onMouseEnter={(e) => this.onMouseEnter(e, item.menu.title)} onMouseOut={this.onMouseOut} > - {picture && ( - <div className="account-icon"> + {arduinoAccountPicture ? ( + <i> <img - src={picture} + className="arduino-account-picture" + src={arduinoAccountPicture} alt={nls.localize( 'arduino/cloud/profilePicture', 'Profile picture' )} /> - </div> + </i> + ) : ( + <i className={item.menu.iconClass} /> + )} + {item.badge && ( + <div className="theia-badge-decorator-sidebar">{item.badge}</div> )} - </i> + </div> ); } } diff --git a/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts b/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts index 769c3c930..92f5fa960 100644 --- a/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/debug/debug-session-contribution.ts @@ -1,6 +1,7 @@ import { injectable } from '@theia/core/shared/inversify'; import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection'; import { DefaultDebugSessionFactory as TheiaDefaultDebugSessionFactory } from '@theia/debug/lib/browser/debug-session-contribution'; +import { DebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; import { DebugAdapterPath, @@ -12,6 +13,7 @@ import { DebugSession } from './debug-session'; @injectable() export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory { override get( + manager: DebugSessionManager, sessionId: string, options: DebugConfigurationSessionOptions, parentSession?: DebugSession @@ -20,12 +22,12 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory sessionId, () => new Promise<DebugChannel>((resolve) => - this.connectionProvider.openChannel( + this.connectionProvider.listen( `${DebugAdapterPath}/${sessionId}`, - (wsChannel) => { + (_, wsChannel) => { resolve(new ForwardingDebugChannel(wsChannel)); }, - { reconnecting: false } + false ) ), this.getTraceOutputChannel() @@ -35,6 +37,9 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory sessionId, options, parentSession, + this.testService, + options.testRun, + manager, connection, this.terminalService, this.editorManager, diff --git a/arduino-ide-extension/src/browser/theia/editor/editor-command.ts b/arduino-ide-extension/src/browser/theia/editor/editor-command.ts deleted file mode 100644 index 9f4a3ffc5..000000000 --- a/arduino-ide-extension/src/browser/theia/editor/editor-command.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { injectable, postConstruct } from '@theia/core/shared/inversify'; -import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser/editor-command'; - -@injectable() -export class EditorCommandContribution extends TheiaEditorCommandContribution { - @postConstruct() - protected override init(): void { - // Workaround for https://github.com/eclipse-theia/theia/issues/8722. - this.editorPreferences.onPreferenceChanged( - ({ preferenceName, newValue, oldValue }) => { - if (preferenceName === 'files.autoSave') { - const autoSaveWasOnBeforeChange = !oldValue || oldValue !== 'off'; - const autoSaveIsOnAfterChange = !newValue || newValue !== 'off'; - if (!autoSaveWasOnBeforeChange && autoSaveIsOnAfterChange) { - this.shell.saveAll(); - } - } - } - ); - } -} diff --git a/arduino-ide-extension/src/browser/theia/editor/editor-contribution.ts b/arduino-ide-extension/src/browser/theia/editor/editor-contribution.ts index 9ff0bd46e..1905ccc72 100644 --- a/arduino-ide-extension/src/browser/theia/editor/editor-contribution.ts +++ b/arduino-ide-extension/src/browser/theia/editor/editor-contribution.ts @@ -1,19 +1,18 @@ import { injectable } from '@theia/core/shared/inversify'; -import { TextEditor } from '@theia/editor/lib/browser'; import { EditorContribution as TheiaEditorContribution } from '@theia/editor/lib/browser/editor-contribution'; @injectable() export class EditorContribution extends TheiaEditorContribution { protected override updateLanguageStatus( - // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars - editor: TextEditor | undefined + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ..._: Parameters<TheiaEditorContribution['updateLanguageStatus']> ): void { // NOOP } protected override updateEncodingStatus( - // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars - editor: TextEditor | undefined + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ..._: Parameters<TheiaEditorContribution['updateEncodingStatus']> ): void { // https://github.com/arduino/arduino-ide/issues/1393 // NOOP diff --git a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts index 9812aa1da..f1b49cfe5 100644 --- a/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts +++ b/arduino-ide-extension/src/browser/theia/filesystem/file-resource.ts @@ -36,7 +36,7 @@ export class FileResourceResolver extends TheiaFileResourceResolver { ); } return new WriteQueuedFileResource(uri, this.fileService, { - isReadonly: stat?.isReadonly ?? false, + readOnly: stat?.isReadonly ?? false, shouldOverwrite: () => this.shouldOverwrite(uri), shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error), }); diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts index 871cf8504..0080d447c 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-editor-provider.ts @@ -117,7 +117,7 @@ export function maybeUpdateReadOnlyState( const model = editor.document; const oldReadOnly = model.readOnly; const resource = model['resource']; - const newReadOnly = Boolean(resource.isReadonly) || isReadOnly(resource.uri); + const newReadOnly = Boolean(resource.readOnly) || isReadOnly(resource.uri); if (oldReadOnly !== newReadOnly) { editor.getControl().updateOptions({ readOnly: newReadOnly }); if (newReadOnly) { diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts index 2943d4580..9d3eebe4b 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-text-model-service.ts @@ -20,7 +20,7 @@ export class MonacoTextModelService extends TheiaMonacoTextModelService { .getContributions() .find(({ scheme }) => resource.uri.scheme === scheme); const readOnly = - Boolean(resource.isReadonly) || + Boolean(resource.readOnly) || this.sketchesServiceClient.isReadOnly(resource.uri); return factory ? factory.createModel(resource) diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts index 2604c3caf..0ed8e475b 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { ThemeService } from '@theia/core/lib/browser/theming'; import { Disposable, diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts index 8edf46383..97437335b 100644 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts +++ b/arduino-ide-extension/src/browser/theia/plugin-ext/hosted-plugin.ts @@ -1,11 +1,9 @@ -import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import type { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; import { injectable, interfaces } from '@theia/core/shared/inversify'; -import { - PluginContributions, - HostedPluginSupport as TheiaHostedPluginSupport, -} from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; -import { HostedPluginSupport } from '../../hosted/hosted-plugin-support'; +import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +import type { PluginContributions } from '@theia/plugin-ext/lib/hosted/common/hosted-plugin'; +import type { HostedPluginSupport } from '../../hosted/hosted-plugin-support'; @injectable() export class HostedPluginSupportImpl diff --git a/arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx b/arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx deleted file mode 100644 index dc83272c2..000000000 --- a/arduino-ide-extension/src/browser/theia/plugin-ext/tree-view-widget.tsx +++ /dev/null @@ -1,241 +0,0 @@ -import { LabelIcon } from '@theia/core/lib/browser/label-parser'; -import { OpenerService, open } from '@theia/core/lib/browser/opener-service'; -import { codicon } from '@theia/core/lib/browser/widgets/widget'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { URI } from '@theia/core/lib/common/uri'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import React from '@theia/core/shared/react'; -import { URI as CodeUri } from '@theia/core/shared/vscode-uri'; -import { TreeViewWidget as TheiaTreeViewWidget } from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget'; - -// Copied back from https://github.com/eclipse-theia/theia/pull/14391 -// Remove the patching when Arduino uses Eclipse Theia >1.55.0 -// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L37-L54 -// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L146-L298 - -interface ViewWelcome { - readonly view: string; - readonly content: string; - readonly when?: string; - readonly enablement?: string; - readonly order: number; -} - -export interface IItem { - readonly welcomeInfo: ViewWelcome; - visible: boolean; -} - -export interface ILink { - readonly label: string; - readonly href: string; - readonly title?: string; -} - -type LinkedTextItem = string | ILink; - -@injectable() -export class TreeViewWidget extends TheiaTreeViewWidget { - @inject(OpenerService) - private readonly openerService: OpenerService; - - private readonly toDisposeBeforeUpdateViewWelcomeNodes = - new DisposableCollection(); - - protected override updateViewWelcomeNodes(): void { - this.viewWelcomeNodes = []; - this.toDisposeBeforeUpdateViewWelcomeNodes.dispose(); - const items = this.visibleItems.sort((a, b) => a.order - b.order); - - const enablementKeys: Set<string>[] = []; - // the plugin-view-registry will push the changes when there is a change in the `when` prop which controls the visibility - // this listener is to update the enablement of the components in the view welcome - this.toDisposeBeforeUpdateViewWelcomeNodes.push( - this.contextService.onDidChange((event) => { - if (enablementKeys.some((keys) => event.affects(keys))) { - this.updateViewWelcomeNodes(); - this.update(); - } - }) - ); - // Note: VS Code does not support the `renderSecondaryButtons` prop in welcome content either. - for (const item of items) { - const { content } = item; - const enablement = isEnablementAware(item) ? item.enablement : undefined; - const itemEnablementKeys = enablement - ? this.contextService.parseKeys(enablement) - : undefined; - if (itemEnablementKeys) { - enablementKeys.push(itemEnablementKeys); - } - const lines = content.split('\n'); - - for (let line of lines) { - line = line.trim(); - - if (!line) { - continue; - } - - const linkedTextItems = this.parseLinkedText_patch14309(line); - - if ( - linkedTextItems.length === 1 && - typeof linkedTextItems[0] !== 'string' - ) { - const node = linkedTextItems[0]; - this.viewWelcomeNodes.push( - this.renderButtonNode_patch14309( - node, - this.viewWelcomeNodes.length, - enablement - ) - ); - } else { - const renderNode = (item: LinkedTextItem, index: number) => - typeof item == 'string' - ? this.renderTextNode_patch14309(item, index) - : this.renderLinkNode_patch14309(item, index, enablement); - - this.viewWelcomeNodes.push( - <p key={`p-${this.viewWelcomeNodes.length}`}> - {...linkedTextItems.flatMap(renderNode)} - </p> - ); - } - } - } - } - - private renderButtonNode_patch14309( - node: ILink, - lineKey: string | number, - enablement: string | undefined - ): React.ReactNode { - return ( - <div key={`line-${lineKey}`} className="theia-WelcomeViewButtonWrapper"> - <button - title={node.title} - className="theia-button theia-WelcomeViewButton" - disabled={!this.isEnabledClick_patch14309(enablement)} - onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)} - > - {node.label} - </button> - </div> - ); - } - - private renderTextNode_patch14309( - node: string, - textKey: string | number - ): React.ReactNode { - return ( - <span key={`text-${textKey}`}> - {this.labelParser - .parse(node) - .map((segment, index) => - LabelIcon.is(segment) ? ( - <span key={index} className={codicon(segment.name)} /> - ) : ( - <span key={index}>{segment}</span> - ) - )} - </span> - ); - } - - private renderLinkNode_patch14309( - node: ILink, - linkKey: string | number, - enablement: string | undefined - ): React.ReactNode { - return ( - <a - key={`link-${linkKey}`} - className={this.getLinkClassName_patch14309(node.href, enablement)} - title={node.title || ''} - onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)} - > - {node.label} - </a> - ); - } - - private getLinkClassName_patch14309( - href: string, - enablement: string | undefined - ): string { - const classNames = ['theia-WelcomeViewCommandLink']; - // Only command-backed links can be disabled. All other, https:, file: remain enabled - if ( - href.startsWith('command:') && - !this.isEnabledClick_patch14309(enablement) - ) { - classNames.push('disabled'); - } - return classNames.join(' '); - } - - private isEnabledClick_patch14309(enablement: string | undefined): boolean { - return typeof enablement === 'string' - ? this.contextService.match(enablement) - : true; - } - - private openLinkOrCommand_patch14309 = ( - event: React.MouseEvent, - value: string - ): void => { - event.stopPropagation(); - - if (value.startsWith('command:')) { - const command = value.replace('command:', ''); - this.commands.executeCommand(command); - } else if (value.startsWith('file:')) { - const uri = value.replace('file:', ''); - open(this.openerService, new URI(CodeUri.file(uri).toString())); - } else { - this.windowService.openNewWindow(value, { external: true }); - } - }; - - private parseLinkedText_patch14309(text: string): LinkedTextItem[] { - const result: LinkedTextItem[] = []; - - const linkRegex = - /\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi; - let index = 0; - let match: RegExpExecArray | null; - - while ((match = linkRegex.exec(text))) { - if (match.index - index > 0) { - result.push(text.substring(index, match.index)); - } - - const [, label, href, , title] = match; - - if (title) { - result.push({ label, href, title }); - } else { - result.push({ label, href }); - } - - index = match.index + match[0].length; - } - - if (index < text.length) { - result.push(text.substring(index)); - } - - return result; - } -} - -interface EnablementAware { - readonly enablement: string | undefined; -} - -function isEnablementAware(arg: unknown): arg is EnablementAware { - return !!arg && typeof arg === 'object' && 'enablement' in arg; -} diff --git a/arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts b/arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts new file mode 100644 index 000000000..d15466f0b --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/test/test-view-contribution.ts @@ -0,0 +1,9 @@ +import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution'; +import { injectable } from 'inversify'; + +@injectable() +export class TestViewContribution extends TheiaTestViewContribution { + override async initializeLayout(): Promise<void> { + // NOOP + } +} diff --git a/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx b/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx index 4f1878f09..4458b8fc6 100644 --- a/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx +++ b/arduino-ide-extension/src/browser/toolbar/arduino-toolbar.tsx @@ -4,6 +4,7 @@ import { TabBarToolbarRegistry, TabBarToolbarItem, ReactTabBarToolbarItem, + RenderedToolbarItem, } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { CommandRegistry } from '@theia/core/lib/common/command'; import { ReactWidget } from '@theia/core/lib/browser'; @@ -14,7 +15,7 @@ export const ARDUINO_TOOLBAR_ITEM_CLASS = 'arduino-tool-item'; export namespace ArduinoToolbarComponent { export interface Props { side: 'left' | 'right'; - items: (TabBarToolbarItem | ReactTabBarToolbarItem)[]; + items: TabBarToolbarItem[]; commands: CommandRegistry; labelParser: LabelParser; commandIsEnabled: (id: string) => boolean; @@ -34,7 +35,7 @@ export class ArduinoToolbarComponent extends React.Component< this.state = { tooltip: '' }; } - protected renderItem = (item: TabBarToolbarItem) => { + protected renderItem = (item: RenderedToolbarItem) => { let innerText = ''; let className = `arduino-tool-icon ${item.id}-icon`; if (item.text) { @@ -46,7 +47,8 @@ export class ArduinoToolbarComponent extends React.Component< } } } - const command = this.props.commands.getCommand(item.command); + const command = + item.command && this.props.commands.getCommand(item.command); const cls = `${ARDUINO_TOOLBAR_ITEM_CLASS} ${ TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM } ${command && this.props.commandIsEnabled(command.id) ? 'enabled' : ''} ${ @@ -80,7 +82,9 @@ export class ArduinoToolbarComponent extends React.Component< const items = [ <React.Fragment key={this.props.side + '-arduino-toolbar-tooltip'}> {[...this.props.items].map((item) => - TabBarToolbarItem.is(item) ? this.renderItem(item) : item.render() + ReactTabBarToolbarItem.is(item) + ? item.render() + : this.renderItem(item) )} </React.Fragment>, ]; @@ -94,10 +98,7 @@ export class ArduinoToolbarComponent extends React.Component< } export class ArduinoToolbar extends ReactWidget { - protected items = new Map< - string, - TabBarToolbarItem | ReactTabBarToolbarItem - >(); + protected items = new Map<string, TabBarToolbarItem>(); constructor( protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry, @@ -112,9 +113,7 @@ export class ArduinoToolbar extends ReactWidget { this.tabBarToolbarRegistry.onDidChange(() => this.updateToolbar()); } - protected updateItems( - items: Array<TabBarToolbarItem | ReactTabBarToolbarItem> - ): void { + protected updateItems(items: Array<TabBarToolbarItem>): void { this.items.clear(); const revItems = items .sort(TabBarToolbarItem.PRIORITY_COMPARATOR) @@ -163,7 +162,7 @@ export class ArduinoToolbar extends ReactWidget { protected executeCommand = (e: React.MouseEvent<HTMLElement>) => { const item = this.items.get(e.currentTarget.id); - if (TabBarToolbarItem.is(item)) { + if (item && item.command) { this.commands.executeCommand(item.command, this, e.target); } }; diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts index 56dec744d..205dac9ed 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget-frontend-contribution.ts @@ -1,4 +1,4 @@ -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { OpenerOptions, OpenHandler, 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 e73bb7e2f..e3ce5b136 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-widget-contribution.ts @@ -3,7 +3,7 @@ import { CommandRegistry } from '@theia/core/lib/common/command'; import { MenuModelRegistry } from '@theia/core/lib/common/menu'; import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service'; import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; -import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution'; import { MainMenuManager } from '../../../common/main-menu-manager'; import { ArduinoPreferences } from '../../arduino-preferences'; import { SketchbookWidget } from './sketchbook-widget'; diff --git a/arduino-ide-extension/src/common/protocol/survey-service.ts b/arduino-ide-extension/src/common/protocol/survey-service.ts deleted file mode 100644 index 3ab53b230..000000000 --- a/arduino-ide-extension/src/common/protocol/survey-service.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const SurveyNotificationServicePath = - '/services/survey-notification-service'; -export const SurveyNotificationService = Symbol('SurveyNotificationService'); - -export interface SurveyNotificationService { - isFirstInstance(): Promise<boolean>; -} diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts index 77fd74a68..cec3f54e6 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-main-menu-factory.ts @@ -38,33 +38,33 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { this.preferencesService.onPreferenceChanged( debounce((e) => { if (e.preferenceName === 'window.menuBarVisibility') { - this.setMenuBar(); + this.doSetMenuBar(); } - if (this._menu) { - for (const cmd of this._toggledCommands) { - const menuItem = this.findMenuById(this._menu, cmd); + 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 + window.electronArduino.setMenu(this.menu); // calls the IDE2-specific implementation } }, 10) ); this.keybindingRegistry.onKeybindingsChanged(() => { - this.setMenuBar(); + this.doSetMenuBar(); }); // #endregion Theia `postConstruct` this.appStateService.reachedState('ready').then(() => { this.appReady = true; if (this.updateWhenReady) { - this.setMenuBar(); + this.doSetMenuBar(); } }); } override createElectronMenuBar(): MenuDto[] { - this._toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977 + this.toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977 const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR); const menu = this.fillMenuTemplate([], menuModel, [], { rootMenuPath: MAIN_MENU_BAR, @@ -73,11 +73,11 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { menu.unshift(this.createOSXMenu()); } const escapedMenu = this.escapeAmpersand(menu); - this._menu = escapedMenu; + this.menu = escapedMenu; return escapedMenu; } - override async setMenuBar(): Promise<void> { + override async doSetMenuBar(): Promise<void> { // Avoid updating menu items when the app is not ready. // Getting the current electron window is not free and synchronous. // Here, we defer all menu update requests, and fire one when the app is ready. @@ -124,17 +124,17 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { ...args ); if ( - this._menu && + this.menu && this.menuCommandExecutor.isVisible(menuPath, commandId, ...args) ) { - const item = this.findMenuById(this._menu, commandId); + 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. + window.electronArduino.setMenu(this.menu); // overridden to call the IDE2-specific implementation. } } } @@ -342,7 +342,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { parentItems.push(menuItem); if (this.commandRegistry.getToggledHandler(commandId, ...args)) { - this._toggledCommands.add(commandId); + this.toggledCommands.add(commandId); } } return parentItems; 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 f1f594783..67adac604 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts @@ -7,6 +7,7 @@ import { hasStartupTasks, StartupTasks, } from '../../../electron-common/startup-task'; +import { WindowReloadOptions } from '@theia/core/lib/browser/window/window-service'; @injectable() export class ElectronWindowService @@ -17,8 +18,12 @@ export class ElectronWindowService @postConstruct() protected override init(): void { - // NOOP + // Overridden to avoid calling the zoom level listener in super. // IDE2 listens on the zoom level changes in `ArduinoFrontendContribution#onStart` + + window.electronTheiaCore.onAboutToClose(() => { + this.connectionCloseService.markForClose(this.frontendIdProvider.getId()); + }); } async isFirstWindow(): Promise<boolean> { @@ -38,11 +43,11 @@ export class ElectronWindowService } // Overridden to support optional task owner params and make `tsc` happy. - override reload(options?: StartupTasks): void { + override reload(options?: StartupTasks | WindowReloadOptions): void { if (hasStartupTasks(options)) { window.electronArduino.requestReload(options); } else { - window.electronTheiaCore.requestReload(); + super.reload(options); } } 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 04f8b50fa..b6fd604e4 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,10 +1,10 @@ +import { ConnectionHandler } from '@theia/core/lib/common/messaging/handler'; 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, + ElectronMainApplication as TheiaElectronMainApplication, } from '@theia/core/lib/electron-main/electron-main-application'; import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window'; import { ContainerModule } from '@theia/core/shared/inversify'; @@ -33,7 +33,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(IDEUpdaterImpl).toSelf().inSingletonScope(); bind(IDEUpdater).toService(IDEUpdaterImpl); bind(ElectronMainApplicationContribution).toService(IDEUpdater); - bind(ElectronConnectionHandler) + bind(ConnectionHandler) .toDynamicValue( (context) => new JsonRpcConnectionHandler<IDEUpdaterClient>( 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 35063bc8f..e6f91f5b9 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 @@ -11,16 +11,16 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { isOSX } from '@theia/core/lib/common/os'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types'; import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token'; import { - ElectronMainExecutionParams, + ElectronMainCommandOptions, ElectronMainApplication as TheiaElectronMainApplication, } from '@theia/core/lib/electron-main/electron-main-application'; import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window'; -import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; import { URI } from '@theia/core/shared/vscode-uri'; import { log as logToFile, setup as setupFileLog } from 'node-log-rotate'; @@ -28,6 +28,7 @@ import { fork } from 'node:child_process'; import { promises as fs, readFileSync, rm, rmSync } from 'node:fs'; import type { AddressInfo } from 'node:net'; import { isAbsolute, join, resolve } from 'node:path'; +import type { Argv } from 'yargs'; import { Sketch } from '../../common/protocol'; import { AppInfo, @@ -129,6 +130,11 @@ const APP_STARTED_WITH_CONTENT_TRACE = typeof process !== 'undefined' && process.argv.indexOf('--content-trace') !== -1; +const createYargs: ( + argv?: string[], + cwd?: string +) => Argv = require('yargs/yargs'); + @injectable() export class ElectronMainApplication extends TheiaElectronMainApplication { @inject(IsTempSketch) @@ -171,29 +177,59 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { private readonly scheduledDeletions: Disposable[] = []; override async start(config: FrontendApplicationConfig): Promise<void> { - // Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit") - // See: https://github.com/electron-userland/electron-builder/issues/2468 - // Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701 - console.log(`${config.applicationName} ${app.getVersion()}`); - app.on('ready', () => app.setName(config.applicationName)); - const cwd = process.cwd(); - this.attachFileAssociations(cwd); - this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native'; - this._config = await updateFrontendApplicationConfigFromPackageJson(config); - this._appInfo = updateAppInfo(this._appInfo, this._config); - this.hookApplicationEvents(); - const [port] = await Promise.all([this.startBackend(), app.whenReady()]); - this.startContentTracing(); - this._backendPort.resolve(port); - await Promise.all([ - this.attachElectronSecurityToken(port), - this.startContributions(), - ]); - return this.launch({ - secondInstance: false, - argv: this.processArgv.getProcessArgvWithoutBin(process.argv), - cwd, - }); + createYargs(this.argv, process.cwd()) + .command( + '$0 [file]', + false, + (cmd) => + cmd + .option('electronUserData', { + type: 'string', + describe: + 'The area where the electron main process puts its data', + }) + .positional('file', { type: 'string' }), + async (args) => { + if (args.electronUserData) { + console.info( + `using electron user data area : '${args.electronUserData}'` + ); + await fs.mkdir(args.electronUserData, { recursive: true }); + app.setPath('userData', args.electronUserData); + } + // Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit") + // See: https://github.com/electron-userland/electron-builder/issues/2468 + // Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701 + console.log(`${config.applicationName} ${app.getVersion()}`); + app.on('ready', () => app.setName(config.applicationName)); + const cwd = process.cwd(); + this.attachFileAssociations(cwd); + this.useNativeWindowFrame = + this.getTitleBarStyle(config) === 'native'; + this._config = await updateFrontendApplicationConfigFromPackageJson( + config + ); + this._appInfo = updateAppInfo(this._appInfo, this._config); + this.hookApplicationEvents(); + this.showInitialWindow(undefined); + const [port] = await Promise.all([ + this.startBackend(), + app.whenReady(), + ]); + this.startContentTracing(); + this._backendPort.resolve(port); + await Promise.all([ + this.attachElectronSecurityToken(port), + this.startContributions(), + ]); + this.handleMainCommand({ + file: args.file, + cwd, + secondInstance: false, + }); + } + ) + .parse(); } private startContentTracing(): void { @@ -284,8 +320,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } } - protected override async launch( - params: ElectronMainExecutionParams + protected override async handleMainCommand( + options: ElectronMainCommandOptions ): Promise<void> { try { // When running on MacOS, we either have to wait until @@ -300,7 +336,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { throw err; } - if (await this.launchFromArgs(params)) { + if (await this.launchFromArgs(options)) { // Application has received a file in its arguments and will skip the default application launch return; } @@ -314,7 +350,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { `Restoring workspace roots: ${workspaces.map(({ file }) => file)}` ); for (const workspace of workspaces) { - const resolvedPath = await this.resolvePath(workspace.file, params.cwd); + const resolvedPath = await this.resolvePath( + workspace.file, + options.cwd + ); if (!resolvedPath) { continue; } @@ -337,15 +376,19 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } this.startup = false; if (useDefault) { - super.launch(params); + super.handleMainCommand(options); } } + private get argv(): string[] { + return this.processArgv.getProcessArgvWithoutBin(process.argv).slice(); + } + private async launchFromArgs( - params: ElectronMainExecutionParams + params: ElectronMainCommandOptions ): Promise<boolean> { // Copy to prevent manipulation of original array - const argCopy = [...params.argv]; + const argCopy = [...this.argv]; let path: string | undefined; for (const maybePath of argCopy) { const resolvedPath = await this.resolvePath(maybePath, params.cwd); @@ -383,7 +426,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } const [uri, electronWindow] = await Promise.all([ this.createWindowUri(), - this.createWindow(options), + this.reuseOrCreateWindow(options), ]); electronWindow.loadURL(uri.withFragment(encodeURI(file)).toString(true)); return electronWindow; @@ -483,7 +526,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { argv: string[], cwd: string ): Promise<void> { - if (await this.launchFromArgs({ cwd, argv, secondInstance: true })) { + if (await this.launchFromArgs({ cwd, secondInstance: true })) { // Application has received a file in its arguments return; } @@ -779,7 +822,7 @@ class InterruptWorkspaceRestoreError extends Error { // 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 + config: Mutable<FrontendApplicationConfig> ): Promise<FrontendApplicationConfig> { if (!isProductionMode) { console.debug( @@ -846,7 +889,8 @@ const fallbackFrontendAppConfig: FrontendApplicationConfig = { defaultIconTheme: 'none', validatePreferencesSchema: false, defaultLocale: '', - electron: {}, + electron: { showWindowEarly: true, uriScheme: 'custom://arduino-ide' }, + reloadOnReconnect: true, }; // When the package.json must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked. 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 ab2843550..3d3f6629b 100644 --- a/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts +++ b/arduino-ide-extension/src/electron-main/theia/theia-electron-window.ts @@ -8,7 +8,7 @@ import { ElectronArduinoRenderer } from '../electron-arduino'; @injectable() export class TheiaElectronWindow extends DefaultTheiaElectronWindow { protected override reload(args?: unknown): void { - this.handleStopRequest(() => { + this.handleStopRequest(async () => { this.applicationState = 'init'; if (hasStartupTasks(args)) { const { webContents } = this._window; diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 13e9bc18e..fef3c3c4d 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -1,7 +1,7 @@ import { join } from 'node:path'; import { inject, injectable, named } from '@theia/core/shared/inversify'; import { spawn, ChildProcess } from 'node:child_process'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { ILogger } from '@theia/core/lib/common/logger'; import { Deferred, retry } from '@theia/core/lib/common/promise-util'; import { 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 4eb572b3b..9367d4aa9 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -105,14 +105,8 @@ import { ClangFormatter } from './clang-formatter'; import { FormatterPath } from '../common/protocol/formatter'; import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service'; import { HostedPluginLocalizationService as TheiaHostedPluginLocalizationService } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-localization-service'; -import { SurveyNotificationServiceImpl } from './survey-service-impl'; -import { - SurveyNotificationService, - SurveyNotificationServicePath, -} from '../common/protocol/survey-service'; import { IsTempSketch } from './is-temp-sketch'; -import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-bindings'; -import { MessagingContribution } from './theia/core/messaging-contribution'; +import { WebsocketEndpoint } from './theia/core/websocket-endpoint'; import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service'; import { HostedPluginReader } from './theia/plugin-ext/plugin-reader'; import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader'; @@ -126,6 +120,7 @@ import { } from './theia/plugin-ext/plugin-deployer'; import { SettingsReader } from './settings-reader'; import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode'; +import { rebindParcelFileSystemWatcher } from './theia/filesystem/parcel-bindings'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -305,7 +300,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ) ) .inSingletonScope(); - rebindNsfwFileSystemWatcher(rebind); + rebindParcelFileSystemWatcher(rebind); // Output service per connection. bind(ConnectionContainerModule).toConstantValue( @@ -383,23 +378,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { HostedPluginLocalizationService ); - // Survey notification bindings - // It's currently unused. https://github.com/arduino/arduino-ide/pull/1150 - bind(SurveyNotificationServiceImpl).toSelf().inSingletonScope(); - bind(SurveyNotificationService).toService(SurveyNotificationServiceImpl); - bind(ConnectionHandler) - .toDynamicValue( - ({ container }) => - new JsonRpcConnectionHandler(SurveyNotificationServicePath, () => - container.get<SurveyNotificationService>(SurveyNotificationService) - ) - ) - .inSingletonScope(); - bind(IsTempSketch).toSelf().inSingletonScope(); - rebind(MessagingService.Identifier) - .to(MessagingContribution) - .inSingletonScope(); + rebind(MessagingService.Identifier).to(WebsocketEndpoint).inSingletonScope(); // Removed undesired contributions from VS Code extensions // Such as the RTOS view from the `cortex-debug` extension diff --git a/arduino-ide-extension/src/node/clang-formatter.ts b/arduino-ide-extension/src/node/clang-formatter.ts index d29778b45..c2b778e61 100644 --- a/arduino-ide-extension/src/node/clang-formatter.ts +++ b/arduino-ide-extension/src/node/clang-formatter.ts @@ -1,6 +1,6 @@ import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { MaybePromise } from '@theia/core/lib/common/types'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; import { constants, promises as fs } from 'node:fs'; import { join } from 'node:path'; diff --git a/arduino-ide-extension/src/node/cli-error-parser.ts b/arduino-ide-extension/src/node/cli-error-parser.ts index d60ecb88e..9fbdaa8cd 100644 --- a/arduino-ide-extension/src/node/cli-error-parser.ts +++ b/arduino-ide-extension/src/node/cli-error-parser.ts @@ -1,6 +1,6 @@ import { notEmpty } from '@theia/core/lib/common/objects'; import { nls } from '@theia/core/lib/common/nls'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { Range, Position, diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts index c1a2adc6f..6686db1a3 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -4,7 +4,7 @@ import yaml from 'js-yaml'; import { injectable, inject, named } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import { ILogger } from '@theia/core/lib/common/logger'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { Event, Emitter } from '@theia/core/lib/common/event'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; import { diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 2e2eb21a2..6789ffc11 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -5,12 +5,13 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { nls } from '@theia/core/lib/common/nls'; import type { Mutable } from '@theia/core/lib/common/types'; -import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; import * as jspb from 'google-protobuf'; import path from 'node:path'; +import { userAbort } from '../common/nls'; import { UploadResponse as ApiUploadResponse, OutputMessage, @@ -26,6 +27,7 @@ import { isCompileSummary, isUploadResponse, } from '../common/protocol/core-service'; +import { UserAbortApplicationError } from '../common/protocol/progressible'; import { ResponseService } from '../common/protocol/response-service'; import { firstToUpperCase, notEmpty } from '../common/utils'; import { BoardDiscovery, createApiPort } from './board-discovery'; @@ -52,8 +54,6 @@ import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible'; import { MonitorManager } from './monitor-manager'; import { ServiceError } from './service-error'; import { AutoFlushingBuffer } from './utils/buffers'; -import { userAbort } from '../common/nls'; -import { UserAbortApplicationError } from '../common/protocol/progressible'; namespace Uploadable { export type Request = UploadRequest | UploadUsingProgrammerRequest; diff --git a/arduino-ide-extension/src/node/examples-service-impl.ts b/arduino-ide-extension/src/node/examples-service-impl.ts index 1199f729e..b9e94450a 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -5,7 +5,7 @@ import { } from '@theia/core/shared/inversify'; import { join } from 'node:path'; import fs from 'node:fs'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { SketchRef, SketchContainer, diff --git a/arduino-ide-extension/src/node/executable-service-impl.ts b/arduino-ide-extension/src/node/executable-service-impl.ts index 9501079d1..4f1eaf567 100644 --- a/arduino-ide-extension/src/node/executable-service-impl.ts +++ b/arduino-ide-extension/src/node/executable-service-impl.ts @@ -1,4 +1,4 @@ -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { injectable } from '@theia/core/shared/inversify'; import { ExecutableService } from '../common/protocol/executable-service'; import { 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 a9df01209..92d78ae47 100644 --- a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts +++ b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts @@ -6,7 +6,7 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { promisify } from 'util'; import { MonitorSettingsProvider } from './monitor-settings-provider'; import { Deferred } from '@theia/core/lib/common/promise-util'; diff --git a/arduino-ide-extension/src/node/node-filesystem-ext.ts b/arduino-ide-extension/src/node/node-filesystem-ext.ts index ee728b89e..732b40c5b 100644 --- a/arduino-ide-extension/src/node/node-filesystem-ext.ts +++ b/arduino-ide-extension/src/node/node-filesystem-ext.ts @@ -1,5 +1,5 @@ import { injectable } from '@theia/core/shared/inversify'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { FileSystemExt } from '../common/protocol/filesystem-ext'; @injectable() diff --git a/arduino-ide-extension/src/node/settings-reader.ts b/arduino-ide-extension/src/node/settings-reader.ts index c58e9751f..61c3b335e 100644 --- a/arduino-ide-extension/src/node/settings-reader.ts +++ b/arduino-ide-extension/src/node/settings-reader.ts @@ -1,5 +1,5 @@ import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; import { promises as fs } from 'node:fs'; import { diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index bbd511bd1..85836ac53 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -6,7 +6,7 @@ import { Deferred } from '@theia/core/lib/common/promise-util'; import { escapeRegExpCharacters } from '@theia/core/lib/common/strings'; import type { Mutable } from '@theia/core/lib/common/types'; import URI from '@theia/core/lib/common/uri'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { inject, injectable, named } from '@theia/core/shared/inversify'; import { glob } from 'glob'; import crypto from 'node:crypto'; diff --git a/arduino-ide-extension/src/node/survey-service-impl.ts b/arduino-ide-extension/src/node/survey-service-impl.ts deleted file mode 100644 index aea8c0472..000000000 --- a/arduino-ide-extension/src/node/survey-service-impl.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { SurveyNotificationService } from '../common/protocol/survey-service'; - -/** - * Service for checking if it is the first instance of the IDE, in this case it sets a flag to true. - * This flag is used to prevent the survey notification from being visible in every open window. It must only be shown on one window. - */ -@injectable() -export class SurveyNotificationServiceImpl - implements SurveyNotificationService -{ - private surveyDidShow = false; - async isFirstInstance(): Promise<boolean> { - if (this.surveyDidShow) { - return false; - } - this.surveyDidShow = true; - return this.surveyDidShow; - } -} diff --git a/arduino-ide-extension/src/node/theia/core/messaging-contribution.ts b/arduino-ide-extension/src/node/theia/core/websocket-endpoint.ts similarity index 58% rename from arduino-ide-extension/src/node/theia/core/messaging-contribution.ts rename to arduino-ide-extension/src/node/theia/core/websocket-endpoint.ts index 7c03c7697..c70ec23dc 100644 --- a/arduino-ide-extension/src/node/theia/core/messaging-contribution.ts +++ b/arduino-ide-extension/src/node/theia/core/websocket-endpoint.ts @@ -1,7 +1,8 @@ -import { MessagingContribution as TheiaMessagingContribution } from '@theia/core/lib/node/messaging/messaging-contribution'; +import { WebsocketEndpoint as TheiaWebsocketEndpoint } from '@theia/core/lib/node/messaging/websocket-endpoint'; import { injectable } from '@theia/core/shared/inversify'; + @injectable() -export class MessagingContribution extends TheiaMessagingContribution { +export class WebsocketEndpoint extends TheiaWebsocketEndpoint { // https://github.com/eclipse-theia/theia/discussions/11543 protected override checkAliveTimeout = process.argv.includes( '--no-ping-timeout' 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 40bf3662b..30a849308 100644 --- a/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts +++ b/arduino-ide-extension/src/node/theia/env-variables/env-variables-server.ts @@ -5,7 +5,7 @@ import { 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 { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { inject, injectable, diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts deleted file mode 100644 index 176f52cf9..000000000 --- a/arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { join } from 'node:path'; -import { interfaces } from '@theia/core/shared/inversify'; -import { - NsfwFileSystemWatcherServiceProcessOptions, - NSFW_SINGLE_THREADED, - spawnNsfwFileSystemWatcherServiceProcess, -} from '@theia/filesystem/lib/node/filesystem-backend-module'; -import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; -import { NsfwFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service'; -import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher'; -import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-watcher/nsfw-filesystem-service'; - -export function rebindNsfwFileSystemWatcher(rebind: interfaces.Rebind): void { - rebind<NsfwFileSystemWatcherServiceProcessOptions>( - NsfwFileSystemWatcherServiceProcessOptions - ).toConstantValue({ - entryPoint: join(__dirname, 'nsfw-watcher'), - }); - rebind<FileSystemWatcherService>(FileSystemWatcherService) - .toDynamicValue((context) => - NSFW_SINGLE_THREADED - ? createNsfwFileSystemWatcherService(context) - : spawnNsfwFileSystemWatcherServiceProcess(context) - ) - .inSingletonScope(); -} - -function createNsfwFileSystemWatcherService({ - container, -}: interfaces.Context): FileSystemWatcherService { - const options = container.get<NsfwFileSystemWatcherServerOptions>( - NsfwFileSystemWatcherServerOptions - ); - const dispatcher = container.get<FileSystemWatcherServiceDispatcher>( - FileSystemWatcherServiceDispatcher - ); - const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService( - options - ); - server.setClient(dispatcher); - return server; -} diff --git a/arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts new file mode 100644 index 000000000..ed969263a --- /dev/null +++ b/arduino-ide-extension/src/node/theia/filesystem/parcel-bindings.ts @@ -0,0 +1,42 @@ +import { join } from 'node:path'; +import { interfaces } from '@theia/core/shared/inversify'; +import { + FileSystemWatcherServiceProcessOptions, + WATCHER_SINGLE_THREADED, + spawnParcelFileSystemWatcherServiceProcess, +} from '@theia/filesystem/lib/node/filesystem-backend-module'; +import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; +import { ParcelFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/parcel-watcher/parcel-filesystem-service'; +import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher'; +import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-watcher/parcel-filesystem-service'; + +export function rebindParcelFileSystemWatcher(rebind: interfaces.Rebind): void { + rebind<FileSystemWatcherServiceProcessOptions>( + FileSystemWatcherServiceProcessOptions + ).toConstantValue({ + entryPoint: join(__dirname, 'parcel-watcher'), + }); + rebind<FileSystemWatcherService>(FileSystemWatcherService) + .toDynamicValue((context) => + WATCHER_SINGLE_THREADED + ? createParcelFileSystemWatcherService(context) + : spawnParcelFileSystemWatcherServiceProcess(context) + ) + .inSingletonScope(); +} + +function createParcelFileSystemWatcherService({ + container, +}: interfaces.Context): FileSystemWatcherService { + const options = container.get<ParcelFileSystemWatcherServerOptions>( + ParcelFileSystemWatcherServerOptions + ); + const dispatcher = container.get<FileSystemWatcherServiceDispatcher>( + FileSystemWatcherServiceDispatcher + ); + const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService( + options + ); + server.setClient(dispatcher); + return server; +} diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/index.ts similarity index 83% rename from arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts rename to arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/index.ts index 472019ca1..49342eb64 100644 --- a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts +++ b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/index.ts @@ -1,6 +1,6 @@ import * as yargs from '@theia/core/shared/yargs'; import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory'; -import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-filesystem-service'; +import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-filesystem-service'; import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol'; import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; @@ -20,7 +20,7 @@ const options: { }).argv as any; export default <IPCEntryPoint>((connection) => { - const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService( + const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService( options ); const factory = new JsonRpcProxyFactory<FileSystemWatcherServiceClient>( diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/parcel-filesystem-service.ts similarity index 71% rename from arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts rename to arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/parcel-filesystem-service.ts index 6bf40ead2..2282391f9 100644 --- a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-filesystem-service.ts +++ b/arduino-ide-extension/src/node/theia/filesystem/parcel-watcher/parcel-filesystem-service.ts @@ -1,26 +1,26 @@ import { Minimatch } from 'minimatch'; import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; import { - NsfwFileSystemWatcherService, - NsfwWatcher, -} from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service'; + ParcelFileSystemWatcherService, + ParcelWatcher, +} from '@theia/filesystem/lib/node/parcel-watcher/parcel-filesystem-service'; // Dispose the watcher immediately when the last reference is removed. By default, Theia waits 10 sec. // https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708 const NoDelay = 0; -export class NoDelayDisposalTimeoutNsfwFileSystemWatcherService extends NsfwFileSystemWatcherService { +export class NoDelayDisposalTimeoutParcelFileSystemWatcherService extends ParcelFileSystemWatcherService { protected override createWatcher( clientId: number, fsPath: string, options: WatchOptions - ): NsfwWatcher { + ): ParcelWatcher { const watcherOptions = { ignored: options.ignored.map( (pattern) => new Minimatch(pattern, { dot: true }) ), }; - return new NsfwWatcher( + return new ParcelWatcher( clientId, fsPath, watcherOptions, 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 9ad7625b3..a5e60ced2 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 @@ -83,7 +83,9 @@ const cortexDebugMapper: PluginContributionMapper = ( } for (const _debugger of contribution.debuggers ?? []) { if (_debugger.type === 'cortex-debug') { - for (const attributes of _debugger.configurationAttributes ?? []) { + for (const attributes of Object.values( + _debugger.configurationAttributes ?? {} + )) { if (attributes.properties) { // Patch the cortex-debug debug config schema to allow the in-house `configId`. attributes.properties['configId'] = { diff --git a/arduino-ide-extension/src/test/node/clang-formatter.test.ts b/arduino-ide-extension/src/test/node/clang-formatter.test.ts index 10e5dc543..92a38f326 100644 --- a/arduino-ide-extension/src/test/node/clang-formatter.test.ts +++ b/arduino-ide-extension/src/test/node/clang-formatter.test.ts @@ -2,7 +2,7 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { expect } from 'chai'; import { promises as fs } from 'node:fs'; import path from 'node:path'; 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 index 1bc09c929..b24b98b69 100644 --- 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 @@ -1,12 +1,12 @@ 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 { FileUri } from '@theia/core/lib/common/file-uri'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { dump, load } from 'js-yaml'; import { promises as fs } from 'node:fs'; import { join } from 'node:path'; -import { sync as deleteSync } from 'rimraf'; +import { rimrafSync } from 'rimraf'; import { BoardsService, CoreService, @@ -65,7 +65,7 @@ describe('core-client-provider', () => { it("should recover when the 'directories.data' folder is missing", async function () { this.timeout(timeout); const configDirPath = await prepareTestConfigDir(); - deleteSync(join(configDirPath, 'data')); + rimrafSync(join(configDirPath, 'data')); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { @@ -84,7 +84,7 @@ describe('core-client-provider', () => { 'Arduino15', 'package_index.json' ); - deleteSync(primaryPackageIndexPath); + rimrafSync(primaryPackageIndexPath); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { @@ -118,7 +118,7 @@ describe('core-client-provider', () => { 'tools', tool ); - deleteSync(builtinToolsPath); + rimrafSync(builtinToolsPath); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { @@ -140,7 +140,7 @@ describe('core-client-provider', () => { 'Arduino15', 'library_index.json' ); - deleteSync(libraryPackageIndexPath); + rimrafSync(libraryPackageIndexPath); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli(container, ({ coreClientProvider }) => { @@ -176,7 +176,7 @@ describe('core-client-provider', () => { 'Arduino15', 'package_teensy_index.json' ); - deleteSync(thirdPartyPackageIndexPath); + rimrafSync(thirdPartyPackageIndexPath); const container = await startCli(configDirPath, toDispose); await assertFunctionalCli( @@ -193,7 +193,7 @@ describe('core-client-provider', () => { it("should recover when invalid 3rd package URL is defined in the CLI config and the 'directories.data' folder is missing", async function () { this.timeout(timeout); const configDirPath = await prepareTestConfigDir(); - deleteSync(join(configDirPath, 'data')); + rimrafSync(join(configDirPath, 'data')); // set an invalid URL so the CLI will try to download it const cliConfigPath = join(configDirPath, 'arduino-cli.yaml'); 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 52b0d0444..0b6ce3956 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 @@ -1,6 +1,6 @@ import { 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 { FileUri } from '@theia/core/lib/common/file-uri'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { diff --git a/arduino-ide-extension/src/test/node/node-test-bindings.ts b/arduino-ide-extension/src/test/node/node-test-bindings.ts index 690d19442..dfa762c68 100644 --- a/arduino-ide-extension/src/test/node/node-test-bindings.ts +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -5,7 +5,7 @@ import { import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { waitForEvent } from '@theia/core/lib/common/promise-util'; import URI from '@theia/core/lib/common/uri'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { ProcessUtils } from '@theia/core/lib/node/process-utils'; import { Container, 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 802c546cd..c97387743 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,15 +2,15 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import { isWindows } from '@theia/core/lib/common/os'; import { URI } from '@theia/core/lib/common/uri'; -import { FileUri } from '@theia/core/lib/node/file-uri'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { rejects } from 'node:assert/strict'; import { promises as fs } from 'node:fs'; import path, { basename, join } from 'node:path'; -import { sync as rimrafSync } from 'rimraf'; +import { rimrafSync } from 'rimraf'; import temp from 'temp'; import { Sketch, SketchesError, SketchesService } from '../../common/protocol'; import { @@ -574,7 +574,7 @@ function disposeSketch(...sketch: Sketch[]): Disposable { function disposeFolder(...paths: string[]): Disposable { return new DisposableCollection( ...paths.map((path) => - Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 })) + Disposable.create(() => rimrafSync(path, { maxRetries: 5 })) ) ); } 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 1b752e142..e679b9217 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,5 +1,5 @@ import type { Mutable } from '@theia/core/lib/common/types'; -import { FileUri } from '@theia/core/lib/node/file-uri'; +import { FileUri } from '@theia/core/lib/common/file-uri'; import stableJsonStringify from 'fast-json-stable-stringify'; import assert from 'node:assert/strict'; import { basename, join } from 'node:path'; diff --git a/arduino-ide-extension/tsconfig.json b/arduino-ide-extension/tsconfig.json index 35c426010..00bb386a7 100644 --- a/arduino-ide-extension/tsconfig.json +++ b/arduino-ide-extension/tsconfig.json @@ -20,5 +20,4 @@ "skipLibCheck": true }, "include": ["src"], - "files": ["../node_modules/nsfw/index.d.ts"] } diff --git a/electron-app/package.json b/electron-app/package.json index d9a6e3682..bee426096 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -5,30 +5,30 @@ "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/electron": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/keymaps": "1.41.0", - "@theia/messages": "1.41.0", - "@theia/monaco": "1.41.0", - "@theia/navigator": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/plugin-ext-vscode": "1.41.0", - "@theia/preferences": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.57.0", + "@theia/debug": "1.57.0", + "@theia/editor": "1.57.0", + "@theia/electron": "1.57.0", + "@theia/filesystem": "1.57.0", + "@theia/keymaps": "1.57.0", + "@theia/messages": "1.57.0", + "@theia/monaco": "1.57.0", + "@theia/navigator": "1.57.0", + "@theia/plugin-ext": "1.57.0", + "@theia/plugin-ext-vscode": "1.57.0", + "@theia/preferences": "1.57.0", + "@theia/terminal": "1.57.0", + "@theia/workspace": "1.57.0", "arduino-ide-extension": "2.3.5" }, "devDependencies": { - "@theia/cli": "1.41.0", + "@theia/cli": "1.57.0", "7zip-min": "^1.4.4", "chmodr": "^1.2.0", "compression-webpack-plugin": "^9.0.0", "copy-webpack-plugin": "^8.1.1", "dateformat": "^5.0.3", - "electron": "^27.0.3", + "electron": "30.1.2", "electron-builder": "^24.6.4", "electron-notarize": "^1.1.1", "execa": "^7.1.1", @@ -36,7 +36,7 @@ "glob": "^10.3.3", "is-ci": "^2.0.0", "resolve-package-path": "^4.0.3", - "rimraf": "^2.6.1", + "rimraf": "^5.0.0", "semver": "^7.3.2", "temp": "^0.9.1", "yaml": "^1.10.2" @@ -53,7 +53,7 @@ "prepackage": "rimraf dist", "package": "node ./scripts/package.js", "postpackage": "node ./scripts/post-package.js", - "rebuild": "theia rebuild:browser --cacheRoot ../.. && theia rebuild:electron --cacheRoot ../.." + "rebuild": "theia rebuild:browser --cacheRoot .. && theia rebuild:electron --cacheRoot .." }, "theia": { "target": "electron", @@ -66,6 +66,10 @@ }, "defaultIconTheme": "none", "validatePreferencesSchema": false, + "electron": { + "showWindowEarly": true + }, + "reloadOnReconnect": true, "preferences": { "window.title": "${rootName}${activeEditorShort}${appName}", "files.autoSave": "afterDelay", @@ -195,29 +199,29 @@ }, "theiaPluginsDir": "plugins", "theiaPlugins": { - "vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.52.1/file/vscode.cpp-1.52.1.vsix", + "vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.88.1/file/vscode.cpp-1.88.1.vsix", "vscode-arduino-api": "https://github.com/dankeboy36/vscode-arduino-api/releases/download/0.1.2/vscode-arduino-api-0.1.2.vsix", "vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.3.vsix", - "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.1.vsix", - "vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.46.1/file/vscode.json-language-features-1.46.1.vsix", + "vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.88.1/file/vscode.json-1.88.1.vsix", + "vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.88.1/file/vscode.json-language-features-1.88.1.vsix", "cortex-debug": "https://downloads.arduino.cc/marus25.cortex-debug/marus25.cortex-debug-1.5.1.vsix", "vscode-language-pack-bg": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-bg/1.48.3/file/MS-CEINTL.vscode-language-pack-bg-1.48.3.vsix", - "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.80.0/file/MS-CEINTL.vscode-language-pack-cs-1.80.0.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.80.0/file/MS-CEINTL.vscode-language-pack-de-1.80.0.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.80.0/file/MS-CEINTL.vscode-language-pack-es-1.80.0.vsix", - "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.80.0/file/MS-CEINTL.vscode-language-pack-fr-1.80.0.vsix", + "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.96.0/file/MS-CEINTL.vscode-language-pack-cs-1.96.0.vsix", + "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.96.0/file/MS-CEINTL.vscode-language-pack-de-1.96.0.vsix", + "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.96.0/file/MS-CEINTL.vscode-language-pack-es-1.96.0.vsix", + "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.96.0/file/MS-CEINTL.vscode-language-pack-fr-1.96.0.vsix", "vscode-language-pack-hu": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-hu/1.48.3/file/MS-CEINTL.vscode-language-pack-hu-1.48.3.vsix", - "vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.80.0/file/MS-CEINTL.vscode-language-pack-it-1.80.0.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.80.0/file/MS-CEINTL.vscode-language-pack-ja-1.80.0.vsix", - "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.80.0/file/MS-CEINTL.vscode-language-pack-ko-1.80.0.vsix", + "vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.96.0/file/MS-CEINTL.vscode-language-pack-it-1.96.0.vsix", + "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.96.0/file/MS-CEINTL.vscode-language-pack-ja-1.96.0.vsix", + "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.96.0/file/MS-CEINTL.vscode-language-pack-ko-1.96.0.vsix", "vscode-language-pack-nl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-nl/1.48.3/file/MS-CEINTL.vscode-language-pack-nl-1.48.3.vsix", - "vscode-language-pack-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.80.0/file/MS-CEINTL.vscode-language-pack-pl-1.80.0.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.80.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.80.0.vsix", - "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.80.0/file/MS-CEINTL.vscode-language-pack-ru-1.80.0.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.80.0/file/MS-CEINTL.vscode-language-pack-tr-1.80.0.vsix", + "vscode-language-pack-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.96.0/file/MS-CEINTL.vscode-language-pack-pl-1.96.0.vsix", + "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.96.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.96.0.vsix", + "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.96.0/file/MS-CEINTL.vscode-language-pack-ru-1.96.0.vsix", + "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.96.0/file/MS-CEINTL.vscode-language-pack-tr-1.96.0.vsix", "vscode-language-pack-uk": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-uk/1.48.3/file/MS-CEINTL.vscode-language-pack-uk-1.48.3.vsix", - "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.80.0.vsix", - "vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.80.0.vsix" + "vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.96.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.96.0.vsix", + "vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.96.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.96.0.vsix" }, "mocha": { "reporter": "spec", diff --git a/electron-app/scripts/package.js b/electron-app/scripts/package.js index 87a597094..3baa1ea4c 100644 --- a/electron-app/scripts/package.js +++ b/electron-app/scripts/package.js @@ -18,7 +18,7 @@ async function run() { '--publish', 'never', '-c.electronVersion', - electronVersion.slice(1), // removes the leading ^ from the version. TODO: user `semver` to clean it. + semver.clean(electronVersion.replace(/^\^/, '')), '-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) diff --git a/electron-app/webpack.config.js b/electron-app/webpack.config.js index 18a7c8969..d259e150e 100644 --- a/electron-app/webpack.config.js +++ b/electron-app/webpack.config.js @@ -30,9 +30,9 @@ backend.config.plugins.unshift( ); // Override the default entry from Theia as IDE2 has a customization of the module. -backend.config.entry['nsfw-watcher'] = { +backend.config.entry['parcel-watcher'] = { import: require.resolve( - 'arduino-ide-extension/lib/node/theia/filesystem/nsfw-watcher' + 'arduino-ide-extension/lib/node/theia/filesystem/parcel-watcher' ), library: { type: 'commonjs2', diff --git a/i18n/en.json b/i18n/en.json index b769cd868..e6dbab0c0 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -415,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -490,11 +489,6 @@ "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", diff --git a/package.json b/package.json index 6f66bf55a..2215352d6 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,17 @@ "resolutions": { "@theia/cli/@babel/traverse": "^7.23.2", "@theia/cli/@theia/application-package/nano": "^10.1.3", + "**/@theia/application-manager/node-abi": "^3.0.0", "**/@theia/core/msgpackr": "^1.10.1", - "nx/axios": "^1.6.7", - "**/ip": "^2.0.1" + "**/@types/react-dom": "18.3.1", + "**/@types/react": "18.3.1", + "**/inversify": "6.0.2", + "**/ip": "^2.0.1", + "**/perfect-scrollbar": "1.5.5", + "nx/axios": "^1.6.7" }, "devDependencies": { - "@theia/cli": "1.41.0", + "@theia/cli": "1.57.0", "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", "@xhmikosr/downloader": "^13.0.1", @@ -36,10 +41,10 @@ "node-gyp": "^9.3.0", "prettier": "^2.3.1", "reflect-metadata": "^0.1.10", - "rimraf": "^2.6.1", + "rimraf": "^5.0.0", "semver": "^7.3.2", "style-dictionary": "^3.7.0", - "typescript": "^4.9.3", + "typescript": "^5.4.5", "xhr2": "^0.2.1" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index 0c3367a1b..87c12c1f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,40 +2,32 @@ # yarn lockfile v1 -"7zip-bin@5.1.1", "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-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== + "7zip-min@^1.4.4": - version "1.4.4" - resolved "https://registry.yarnpkg.com/7zip-min/-/7zip-min-1.4.4.tgz#82a50a8d3f0a2d86b4c908433c9ec35627f4138c" - integrity sha512-mYB1WW5tcXfZxUN4+2joKk4+6j8jp+mpO2YiMU5z1gNNFbACxI2ADasffsdNPovZSwn/E662ZIH5gRkFPMufmA== + version "1.4.5" + resolved "https://registry.yarnpkg.com/7zip-min/-/7zip-min-1.4.5.tgz#5d6962ae5f3539fbdf8083a0a9ea2ac353b9ef6d" + integrity sha512-S+FzNwJFKF5LgQYs+hPQo+qeffdi+259Ak63rWEfkHP9arsU8gbe5K+4HscuWN1ih1lP1gTjDNPddbU0qhPtHQ== dependencies: "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== - "@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: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.25.9": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -44,106 +36,87 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5", "@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== "@babel/core@^7.10.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" - integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9" + integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.0" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.10" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.10" + "@babel/parser" "^7.26.10" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.10" + "@babel/types" "^7.26.10" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.25.9": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.26.10": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.10.tgz#a60d9de49caca16744e6340c3658dfef6138c3f7" + integrity sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.10" + "@babel/types" "^7.26.10" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.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.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== - 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.15" - "@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" +"@babel/helper-create-class-features-plugin@^7.25.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz#d6f83e3039547fbb39967e78043cd3c8b7820c71" + integrity sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.26.9" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - regexpu-core "^5.3.1" + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -151,305 +124,165 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@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/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== - dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@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== +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: - "@babel/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-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" + "@babel/types" "^7.25.9" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== -"@babel/helper-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== +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== dependencies: - "@babel/types" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@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== +"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" + integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== dependencies: - "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.26.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== +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== dependencies: - "@babel/types" "^7.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/traverse" "^7.25.9" + "@babel/types" "^7.25.9" "@babel/helper-string-parser@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helpers@^7.23.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== +"@babel/helpers@^7.26.10": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.10.tgz#6baea3cd62ec2d0c1068778d63cb1314f6637384" + integrity sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.10" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/parser@^7.26.10", "@babel/parser@^7.26.9": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.10.tgz#e9bdb82f14b97df6569b0b038edd436839c57749" + integrity sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" + "@babel/types" "^7.26.10" -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/parser@^7.25.9", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/types" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": - version "7.22.15" - 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.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" - integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" - integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@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.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" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== +"@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -459,490 +292,478 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@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== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" - integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== +"@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz#5e3991135e3b9c6eaaf5eff56d1ae5a11df45ff8" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.26.8" -"@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== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-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== +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-block-scoping@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" - integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@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.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" - integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@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.9" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-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== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" - integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.22.5": - 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== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== +"@babel/plugin-transform-exponentiation-operator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-for-of@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" - integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-for-of@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz#27231f79d5170ef33b5111f07fe5cafeb2c96a56" + integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@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== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" - integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" - integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== +"@babel/plugin-transform-modules-commonjs@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-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== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-object-rest-spread@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" - integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" - integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-parameters@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" - integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@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== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" -"@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== +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-runtime@^7.10.0": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" - integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-runtime@^7.10.0": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz#6b4504233de8238e7d666c15cde681dc62adff87" + integrity sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.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== +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@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== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz#966b15d153a991172a540a69ad5e1845ced990b5" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.26.5" -"@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== +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" + integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@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== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.10.0": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" - integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== - dependencies: - "@babel/compat-data" "^7.22.20" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.9.tgz#2ec64e903d0efe743699f77a10bdf7955c2123c3" + integrity sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-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.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" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.15" - "@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.15" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.15" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.15" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.15" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.15" - "@babel/plugin-transform-modules-systemjs" "^7.22.11" - "@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.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.15" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.15" - "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@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.10" - "@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/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.26.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.19" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" - core-js-compat "^3.31.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -954,78 +775,39 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@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.23.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.10.tgz#a07b4d8fa27af131a633d7b3524db803eb4764c2" + integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.23.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" +"@babel/template@^7.25.9", "@babel/template@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + +"@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.26.9": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.10.tgz#43cca33d76005dbaa93024fae536cc1946a4c380" + integrity sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.10" + "@babel/parser" "^7.26.10" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.10" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@babel/types@^7.25.9", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.26.9", "@babel/types@^7.4.4": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.10.tgz#396382f6335bd4feb65741eacfc808218f859259" + integrity sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1044,9 +826,9 @@ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@electron/asar@^3.2.1": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.7.tgz#bb8117dc6fd0c06a922ae7fb1c0e2d433e35a6e5" - integrity sha512-8FaSCAIiZGYFWyjeevPQt+0e9xCK9YmJ2Rjg5SXgdsXon6cRnU0Yxnbe6CvJbQn26baifur2Y2G5EBayRIsjyg== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.3.1.tgz#cd14e897770d9844673dd7c1dc8944e086e1e0ea" + integrity sha512-WtpC/+34p0skWZiarRjLAyqaAX78DofhDxnREy/V5XHfu1XEXbFCSSMcDQ6hNCPJFaPy8/NnUgYuf9uiCkvKPg== dependencies: commander "^5.0.0" glob "^7.1.6" @@ -1067,10 +849,10 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3" - integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA== +"@electron/notarize@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.2.1.tgz#d0aa6bc43cba830c41bfd840b85dbe0e273f59fe" + integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== dependencies: debug "^4.1.1" fs-extra "^9.0.1" @@ -1088,10 +870,10 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" - integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== +"@electron/universal@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5" + integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== dependencies: "@electron/asar" "^3.2.1" "@malept/cross-spawn-promise" "^1.1.0" @@ -1101,16 +883,16 @@ minimatch "^3.0.4" plist "^3.0.4" -"@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== +"@emotion/babel-plugin@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.3.3" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" @@ -1118,93 +900,93 @@ source-map "^0.5.7" stylis "4.2.0" -"@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== +"@emotion/cache@^11.14.0", "@emotion/cache@^11.4.0": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" stylis "4.2.0" -"@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/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== -"@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/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== "@emotion/react@^11.8.1": - version "11.11.1" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" - integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.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" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" - integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== +"@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.2" csstype "^3.0.2" -"@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== +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== -"@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== +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== -"@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== +"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== -"@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== +"@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== -"@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== +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== "@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== + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz#b0fc7e06d0c94f801537fd4237edc2706d3b8e4c" + integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" - integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1216,56 +998,61 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.51.0": - version "8.51.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" - integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@floating-ui/core@^1.4.2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" - integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== +"@floating-ui/core@^1.6.0": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== dependencies: - "@floating-ui/utils" "^0.1.3" + "@floating-ui/utils" "^0.2.9" "@floating-ui/dom@^1.0.1": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" - integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== + version "1.6.13" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" + integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== dependencies: - "@floating-ui/core" "^1.4.2" - "@floating-ui/utils" "^0.1.3" + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== -"@floating-ui/utils@^0.1.3": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" - integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== +"@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.8.14": - version "1.9.5" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.5.tgz#22e283754b7b10d1ad26c3fb21849028dcaabc53" - integrity sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw== + version "1.13.0" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.0.tgz#69c229eacb77f3468afa9d375c23dc9b694d1af9" + integrity sha512-pMuxInZjUnUkgMT2QLZclRqwk2ykJbIU05aZgPgJYXEpN9+2I7z7aNwcjWZSycRPl232FfhPszyBFJyOxTHNog== dependencies: - "@grpc/proto-loader" "^0.7.8" - "@types/node" ">=12.12.47" + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" -"@grpc/proto-loader@^0.7.8": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" - integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== dependencies: lodash.camelcase "^4.3.0" long "^5.0.0" - protobufjs "^7.2.4" + protobufjs "^7.2.5" yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1273,10 +1060,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@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== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1302,33 +1089,19 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@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: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@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== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" @@ -1336,25 +1109,17 @@ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@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== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - 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.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" @@ -1364,10 +1129,15 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + "@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== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@lerna/child-process@7.4.2": version "7.4.2" @@ -1539,10 +1309,18 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@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== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== dependencies: semver "^7.3.5" @@ -1561,13 +1339,21 @@ which "^3.0.0" "@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== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== dependencies: npm-bundled "^3.0.0" npm-normalize-package-bin "^3.0.0" +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@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" @@ -1881,6 +1667,71 @@ dependencies: "@octokit/openapi-types" "^18.0.0" +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== + +"@parcel/watcher-darwin-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== + +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== + +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + "@parcel/watcher@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" @@ -1889,6 +1740,30 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@parcel/watcher@^2.5.0": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" + "@phosphor/algorithm@1", "@phosphor/algorithm@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@phosphor/algorithm/-/algorithm-1.2.0.tgz#4a19aa59261b7270be696672dc3f0663f7bef152" @@ -2064,6 +1939,20 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@puppeteer/browsers@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.1.tgz#238200dbdce5c00ae28c8f2a55ac053c3be71668" + integrity sha512-uK7o3hHkK+naEobMSJ+2ySYyXtQkBxIH8Gn4MK9ciePjNV+Pf+PgY/W7iPzn2MTjl3stcYB5AlcTmPYw7AXDwA== + dependencies: + debug "^4.3.6" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.4.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + "@sigstore/bundle@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" @@ -2121,9 +2010,9 @@ integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== "@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== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== "@stroncium/procfs@^1.2.1": version "1.2.1" @@ -2144,18 +2033,18 @@ dependencies: defer-to-connect "^2.0.1" -"@theia/application-manager@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.41.0.tgz#5a6cb2a4d163956c9e94d28411f56d0c8591aebb" - integrity sha512-Fy66EbWp+c8SilIBe8KwYCqi52hC7DXRhLyZ7Kpo5utPZif5FwRDs81UBlpyVLWCWKJABcQjT/Vbp36uCcUT2g== +"@theia/application-manager@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.57.0.tgz#8830301d392081eb5731b845585783aa0f2b223a" + integrity sha512-L5X0+pM8Py2F0+pf4KhqFYh0awsUnJAXjs/dTJvD6eXJsAnKxpwgMTVlI144XigDEDZo+y7Zhiry84uXcrxCXQ== dependencies: "@babel/core" "^7.10.0" "@babel/plugin-transform-classes" "^7.10.0" "@babel/plugin-transform-runtime" "^7.10.0" "@babel/preset-env" "^7.10.0" - "@theia/application-package" "1.41.0" - "@theia/ffmpeg" "1.41.0" - "@theia/native-webpack-plugin" "1.41.0" + "@theia/application-package" "1.57.0" + "@theia/ffmpeg" "1.57.0" + "@theia/native-webpack-plugin" "1.57.0" "@types/fs-extra" "^4.0.2" "@types/semver" "^7.5.0" babel-loader "^8.2.2" @@ -2165,6 +2054,7 @@ css-loader "^6.2.0" electron-rebuild "^3.2.7" fs-extra "^4.0.2" + http-server "^14.1.1" ignore-loader "^0.1.2" less "^3.0.3" mini-css-extract-plugin "^2.6.1" @@ -2176,96 +2066,104 @@ source-map "^0.6.1" source-map-loader "^2.0.1" source-map-support "^0.5.19" - string-replace-loader "^3.1.0" style-loader "^2.0.0" + tslib "^2.6.2" umd-compat-loader "^2.1.2" webpack "^5.76.0" webpack-cli "4.7.0" worker-loader "^3.0.8" yargs "^15.3.1" -"@theia/application-package@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.41.0.tgz#40e144f7e07c2abab37baabd695a3861c35494bc" - integrity sha512-Aay/87X+ogj/jSec7SPjRrx1ODDSzYK7F2KdgDtqb/IJ3f8KsL/Vh37XeTKzOPlW+rlhRAOzG4rpeuf1duO7MA== +"@theia/application-package@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.57.0.tgz#4464aef8fba52bcdb584b7fb93805ee120494406" + integrity sha512-5bq1K6Bw2CSsNBR8B+Ry4MJo1M8/Wq6W3qPtgoASg/aRPPMbAyDyBt9Mk7BG0zpnXa1sSU+bUx+AUkKPONeRqQ== dependencies: - "@theia/request" "1.41.0" + "@theia/request" "1.57.0" "@types/fs-extra" "^4.0.2" "@types/semver" "^7.5.0" "@types/write-json-file" "^2.2.1" deepmerge "^4.2.2" fs-extra "^4.0.2" is-electron "^2.1.0" - nano "^9.0.5" + nano "^10.1.3" resolve-package-path "^4.0.3" semver "^7.5.4" + tslib "^2.6.2" write-json-file "^2.2.0" -"@theia/bulk-edit@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.41.0.tgz#804330845df4477d07f57acd423bddb610a2c1e7" - integrity sha512-JnhYCRyLeLqIXJzlU/L78cBXQ60fw0hDOaYMS0r/ZTqgmgBmTGVKx+HDypTQ1/XP5h96e/J7FxjIXYcHBRisSA== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/workspace" "1.41.0" - -"@theia/callhierarchy@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.41.0.tgz#c925763f71dd2e2773a24a4fec8afbd439ae617a" - integrity sha512-kZmGp10ibHWzmz/dXWiJXl84QYFrh2I6NtgFvFxEmMiGsC1NN1CQfQg+6J0i4OG169FKiE8stn3m60KmXn5fNA== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" +"@theia/bulk-edit@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.57.0.tgz#aae0965acea735351353f234e3d36f77d5fbca1e" + integrity sha512-aArK91eyowUuVQvtiEXArq5ot6rVGW0PRGNKBOxCmxFwjep2vfDboGzLzSHKuVtx4oXjBwGSMBWQBvovALatfw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/workspace" "1.57.0" + tslib "^2.6.2" + +"@theia/callhierarchy@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.57.0.tgz#d8046b181837d2a43d9d3a83cbdd694811ad10c6" + integrity sha512-73WraULaDH7te+zHXBGpCOOpzm3j9V6nDpHJXrg1ab8+m/EGiIfdlerWkzo6LyKWcebyGxrviL49jDeqjOYoAw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" ts-md5 "^1.2.2" - -"@theia/cli@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.41.0.tgz#4243d1cd45f0996dd8699e1e2a3413709866b7a6" - integrity sha512-GgOfB/a1C3kslIN6IVpkD3sSYj8hH30htf2n3En0DiTj6FHECb0Uf2jtccyb9W4XPZyK/P2gd/A4LhzbKXIZiw== - dependencies: - "@theia/application-manager" "1.41.0" - "@theia/application-package" "1.41.0" - "@theia/ffmpeg" "1.41.0" - "@theia/localization-manager" "1.41.0" - "@theia/ovsx-client" "1.41.0" - "@theia/request" "1.41.0" + tslib "^2.6.2" + +"@theia/cli@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.57.0.tgz#8fb894ca7a547a8d90b862359e671b049f6d21b2" + integrity sha512-wz0rcMGkpAbjSJySJC6HbtJHAURaTBsY2FPL4FkVmEA6DhC/+mTxqzejFMWCfZbyUCPr520vYTryfVrs9iQGsQ== + dependencies: + "@theia/application-manager" "1.57.0" + "@theia/application-package" "1.57.0" + "@theia/ffmpeg" "1.57.0" + "@theia/localization-manager" "1.57.0" + "@theia/ovsx-client" "1.57.0" + "@theia/request" "1.57.0" "@types/chai" "^4.2.7" "@types/mocha" "^10.0.0" "@types/node-fetch" "^2.5.7" - chai "^4.2.0" + chai "^4.3.10" chalk "4.0.0" decompress "^4.2.1" escape-string-regexp "4.0.0" glob "^8.0.3" + http-server "^14.1.1" limiter "^2.1.0" log-update "^4.0.0" mocha "^10.1.0" - puppeteer "19.7.2" - puppeteer-core "19.7.2" + patch-package "^8.0.0" + puppeteer "23.1.0" + puppeteer-core "23.1.0" puppeteer-to-istanbul "1.4.0" temp "^0.9.1" + tslib "^2.6.2" yargs "^15.3.1" -"@theia/console@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.41.0.tgz#f7f6bcb5f5411bd3ec70ca236bbfaaddb4f524db" - integrity sha512-9H27dDFndjpIpcJA0ujQKe4xLDFCFYw47E+72B3Ci8aQ5HqrTQwzsPK7JvPBvUFN/lrWQrQrwY0ZDZElOhNuig== +"@theia/console@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.57.0.tgz#b1e90f0c6c2a89ef34b677562b4d8c8e06197305" + integrity sha512-SL81TiLdP5dm51ejjDk/rU3Dd/28VcnrWCzJCv1f7IBi/BphzQGqFsqJhcCkbWwmnwxsxzMvLceIc82ANnMx2w== dependencies: - "@theia/core" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" + "@theia/core" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" anser "^2.0.1" + tslib "^2.6.2" -"@theia/core@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.41.0.tgz#04d3ad18b2b9c662eaf63c06c9852ea0ad78d1d9" - integrity sha512-XpoBPul1DGFT/CVFmc9b56IfNj5Paa+NKgI3aMRdmjtlYLtFpbjKOZbidWpPVQGLXIvXrpGiSITIQIM21Ojtmw== +"@theia/core@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.57.0.tgz#d473d8b9246403c5bcaf402d885bb4e2627d54b4" + integrity sha512-TT06PG3i+j7ViSTEaiAys9GrThhzH+9hkFCgyLJMr49Qc6XnUPtWcy2ncoi7nKyX1dxg+d4lAvj5oqpWRXlmUQ== dependencies: "@babel/runtime" "^7.10.0" + "@parcel/watcher" "^2.5.0" "@phosphor/algorithm" "1" "@phosphor/commands" "1" "@phosphor/coreutils" "1" @@ -2276,12 +2174,12 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" - "@theia/application-package" "1.41.0" - "@theia/request" "1.41.0" + "@theia/application-package" "1.57.0" + "@theia/request" "1.57.0" "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" - "@types/express" "^4.16.0" + "@types/express" "^4.17.21" "@types/fs-extra" "^4.0.2" "@types/lodash.debounce" "4.0.3" "@types/lodash.throttle" "^4.1.3" @@ -2290,7 +2188,8 @@ "@types/react-dom" "^18.0.6" "@types/route-parser" "^0.1.1" "@types/safer-buffer" "^2.1.0" - "@types/ws" "^5.1.2" + "@types/uuid" "^9.0.8" + "@types/ws" "^8.5.5" "@types/yargs" "^15" "@vscode/codicons" "*" ajv "^6.5.3" @@ -2300,7 +2199,7 @@ dompurify "^2.2.9" drivelist "^9.0.2" es6-promise "^4.2.4" - express "^4.16.3" + express "^4.21.0" fast-json-stable-stringify "^2.1.0" file-icons-js "~1.0.3" font-awesome "^4.7.0" @@ -2309,16 +2208,15 @@ http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" iconv-lite "^0.6.0" - inversify "^6.0.1" + inversify "^6.1.3" jschardet "^2.1.1" keytar "7.2.0" lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" markdown-it "^12.3.2" - msgpackr "1.6.1" - nsfw "^2.2.4" + msgpackr "^1.10.2" p-debounce "^2.1.0" - perfect-scrollbar "^1.3.0" + perfect-scrollbar "^1.5.5" react "^18.2.0" react-dom "^18.2.0" react-tooltip "^4.2.21" @@ -2328,120 +2226,126 @@ safer-buffer "^2.1.2" socket.io "^4.5.3" socket.io-client "^4.5.3" - uuid "^8.3.2" + tslib "^2.6.2" + uuid "^9.0.1" vscode-languageserver-protocol "^3.17.2" vscode-uri "^2.1.1" - ws "^7.1.2" + ws "^8.17.1" yargs "^15.3.1" -"@theia/debug@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.41.0.tgz#c4b90d253143bb22662e885087586c17a95a0fa5" - integrity sha512-TkTI9Ls/MyMdCsi3ZqvmqCT2CmWr2v8MSMsCilPThuelPh4l2RcDM0LyXEI1EqTh4Ha3VVW5D1jUpPU2OvDnCA== - dependencies: - "@theia/console" "1.41.0" - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/markers" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/output" "1.41.0" - "@theia/process" "1.41.0" - "@theia/task" "1.41.0" - "@theia/terminal" "1.41.0" - "@theia/variable-resolver" "1.41.0" - "@theia/workspace" "1.41.0" +"@theia/debug@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.57.0.tgz#9f2b0752f626dea19a6549ea9bcf259e9d1199c2" + integrity sha512-qmiq7KT8uB7IGhd3yqg07NtgF/aA8r6me1uHHiEYQsNv392F3kgx03aTjIAWmMuqjnk/esEM09vl6NGIoj3XAg== + dependencies: + "@theia/console" "1.57.0" + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/output" "1.57.0" + "@theia/process" "1.57.0" + "@theia/task" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/test" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" "@vscode/debugprotocol" "^1.51.0" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" + tslib "^2.6.2" -"@theia/editor-preview@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.41.0.tgz#1a77a315aa202abfcca027352a4a5533ae7f678c" - integrity sha512-eLIEwgB6Sjbl5d93cNhqRccNIpXaZ7GS6yP2JTrF+YcHyEx1cmVikPcgG0QY0KAPFAGpe294mI6sZNwOBot58g== +"@theia/editor-preview@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.57.0.tgz#1ce7faea7e150a35d8785a21bd865bed4f9f0059" + integrity sha512-Tj0QARXKkf8EaQpgUgBW/JSfOsazAbl5DeKr+XPlZ8qb41iN+DXwD5bSO7XfhG45KrvVkM7wLEntBVMGMGPXSg== dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/navigator" "1.41.0" + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/navigator" "1.57.0" + tslib "^2.6.2" -"@theia/editor@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.41.0.tgz#666fd31389c03187cc34a19c25c7bc2ed672e9c5" - integrity sha512-VdCg6fjZ9v0ZNHYuo2ZabN/lSyZsL3Cx5aQ+0wITD7Zmtjtl98rHiiqcx+yMSMdSKvhZkYtb50Ze1226FMgiKA== +"@theia/editor@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.57.0.tgz#3fc4e8cfab89be566046b446f225fa1933c46c95" + integrity sha512-8Q3j5RJEnyHjOvnoL8k8HzfuRyU1n0JaGksT0Nl8fdt4XKHcjfda0AApDTEKVurXf20gfAtfjnIfR/f2Xv/ckw== dependencies: - "@theia/core" "1.41.0" - "@theia/variable-resolver" "1.41.0" + "@theia/core" "1.57.0" + "@theia/variable-resolver" "1.57.0" + tslib "^2.6.2" -"@theia/electron@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.41.0.tgz#f9f49b24da5a5eaa1a0ff54861a74e6752fc8111" - integrity sha512-4GcMAt2c75wO+an3VdJUb3cndXuD6/zS8plKCn0KGQTQPgBBabu6SHcG/KfuGYJag2QiSDVHa02tE9904i2qug== +"@theia/electron@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.57.0.tgz#13388ca1716de97915fd89cf18bc9d8c5b0225e8" + integrity sha512-QNzpmQapDCXJKwmATXe2F1T5DNDvLQyzAqrBLDNXegRxeuOZ+wAaPiKi7eq0zBh2481fzXu0hCNSvsx5gM1vjQ== dependencies: electron-store "^8.0.0" fix-path "^3.0.0" native-keymap "^2.2.1" -"@theia/ffmpeg@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.41.0.tgz#f1724478bb7ab076b19b09f55ca03c206f6f73da" - integrity sha512-Hpgix6cSbgyQ3kgSlcJuhxlianlysC9Ze1LNu/CkZgrAVxvz0nJHMjB1sx7zVeqfeDFdkZHInfkYltBZ6K+WnQ== +"@theia/ffmpeg@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.57.0.tgz#109f16bc542831bf9e2eb7b8dea056b51c63dce4" + integrity sha512-/NEUrNH6vJFpkUwI9bokfRLg81715nvhdvgJjYOgh2UBVHZ1XCeubjcrVWql/Zz5Ta8x7pbPqkY89WPyLWJmlg== dependencies: "@electron/get" "^2.0.0" + tslib "^2.6.2" unzipper "^0.9.11" -"@theia/file-search@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.41.0.tgz#edfdd13c223bcee5577c79e175715d6319544a50" - integrity sha512-5/YZibMMC7To1bA7lCJBmQ9pqzVaS2aBmr1Jl4ry/jKjGWu7zol3qnt4l2BwyMRNSRIFoEO4aT2M/1NbyAEKoA== +"@theia/file-search@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.57.0.tgz#3e94a65d371308ab40e86bb85f6af01182730317" + integrity sha512-oB35LTRgQVlEEgKaS4oTS6f576kFP3d2FqelfkSsQNFVnaQFwp6R2Jabj3uNyYgBfCN/FcZaxMj/EGet9jN+jA== dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/process" "1.41.0" - "@theia/workspace" "1.41.0" + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/process" "1.57.0" + "@theia/workspace" "1.57.0" "@vscode/ripgrep" "^1.14.2" + tslib "^2.6.2" -"@theia/filesystem@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.41.0.tgz#71daa0dd7569092566a0e7f6f9a00b7364aee634" - integrity sha512-hJ6mmhdYMp0JG1V5PS5+qiT2rCyt5ZMopeBbn1kOEectbhasgEtgj5u0RKp3nguW+ZZDs4yERJ22Y2HTvV+YeQ== +"@theia/filesystem@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.57.0.tgz#1c212c951b5d495a9848bfe6bf4e26ca72713154" + integrity sha512-88bMYtksDZOiTgzyaOuKbmQmAk6SOjIrnGIsGe5oJXxXcSr8vbMIGwTimFL5KKXo02D0rfXTQ6HxxX6xD32PWA== dependencies: - "@theia/core" "1.41.0" + "@theia/core" "1.57.0" "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" - "@types/rimraf" "^2.0.2" "@types/tar-fs" "^1.16.1" - "@types/uuid" "^7.0.3" async-mutex "^0.3.1" body-parser "^1.18.3" http-status-codes "^1.3.0" minimatch "^5.1.0" multer "1.4.4-lts.1" - rimraf "^2.6.2" + rimraf "^5.0.0" stat-mode "^1.0.0" tar-fs "^1.16.2" trash "^7.2.0" - uuid "^8.0.0" + tslib "^2.6.2" vscode-languageserver-textdocument "^1.0.1" -"@theia/keymaps@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.41.0.tgz#41baeaadba0e8c6538d6b1edff190a7f6b25c714" - integrity sha512-1KdUMYJaH5spbDMoMKhR8nikzna836ucUUDP6qCrPeuY3EsdS51ap9JFF+ZK+SrrKCAlW8+iKhAlU9NtSwxJow== +"@theia/keymaps@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.57.0.tgz#f267101be3af848facc4d872f9bbe282c1537ee6" + integrity sha512-DcSdfRT2/X0eJoT8pumbyXTREnFGKbhcLOCXzO66QcjGevk+QEcYlNbQhGIL8rNOXNMV0o096MZSK4LaNJsbtQ== dependencies: - "@theia/core" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/preferences" "1.41.0" - "@theia/userstorage" "1.41.0" + "@theia/core" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/preferences" "1.57.0" + "@theia/userstorage" "1.57.0" jsonc-parser "^2.2.0" + tslib "^2.6.2" -"@theia/localization-manager@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.41.0.tgz#91b7562aaeb5ce7e42e46f36a74d2d90b67bf107" - integrity sha512-y/q2Kelroea6iAjrqeMe5pWEhgKt/WGviZ3NRLzZRz5SMF2EiknZc9JOC1uzXR/RRChqDJq7HdXfP1xh4GdqiA== +"@theia/localization-manager@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.57.0.tgz#40d274e7dbea4fac422193d721406c58f0ef6b43" + integrity sha512-f5HH1s83thnYl3+/83hMk4p+cfgmqAeBncU9atljdWMnp0vLe9gJRjpFGdwoL5SbtU/qEq9UpcRlNZoT6ZCV/Q== dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2450,155 +2354,174 @@ deepmerge "^4.2.2" fs-extra "^4.0.2" glob "^7.2.0" - typescript "~4.5.5" + tslib "^2.6.2" + typescript "~5.4.5" -"@theia/markers@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.41.0.tgz#fe4e450c0ed67eaed24aed029b3a4168a929785b" - integrity sha512-PC3sMzsh1Sn78PzZPsKK/CxgEPkPkVnHsl54gKgv71gkZxg02ujfSGQlyJ5CKg0ZC4MiEnyjsdX/p+B2EriTUA== +"@theia/markers@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.57.0.tgz#71969b2fee96b9044e682b74ad5081863e4b0f17" + integrity sha512-XYoIWMx6dy5PlKIyJrX+jOduznKRSxPKvxghU5LbDIBSYUsZUab3zN3/SCuO28cVUikktqMtwBkKIbL++5BBMw== dependencies: - "@theia/core" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/workspace" "1.41.0" + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/workspace" "1.57.0" + tslib "^2.6.2" -"@theia/messages@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.41.0.tgz#72a4895c9930babf0082823f1d586a8cb4b7433d" - integrity sha512-JmQ9IKgIv1/qOaeQWQOdhlMz2Xip7A6HRUr19JDXcZpvbnKZYSf4l4hDFei8qJgRlWFfs90pcgBuSnnOOUkNUw== +"@theia/messages@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.57.0.tgz#24d412eff171e91eded5c2baab0907ce80a33d1f" + integrity sha512-Lg3wAyrhX4zmgDsM/1IA2lNsFO8a05mFiMlneAvBa/XN5HO4stpJTOH56rkvUkrVr9bGPpHupSAkqCySz3pQnw== dependencies: - "@theia/core" "1.41.0" + "@theia/core" "1.57.0" react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" - -"@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.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.41.0.tgz#9fc6643c12f001b0814afadc72037428ad72d2e0" - integrity sha512-Atop1W7aOiWEjrFBFhV+OUE5NC+WrKSGv7o5fa3hdG/JaJk3oJ75NpqQjN4CTBDtcNEcc02EncRXZKmXx5ZSlQ== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/markers" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/outline-view" "1.41.0" + tslib "^2.6.2" + +"@theia/monaco-editor-core@1.83.101": + version "1.83.101" + resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.83.101.tgz#a0577396fb4c69540536df2d7fed2de4399c4fde" + integrity sha512-UaAi6CEvain/qbGD3o6Ufe8plLyzAVQ53p9Ke+MoBYDhb391+r+MuK++JtITqIrXqoa8OCjbt8wQxEFSNNO0Mw== + +"@theia/monaco@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.57.0.tgz#229d514e8b3edc4a228ac52e83e1e1a2a140f7c2" + integrity sha512-nzv58i058BnWeIVr256KNs1Q/iLaDmljZrw4OHERBhsIrNJhJqYQnTpRv8rEoP9NxM7OTDpfbzSnnjV3vOV/Gg== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/outline-view" "1.57.0" + "@theia/workspace" "1.57.0" fast-plist "^0.1.2" idb "^4.0.5" jsonc-parser "^2.2.0" + tslib "^2.6.2" vscode-oniguruma "1.6.1" - vscode-textmate "^7.0.3" + vscode-textmate "^9.0.0" -"@theia/native-webpack-plugin@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/native-webpack-plugin/-/native-webpack-plugin-1.41.0.tgz#8c23d15281809e431159112aae429ab0c5d49dfb" - integrity sha512-vxf0P41iBmg+3Iex48HBy4eUWVWlcmeJ7EE0xEw/acEvxqAj24hNepldZ28dEAjqyful1tRUO6QuTyqkx0u5vQ== +"@theia/native-webpack-plugin@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/native-webpack-plugin/-/native-webpack-plugin-1.57.0.tgz#8276888bcb4be1b6e8f83609455a9cdbb5ea5960" + integrity sha512-sX29faaRIhPkp4e2OD7JGkOrYNGUMzYmEhldvACo6PWCFn0J4tkhGLAEB9oMnedAmpGAeBYTMMN7u4UfyWwa1Q== dependencies: - temp "^0.9.1" + detect-libc "^2.0.2" + tslib "^2.6.2" webpack "^5.76.0" -"@theia/navigator@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.41.0.tgz#d85e31492e7e7a473416984c2bac3126b3d77f0e" - integrity sha512-EcSJIjHrpSoOOsR+SsEtokYBTCK3LYWfYxUERoHSLeblnvB//b7g5Em18HH4utWmPDv+5NEm+HUK9LVG27Etiw== +"@theia/navigator@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.57.0.tgz#73c50b1bf9c1b74f448d2d315149c432219f2af8" + integrity sha512-7/87eyeeLOXwIC5UeBk7bXdg/t484rToZZi+Jk8AbubCWnGoicECo0r3fkjDYFDWWX/xiEewZrMUoyxoy/jK2Q== dependencies: - "@theia/core" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/workspace" "1.41.0" + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/workspace" "1.57.0" minimatch "^5.1.0" - -"@theia/notebook@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/notebook/-/notebook-1.41.0.tgz#5f651c30b035a3ba23cdfc445055278c5b99eef0" - integrity sha512-Hs5Mnt9BCJSx+VwiGIcTOd5cZxoRSZXVcNSVL0ZeBsxVLW8SvDSDFg5W5ZWt56vo3P20vdZ5Isv6DqQrUgpwbQ== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/monaco" "1.41.0" - uuid "^8.3.2" - -"@theia/outline-view@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.41.0.tgz#6fe502894fcf8092509733b5c28eb0bc7a2e7690" - integrity sha512-BPaZzLleCf6N8T4YSV5HfSGvc3d6FQLQm+7zM305JFfMdWjdvpbS1d/8Yz1pyDsG7G4EZy/pFt7Vxq7SRHztfQ== - dependencies: - "@theia/core" "1.41.0" - -"@theia/output@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.41.0.tgz#1824adc155a981454172333ff9687880a945e74d" - integrity sha512-BeFUeVzibOQUNGoId0F2nZraTvLNEMgXTCJQycv2xCPHpbSUJSx8fgIo4rBQCwTYcLNT7SFsjUIm8WKD4sC7JA== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" + tslib "^2.6.2" + +"@theia/notebook@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/notebook/-/notebook-1.57.0.tgz#1b4ad78005d520bf5d9a9a75f30cf85010b0a79f" + integrity sha512-1sJSSKaM0FEXQJgaO4DOwwoj/NFKyEhseu5SpxHcJ8v/1e7PTB3GN+nEv4Ax+ZDVoj5H4xZZ8qf/GxmSHhuseQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/outline-view" "1.57.0" + advanced-mark.js "^2.6.0" + react-perfect-scrollbar "^1.5.8" + tslib "^2.6.2" + +"@theia/outline-view@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.57.0.tgz#5b91222df1faaa05b0b8fcbb1458c4aaf8bd860e" + integrity sha512-VUZdOAIrzMHhEsqVdwIQN8QCWY3O6kBeDDtcRQRn7TnoKt77aJuNHmGoQXPPi0uweNRyNXXSU45+YnTEDM6O4w== + dependencies: + "@theia/core" "1.57.0" + tslib "^2.6.2" + +"@theia/output@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.57.0.tgz#80a987a5b32564c752f70fd48097152709b6c7f7" + integrity sha512-Xp6gOhE4KYnszraOWw03gDGRZuUlS7V3GX6VDqwb20NdGi1Ezgr6H1lQMQ8F/nJFEuRzmw2BR6HWgMWGXEB1aA== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" "@types/p-queue" "^2.3.1" p-queue "^2.4.2" + tslib "^2.6.2" -"@theia/ovsx-client@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.41.0.tgz#a7ecf8d6a55ba202dba1ec4913a7aeada9ff7a75" - integrity sha512-8mV0WO+p4ALW95y3WZmWs5dQwUEmj958qF8hu5PjeQ6t6+mDbkMIeoKr6uofYAxcJP2Jb4LKXwhiNZvK5n+0xQ== +"@theia/ovsx-client@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.57.0.tgz#60a8f2824bfde860b09476372d5c74f8de34cf18" + integrity sha512-SQ0V2VG7xzOrOWtyqSLsAIhXwDenHw7/3VAb1mMKCx/eaVNf1ZTL9HYMEYkBgtF9iMa2BAOAY/m47Vv8ken+BA== dependencies: - "@theia/request" "1.41.0" + "@theia/request" "1.57.0" + limiter "^2.1.0" semver "^7.5.4" - -"@theia/plugin-ext-vscode@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.41.0.tgz#7e6f3feb09417f57e68b291ecb86c7b66cefea0d" - integrity sha512-ekt6QxJIWmMO+cj/yIg4KhxTyeVbhib2qd2JNIw8Tj8INcRdVPbPOwKXS3a2CMcVD7fjOgydqsdFO/HssaI1bg== - dependencies: - "@theia/callhierarchy" "1.41.0" - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/navigator" "1.41.0" - "@theia/plugin" "1.41.0" - "@theia/plugin-ext" "1.41.0" - "@theia/terminal" "1.41.0" - "@theia/typehierarchy" "1.41.0" - "@theia/userstorage" "1.41.0" - "@theia/workspace" "1.41.0" + tslib "^2.6.2" + +"@theia/plugin-ext-vscode@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.57.0.tgz#0a305596f2907bb6abb77d1282c6642599a00d5b" + integrity sha512-hFqQ4VjJBzRTs/uPwHoCtyL7IC2vGXEvIRIwMNTnDuPj12xp/cbVBephT0otnLNsjEtVwzsgbhqeKyzIr/ZuBQ== + dependencies: + "@theia/callhierarchy" "1.57.0" + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/navigator" "1.57.0" + "@theia/outline-view" "1.57.0" + "@theia/plugin" "1.57.0" + "@theia/plugin-ext" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/typehierarchy" "1.57.0" + "@theia/userstorage" "1.57.0" + "@theia/workspace" "1.57.0" + decompress "^4.2.1" filenamify "^4.1.0" - -"@theia/plugin-ext@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.41.0.tgz#971dd5196aafddb97fa80a5572326ed77e9b66f3" - integrity sha512-EZ0vbOLlyoJMEUGKPCverJ2a3Tey0NtNUIQRvX0jqzhNbdPtA1Aevw2eUMko5UW6OA1S0LkJ7wEDku+wCIwgzw== - dependencies: - "@theia/bulk-edit" "1.41.0" - "@theia/callhierarchy" "1.41.0" - "@theia/console" "1.41.0" - "@theia/core" "1.41.0" - "@theia/debug" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/editor-preview" "1.41.0" - "@theia/file-search" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/markers" "1.41.0" - "@theia/messages" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/navigator" "1.41.0" - "@theia/notebook" "1.41.0" - "@theia/output" "1.41.0" - "@theia/plugin" "1.41.0" - "@theia/preferences" "1.41.0" - "@theia/scm" "1.41.0" - "@theia/search-in-workspace" "1.41.0" - "@theia/task" "1.41.0" - "@theia/terminal" "1.41.0" - "@theia/timeline" "1.41.0" - "@theia/typehierarchy" "1.41.0" - "@theia/variable-resolver" "1.41.0" - "@theia/workspace" "1.41.0" + tslib "^2.6.2" + +"@theia/plugin-ext@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.57.0.tgz#308bebeec7710961dc289a4ebe4c6faa4e404147" + integrity sha512-0seEcyaYOg1AsjrJL1WrL3baYbadlW1unCKlfb/MEHjGXO2Dkkya5Wmm4bZ3JfZa0BFye9uZGmzVtIzH8SXOFg== + dependencies: + "@theia/bulk-edit" "1.57.0" + "@theia/callhierarchy" "1.57.0" + "@theia/console" "1.57.0" + "@theia/core" "1.57.0" + "@theia/debug" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/editor-preview" "1.57.0" + "@theia/file-search" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/messages" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/navigator" "1.57.0" + "@theia/notebook" "1.57.0" + "@theia/output" "1.57.0" + "@theia/plugin" "1.57.0" + "@theia/preferences" "1.57.0" + "@theia/scm" "1.57.0" + "@theia/search-in-workspace" "1.57.0" + "@theia/task" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/test" "1.57.0" + "@theia/timeline" "1.57.0" + "@theia/typehierarchy" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" "@types/mime" "^2.0.1" "@vscode/debugprotocol" "^1.51.0" "@vscode/proxy-agent" "^0.13.2" @@ -2613,155 +2536,181 @@ mime "^2.4.4" ps-tree "^1.2.0" semver "^7.5.4" - uuid "^8.0.0" + tslib "^2.6.2" vhost "^3.0.2" - vscode-textmate "^7.0.3" - -"@theia/plugin@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.41.0.tgz#c7c3ccbe5bc18fa73d4d74f031ec22768e8d65ba" - integrity sha512-buWOnamoySgEAaIAvmn27xEBujejzMHlZ9lCmg09y2nxTW6sNJFEr9yoI/Ik9ktVRZOtVopqQULO90yaVBh3kA== - -"@theia/preferences@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.41.0.tgz#c0adf3984366694730a75cb43e5af0d11af0a906" - integrity sha512-en/WVgq8GQHTCFl+fCyx8HASV7x7sOSmAp9Lt2y8Ml8ksMUJHmZ64Nzdcc9TZ2qAcebpPSZ4RKe9FWrLYHpa0w== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/userstorage" "1.41.0" - "@theia/workspace" "1.41.0" + vscode-textmate "^9.0.0" + +"@theia/plugin@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.57.0.tgz#587a1f2caa358ab0065ef43e6b7abc97512954cc" + integrity sha512-WvKxS2hFDu7CYQ2PhzDRBLlH3nKf/dmqgWyXnzqft6HewnSzlfZz9RYpbMnHGLxc3NMCtmnNYEpDRGO2Q/BeMA== + +"@theia/preferences@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.57.0.tgz#044297884da7b47b2835354ab3fb85157ff179cc" + integrity sha512-+huHT1D6ycjqeFMY4Mo5gOp+lZeTjWz1UGI7P7U/Fqw/SnGtj4QuAsoR5imdp5TgWahCjtCYFMPGB7HqTbeS+Q== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/userstorage" "1.57.0" + "@theia/workspace" "1.57.0" async-mutex "^0.3.1" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" + tslib "^2.6.2" -"@theia/process@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.41.0.tgz#2a2b34e447ea69a43e38fe8ab63e02936278d685" - integrity sha512-UTn+2Bb0jVdH85i3WRMugfbqRs5LGVNPoik1SSaz2/3qQgirT86M0QqSp9H+ys8z3cKuowPt0H/j/173YnPfwQ== +"@theia/process@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.57.0.tgz#5186b407ccbb4b7ab5d0115003e02adb9f8e9f27" + integrity sha512-CD5oFDKoDYGq+Udbz8aL/NIubdCwxb/XcklnOmpYhKOIA1CGrRs2+9/pJOUkIMKO9XbbWv8DqSdFWi/tWU2I8g== dependencies: - "@theia/core" "1.41.0" - node-pty "0.11.0-beta17" + "@theia/core" "1.57.0" + node-pty "0.11.0-beta24" string-argv "^0.1.1" + tslib "^2.6.2" -"@theia/request@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.41.0.tgz#329103397337f49582791e6c4e681aeb24875a6c" - integrity sha512-n+ze+qqZLTzkl1/M27f6+bJpJMbi4uKGJyLfWdRJFx7KFj01JFhiEAh9q4Qf/e5HAadzbYy35FWj4TviCG1lYw== +"@theia/request@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.57.0.tgz#777d6e9c7e0429410d037e3087bce8e1efc6ff32" + integrity sha512-udL2PR5Aa66fEDB/IGJuXXzPoDtZRDYGvQluZHPKfJlUn5pZbdT58m4yA1YJqQjSrJvHxipZVSluCXJdXAxOVg== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" - -"@theia/scm@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.41.0.tgz#2d6f5e787bafe38867ca7b903a25252b94861cf8" - integrity sha512-DPFXhDIu9jjF7dDnfSHOYMs33LHDGPP+QaShuO9fhYLBFhzOLD670/JCSK3rznF9wfi+v6htkuGMIAlkKyFaKA== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@types/diff" "^3.2.2" - diff "^3.4.0" + tslib "^2.6.2" + +"@theia/scm@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.57.0.tgz#5cdb3600f57b41b714afb5c1c04d0b337e1df05e" + integrity sha512-U0oX4SnGxfWPHIlzEVhpytgl52OKhQ0UokIjwnO9+AbjG6TjoFoJK2c2WExrZ0ku9C5DPgGPxifF0W3nj4teqQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@types/diff" "^5.2.1" + diff "^5.2.0" p-debounce "^2.1.0" react-autosize-textarea "^7.0.0" ts-md5 "^1.2.2" - -"@theia/search-in-workspace@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.41.0.tgz#446027b8b68bcc42919dc2428e08002126a1407e" - integrity sha512-5q3DJUewUtsmkawKgcG/Eu6QF+2p6ZarEmwFaiEY/lNdTpJG311o1rapYT/iIfjcxFFwsHZbjPWwhpNBtJbLlA== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/navigator" "1.41.0" - "@theia/process" "1.41.0" - "@theia/workspace" "1.41.0" + tslib "^2.6.2" + +"@theia/search-in-workspace@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.57.0.tgz#4647785278f8c59ba9dd8f1b61fb962ef61615bc" + integrity sha512-hmHF1YshxLs9eKk9JUpKuEQeiv2XY0I0IbfPJ1wqHMf7mGESM9YxHEQnrZ85bBWZ4y8rPNeQnrJ80GIBxy7dYg== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/navigator" "1.57.0" + "@theia/process" "1.57.0" + "@theia/workspace" "1.57.0" "@vscode/ripgrep" "^1.14.2" minimatch "^5.1.0" - -"@theia/task@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.41.0.tgz#3c37dcf932cd8d542fd947f467d4eeebb7578de8" - integrity sha512-1FBb3a66ZNa9tdLXv2qZw31M7sCbcelMXlTC+90AssX7nT4nUdKHkYINnsTMRYWaUR5sb2U86RZi/lJy/g6nSw== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/markers" "1.41.0" - "@theia/monaco" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/process" "1.41.0" - "@theia/terminal" "1.41.0" - "@theia/userstorage" "1.41.0" - "@theia/variable-resolver" "1.41.0" - "@theia/workspace" "1.41.0" + react-autosize-textarea "^7.0.0" + tslib "^2.6.2" + +"@theia/task@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.57.0.tgz#8d8bb1d1453a9b752b12e24e8cf878e982bc6053" + integrity sha512-4ipLeVukxu1SR7EDFsbbkH94ULuvocNj7SScvx3UjJ7btKPCMd+vVmdm+HzbLPhLfYD9T8H75tOi09asNYW7mQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/markers" "1.57.0" + "@theia/monaco" "1.57.0" + "@theia/monaco-editor-core" "1.83.101" + "@theia/process" "1.57.0" + "@theia/terminal" "1.57.0" + "@theia/userstorage" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" async-mutex "^0.3.1" jsonc-parser "^2.2.0" p-debounce "^2.1.0" - -"@theia/terminal@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.41.0.tgz#11762e0da89b7dd599d334f81ff7da1a45139ae2" - integrity sha512-xQ+0yS4ichwGsAUEczlOZwfzQHV3LtnoXwQOgcQjRBtAROmZYpc/ybU9k3O88A1X8F84AT7COcO3PKHVBezjXQ== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/process" "1.41.0" - "@theia/variable-resolver" "1.41.0" - "@theia/workspace" "1.41.0" + tslib "^2.6.2" + +"@theia/terminal@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.57.0.tgz#d3409e51df80a184aff764cf8379f7df976a45ce" + integrity sha512-cTRi9XqAp7LANDy0a1o/0O+/oVFGdiNdGtpAQ43SHsYvBFmpaY3wH+pcvDGSezUS1D24IKEqHRikmJ1ZE46zTw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/file-search" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/process" "1.57.0" + "@theia/variable-resolver" "1.57.0" + "@theia/workspace" "1.57.0" + tslib "^2.6.2" + xterm "^5.3.0" + xterm-addon-fit "^0.8.0" + xterm-addon-search "^0.13.0" + +"@theia/test@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/test/-/test-1.57.0.tgz#0eaf442d67e17907497892411b6e9b7e9333f006" + integrity sha512-x1TUAojhMD5pd3JC+pbGB2lLHpFvANJP04hxCJNPPU2MnFXQo6d9VtYaWZcuzZBLHp2S7eiXGw/kEkc/h98IaQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/navigator" "1.57.0" + "@theia/terminal" "1.57.0" xterm "^4.16.0" xterm-addon-fit "^0.5.0" - xterm-addon-search "^0.8.2" - -"@theia/timeline@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.41.0.tgz#f82a95208f3af08a377dbad253d86b6845209d04" - integrity sha512-LxNJqL93Al8q/6qZOQn0ZI/vAoYYaFNK+rnlioq0TJRSFZznRF14sSrzvWRv30rtDoxlJvVDELlUpl9fm3X2zw== - dependencies: - "@theia/core" "1.41.0" - "@theia/navigator" "1.41.0" - -"@theia/typehierarchy@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.41.0.tgz#554bff105148651493c60872d1e3763ad069ac88" - integrity sha512-GPOXJm27JWoGXzmn0yYtRZaXVykzFvGaF/cmfw9cFPeLBtm81wGwyUw716SzdCZPimuw825uP/IeWp6wubPSvw== - dependencies: - "@theia/core" "1.41.0" - "@theia/editor" "1.41.0" - "@types/uuid" "^7.0.3" - uuid "^8.0.0" - -"@theia/userstorage@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.41.0.tgz#127e564e0163e629391fe974bb6c2bd6cea3e074" - integrity sha512-5afYNaPNdWuqt/eHmnPgfpL2At3mtU2kgP3jrLNPY7tCCyeCxrvz2lz6+Twyb0xsBS8+m6EbiINitjoKvZEF3Q== - dependencies: - "@theia/core" "1.41.0" - "@theia/filesystem" "1.41.0" - -"@theia/variable-resolver@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.41.0.tgz#4c0f9667da930ac4b7a03a12d6d011435d4bde56" - integrity sha512-4CGPGQAN7iVk86q4ZtMsiV9fIi7GvnKpu6qB+yVUQg4Tnc18kYaYPGxQMpoaccmQ9mWQpVTT0JaU8o7ltPFxkA== - dependencies: - "@theia/core" "1.41.0" - -"@theia/workspace@1.41.0": - version "1.41.0" - resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.41.0.tgz#db474c271f7985349260d1d95549adf4422baa16" - integrity sha512-mM3t3oLCdY+xi/XWlYmG8DKECBY9nm9vcng3eNCz6omsdzRD6SkVTXhqm38E+XG8XLzMYryuwlZYmvaJ2qSoSw== - dependencies: - "@theia/core" "1.41.0" - "@theia/filesystem" "1.41.0" - "@theia/monaco-editor-core" "1.72.3" - "@theia/variable-resolver" "1.41.0" + +"@theia/timeline@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.57.0.tgz#629d2bd9a62ca44bc14dc8751ca4879a2f047e25" + integrity sha512-iUij2P5RKRy0scP+HYyxNXlM2Pvsq8dI1RE5s4KjgZGtyn9JNayKOfsd9uPFYisGuV4tTlP1oH7bi3UPcRYFgA== + dependencies: + "@theia/core" "1.57.0" + "@theia/navigator" "1.57.0" + tslib "^2.6.2" + +"@theia/typehierarchy@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.57.0.tgz#6cae26e812471d582360d11d98bf57757046e8a3" + integrity sha512-XJi6GsxGPDKNuJmzqS+woXzQfrOEynhzXV3tr1VbYNBk0wdlqghf52ehonhPfmVrwkqYRnpH11wlGPPNfg/htw== + dependencies: + "@theia/core" "1.57.0" + "@theia/editor" "1.57.0" + tslib "^2.6.2" + +"@theia/userstorage@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.57.0.tgz#4d30e5059163ce97d491b752ad755ff84bb99299" + integrity sha512-msI0U0b6X3RWq12QrOuB33GEw7+PXUo63UfIOypdcZeoYZWRECZrogE69AVTrFYh368kYPSpBb9G2zqvgC9ESQ== + dependencies: + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + tslib "^2.6.2" + +"@theia/variable-resolver@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.57.0.tgz#aa6e833924f4cba5d5080dcc7319ee5dbf3048aa" + integrity sha512-o8CL8NYAdiaf5fYsNjmSwhQouhWOJEshqFiggte4gS2nFGW6LL+zeQ3xRGOK7IhNcSgzACPEpDTGMjQQblJrpg== + dependencies: + "@theia/core" "1.57.0" + tslib "^2.6.2" + +"@theia/workspace@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.57.0.tgz#4b7bfe78a0f1e25e6445175da283f3b7c2d2e573" + integrity sha512-L68Bu07+IJQTpQur+aRq3G0fmJqUQQ3FSQQIlCrUaobPQ7/wtDoWg4yMybTXwZ0f0Nbm9IxmsB59/O6Jnzb/ug== + dependencies: + "@theia/core" "1.57.0" + "@theia/filesystem" "1.57.0" + "@theia/variable-resolver" "1.57.0" jsonc-parser "^2.2.0" + tslib "^2.6.2" valid-filename "^2.0.1" "@tippyjs/react@^4.2.5": @@ -2786,6 +2735,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@tufjs/canonical-json@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" @@ -2800,29 +2754,29 @@ minimatch "^9.0.0" "@types/auth0-js@^9.21.3": - version "9.21.3" - resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.3.tgz#de88abd4df6bbc3b8ad2fe5e299c65304f8ed691" - integrity sha512-5IZHQSljfOREU1fngFcwUXjHUlCq/CM4K1zmVytX0EvH3QnX3cYwK6HCxRuxK7seYMm8yeviWUUkWV1kqK2+sg== + version "9.21.6" + resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.6.tgz#31535a9cca2b3154c4836aab7854c38c2016a26c" + integrity sha512-wsvfk03WzQDXCbMdX8lQZH2Thh5AQk9SKQcxrBN1EdRkIOgkw9aIixxBpzsTHu/gj0I514BGQv7t5EyZSgVRmQ== "@types/bent@^7.0.1": - version "7.3.5" - resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.5.tgz#0676776c1ea70bed464234435b80a6acbc8d9c7d" - integrity sha512-7PTYvy4UERqRPwlz/2KMXyCu08JpvN+SHBOH1Kzp+haZFsX1xrC+RI5qFVERTIDp1XoA+VnfatRmSM7x/0p3vw== + version "7.3.8" + resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.8.tgz#69c3ee49bf6593d831006794e7bd2f84bb573e58" + integrity sha512-yZ09JA1KsA5Fl6Oh/ahK00+H5bV0qCy2bYnyfiFY42wnaMK4n7IDC6HaFe3WW45Zhnak7iqJBKlWD0nVxzrGWg== dependencies: "@types/node" "*" "@types/body-parser@*", "@types/body-parser@^1.16.4", "@types/body-parser@^1.17.0": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/btoa@^1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/btoa/-/btoa-1.2.3.tgz#2c8e7093f902bf8f0e10992a731a4996aa1a5732" - integrity sha512-ANNCZICS/ofxhzUl8V1DniBJs+sFQ+Yg5am1ZwVEf/sxoKY/J2+h5Fuw3xUErlZ7eJLdgzukBjZwnsV6+/2Rmg== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/btoa/-/btoa-1.2.5.tgz#9b2690b224e2bd2a629d0fc5812d19ccd5e781bc" + integrity sha512-BItINdjZRlcGdI2efwK4bwxY5vEAT0SnIVfMOZVT18wp4900F1Lurqk/9PNdF9hMP1zgFmWbjVEtAsQKVcbqxA== dependencies: "@types/node" "*" @@ -2837,14 +2791,14 @@ "@types/responselike" "^1.0.0" "@types/chai@^4.2.7": - version "4.3.7" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.7.tgz#5457bc3dce72f20ae533366682a6298471d1c610" - integrity sha512-/k+vesl92vMvMygmQrFe9Aimxi6oQXFUX9mA5HanTrKUSAMoLauSi6PNFOdRw0oeqilaW600GNx2vSaT2f8aIQ== + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" @@ -2853,15 +2807,10 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cors@^2.8.12": - version "2.8.14" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" - integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== dependencies: "@types/node" "*" @@ -2871,16 +2820,16 @@ integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== "@types/debug@^4.0.0", "@types/debug@^4.1.6": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" - integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" -"@types/diff@^3.2.2": - version "3.5.6" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.5.6.tgz#2524928a13888cebb59dc18e0c793022e7d02dfd" - integrity sha512-5BV7iGX/NmFGqAQn+YDBK++kO7IbZf0mIn8mwdJACIpZsMUqJvEin0riqNDbmS3SQL8u00dGnbC0FFJQptTSWw== +"@types/diff@^5.2.1": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.2.3.tgz#dcdcfa40df9f011f9465180e0196dfbd921971d9" + integrity sha512-K0Oqlrq3kQMaO2RhfrNQX5trmt+XLyom88zS0u84nnIcLvFnRUMRRHmrGny5GSM+kNO9IZLARsdQHDzkhAgmrQ== "@types/dompurify@^2.2.2": version "2.4.0" @@ -2889,46 +2838,61 @@ dependencies: "@types/trusted-types" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.3" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" - integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" - integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== - -"@types/events@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.1.tgz#e94892d60bcf582e3ee95ddedb89f77373925746" - integrity sha512-QfUFdKjGSc+iCf8OFZhqJKfDuqB6lP57kSMkPw8ba3yNDANicUwCdaPt5ytZ4nDXXVFxQkvT8v73I4stSVrCxA== +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/express-serve-static-core@^4.17.33": - version "4.17.37" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" - integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.16.0": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" - integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2943,60 +2907,52 @@ "@types/node" "*" "@types/fs-extra@^4.0.2": - version "4.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.13.tgz#0499ef6ab6dd1c9e05c5247383867a47f5929e0b" - integrity sha512-rMZ7c4t5/EQc2FD7OTbS5XPHCR4hUSVwkiTN0/CXaLDTwxE3IPNMrCKEroLDSYB0K7UTpEH6TAcN30ff+MJw9w== - 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== + version "4.0.15" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.15.tgz#82d70b4a2e5e3dd17474ce9e8fe951a03aeddd31" + integrity sha512-zU/EU2kZ1tv+p4pswQLntA7dFQq84wXrSCfmLjZvMbLjf4N46cPOWHg+WKfc27YnEOQ0chVFlBui55HRsvzHPA== dependencies: - "@types/minimatch" "^5.1.2" "@types/node" "*" "@types/google-protobuf@^3.7.2": - version "3.15.7" - resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.7.tgz#882e7351bc8ccf30bb21c507cc4597cf76f8888b" - integrity sha512-pIEMnb04J60c5eExVLUY/R4eWT5QEQ5cC792JOSfDI3kLjaKC4TjdgMp3xIrN1vxbi2Zk8LcscTm0VaNrIdniA== + version "3.15.12" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.12.tgz#eb2ba0eddd65712211a2b455dc6071d665ccf49b" + integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ== "@types/hast@^2.0.0": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" - integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" "@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" - integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/js-yaml@^3.12.2": - version "3.12.8" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.8.tgz#d47f0ceac930a644266001979d07d7b94808a5c8" - integrity sha512-6McoI148SFmiE2m2Y9lpzwN238grgzEn2J1mHoc8UWwDKvAUsjl100jjqoj5ORVqDwWuEmD+zlOES0+jI7fZCA== + version "3.12.10" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.10.tgz#4d80d0c7dfc570eb4f0be280cb2d67789f977ba5" + integrity sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA== "@types/jsdom@^21.1.1": - version "21.1.3" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.3.tgz#a88c5dc65703e1b10b2a7839c12db49662b43ff0" - integrity sha512-1zzqSP+iHJYV4lB3lZhNBa012pubABkj9yG/GuXuf6LZH1cSPIJBqFDrm5JX65HHt6VOnNYdTui/0ySerRbMgA== + version "21.1.7" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.7.tgz#9edcb09e0b07ce876e7833922d3274149c898cfa" + integrity sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA== dependencies: "@types/node" "*" "@types/tough-cookie" "*" parse5 "^7.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/keyv@^3.1.4": version "3.1.4" @@ -3006,9 +2962,9 @@ "@types/node" "*" "@types/linkify-it@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b" - integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g== + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== "@types/lodash.debounce@4.0.3": version "4.0.3" @@ -3018,23 +2974,23 @@ "@types/lodash" "*" "@types/lodash.debounce@^4.0.6": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz#0285879defb7cdb156ae633cecd62d5680eded9f" - integrity sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA== + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" + integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== dependencies: "@types/lodash" "*" "@types/lodash.throttle@^4.1.3": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/lodash.throttle/-/lodash.throttle-4.1.7.tgz#4ef379eb4f778068022310ef166625f420b6ba58" - integrity sha512-znwGDpjCHQ4FpLLx19w4OXDqq8+OvREa05H89obtSyXyOFKL3dDjCslsmfBz0T2FU8dmf5Wx1QvogbINiGIu9g== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/lodash.throttle/-/lodash.throttle-4.1.9.tgz#f17a6ae084f7c0117bd7df145b379537bc9615c5" + integrity sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g== dependencies: "@types/lodash" "*" "@types/lodash@*": - version "4.14.199" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" - integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== + version "4.17.16" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a" + integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== "@types/markdown-it@^12.2.3": version "12.2.3" @@ -3045,26 +3001,21 @@ "@types/mdurl" "*" "@types/mdast@^3.0.0": - version "3.0.13" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" - integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/mdurl@*": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.3.tgz#d0aefccdd1a96f4bec76047d6b314601f0b0f3de" - integrity sha512-T5k6kTXak79gwmIOaDF2UUQXFbnBE0zBUzF20pz7wDYu0RQMzWg+Ml/Pz50214NsFHBITkoi5VtdjFZnJ2ijjA== - -"@types/mime@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" - integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== "@types/mime@^1": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" - integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/mime@^2.0.1": version "2.0.3" @@ -3076,57 +3027,54 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@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/minimist@^1.2.0": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" - integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/mocha@^10.0.0": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.2.tgz#96d63314255540a36bf24da094cce7a13668d73b" - integrity sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w== + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== "@types/ms@*": - version "0.7.32" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" - integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/multer@^1.4.7": - version "1.4.8" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.8.tgz#8d98c36f6a4e0b228a9f262cd66e881d7cd64039" - integrity sha512-VMZOW6mnmMMhA5m3fsCdXBwFwC+a+27/8gctNMuQC4f7UtWcF79KAFGoIfKZ4iqrElgWIa3j5vhMJDp0iikQ1g== + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== dependencies: "@types/express" "*" "@types/node-fetch@^2.5.7": - version "2.6.6" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" - integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: "@types/node" "*" form-data "^4.0.0" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.8.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.4.tgz#0e9ebb2ff29d5c3302fc84477d066fa7c6b441aa" - integrity sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A== +"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": + version "22.13.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== dependencies: - undici-types "~5.25.1" + undici-types "~6.20.0" -"@types/node@^18.11.18": - version "18.18.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.4.tgz#519fef47a13cf869be290c20fc6ae9b7fe887aa7" - integrity sha512-t3rNFBgJRugIhackit2mVcLfF6IRc0JE4oeizPQL8Zrm8n2WY/0wOdpOPhdtG0V9Q2TlW/axbF1MJ6z+Yj/kKQ== +"@types/node@^20.9.0": + version "20.17.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.24.tgz#2325476954e6fc8c2f11b9c61e26ba6eb7d3f5b6" + integrity sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA== + dependencies: + undici-types "~6.19.2" "@types/normalize-package-data@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/p-queue@^2.3.1": version "2.3.2" @@ -3134,128 +3082,105 @@ integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/plist@^3.0.1": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.3.tgz#8571d797ed09e0ee2700f7e40bbdec7fd80966ef" - integrity sha512-DXkBoKc7jwUR0p439icInmXXMJNhoImdpOrrgA5/nDFK7LVtcJ9MyQNKhJEKpEztnHGWnNWMWLOIR62By0Ln0A== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== dependencies: "@types/node" "*" xmlbuilder ">=11.0.1" "@types/prop-types@*", "@types/prop-types@^15.0.0": - version "15.7.8" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" - integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/ps-tree@^1.1.0": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.3.tgz#12a05ebbdc253ed2b2a6055560667e60814791d0" - integrity sha512-J8IrehehphLtxpABSekURTw9jthrlLcM4llH1I2fZ0zKaxq8jI/O1+Q/tabAJgBY/ffoqDxPRNYBM1lFUXm0lw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.6.tgz#fbb22dabe3d64b79295f37ce0afb7320a26ac9a6" + integrity sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" - integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== - -"@types/react-dom@^18.0.6": - version "18.2.12" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.12.tgz#58479c463d1e0b7f1ee7cd80e09186189f9ec32d" - integrity sha512-QWZuiA/7J/hPIGocXreCRbx7wyoeet9ooxfbSA+zbIWqyQEE7GMtRn4A37BdYyksnN+/NDnWgfxZH9UVGDw1hg== - dependencies: - "@types/react" "*" + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-tabs@^2.3.2": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/react-tabs/-/react-tabs-2.3.4.tgz#b63662ee52e59a86ec33b78b9721d8163a46394c" - integrity sha512-HQzhKW+RF/7h14APw/2cu4Nnt+GmsTvfBKbFdn/NbYpb8Q+iB65wIkPHz4VRKDxWtOpNFpOUtzt5r0LRmQMfOA== +"@types/react-dom@18.3.1", "@types/react-dom@^18.0.6": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" + integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== dependencies: "@types/react" "*" "@types/react-transition-group@^4.4.0": - version "4.4.7" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.7.tgz#bf69f269d74aa78b99097673ca6dd6824a68ef1c" - integrity sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg== - dependencies: - "@types/react" "*" + version "4.4.12" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== "@types/react-window@^1.8.5": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.6.tgz#4faba05b86abd36f40b612a5b02e28fadcf95c7c" - integrity sha512-AVJr3A5rIO9dQQu5TwTN0lP2c1RtuqyyZGCt7PGP8e5gUpn1PuQRMJb/u3UpdbwTHh4wbEi33UMW5NI0IXt1Mg== + version "1.8.8" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.8.tgz#c20645414d142364fbe735818e1c1e0a145696e3" + integrity sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.15": - version "18.2.27" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.27.tgz#746e52b06f3ccd5d7a724fd53769b70792601440" - integrity sha512-Wfv7B7FZiR2r3MIqbAlXoY1+tXm4bOqfz4oRr+nyXdBqapDBZ0l/IGcSlAfvxIHEEJjkPU0MYAc/BlFPOcrgLw== +"@types/react@*", "@types/react@18.3.1", "@types/react@^18.0.15": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.1.tgz#fed43985caa834a2084d002e4771e15dfcbdbe8e" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/responselike@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" - integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== - dependencies: - "@types/node" "*" - -"@types/rimraf@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.5.tgz#368fb04d59630b727fc05a74d2ca557f64a8ef98" - integrity sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== dependencies: - "@types/glob" "*" "@types/node" "*" "@types/route-parser@^0.1.1": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@types/route-parser/-/route-parser-0.1.5.tgz#5fee03ea01d2d457603eab3e46f4fa52573fb5c8" - integrity sha512-W17Tv0Y3uecmsqisMC5HwobDSEy7RXQfBxnbcBnVP0f6QbxFWCK+dEtC0u259nZFRgTYXHKaKbZzCtMgiYYAqg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/@types/route-parser/-/route-parser-0.1.7.tgz#76d324537c9f0aaf65c96588c6ab5f3b84ae1505" + integrity sha512-haO+3HVio/4w+yuMJTjqfSo0ivOV8WnXaOReVD6QN729UGBEyizWNGc2Jd0OLsJDucIod4aJSsPLBeLj2uzMCQ== "@types/safer-buffer@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/safer-buffer/-/safer-buffer-2.1.1.tgz#7d504d3d5b9cba87723543d0da3f47649d4feb52" - integrity sha512-L/QB8WCfXIRPguK8h3L+o1QO9b2NltRpj6y8dYusvzGPJhPZtw9lWYb9gmLvf30qS7j6cZ/wUBXXu36UEtH1XQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/safer-buffer/-/safer-buffer-2.1.3.tgz#901b21c2da54344cf73a205fb5d400592a43b5fd" + integrity sha512-5o3RcpBa7mUFnnnoMa9UIGOf9naD4DCKKMYzqkm9OSY7NNTd26k7adNC+fphcVRI9BUJglBs2yJQiRZYqBF/8w== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" - integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== - "@types/semver@^7.3.12", "@types/semver@^7.3.6", "@types/semver@^7.5.0": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" - integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/send@*": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" - integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-static@*": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" - integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" - "@types/mime" "*" "@types/node" "*" + "@types/send" "*" "@types/tar-fs@^1.16.1": version "1.16.3" @@ -3266,9 +3191,9 @@ "@types/tar-stream" "*" "@types/tar-stream@*": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-3.1.1.tgz#a0d936ec27c732e5287a84055b849637ee609974" - integrity sha512-/1E+a09mAFQwhlEHqiS3LuNWIBiyrn0HqUWZk2IyGzodu9zkXbaT5vl94iGlZGnG2IONVFZd84SFhns3MhhAQQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-3.1.3.tgz#f61427229691eda1b7d5719f34acdc4fc8a558ce" + integrity sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ== dependencies: "@types/node" "*" @@ -3280,64 +3205,63 @@ "@types/node" "*" "@types/tough-cookie@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" - integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/trusted-types@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" - integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" - integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== -"@types/uuid@^7.0.3": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.6.tgz#455e838428ae709f82c85c677dcf5115f2061ac1" - integrity sha512-U/wu4HTp6T2dUmKqDtOUKS9cYhawuf8txqKF3Jp1iMDG8fP5HtjSldcN0g4m+/h7XHU1to1/HDCT0qeeUiu0EA== +"@types/uuid@^9.0.8": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== "@types/verror@^1.10.3": - version "1.10.7" - resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.7.tgz#7e2ee21514355a7ae354fa151d96856d18531f72" - integrity sha512-4c5F4T0qMSoXq1KHx7WV1FMuD2h0xdaFoJ7HSVWUfQ8w5YbqCwLOA8K7/yy1I+Txuzvm417dnPUaLmqazX1F7g== + version "1.10.11" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.11.tgz#d3d6b418978c8aa202d41e5bb3483227b6ecc1bb" + integrity sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg== "@types/vscode@^1.78.0": - version "1.83.0" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.83.0.tgz#f787d1d94d0b258b9bb97947396b47c1d364e90f" - integrity sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ== + version "1.98.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.98.0.tgz#5b6fa5bd99ba15313567d3847fb1177832fee08c" + integrity sha512-+KuiWhpbKBaG2egF+51KjbGWatTH5BbmWQjSLMDCssb4xF8FJnW4nGH4nuAdOOfMbpD0QlHtI+C3tPq+DoKElg== "@types/write-json-file@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/write-json-file/-/write-json-file-2.2.1.tgz#74155aaccbb0d532be21f9d66bebc4ea875a5a62" integrity sha512-JdO/UpPm9RrtQBNVcZdt3M7j3mHO/kXaea9LBGx3UgWJd1f9BkIWP7jObLBG6ZtRyqp7KzLFEsaPhWcidVittA== -"@types/ws@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.2.tgz#f02d3b1cd46db7686734f3ce83bdf46c49decd64" - integrity sha512-NkTXUKTYdXdnPE2aUUbGOXE1XfMK527SCvU/9bj86kyFF6kZ9ZnOQ3mK5jADn98Y2vEUD/7wKDgZa7Qst2wYOg== +"@types/ws@^8.5.5": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.0.tgz#8a2ec491d6f0685ceaab9a9b7ff44146236993b5" + integrity sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw== dependencies: - "@types/events" "*" "@types/node" "*" "@types/yargs-parser@*": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" - integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15": - version "15.0.16" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.16.tgz#258009dc52907e8f03041eb64ffdac297ba4b208" - integrity sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== dependencies: "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" - integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" @@ -3425,6 +3349,11 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + "@virtuoso.dev/react-urx@^0.2.12": version "0.2.13" resolved "https://registry.yarnpkg.com/@virtuoso.dev/react-urx/-/react-urx-0.2.13.tgz#e2cfc42d259d2a002695e7517d34cb97b64ee9c4" @@ -3438,14 +3367,14 @@ integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw== "@vscode/codicons@*": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.33.tgz#a56243ab5492801fff04e53c0aab0d18a6521751" - integrity sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ== + version "0.0.36" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.36.tgz#ccdabfaef5db596b266644ab85fc25aa701058f0" + integrity sha512-wsNOvNMMJ2BY8rC2N2MNBG7yOowV3ov8KlvUE/AiVUlHKTfWsw3OgAOQduX7h0Un6GssKD3aoTVH+TF3DSQwKQ== "@vscode/debugprotocol@^1.51.0": - version "1.63.0" - resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.63.0.tgz#f6d16c382765d2533e515939ac2857aa1ed7ba35" - integrity sha512-7gewwv69pA7gcJUhtJsru5YN7E1AwwnlBrF5mJY4R/NGInOUqOYOWHlqQwG+4AXn0nXWbcn26MHgaGI9Q26SqA== + version "1.68.0" + resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.68.0.tgz#e558ba6affe1be7aff4ec824599f316b61d9a69d" + integrity sha512-2J27dysaXmvnfuhFGhfeuxfHRXunqNPxtBoR3koiTOA9rdxWNDTa1zIFLCFMSHJ9MPTPKFcBeblsyaCJCIlQxg== "@vscode/proxy-agent@^0.13.2": version "0.13.2" @@ -3462,139 +3391,140 @@ "@vscode/windows-ca-certs" "^0.3.1" "@vscode/ripgrep@^1.14.2": - version "1.15.5" - resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.5.tgz#26025884bbc3a8b40dfc29f5bda4b87b47bd7356" - integrity sha512-PVvKNEmtnlek3i4MJMaB910dz46CKQqcIY2gKR3PSlfz/ZPlSYuSuyQMS7iK20KL4hGUdSbWt964B5S5EIojqw== + version "1.15.11" + resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.11.tgz#31d49e8edae86cd6bab3017f1b2088bdb48dfc4e" + integrity sha512-G/VqtA6kR50mJkIH4WA+I2Q78V5blovgPPq0VPYM0QIRp57lYMkdV+U9VrY80b3AvaC72A1z8STmyxc8ZKiTsw== dependencies: - https-proxy-agent "^5.0.0" + https-proxy-agent "^7.0.2" proxy-from-env "^1.1.0" + yauzl "^2.9.2" "@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== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@vscode/windows-ca-certs/-/windows-ca-certs-0.3.3.tgz#7943d78db7d1d99bcd82eb8a0765a870b111d003" + integrity sha512-C0Iq5RcH+H31GUZ8bsMORsX3LySVkGAqe4kQfUSVcCqJ0QOhXkhgwUMU7oCiqYLXaQWyXFp6Fj6eMdt05uK7VA== dependencies: - node-addon-api "^3.0.2" + node-addon-api "^8.2.0" -"@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== +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -"@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/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -"@webassemblyjs/helper-api-error@1.11.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-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== -"@webassemblyjs/helper-buffer@1.11.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-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.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-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.11.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== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.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" +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.3": @@ -3741,6 +3671,13 @@ abbrev@1, abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3757,31 +3694,33 @@ acorn-globals@^7.0.0: acorn "^8.1.0" acorn-walk "^8.0.2" -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.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@^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== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" -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== +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== +advanced-mark.js@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/advanced-mark.js/-/advanced-mark.js-2.6.0.tgz#86ea8b81152b543db91b1602df4e69282c3b0083" + integrity sha512-b6Q7iNkXk1BTUvmbvtig+/p3Z54qDQqOoOKPJUZXYtCdgeZPz/qj9xZs6GKKQA2/OIOrlNwSt/OvyIq06eYPVw== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3789,10 +3728,15 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== dependencies: humanize-ms "^1.2.1" @@ -3842,26 +3786,21 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3: uri-js "^4.2.2" 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== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" anser@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/anser/-/anser-2.1.1.tgz#8afae28d345424c82de89cc0e4d1348eb0c5af7c" - integrity sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ== - -ansi-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== + version "2.3.2" + resolved "https://registry.yarnpkg.com/anser/-/anser-2.3.2.tgz#e2da9d10759a4243a5819595f4f46ec369970c5b" + integrity sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw== -ansi-colors@^4.1.1: +ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== @@ -3884,16 +3823,9 @@ ansi-regex@^5.0.1: 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-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" + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" @@ -3925,26 +3857,25 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@24.6.4: - version "24.6.4" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.4.tgz#5bf77dd89d3ee557bc615b9ddfaf383f3e51577b" - integrity sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg== +app-builder-lib@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.13.3.tgz#36e47b65fecb8780bb73bff0fee4e0480c28274b" + integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== dependencies: - "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "2.1.0" + "@electron/notarize" "2.2.1" "@electron/osx-sign" "1.0.5" - "@electron/universal" "1.4.1" + "@electron/universal" "1.5.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + builder-util "24.13.1" + builder-util-runtime "9.2.4" chromium-pickle-js "^0.2.0" debug "^4.3.4" ejs "^3.1.8" - electron-publish "24.5.0" + electron-publish "24.13.1" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -3980,17 +3911,9 @@ arduino-serial-plotter-webapp@0.2.0: 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" - -ardunno-cli@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.8.tgz#c70b11b2ee0256227689079d01b828328bb1bfb6" - integrity sha512-DfyI98EFHdpc26nPYq2IXK6ZNypwBY0Fg+CAjYeGI/mjgQ1O9QUjNgz6NADwr+pcQ/ikhvLc88Ud9qR08CFTyg== + version "0.1.11" + resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.11.tgz#776b3f4d4c21088b4c69eaf1c05da0f941e1041f" + integrity sha512-B8MtDWXwynLYx4d+GvXZ8Vzo7//mN6PgwP0RSAGgIyv0b3Gn4DQZWSnyhYMZE4Y/oagL05SZrUvHVtZPqBX14w== dependencies: nice-grpc-common "^2.0.2" protobufjs "^7.2.3" @@ -4031,13 +3954,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -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== +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bound "^1.0.3" + is-array-buffer "^3.0.5" array-differ@^3.0.0: version "3.0.0" @@ -4054,15 +3977,16 @@ 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.6: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^1.0.1: @@ -4082,49 +4006,61 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + array.prototype.flat@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -array.prototype.flatmap@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" arrify@^1.0.1: version "1.0.1" @@ -4156,6 +4092,13 @@ ast-types@0.9.6: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + ast-types@^0.9.2: version "0.9.14" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.14.tgz#d34ba5dffb9d15a44351fd2a9d82e4ab2838b5ba" @@ -4171,6 +4114,11 @@ async-exit-hook@^2.0.1: resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async-mutex@^0.3.0, async-mutex@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.3.2.tgz#1485eda5bda1b0ec7c8df1ac2e815757ad1831df" @@ -4179,23 +4127,16 @@ async-mutex@^0.3.0, async-mutex@^0.3.1: 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== + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== dependencies: tslib "^2.4.0" -async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynciterator.prototype@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" +async@^3.2.3, async@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -4213,12 +4154,12 @@ atomically@^1.7.0: integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== auth0-js@^9.23.2: - version "9.23.2" - resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.23.2.tgz#9760dc207c074995efd6fbc4d7b585e05709c85b" - integrity sha512-RiUBalXymeGjF0Ap/IyjKnsILO44eaFrSJDqchox6wUUWnJATGjEQLMTLzjWn8R1wZVKBGu1Fv7PPSViWhcYVQ== + version "9.28.0" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.28.0.tgz#f9d3f0ddf865d4e34f1befb0eacfaa6785ca2f9e" + integrity sha512-2xIfQIGM0vX3IdPR91ztLO2+Ar2I5+3iFKcjuZO+LV9vRh4Wje+Ka1hnHjMU9dH892Lm3ZxBAHxRo68YToUhfg== dependencies: base64-js "^1.5.1" - idtoken-verifier "^2.2.2" + idtoken-verifier "^2.2.4" js-cookie "^2.2.0" minimist "^1.2.5" qs "^6.10.1" @@ -4231,46 +4172,34 @@ autosize@^4.0.2: resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.4.tgz#924f13853a466b633b9309330833936d8bccce03" integrity sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -available-typed-arrays@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" - integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== - -axios@^1.0.0: - version "1.6.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" - integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: - follow-redirects "^1.15.4" - form-data "^4.0.0" - proxy-from-env "^1.1.0" + possible-typed-array-names "^1.0.0" -axios@^1.6.7, axios@^1.7.4: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== +axios@^1.0.0, axios@^1.6.7, axios@^1.7.4: + version "1.8.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" + integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== dependencies: follow-redirects "^1.15.6" 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== + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== babel-loader@^8.2.2: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + version "8.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" + integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== dependencies: find-cache-dir "^3.3.1" - loader-utils "^2.0.0" + loader-utils "^2.0.4" make-dir "^3.1.0" schema-utils "^2.6.5" @@ -4283,29 +4212,29 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" - integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.32.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" bail@^2.0.0: version "2.0.2" @@ -4317,6 +4246,39 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== + dependencies: + bare-events "^2.0.0" + bare-path "^3.0.0" + bare-stream "^2.0.0" + +bare-os@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.0.tgz#1465dd7e1bebe0dec230097a23ad00f7db51f957" + integrity sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.0.0: + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -4327,6 +4289,18 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== +basic-auth@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== + before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" @@ -4342,9 +4316,9 @@ bent@^7.1.0: is-stream "^2.0.0" big-integer@^1.6.17: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== big.js@^5.2.2: version "5.2.2" @@ -4352,9 +4326,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== binary@~0.3.0: version "0.3.0" @@ -4405,28 +4379,10 @@ bluebird@~3.4.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== -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" - -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== +body-parser@1.20.3, body-parser@^1.17.2, body-parser@^1.18.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -4436,7 +4392,7 @@ 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.11.0" + qs "6.13.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -4461,27 +4417,27 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5, browserslist@^4.21.9, browserslist@^4.22.1: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.24.0, browserslist@^4.24.4: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" btoa@^1.2.1: version "1.2.1" @@ -4555,24 +4511,24 @@ builder-util-runtime@8.9.2: debug "^4.3.2" sax "^1.2.4" -builder-util-runtime@9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz#3184dcdf7ed6c47afb8df733813224ced4f624fd" - integrity sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA== +builder-util-runtime@9.2.4: + version "9.2.4" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a" + integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@24.5.0: - version "24.5.0" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.5.0.tgz#8683c9a7a1c5c9f9a4c4d2789ecca0e47dddd3f9" - integrity sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ== +builder-util@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.13.1.tgz#4a4c4f9466b016b85c6990a0ea15aa14edec6816" + integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== dependencies: - "7zip-bin" "~5.1.1" + "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" app-builder-bin "4.0.0" bluebird-lst "^1.0.9" - builder-util-runtime "9.2.1" + builder-util-runtime "9.2.4" chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" @@ -4591,9 +4547,9 @@ builtins@^1.0.3: integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== builtins@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" + integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== dependencies: semver "^7.0.0" @@ -4619,6 +4575,30 @@ bytesish@^0.4.1: resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== +cacache@^16.1.0: + 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@^17.0.0: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" @@ -4673,34 +4653,31 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-bind@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.6.tgz#6c46675fc7a5e9de82d75a233d586c8b7ac0d931" - integrity sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg== + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.3" - set-function-length "^1.2.0" -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: + call-bind-apply-helpers "^1.0.0" es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" callsites@^3.0.0: version "3.1.0" @@ -4734,10 +4711,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001541: - version "1.0.30001547" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" - integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== +caniuse-lite@^1.0.30001688: + version "1.0.30001704" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001704.tgz#6644fe909d924ac3a7125e8a0ab6af95b1f32990" + integrity sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew== capital-case@^1.0.4: version "1.0.4" @@ -4753,10 +4730,10 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chai@^4.2.0: - version "4.3.10" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== +chai@^4.2.0, chai@^4.3.10: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" check-error "^1.0.3" @@ -4764,7 +4741,7 @@ chai@^4.2.0: get-func-name "^2.0.2" loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.8" + type-detect "^4.1.0" chainsaw@~0.1.0: version "0.1.0" @@ -4789,15 +4766,6 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -4846,10 +4814,10 @@ chmodr@^1.2.0: resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.2.0.tgz#720e96caa09b7f1cdbb01529b7d0ab6bc5e118b9" integrity sha512-Y5uI7Iq/Az6HgJEL6pdw7THVd7jbVOTPwsmcPOBjQL8e3N+pz872kzK5QxYGEy21iRys+iHWV0UZQXDFJo1hyA== -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -4872,16 +4840,18 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -chromium-bidi@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.4.tgz#44f25d4fa5d2f3debc3fc3948d0657194cac4407" - integrity sha512-4BX5cSaponuvVT1+SbLYTOAgDoVtX/Khoc9UsbFJ/AsPVUeFAM3RiIDFI6XFhLYMi9WmVJqh1ZH+dRpNKkKwiQ== +chromium-bidi@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.4.tgz#627d76bae2819d59b61a413babe9664e0a16b71d" + integrity sha512-8zoq6ogmhQQkAKZVKO2ObFTl4uOkqoX1PlKQX3hZQ5E9cbUotcAb7h4pTNVAGGv8Z36PF3CtdOriEp/Rz82JqQ== dependencies: - mitt "3.0.0" + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" chromium-pickle-js@^0.2.0: version "0.2.0" @@ -4893,15 +4863,15 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0, ci-info@^3.6.1: +ci-info@^3.2.0, ci-info@^3.6.1, ci-info@^3.7.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-stack@^2.0.0: version "2.2.0" @@ -4928,9 +4898,9 @@ cli-spinners@2.6.1: integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.5.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" - integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" @@ -5017,10 +4987,10 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -clsx@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== cmd-shim@6.0.1: version "6.0.1" @@ -5032,13 +5002,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -5046,11 +5009,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -5135,9 +5093,9 @@ compare-version@^0.1.2: integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== 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== + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== compression-webpack-plugin@^9.0.0: version "9.2.0" @@ -5194,12 +5152,12 @@ conf@^10.2.0: semver "^7.3.5" config-file-ts@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.4.tgz#6c0741fbe118a7cf786c65f139030f0448a2cc99" - integrity sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ== + version "0.2.6" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" + integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== dependencies: - glob "^7.1.6" - typescript "^4.0.2" + glob "^10.3.10" + typescript "^5.3.3" console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" @@ -5315,16 +5273,21 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== -cookie@^0.4.0, cookie@~0.4.1: +cookie@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@~0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + cookiejar@^2.1.3: version "2.1.4" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" @@ -5350,12 +5313,12 @@ copy-webpack-plugin@^8.1.1: schema-utils "^3.0.0" serialize-javascript "^5.0.1" -core-js-compat@^3.31.0, core-js-compat@^3.32.2: - version "3.33.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" - integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== +core-js-compat@^3.40.0: + version "3.41.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17" + integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== dependencies: - browserslist "^4.22.1" + browserslist "^4.24.4" core-util-is@1.0.2: version "1.0.2" @@ -5375,15 +5338,10 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" - integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" @@ -5406,6 +5364,16 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + crc@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" @@ -5420,19 +5388,12 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -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-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== + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== dependencies: - node-fetch "^2.6.12" + node-fetch "^2.7.0" cross-spawn@^4.0.0: version "4.0.2" @@ -5442,33 +5403,33 @@ cross-spawn@^4.0.0: lru-cache "^4.0.1" which "^1.2.9" -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== +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -crypto-js@^4.1.1: +crypto-js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== css-loader@^6.2.0: - version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.8" + semver "^7.5.4" cssesc@^3.0.0: version "3.0.0" @@ -5483,9 +5444,9 @@ cssstyle@^3.0.0: rrweb-cssom "^0.6.0" csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== dargs@^7.0.0: version "7.0.0" @@ -5497,6 +5458,11 @@ data-uri-to-buffer@^4.0.0: 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-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + data-urls@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" @@ -5506,6 +5472,33 @@ data-urls@^4.0.0: whatwg-mimetype "^3.0.0" whatwg-url "^12.0.0" +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -5530,12 +5523,12 @@ debug@2.6.9: dependencies: ms "2.0.0" -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== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.1.0: version "3.2.7" @@ -5544,6 +5537,13 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -5563,14 +5563,14 @@ decamelize@^4.0.0: 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== + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz#5d6ce68792808901210dac42a8e9853511e2b8bf" + integrity sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w== dependencies: character-entities "^2.0.0" @@ -5652,9 +5652,9 @@ dedent@0.7.0, dedent@^0.7.0: integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" @@ -5714,26 +5714,7 @@ defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-data-property@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.2.tgz#f3c33b4f0102360cd7c0f5f28700f5678510b63a" - integrity sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.2" - gopd "^1.0.1" - has-property-descriptors "^1.0.1" - -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -5747,7 +5728,7 @@ 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.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -5756,6 +5737,15 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5796,20 +5786,20 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== -detect-libc@^2.0.0, detect-libc@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" - integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== +detect-libc@^2.0.0, detect-libc@^2.0.1, detect-libc@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -devtools-protocol@0.0.1094867: - version "0.0.1094867" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz#2ab93908e9376bd85d4e0604aa2651258f13e374" - integrity sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ== +devtools-protocol@0.0.1312386: + version "0.0.1312386" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" + integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== dezalgo@^1.0.4: version "1.0.4" @@ -5824,20 +5814,10 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -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@^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.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +diff@^5.0.0, diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dir-compare@^3.0.0: version "3.3.0" @@ -5861,14 +5841,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@24.6.4: - version "24.6.4" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.4.tgz#e19b8305f7e1ea0b4faaa30382c81b9d6de39863" - integrity sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw== +dmg-builder@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.13.3.tgz#95d5b99c587c592f90d168a616d7ec55907c7e55" + integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== dependencies: - app-builder-lib "24.6.4" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -5932,15 +5912,10 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -dompurify@^2.2.9: - version "2.4.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== - -dompurify@^2.4.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.7.tgz#6e0d36b9177db5a99f18ade1f28579db5ab839d7" - integrity sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q== +dompurify@^2.2.9, dompurify@^2.4.7: + version "2.5.8" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.8.tgz#2809d89d7e528dc7a071dea440d7376df676f824" + integrity sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw== dot-case@^3.0.4: version "3.0.4" @@ -5980,9 +5955,9 @@ dotenv@^9.0.2: integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== dotenv@~16.3.1: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" + integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== drivelist@^9.0.2, drivelist@^9.2.4: version "9.2.4" @@ -5994,6 +5969,15 @@ drivelist@^9.0.2, drivelist@^9.2.4: nan "^2.14.0" prebuild-install "^5.2.4" +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -6017,22 +6001,22 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.7, ejs@^3.1.8: - version "3.1.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" electron-builder@^24.6.4: - version "24.6.4" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.4.tgz#c51271e49b9a02c9a3ec444f866b6008c4d98a1d" - integrity sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA== + version "24.13.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616" + integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== dependencies: - app-builder-lib "24.6.4" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" chalk "^4.1.2" - dmg-builder "24.6.4" + dmg-builder "24.13.3" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -6048,14 +6032,14 @@ electron-notarize@^1.1.1: debug "^4.1.1" fs-extra "^9.0.1" -electron-publish@24.5.0: - version "24.5.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.5.0.tgz#492a4d7caa232e88ee3c18f5c3b4dc637e5e1b3a" - integrity sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA== +electron-publish@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.13.1.tgz#57289b2f7af18737dc2ad134668cdd4a1b574a0c" + integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + builder-util "24.13.1" + builder-util-runtime "9.2.4" chalk "^4.1.2" fs-extra "^10.1.0" lazy-val "^1.0.5" @@ -6082,17 +6066,17 @@ electron-rebuild@^3.2.7: yargs "^17.0.1" electron-store@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.1.0.tgz#46a398f2bd9aa83c4a9daaae28380e2b3b9c7597" - integrity sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA== + version "8.2.0" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.2.0.tgz#114e6e453e8bb746ab4ccb542424d8c881ad2ca1" + integrity sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw== dependencies: conf "^10.2.0" type-fest "^2.17.0" -electron-to-chromium@^1.4.535: - version "1.4.548" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.548.tgz#e695d769e0e801fa6d438b63f6bc9b80372000d6" - integrity sha512-R77KD6mXv37DOyKLN/eW1rGS61N6yHOfapNSX9w+y9DdPG83l9Gkuv7qkCFZ4Ta4JPhrjgQfYbv4Y3TnM1Hi2Q== +electron-to-chromium@^1.5.73: + version "1.5.118" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.118.tgz#064bda9bfea1611074288adb1fdd1f787a131e21" + integrity sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA== electron-updater@^4.6.5: version "4.6.5" @@ -6108,13 +6092,13 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -electron@^27.0.3: - version "27.0.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-27.0.3.tgz#dc843d95700b33d88e71b458082b66f37ca901c5" - integrity sha512-VaB9cI1se+mUtz366NP+zxFVnkHLbCBNO4wwouw3FuGyX/m7/Bv1I89JhWOBv78tC+n11ZYMrVD23Jf6EZgVcg== +electron@30.1.2: + version "30.1.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-30.1.2.tgz#9c8b9b0d0e3f07783d8c5dbd9519b3ffd11f1551" + integrity sha512-A5CFGwbA+HSXnzwjc8fP2GIezBcAb0uN/VbNGLOW8DHOYn07rvJ/1bAJECHUUzt5zbfohveG3hpMQiYpbktuDw== dependencies: "@electron/get" "^2.0.0" - "@types/node" "^18.11.18" + "@types/node" "^20.9.0" extract-zip "^2.0.1" emoji-regex@^8.0.0: @@ -6137,6 +6121,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -6151,42 +6140,41 @@ 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.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.2.tgz#8709e22c291d4297ae80318d3c8baeae71f0e002" - integrity sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg== +engine.io-client@~6.6.1: + version "6.6.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de" + integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" engine.io-parser "~5.2.1" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" + ws "~8.17.1" + xmlhttprequest-ssl "~2.1.1" engine.io-parser@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" - integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== -engine.io@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.3.tgz#80b0692912cef3a417e1b7433301d6397bf0374b" - integrity sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw== +engine.io@~6.6.0: + version "6.6.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== dependencies: - "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" "@types/node" ">=10.0.0" accepts "~1.3.4" base64id "2.0.0" - cookie "~0.4.1" + cookie "~0.7.2" cors "~2.8.5" debug "~4.3.1" engine.io-parser "~5.2.1" - ws "~8.11.0" + ws "~8.17.1" -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== +enhanced-resolve@^5.17.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -6206,7 +6194,7 @@ enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^4.4.0: +entities@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -6227,9 +6215,9 @@ envinfo@7.8.1: 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== + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== err-code@^2.0.2: version "2.0.3" @@ -6250,57 +6238,67 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" - integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - 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.5" - is-array-buffer "^3.0.2" +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" is-callable "^1.2.7" - is-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.12" - is-weakref "^1.0.2" - object-inspect "^1.12.3" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - 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.11" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" @@ -6322,55 +6320,65 @@ es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" -es-iterator-helpers@^1.0.12: - version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" es-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" -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== +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: - has "^1.0.3" + hasown "^2.0.2" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-error@^4.1.1: version "4.1.1" @@ -6382,10 +6390,10 @@ es6-promise@^4.2.4, es6-promise@^4.2.8: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" @@ -6407,7 +6415,7 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escodegen@^2.0.0: +escodegen@^2.0.0, escodegen@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== @@ -6431,31 +6439,33 @@ eslint-plugin-prettier@^4.2.1: prettier-linter-helpers "^1.0.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== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.32.2: - version "7.33.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" - integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" + version "7.37.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.12" + es-iterator-helpers "^1.2.1" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.1" prop-types "^15.8.1" - resolve "^2.0.0-next.4" + resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.8" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" eslint-plugin-unused-imports@^2.0.0: version "2.0.0" @@ -6491,17 +6501,18 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.39.0: - version "8.51.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3" - integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.51.0" - "@humanwhocodes/config-array" "^0.11.11" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -6553,9 +6564,9 @@ esprima@~3.1.0: integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg== 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== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -6599,12 +6610,17 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -eventemitter3@^4.0.4: +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -6703,41 +6719,41 @@ expand-template@^2.0.3: 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== + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== -express@^4.16.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== +express@^4.21.0: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -6773,7 +6789,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extract-zip@2.0.1, 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== @@ -6799,21 +6815,21 @@ fast-diff@^1.1.2: 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: +fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" @@ -6835,15 +6851,20 @@ fast-safe-stringify@^2.1.1: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + fastest-levenshtein@^1.0.12: version "1.0.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.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" @@ -6882,9 +6903,9 @@ file-icons-js@~1.0.3: 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== + version "18.7.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.7.0.tgz#cddb16f184d6b94106cfc4bb56978726b25cb2a2" + integrity sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw== dependencies: readable-web-to-node-stream "^3.0.2" strtok3 "^7.0.0" @@ -6945,10 +6966,10 @@ filenamify@^5.1.1: strip-outer "^2.0.0" trim-repeated "^2.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -6957,13 +6978,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -6984,14 +7005,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@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: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -7014,6 +7027,21 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + fix-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/fix-path/-/fix-path-3.0.0.tgz#c6b82fd5f5928e520b392a63565ebfef0ddf037e" @@ -7022,9 +7050,9 @@ fix-path@^3.0.0: shell-path "^2.1.0" flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" keyv "^4.5.3" @@ -7036,16 +7064,11 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== - -follow-redirects@^1.15.4: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -follow-redirects@^1.15.6: +follow-redirects@^1.0.0, follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== @@ -7055,19 +7078,19 @@ 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== +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" 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== + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" form-data-encoder@^2.1.2: @@ -7076,12 +7099,13 @@ form-data-encoder@^2.1.2: integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" formdata-polyfill@^4.0.10: @@ -7107,11 +7131,10 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fqbn@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fqbn/-/fqbn-1.0.5.tgz#4a4ea6babadeffc12c4637d5a4f5ef57c7ef317b" - integrity sha512-ImcK5biXDRSQHsvC8XXhEZH/YPmW7lRrmTABv6m5D7HQz3Xzi5foHZxTxmeXekcrRkZOfIrDWWtpk2wtUJgPPA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fqbn/-/fqbn-1.3.0.tgz#1d1b21c721db6cd882d6dccbd7ec6332a001f3f1" + integrity sha512-h+egsORZNuWZvsgn7nPkBTuo6isy9TRrfWSmn/6ywNsgLoIuR7FrOVNMWBwCLjBI0b6FV52VkWY4CIZcQpUJZA== dependencies: - ardunno-cli "^0.1.7" clone "^2.1.2" deep-equal "^2.2.3" @@ -7140,9 +7163,9 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: 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== + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -7176,7 +7199,7 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -7210,25 +7233,22 @@ fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functions-have-names@^1.2.3: version "1.2.3" @@ -7293,31 +7313,26 @@ get-caller-file@^2.0.1, get-caller-file@^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, get-func-name@^2.0.2: +get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-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-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -7339,6 +7354,14 @@ get-port@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-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" @@ -7364,13 +7387,23 @@ get-stream@^6.0.0, get-stream@^6.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-uri@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" git-raw-commits@^3.0.0: version "3.0.0" @@ -7467,28 +7500,17 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.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.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== +glob@^10.2.2, glob@^10.3.10, glob@^10.3.3, glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3: version "7.2.3" @@ -7502,7 +7524,7 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1, glob@^8.0.3: +glob@^8.0.1, glob@^8.0.3, glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -7541,18 +7563,19 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.1, 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== +globalthis@^1.0.1, globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@11.1.0, globby@^11.0.3, globby@^11.1.0: version "11.1.0" @@ -7584,16 +7607,14 @@ google-protobuf@3.15.8: integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== google-protobuf@^3.20.1: - version "3.21.2" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4" - integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA== + version "3.21.4" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9" + integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ== -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^11.7.0, got@^11.8.5: version "11.8.6" @@ -7629,7 +7650,7 @@ got@^12.0.0, got@^12.1.0, got@^12.6.1: p-cancelable "^3.0.0" responselike "^3.0.0" -graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -7640,9 +7661,9 @@ graphemer@^1.4.0: integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== grpc-tools@^1.12.4: - 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== + version "1.13.0" + resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.13.0.tgz#a4fea8eebce51fb9fec00055a3e52016dfd5af89" + integrity sha512-7CbkJ1yWPfX0nHjbYG58BQThNhbICXBZynzCUxCb3LzX5X9B3hQbRY2STiRgIEiLILlK9fgl0z0QVGwPCdXf5g== dependencies: "@mapbox/node-pre-gyp" "^1.0.5" @@ -7683,60 +7704,36 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-property-descriptors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== - dependencies: - get-intrinsic "^1.2.2" - -has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -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.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-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: - has-symbols "^1.0.2" + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.1: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -7748,11 +7745,6 @@ has-unicode@2.0.1, has-unicode@^2.0.0, has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -7761,10 +7753,10 @@ hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -7773,7 +7765,7 @@ hast-util-whitespace@^2.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -7818,9 +7810,9 @@ hosted-git-info@^4.0.0, hosted-git-info@^4.0.1, hosted-git-info@^4.1.0: lru-cache "^6.0.0" 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== + version "6.1.3" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.3.tgz#2ee1a14a097a1236bddf8672c35b613c46c55946" + integrity sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw== dependencies: lru-cache "^7.5.1" @@ -7831,7 +7823,7 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -7865,6 +7857,42 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" + integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== + dependencies: + basic-auth "^2.0.1" + chalk "^4.1.2" + corser "^2.0.1" + he "^1.2.0" + html-encoding-sniffer "^3.0.0" + http-proxy "^1.18.1" + mime "^1.6.0" + minimist "^1.2.6" + opener "^1.5.1" + portfinder "^1.0.28" + secure-compare "3.0.1" + union "~0.5.0" + url-join "^4.0.1" + http-status-codes@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.4.0.tgz#6e4c15d16ff3a9e2df03b89f3a55e1aae05fb477" @@ -7879,14 +7907,14 @@ http2-wrapper@^1.0.0-beta.5.2: resolve-alpn "^1.0.0" 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== + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" -https-proxy-agent@5.0.1, 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== @@ -7894,6 +7922,14 @@ https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" +https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -7953,13 +7989,13 @@ idb@^4.0.5: resolved "https://registry.yarnpkg.com/idb/-/idb-4.0.5.tgz#23b930fbb0abce391e939c35b7b31a669e74041f" integrity sha512-P+Fk9HT2h1DhXoE1YNK183SY+CRh2GHNh28de94sGwhe0bUA75JJeVJWt3SenE5p0BXK7maflIq29dl6UZHrFw== -idtoken-verifier@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.2.3.tgz#1758e9b0596f7036134938d63e107a72045622b8" - integrity sha512-hhpzB+MRgEvbwqzRLFdVbG55lKdXQVfeYEjAA2qu0UC72MSLeR0nX7P7rY5Dycz1aISHPOwq80hIPFoJ/+SItA== +idtoken-verifier@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.2.4.tgz#5749bd3fc9b757db40ad764484173584fb19fb55" + integrity sha512-5t7O8cNHpJBB8FnwLD0qFZqy/+qGICObQKUl0njD6vXKHhpZPLEe8LU7qv/GBWB3Qv5e/wAIFHYVi4SoQwdOxQ== dependencies: base64-js "^1.5.1" - crypto-js "^4.1.1" + crypto-js "^4.2.0" es6-promise "^4.2.8" jsbn "^1.1.0" unfetch "^4.2.0" @@ -7988,9 +8024,9 @@ ignore-walk@^5.0.1: minimatch "^5.0.1" ignore-walk@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" - integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== + version "6.0.5" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== dependencies: minimatch "^9.0.0" @@ -8000,9 +8036,9 @@ ignore@^3.3.5: integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== ignore@^5.0.4, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@~0.5.0: version "0.5.5" @@ -8010,14 +8046,14 @@ image-size@~0.5.0: integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@3.1.0, import-local@^3.0.2: +import-local@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== @@ -8025,6 +8061,14 @@ import-local@3.1.0, import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -8040,6 +8084,11 @@ indent-string@^5.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -8104,40 +8153,39 @@ inspect-with-kind@^1.0.5: dependencies: kind-of "^6.0.2" -internal-slot@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -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" + hasown "^2.0.2" + side-channel "^1.1.0" interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -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== +inversify@6.0.2, inversify@^6.1.3: + version "6.0.2" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-6.0.2.tgz#dc7fa0348213d789d35ffb719dea9685570989c7" + integrity sha512-i9m8j/7YIv4mDuYXUAcrpKPSaju/CIly9AHK5jvCBeoiM/2KEsuCQTTP+rzSWWpLYWRukdXFSl6ZTk2/uumbiA== + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" ip-regex@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^2.0.0, ip@^2.0.1: +ip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== @@ -8148,21 +8196,21 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arguments@^1.0.4, is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" -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== +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-arrayish@^0.2.1: version "0.2.1" @@ -8170,18 +8218,22 @@ is-arrayish@^0.2.1: integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: - has-tostringtag "^1.0.0" + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -8190,20 +8242,20 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-buffer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +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== @@ -8222,19 +8274,29 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - has "^1.0.3" + hasown "^2.0.2" -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" @@ -8251,12 +8313,12 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -8271,11 +8333,14 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10, 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== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" @@ -8301,27 +8366,23 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" @@ -8385,35 +8446,37 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-regex@^1.1.4, is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" is-ssh@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== + version "1.4.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.1.tgz#76de1cdbe8f92a8b905d1a172b6bc09704c20396" + integrity sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg== dependencies: protocols "^2.0.1" @@ -8437,19 +8500,22 @@ is-stream@^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" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" is-text-path@^1.0.1: version "1.0.1" @@ -8458,44 +8524,44 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.16" is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -8518,9 +8584,9 @@ isbinaryfile@^4.0.8: integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== isbinaryfile@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" - integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + version "5.0.4" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.4.tgz#2a2edefa76cafa66613fe4c1ea52f7f031017bdf" + integrity sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ== isexe@^2.0.0: version "2.0.0" @@ -8532,25 +8598,17 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" jackspeak@^3.1.2: version "3.4.3" @@ -8562,9 +8620,9 @@ jackspeak@^3.1.2: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.8.7" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -8620,7 +8678,7 @@ js-yaml@^3.10.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@^1.1.0: +jsbn@1.1.0, jsbn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== @@ -8662,21 +8720,16 @@ jsdom@^21.1.1: ws "^8.13.0" xml-name-validator "^4.0.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -8693,9 +8746,9 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: 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== + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== json-schema-traverse@^0.4.1: version "0.4.1" @@ -8717,6 +8770,17 @@ json-stable-stringify-without-jsonify@^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-stable-stringify@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2" + integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -8734,7 +8798,7 @@ json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^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.0.0: +jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== @@ -8744,6 +8808,11 @@ 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.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -8760,6 +8829,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -8810,6 +8884,13 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^4.0.3: version "4.1.5" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" @@ -8967,9 +9048,9 @@ lines-and-columns@^1.1.6: 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== + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== linkify-it@^3.0.1: version "3.0.3" @@ -9072,7 +9153,7 @@ loader-utils@^1.0.3: emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: +loader-utils@^2.0.0, loader-utils@^2.0.3, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -9156,7 +9237,7 @@ lodash@^4.17.15, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0, log-symbols@^4.0.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== @@ -9175,9 +9256,9 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + version "5.3.1" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.1.tgz#9d4222d3213f38a5ec809674834e0f0ab21abe96" + integrity sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -9187,11 +9268,11 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - get-func-name "^2.0.0" + get-func-name "^2.0.1" lower-case@^2.0.2: version "2.0.2" @@ -9237,16 +9318,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== - lzma-native@^8.0.5: version "8.0.6" resolved "https://registry.yarnpkg.com/lzma-native/-/lzma-native-8.0.6.tgz#3ea456209d643bafd9b5d911781bdf0b396b2665" @@ -9290,7 +9366,29 @@ make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + 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" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== @@ -9344,6 +9442,11 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdast-util-definitions@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" @@ -9429,10 +9532,10 @@ meow@^8.1.2: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-options@^3.0.4: version "3.0.4" @@ -9650,19 +9753,24 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, mime-db@^1.28.0: +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +mime-db@^1.28.0: + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -9670,7 +9778,7 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@1.6.0, mime@^1.4.1: +mime@1.6.0, mime@^1.4.1, mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -9721,11 +9829,12 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.6.1: - 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== + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" minimalistic-assert@^1.0.1: version "1.0.1" @@ -9739,13 +9848,6 @@ minimatch@3.0.5: dependencies: brace-expansion "^1.1.7" -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" @@ -9753,7 +9855,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.0, minimatch@^5.1.1: +minimatch@^5.0.1, minimatch@^5.1.0, minimatch@^5.1.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -9767,14 +9869,7 @@ minimatch@^8.0.2: 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" - -minimatch@^9.0.4: +minimatch@^9.0.0, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -9802,10 +9897,21 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-fetch@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" - integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== dependencies: minipass "^7.0.3" minipass-sized "^1.0.3" @@ -9821,9 +9927,9 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz#5121616c77a11c406c3ffa77509e0b77bb267ec3" + integrity sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg== dependencies: jsonparse "^1.3.1" minipass "^3.0.0" @@ -9842,7 +9948,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -9859,12 +9965,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== @@ -9877,10 +9978,10 @@ 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== +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" @@ -9900,31 +10001,30 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mocha@^10.1.0, mocha@^10.2.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" + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" mockdate@^3.0.5: version "3.0.5" @@ -9937,9 +10037,9 @@ modify-values@^1.0.1: integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== 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== + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== mount-point@^3.0.0: version "3.0.0" @@ -9967,12 +10067,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -9991,7 +10086,7 @@ msgpackr-extract@^3.0.2: "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" -msgpackr@1.6.1, msgpackr@^1.10.1: +msgpackr@^1.10.1, msgpackr@^1.10.2: version "1.11.2" resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.2.tgz#4463b7f7d68f2e24865c395664973562ad24473d" integrity sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g== @@ -10027,17 +10122,17 @@ mute-stream@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: +mute-stream@^1.0.0, mute-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== -nan@^2.14.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" - integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== +nan@^2.14.0, nan@^2.17.0: + version "2.22.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb" + integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ== -nano@^10.1.3, nano@^9.0.5: +nano@^10.1.3: version "10.1.4" resolved "https://registry.yarnpkg.com/nano/-/nano-10.1.4.tgz#cb4cabd677733ddb81c88c1b8635101e2d84e926" integrity sha512-bJOFIPLExIbF6mljnfExXX9Cub4W0puhDjVMp+qV40xl/DBvgKao7St4+6/GB6EoHZap7eFnrnx4mnp5KYgwJA== @@ -10046,15 +10141,10 @@ nano@^10.1.3, nano@^9.0.5: node-abort-controller "^3.1.1" qs "^6.13.0" -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== +nanoid@^3.3.8: + version "3.3.9" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a" + integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== napi-build-utils@^1.0.1: version "1.0.2" @@ -10067,9 +10157,9 @@ native-keymap@^2.2.1: integrity sha512-EfdMpTcX40mlHBJSWidFV4WLpwwaebK3D3JFuO/42voOAnG2WHgDdg6JerbqcxXvRhvIg934GV+9PjB3jzfu9A== native-request@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" - integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.2.tgz#b677952757429db6cd41972a29c3b781977413ed" + integrity sha512-/etjwrK0J4Ebbcnt35VMWnfiUX/B04uwGJxyJInagxDqf2z5drSt/lsOvEMWGYunz1kaLZAFrV4NDAbOoDKvAQ== natural-compare-lite@^1.4.0: version "1.4.0" @@ -10086,16 +10176,26 @@ ncp@^2.0.0: resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + 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" @@ -10112,9 +10212,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-abi@*, node-abi@^3.0.0: - version "3.48.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.48.0.tgz#122d132ae1ac097b0d711144560b17922de026ab" - integrity sha512-uWR/uwQyVV2iN5+Wkf1/oQxOR9YjU7gBclJLg2qK7GDvVohcnY6LaBXKV89N79EQFyN4/e43O32yQYE5QdFYTA== + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== dependencies: semver "^7.3.5" @@ -10135,15 +10235,20 @@ node-addon-api@^1.6.3: 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: +node-addon-api@^3.0.0, node-addon-api@^3.1.0, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-addon-api@^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-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + +node-addon-api@^8.2.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.1.tgz#53bc8a4f8dbde3de787b9828059da94ba9fd4eed" + integrity sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA== node-api-version@^0.1.4: version "0.1.4" @@ -10164,7 +10269,7 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -10187,26 +10292,21 @@ node-gyp-build-optional-packages@5.2.2: dependencies: detect-libc "^2.0.1" -node-gyp-build@^4.2.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== - -node-gyp-build@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" - integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== +node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== node-gyp@^9.0.0, node-gyp@^9.3.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" - integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^11.0.3" + make-fetch-happen "^10.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -10215,11 +10315,11 @@ node-gyp@^9.0.0, node-gyp@^9.3.0: which "^2.0.2" 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== + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-2.1.0.tgz#8c4eb926e8bdcacb7349d17b40ebcc49fd2458d5" + integrity sha512-OwjPkyh8+7jW8DMd/iq71uU1Sspufr/C2+c3t0p08J3CrM9ApZ4U53xuisNrDXOHyGi5OYHgtfmmh+aK9zJA6g== dependencies: - loader-utils "^2.0.0" + loader-utils "^2.0.3" node-log-rotate@^0.1.5: version "0.1.5" @@ -10235,17 +10335,17 @@ node-machine-id@1.1.12: resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== -node-pty@0.11.0-beta17: - version "0.11.0-beta17" - resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta17.tgz#7df6a60dced6bf7a3a282b65cf51980c68954af6" - integrity sha512-JALo4LgYKmzmmXI23CIfS6DpCuno647YJpNg3RT6jCKTHWrt+RHeB6JAlb/pJG9dFNSeaiIAWD+0waEg2AzlfA== +node-pty@0.11.0-beta24: + version "0.11.0-beta24" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta24.tgz#084841017187656edaf14b459946c4a1d7cf8392" + integrity sha512-CzItw3hitX+wnpw9dHA/A+kcbV7ETNKrsyQJ+s0ZGzsu70+CSGuIGPLPfMnAc17vOrQktxjyRQfaqij75GVJFw== dependencies: - nan "^2.14.0" + nan "^2.17.0" -node-releases@^2.0.13: - 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== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== noop-logger@^0.1.1: version "0.1.1" @@ -10307,9 +10407,9 @@ normalize-url@^6.0.1: integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== 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== + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== npm-bundled@^1.1.2: version "1.1.2" @@ -10319,9 +10419,9 @@ npm-bundled@^1.1.2: npm-normalize-package-bin "^1.0.1" 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== + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== dependencies: npm-normalize-package-bin "^3.0.0" @@ -10423,9 +10523,9 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: 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== + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" @@ -10459,22 +10559,15 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" -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 "^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.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + version "2.2.18" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.18.tgz#3c4d7927e1ef4d042d319438ecfda6cd81b7ee41" + integrity sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA== nx@16.10.0, "nx@>=16.5.1 < 17": version "16.10.0" @@ -10534,73 +10627,64 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -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-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.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.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== +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.fromentries@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.values@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" on-finished@2.4.1: version "2.4.1" @@ -10630,6 +10714,14 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + open@^8.0.6, open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -10639,17 +10731,22 @@ open@^8.0.6, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 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.5" ora@^5.1.0, ora@^5.4.1: version "5.4.1" @@ -10676,6 +10773,15 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + p-any@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-any/-/p-any-4.0.0.tgz#0e9c8b0fa3e58cc79e6a1c6c715aa9326b6a4447" @@ -10837,6 +10943,28 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" @@ -10900,9 +11028,9 @@ parse-json@^5.0.0, parse-json@^5.2.0: lines-and-columns "^1.1.6" parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== + version "7.0.1" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.1.tgz#ae548cd36315fd8881a3610eae99fa08123ee0e2" + integrity sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg== dependencies: protocols "^2.0.0" @@ -10914,11 +11042,11 @@ parse-url@^8.1.0: parse-path "^7.0.0" 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== + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== dependencies: - entities "^4.4.0" + entities "^4.5.0" parseurl@~1.3.3: version "1.3.3" @@ -10933,6 +11061,27 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -10993,15 +11142,7 @@ path-root@^0.1.1: 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-scurry@^1.11.1: +path-scurry@^1.11.1, path-scurry@^1.6.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -11009,10 +11150,10 @@ path-scurry@^1.11.1: lru-cache "^10.2.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" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^3.0.0: version "3.0.0" @@ -11038,25 +11179,25 @@ 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== +peek-readable@^5.1.3: + version "5.4.2" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.4.2.tgz#aff1e1ba27a7d6911ddb103f35252ffc1787af49" + integrity sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg== pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -perfect-scrollbar@^1.3.0, perfect-scrollbar@^1.5.0: +perfect-scrollbar@1.5.5, perfect-scrollbar@^1.5.0, perfect-scrollbar@^1.5.5: version "1.5.5" resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -11125,26 +11266,39 @@ plist@^3.0.4, plist@^3.0.5: base64-js "^1.5.1" xmlbuilder "^15.1.1" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +portfinder@^1.0.28: + version "1.0.35" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.35.tgz#6ebaf945da4d14c55d996e907b217f73e1dc06c9" + integrity sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw== + dependencies: + async "^3.2.6" + debug "^4.3.6" -postcss-modules-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== +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" @@ -11153,10 +11307,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -11166,14 +11320,14 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.21: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== +postcss@^8.4.33: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" prebuild-install@^5.2.4: version "5.3.6" @@ -11261,7 +11415,7 @@ process@^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: +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== @@ -11280,11 +11434,11 @@ promise-retry@^2.0.1: retry "^0.12.0" promzard@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" - integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== + version "1.0.2" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.2.tgz#2226e7c6508b1da3471008ae17066a7c3251e660" + integrity sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ== dependencies: - read "^2.0.0" + read "^3.0.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" @@ -11296,14 +11450,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.3.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" - integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== -protobufjs@^7.2.3, protobufjs@^7.2.4: - version "7.2.5" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" - integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== +protobufjs@^7.2.3, protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -11319,9 +11473,9 @@ protobufjs@^7.2.3, protobufjs@^7.2.4: long "^5.0.0" protocols@^2.0.0, protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + version "2.0.2" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" + integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== proxy-addr@~2.0.7: version "2.0.7" @@ -11331,7 +11485,21 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@1.1.0, proxy-from-env@^1.1.0: +proxy-agent@^6.4.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -11354,9 +11522,11 @@ pseudomap@^1.0.2: integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== 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== + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" public-ip@^5.0.0: version "5.0.0" @@ -11376,34 +11546,29 @@ pump@^1.0.0: once "^1.3.1" pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -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.7.2: - version "19.7.2" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.7.2.tgz#deee9ef915829b6a1d1a3a008625c29eeb251161" - integrity sha512-PvI+fXqgP0uGJxkyZcX51bnzjFA73MODZOAv0fSD35yR7tvbqwtMV3/Y+hxQ0AMMwzxkEebP6c7po/muqxJvmQ== - dependencies: - chromium-bidi "0.4.4" - cross-fetch "3.1.5" - debug "4.3.4" - devtools-protocol "0.0.1094867" - extract-zip "2.0.1" - https-proxy-agent "5.0.1" - proxy-from-env "1.1.0" - rimraf "3.0.2" - tar-fs "2.1.1" - unbzip2-stream "1.4.3" - ws "8.11.0" +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +puppeteer-core@23.1.0: + version "23.1.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.1.0.tgz#50703d2e27c1d73d523c25b807f6e6d95a6b1c47" + integrity sha512-SvAsu+xnLN2FMXE/59bp3s3WXp8ewqUGzVV4AQtml/2xmsciZnU/bXcCW+eETHPWQ6Agg2vTI7QzWXPpEARK2g== + dependencies: + "@puppeteer/browsers" "2.3.1" + chromium-bidi "0.6.4" + debug "^4.3.6" + devtools-protocol "0.0.1312386" + typed-query-selector "^2.12.0" + ws "^8.18.0" puppeteer-to-istanbul@1.4.0: version "1.4.0" @@ -11415,37 +11580,31 @@ puppeteer-to-istanbul@1.4.0: v8-to-istanbul "^1.2.1" yargs "^15.3.1" -puppeteer@19.7.2: - version "19.7.2" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.7.2.tgz#1b3ce99a093cc2f8f84dfb06f066d0757ea79d4b" - integrity sha512-4Lm7Qpe/LU95Svirei/jDLDvR5oMrl9BPGd7HMY5+Q28n+BhvKuW97gKkR+1LlI86bO8J3g8rG/Ll5kv9J1nlQ== - dependencies: - cosmiconfig "8.0.0" - https-proxy-agent "5.0.1" - progress "2.0.3" - proxy-from-env "1.1.0" - puppeteer-core "19.7.2" - -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== +puppeteer@23.1.0: + version "23.1.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.1.0.tgz#3abe4980670f214c8edfe689012e83418f81f9aa" + integrity sha512-m+CyicDlGN1AVUeOsCa6/+KQydJzxfsPowL7fQy+VGNeaWafB0m8G5aGfXdfZztKMxzCsdz7KNNzbJPeG9wwFw== dependencies: - side-channel "^1.0.4" + "@puppeteer/browsers" "2.3.1" + chromium-bidi "0.6.4" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1312386" + puppeteer-core "23.1.0" + typed-query-selector "^2.12.0" -qs@^6.10.1, qs@^6.10.3, qs@^6.11.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" -qs@^6.13.0: - version "6.13.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" - integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== +qs@^6.10.1, qs@^6.10.3, qs@^6.11.0, qs@^6.13.0, qs@^6.4.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" query-string@^7.0.1: version "7.1.3" @@ -11467,11 +11626,6 @@ queue-microtask@^1.2.2: 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" @@ -11494,16 +11648,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - 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" @@ -11539,12 +11683,12 @@ react-disable@^0.1.1: integrity sha512-KKEDYJUnF8hIPlmGYJu38HG8BlBB4EElCFY1zfA9W46/MF76DSGvgcduWl1eVT/CAw3ahb2sWTSfhon+kPSiKw== react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" @@ -11552,9 +11696,9 @@ react-is@^16.13.1, react-is@^16.7.0: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-markdown@^8.0.0: version "8.0.7" @@ -11586,9 +11730,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.7.7" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.7.tgz#dbade9dbf711ef2a181970c10f8ab319ac37fbd0" - integrity sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw== + version "5.10.1" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.10.1.tgz#e858dd98358ccd864b65d53ab0fb682cd5e96b89" + integrity sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -11598,14 +11742,14 @@ react-select@^5.6.0: memoize-one "^6.0.0" prop-types "^15.6.0" react-transition-group "^4.3.0" - use-isomorphic-layout-effect "^1.1.2" + use-isomorphic-layout-effect "^1.2.0" -react-tabs@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.3.tgz#ccbb3e1241ad3f601047305c75db661239977f2f" - integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== +react-tabs@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-6.1.0.tgz#a1fc9d9b8db4c6e7bb327a1b6783bc51a1c457a1" + integrity sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ== dependencies: - clsx "^1.1.0" + clsx "^2.0.0" prop-types "^15.5.0" react-tooltip@^4.2.21: @@ -11635,17 +11779,17 @@ react-virtuoso@^2.17.0: "@virtuoso.dev/urx" "^0.2.12" react-window@^1.8.6: - version "1.8.9" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" - integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== + version "1.8.11" + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.11.tgz#a857b48fa85bd77042d59cc460964ff2e0648525" + integrity sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ== dependencies: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -11727,6 +11871,13 @@ read@^2.0.0: dependencies: mute-stream "~1.0.0" +read@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/read/-/read-3.0.1.tgz#926808f0f7c83fa95f1ef33c0e2c09dbb28fd192" + integrity sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw== + dependencies: + mute-stream "^1.0.0" + readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -11749,12 +11900,23 @@ readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + 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== + version "3.0.4" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz#392ba37707af5bf62d725c36c1b5d6ef4119eefc" + integrity sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw== dependencies: - readable-stream "^3.6.0" + readable-stream "^4.7.0" readdirp@~3.6.0: version "3.6.0" @@ -11789,26 +11951,28 @@ redent@^3.0.0: strip-indent "^3.0.0" reflect-metadata@^0.1.10: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== -reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" @@ -11818,9 +11982,9 @@ regenerate@^1.4.2: integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" @@ -11829,33 +11993,41 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" -regexpu-core@^5.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== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: - "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: - jsesc "~0.5.0" + jsesc "~3.0.2" remark-parse@^10.0.0: version "10.0.2" @@ -11936,20 +12108,20 @@ resolve-package-path@^4.0.3: path-root "^0.1.1" resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.9.0: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -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== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -11981,23 +12153,23 @@ retry@^0.12.0: integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rimraf@2, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -12011,6 +12183,13 @@ rimraf@^4.4.1: dependencies: glob "^9.2.0" +rimraf@^5.0.0: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -12053,9 +12232,9 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" 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== + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" @@ -12066,39 +12245,48 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.0.0: +safe-push-apply@^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== + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" 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== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2: version "2.1.2" @@ -12113,9 +12301,9 @@ sanitize-filename@^1.6.3: truncate-utf8-bytes "^1.0.0" sax@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== saxes@^6.0.0: version "6.0.0" @@ -12124,10 +12312,10 @@ saxes@^6.0.0: 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" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -12140,7 +12328,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -12149,16 +12337,21 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - 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== +schema-utils@^4.0.0, schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== + seek-bzip@^1.0.5, seek-bzip@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" @@ -12188,17 +12381,15 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: - 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.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -12230,13 +12421,6 @@ 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" @@ -12244,41 +12428,29 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -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== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" - integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== - dependencies: - define-data-property "^1.1.2" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.1" - -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -12290,14 +12462,24 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" @@ -12344,24 +12526,45 @@ shell-path@^2.1.0: dependencies: shell-env "^0.3.0" -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + es-errors "^1.3.0" + object-inspect "^1.13.3" -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.2" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" @@ -12415,6 +12618,11 @@ slash@^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== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -12447,20 +12655,21 @@ snake-case@^3.0.4: tslib "^2.0.3" 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== + version "2.5.5" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" + integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== dependencies: - ws "~8.11.0" + debug "~4.3.4" + ws "~8.17.1" socket.io-client@^4.5.3: - version "4.7.2" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" - integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" + integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.5.2" + engine.io-client "~6.6.1" socket.io-parser "~4.2.4" socket.io-parser@~4.2.4: @@ -12472,15 +12681,15 @@ socket.io-parser@~4.2.4: debug "~4.3.1" socket.io@^4.5.3: - version "4.7.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" - integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" + integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== dependencies: accepts "~1.3.4" base64id "~2.0.0" cors "~2.8.5" debug "~4.3.2" - engine.io "~6.5.2" + engine.io "~6.6.0" socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" @@ -12502,12 +12711,21 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.3.3, socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - ip "^2.0.0" + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.3.3, socks@^2.6.2, socks@^2.8.3: + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== + dependencies: + ip-address "^9.0.5" smart-buffer "^4.2.0" sort-keys-length@^1.0.0: @@ -12536,10 +12754,10 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-loader@^2.0.1: version "2.0.2" @@ -12582,9 +12800,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -12595,9 +12813,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.21" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== split-on-first@^1.0.0: version "1.1.0" @@ -12625,7 +12843,7 @@ split@^1.0.1: dependencies: through "2" -sprintf-js@^1.1.2: +sprintf-js@^1.1.2, sprintf-js@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== @@ -12636,13 +12854,13 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== ssri@^10.0.0, ssri@^10.0.1: - version "10.0.5" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" - integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== dependencies: minipass "^7.0.3" -ssri@^9.0.1: +ssri@^9.0.0, ssri@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== @@ -12660,11 +12878,12 @@ statuses@2.0.1: integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: - internal-slot "^1.0.4" + es-errors "^1.3.0" + internal-slot "^1.1.0" stream-combiner@~0.0.4: version "0.0.4" @@ -12678,13 +12897,15 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -streamx@^2.15.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.1.tgz#396ad286d8bc3eeef8f5cea3f029e81237c024c6" - integrity sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA== +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" strict-uri-encode@^2.0.0: version "2.0.0" @@ -12706,14 +12927,6 @@ string-natural-compare@^2.0.3: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-2.0.3.tgz#9dbe1dd65490a5fe14f7a5c9bc686fc67cb9c6e4" integrity sha512-4Kcl12rNjc+6EKhY8QyDVuQTAlMWwRiNbsxnVwBUKFr7dYPQuXVrtNU4sEkjF9LHY0AY6uVbB3ktbkIH4LC+BQ== -string-replace-loader@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-3.1.0.tgz#11ac6ee76bab80316a86af358ab773193dd57a4f" - integrity sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ== - dependencies: - 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" @@ -12741,49 +12954,66 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -12874,7 +13104,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.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== @@ -12906,23 +13136,23 @@ strong-log-transformer@2.1.0, strong-log-transformer@^2.1.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== + version "7.1.1" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.1.1.tgz#f548fd9dc59d0a76d5567ff8c16be31221f29dfc" + integrity sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg== dependencies: "@tokenizer/token" "^0.3.0" - peek-readable "^5.0.0" + peek-readable "^5.1.3" style-dictionary@^3.7.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.8.0.tgz#7cb8d64360c53431f768d44def665f61e971a73e" - integrity sha512-wHlB/f5eO3mDcYv6WtOz6gvQC477jBKrwuIXe+PtHskTCBsJdAOvL8hCquczJxDui2TnwpeNE+2msK91JJomZg== + version "3.9.2" + resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.9.2.tgz#5b3ecd4af28a64f4855db71c90d24fd288f27318" + integrity sha512-M2pcQ6hyRtqHOh+NyT6T05R3pD/gwNpuhREBKvxC1En0vyywx+9Wy9nXWT1SZ9ePzv1vAo65ItnpA16tT9ZUCg== dependencies: chalk "^4.0.0" change-case "^4.1.2" commander "^8.3.0" fs-extra "^10.0.0" - glob "^7.2.0" + glob "^10.3.10" json5 "^2.2.2" jsonc-parser "^3.0.0" lodash "^4.17.15" @@ -12937,9 +13167,9 @@ style-loader@^2.0.0: schema-utils "^3.0.0" style-to-object@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" - integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" @@ -12972,20 +13202,13 @@ superagent@^7.1.5: readable-stream "^3.6.0" semver "^7.3.7" -supports-color@8.1.1, supports-color@^8.0.0: +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -13003,30 +13226,41 @@ symbol-tree@^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== -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@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== +tar-fs@^1.16.2: + version "1.16.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.4.tgz#d3f0e1edf164b821f086640b1f0596f004021dc8" + integrity sha512-u3XczWoYAIVXe5GOKK6+VeWaHjtc47W7hyuTo3+4cNakcCcuDmlkYiiHEsECwTkcI3h1VUgtwBQ54+RvY6cM4w== + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-fs@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== +tar-fs@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" tar-stream@^1.1.2, tar-stream@^1.5.2: version "1.6.2" @@ -13052,10 +13286,10 @@ tar-stream@^2.1.4, tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -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== +tar-stream@^3.1.4, tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" fast-fifo "^1.2.0" @@ -13074,9 +13308,9 @@ tar@6.1.11: yallist "^4.0.0" tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -13111,27 +13345,34 @@ temp@^0.9.1: mkdirp "^0.5.1" rimraf "~2.6.2" -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== +terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" -terser@^5.16.8: - version "5.21.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" - integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== +terser@^5.31.1: + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -13182,22 +13423,15 @@ tmp@^0.0.33: os-tmpdir "~1.0.2" 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== - dependencies: - rimraf "^3.0.0" + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - 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" @@ -13219,9 +13453,9 @@ token-types@^5.0.1: ieee754 "^1.2.1" 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== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -13289,9 +13523,9 @@ trim-repeated@^2.0.0: escape-string-regexp "^5.0.0" trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== truncate-utf8-bytes@^1.0.0: version "1.0.2" @@ -13324,10 +13558,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.0, tslib@^2.3.1, tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsutils@^3.21.0: version "3.21.0" @@ -13359,10 +13593,10 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.13.1: version "0.13.1" @@ -13412,64 +13646,70 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -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== +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" -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== +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.8" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -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== +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" -typed-array-length@^1.0.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== +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -"typescript@>=3 < 6": - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== - -typescript@^4.0.2, 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@>=3 < 6", typescript@^5.3.3, typescript@^5.4.5: + version "5.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" + integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== -typescript@~4.5.5: - version "4.5.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +typescript@~5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -13477,9 +13717,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== umd-compat-loader@^2.1.2: version "2.1.2" @@ -13490,17 +13730,17 @@ umd-compat-loader@^2.1.2: loader-utils "^1.0.3" recast "^0.11.17" -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" -unbzip2-stream@1.4.3, 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== @@ -13508,10 +13748,15 @@ unbzip2-stream@1.4.3, unbzip2-stream@^1.0.9, unbzip2-stream@^1.4.3: buffer "^5.2.1" through "^2.3.8" -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unfetch@^4.2.0: version "4.2.0" @@ -13519,9 +13764,9 @@ unfetch@^4.2.0: integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" @@ -13532,9 +13777,9 @@ unicode-match-property-ecmascript@^2.0.0: unicode-property-aliases-ecmascript "^2.0.0" 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== + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -13554,6 +13799,20 @@ unified@^10.0.0: trough "^2.0.0" vfile "^5.0.0" +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.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-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -13561,6 +13820,13 @@ unique-filename@^3.0.0: dependencies: unique-slug "^4.0.0" +unique-slug@^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== + dependencies: + imurmurhash "^0.1.4" + unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -13612,9 +13878,9 @@ unist-util-visit@^4.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== + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== universalify@^0.1.0: version "0.1.2" @@ -13627,9 +13893,9 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -13672,13 +13938,13 @@ upath@2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.1" upper-case-first@^2.0.2: version "2.0.2" @@ -13714,10 +13980,15 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -use-isomorphic-layout-effect@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + +use-isomorphic-layout-effect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz#afb292eb284c39219e8cb8d3d62d71999361a21d" + integrity sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w== user-home@^2.0.0: version "2.0.0" @@ -13727,9 +13998,9 @@ user-home@^2.0.0: 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== + version "1.0.5" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e" + integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -13757,12 +14028,12 @@ uuid@^7.0.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.0.0, uuid@^8.3.2: +uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -13807,7 +14078,7 @@ validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validat 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: +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== @@ -13821,6 +14092,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13893,9 +14169,9 @@ vscode-languageserver-protocol@^3.17.2: vscode-languageserver-types "3.17.5" vscode-languageserver-textdocument@^1.0.1: - version "1.0.11" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" - integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== vscode-languageserver-types@3.17.5: version "3.17.5" @@ -13907,10 +14183,10 @@ vscode-oniguruma@1.6.1: resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== -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-textmate@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-9.2.0.tgz#be2b04b3f8853135b2d67274670540215c5bb92b" + integrity sha512-rkvG4SraZQaPSN/5XjwKswdU0OP9MF28QjrYzUBbhb8QyG3ljB1Ky996m++jiI7KdiAP2CkBiQZd9pqEDTClqA== vscode-uri@^2.1.1: version "2.1.2" @@ -13924,10 +14200,10 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" -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== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -13940,9 +14216,9 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: 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== + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webidl-conversions@^3.0.0: version "3.0.1" @@ -13974,11 +14250,12 @@ webpack-cli@4.7.0: webpack-merge "^5.7.3" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: @@ -13987,33 +14264,32 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.76.0: - version "5.88.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@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" + version "5.98.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.98.0.tgz#44ae19a8f2ba97537978246072fb89d10d1fbd17" + integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.2.0" + schema-utils "^4.3.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.1" webpack-sources "^3.2.3" whatwg-encoding@^2.0.0: @@ -14044,44 +14320,45 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -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" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" - is-regex "^1.1.4" + is-regex "^1.2.1" is-weakref "^1.0.2" isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== +which-collection@^1.0.1, which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: version "2.0.1" @@ -14093,27 +14370,18 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== -which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - 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" - -which-typed-array@^1.1.13: - version "1.1.14" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" - integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== +which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.2: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: - available-typed-arrays "^1.0.6" - call-bind "^1.0.5" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.1" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" which@^1.2.9: version "1.3.1" @@ -14153,6 +14421,11 @@ winchan@^0.2.2: resolved "https://registry.yarnpkg.com/winchan/-/winchan-0.2.2.tgz#6766917b88e5e1cb75f455ffc7cc13f51e5c834e" integrity sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -14166,10 +14439,10 @@ 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== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" @@ -14253,20 +14526,15 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@8.11.0, 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== +ws@^8.13.0, ws@^8.17.1, ws@^8.18.0: + version "8.18.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" + integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== -ws@^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.13.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== xdg-basedir@^4.0.0: version "4.0.0" @@ -14303,10 +14571,10 @@ xmlchars@^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== +xmlhttprequest-ssl@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" + integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -14318,16 +14586,26 @@ xterm-addon-fit@^0.5.0: resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz#2d51b983b786a97dcd6cde805e700c7f913bc596" integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ== -xterm-addon-search@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz#be7aa74d5ff12c901707c6ff674229f214318032" - integrity sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg== +xterm-addon-fit@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz#48ca99015385141918f955ca7819e85f3691d35f" + integrity sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw== + +xterm-addon-search@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.13.0.tgz#21286f4db48aa949fbefce34bb8bc0c9d3cec627" + integrity sha512-sDUwG4CnqxUjSEFh676DlS3gsh3XYCzAvBPSvJ5OPgF3MRL3iHLPfsb06doRicLC2xXNpeG2cWk8x1qpESWJMA== xterm@^4.16.0: version "4.19.0" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== +xterm@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.3.0.tgz#867daf9cc826f3d45b5377320aabd996cb0fce46" + integrity sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg== + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -14358,6 +14636,11 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -14376,12 +14659,12 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@2.0.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== @@ -14434,7 +14717,7 @@ yargs@^17.0.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yauzl@^2.10.0, yauzl@^2.4.2: +yauzl@^2.10.0, yauzl@^2.4.2, yauzl@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== @@ -14446,3 +14729,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 7dafe7b0d35e8720ca7a37d9b52f3fe7efc3b702 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:53:46 +0900 Subject: [PATCH 371/384] feat: use Arduino CLI 1.2.0 (#2645) --- arduino-ide-extension/package.json | 2 +- .../cc/arduino/cli/commands/v1/board_pb.d.ts | 59 +++ .../cc/arduino/cli/commands/v1/board_pb.js | 482 +++++++++++++++++- .../cli/commands/v1/commands_grpc_pb.d.ts | 17 + .../cli/commands/v1/commands_grpc_pb.js | 34 ++ 5 files changed, 591 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 603398edb..953331109 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -172,7 +172,7 @@ ], "arduino": { "arduino-cli": { - "version": "1.1.1" + "version": "1.2.0" }, "arduino-fwuploader": { "version": "2.4.1" 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 74c87488c..01ff287d4 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.d.ts @@ -360,6 +360,8 @@ export class BoardListRequest extends jspb.Message { setTimeout(value: number): BoardListRequest; getFqbn(): string; setFqbn(value: string): BoardListRequest; + getSkipCloudApiForBoardDetection(): boolean; + setSkipCloudApiForBoardDetection(value: boolean): BoardListRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListRequest.AsObject; @@ -376,6 +378,7 @@ export namespace BoardListRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, timeout: number, fqbn: string, + skipCloudApiForBoardDetection: boolean, } } @@ -493,6 +496,8 @@ export class BoardListWatchRequest extends jspb.Message { clearInstance(): void; getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardListWatchRequest; + getSkipCloudApiForBoardDetection(): boolean; + setSkipCloudApiForBoardDetection(value: boolean): BoardListWatchRequest; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListWatchRequest.AsObject; @@ -507,6 +512,7 @@ export class BoardListWatchRequest extends jspb.Message { export namespace BoardListWatchRequest { export type AsObject = { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + skipCloudApiForBoardDetection: boolean, } } @@ -621,3 +627,56 @@ export namespace BoardSearchResponse { boardsList: Array<BoardListItem.AsObject>, } } + +export class BoardIdentifyRequest extends jspb.Message { + + hasInstance(): boolean; + clearInstance(): void; + getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; + setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): BoardIdentifyRequest; + + getPropertiesMap(): jspb.Map<string, string>; + clearPropertiesMap(): void; + getUseCloudApiForUnknownBoardDetection(): boolean; + setUseCloudApiForUnknownBoardDetection(value: boolean): BoardIdentifyRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BoardIdentifyRequest.AsObject; + static toObject(includeInstance: boolean, msg: BoardIdentifyRequest): BoardIdentifyRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BoardIdentifyRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BoardIdentifyRequest; + static deserializeBinaryFromReader(message: BoardIdentifyRequest, reader: jspb.BinaryReader): BoardIdentifyRequest; +} + +export namespace BoardIdentifyRequest { + export type AsObject = { + instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, + + propertiesMap: Array<[string, string]>, + useCloudApiForUnknownBoardDetection: boolean, + } +} + +export class BoardIdentifyResponse extends jspb.Message { + clearBoardsList(): void; + getBoardsList(): Array<BoardListItem>; + setBoardsList(value: Array<BoardListItem>): BoardIdentifyResponse; + addBoards(value?: BoardListItem, index?: number): BoardListItem; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BoardIdentifyResponse.AsObject; + static toObject(includeInstance: boolean, msg: BoardIdentifyResponse): BoardIdentifyResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BoardIdentifyResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BoardIdentifyResponse; + static deserializeBinaryFromReader(message: BoardIdentifyResponse, reader: jspb.BinaryReader): BoardIdentifyResponse; +} + +export namespace BoardIdentifyResponse { + export type AsObject = { + boardsList: Array<BoardListItem.AsObject>, + } +} diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js index 2625f2e0a..81abe9a99 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/board_pb.js @@ -28,6 +28,8 @@ goog.object.extend(proto, cc_arduino_cli_commands_v1_port_pb); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardDetailsResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentificationProperties', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListAllRequest', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListAllResponse', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.BoardListItem', null, global); @@ -465,6 +467,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardSearchResponse'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.displayName = 'proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.repeatedFields_, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.displayName = 'proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse'; +} @@ -3204,7 +3248,8 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.toObject = function(includeIns var f, obj = { instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), timeout: jspb.Message.getFieldWithDefault(msg, 2, 0), - fqbn: jspb.Message.getFieldWithDefault(msg, 3, "") + fqbn: jspb.Message.getFieldWithDefault(msg, 3, ""), + skipCloudApiForBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -3254,6 +3299,10 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.deserializeBinaryFromReader = var value = /** @type {string} */ (reader.readString()); msg.setFqbn(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipCloudApiForBoardDetection(value); + break; default: reader.skipField(); break; @@ -3305,6 +3354,13 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.serializeBinaryToWriter = func f ); } + f = message.getSkipCloudApiForBoardDetection(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -3381,6 +3437,24 @@ proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setFqbn = function(v }; +/** + * optional bool skip_cloud_api_for_board_detection = 4; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.getSkipCloudApiForBoardDetection = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListRequest.prototype.setSkipCloudApiForBoardDetection = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + /** * List of repeated fields within this message type. @@ -4230,7 +4304,8 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.toObject = func */ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.toObject = function(includeInstance, msg) { var f, obj = { - instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f) + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + skipCloudApiForBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -4272,6 +4347,10 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.deserializeBinaryFromRead reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); msg.setInstance(value); break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setSkipCloudApiForBoardDetection(value); + break; default: reader.skipField(); break; @@ -4309,6 +4388,13 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.serializeBinaryToWriter = cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter ); } + f = message.getSkipCloudApiForBoardDetection(); + if (f) { + writer.writeBool( + 2, + f + ); + } }; @@ -4349,6 +4435,24 @@ proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.hasInstance = f }; +/** + * optional bool skip_cloud_api_for_board_detection = 2; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.getSkipCloudApiForBoardDetection = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardListWatchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardListWatchRequest.prototype.setSkipCloudApiForBoardDetection = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + @@ -5172,4 +5276,378 @@ proto.cc.arduino.cli.commands.v1.BoardSearchResponse.prototype.clearBoardsList = }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.toObject = function(includeInstance, msg) { + var f, obj = { + instance: (f = msg.getInstance()) && cc_arduino_cli_commands_v1_common_pb.Instance.toObject(includeInstance, f), + propertiesMap: (f = msg.getPropertiesMap()) ? f.toObject(includeInstance, undefined) : [], + useCloudApiForUnknownBoardDetection: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest; + return proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new cc_arduino_cli_commands_v1_common_pb.Instance; + reader.readMessage(value,cc_arduino_cli_commands_v1_common_pb.Instance.deserializeBinaryFromReader); + msg.setInstance(value); + break; + case 2: + var value = msg.getPropertiesMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setUseCloudApiForUnknownBoardDetection(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getInstance(); + if (f != null) { + writer.writeMessage( + 1, + f, + cc_arduino_cli_commands_v1_common_pb.Instance.serializeBinaryToWriter + ); + } + f = message.getPropertiesMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(2, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = message.getUseCloudApiForUnknownBoardDetection(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional Instance instance = 1; + * @return {?proto.cc.arduino.cli.commands.v1.Instance} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.getInstance = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Instance} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Instance, 1)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Instance|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this +*/ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.setInstance = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.clearInstance = function() { + return this.setInstance(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.hasInstance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * map<string, string> properties = 2; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<string,string>} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.getPropertiesMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<string,string>} */ ( + jspb.Message.getMapField(this, 2, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.clearPropertiesMap = function() { + this.getPropertiesMap().clear(); + return this;}; + + +/** + * optional bool use_cloud_api_for_unknown_board_detection = 3; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.getUseCloudApiForUnknownBoardDetection = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyRequest.prototype.setUseCloudApiForUnknownBoardDetection = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.toObject = function(includeInstance, msg) { + var f, obj = { + boardsList: jspb.Message.toObjectList(msg.getBoardsList(), + proto.cc.arduino.cli.commands.v1.BoardListItem.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse; + return proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.cc.arduino.cli.commands.v1.BoardListItem; + reader.readMessage(value,proto.cc.arduino.cli.commands.v1.BoardListItem.deserializeBinaryFromReader); + msg.addBoards(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBoardsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.cc.arduino.cli.commands.v1.BoardListItem.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated BoardListItem boards = 1; + * @return {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.getBoardsList = function() { + return /** @type{!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.cc.arduino.cli.commands.v1.BoardListItem, 1)); +}; + + +/** + * @param {!Array<!proto.cc.arduino.cli.commands.v1.BoardListItem>} value + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.setBoardsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.cc.arduino.cli.commands.v1.BoardListItem=} opt_value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.BoardListItem} + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.addBoards = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.cc.arduino.cli.commands.v1.BoardListItem, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.BoardIdentifyResponse.prototype.clearBoardsList = function() { + return this.setBoardsList([]); +}; + + goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); 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 c267fec60..d41e71c12 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.d.ts @@ -32,6 +32,7 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition<grpc.Untyped boardList: IArduinoCoreServiceService_IBoardList; boardListAll: IArduinoCoreServiceService_IBoardListAll; boardSearch: IArduinoCoreServiceService_IBoardSearch; + boardIdentify: IArduinoCoreServiceService_IBoardIdentify; boardListWatch: IArduinoCoreServiceService_IBoardListWatch; compile: IArduinoCoreServiceService_ICompile; platformInstall: IArduinoCoreServiceService_IPlatformInstall; @@ -195,6 +196,15 @@ interface IArduinoCoreServiceService_IBoardSearch extends grpc.MethodDefinition< responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>; responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>; } +interface IArduinoCoreServiceService_IBoardIdentify extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse> { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardIdentify"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest>; + requestDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest>; + responseSerialize: grpc.serialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse>; + responseDeserialize: grpc.deserialize<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse>; +} interface IArduinoCoreServiceService_IBoardListWatch extends grpc.MethodDefinition<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse> { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch"; requestStream: false; @@ -528,6 +538,7 @@ export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementa boardList: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListRequest, cc_arduino_cli_commands_v1_board_pb.BoardListResponse>; boardListAll: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest, cc_arduino_cli_commands_v1_board_pb.BoardListAllResponse>; boardSearch: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse>; + boardIdentify: grpc.handleUnaryCall<cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse>; boardListWatch: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; compile: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_compile_pb.CompileRequest, cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; platformInstall: grpc.handleServerStreamingCall<cc_arduino_cli_commands_v1_core_pb.PlatformInstallRequest, cc_arduino_cli_commands_v1_core_pb.PlatformInstallResponse>; @@ -605,6 +616,9 @@ export interface IArduinoCoreServiceClient { boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; + boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall; + boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall; + boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall; boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; @@ -737,6 +751,9 @@ export class ArduinoCoreServiceClient extends grpc.Client implements IArduinoCor public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; public boardSearch(request: cc_arduino_cli_commands_v1_board_pb.BoardSearchRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardSearchResponse) => void): grpc.ClientUnaryCall; + public boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall; + public boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall; + public boardIdentify(request: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse) => void): grpc.ClientUnaryCall; public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; public boardListWatch(request: cc_arduino_cli_commands_v1_board_pb.BoardListWatchRequest, metadata?: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_board_pb.BoardListWatchResponse>; public compile(request: cc_arduino_cli_commands_v1_compile_pb.CompileRequest, options?: Partial<grpc.CallOptions>): grpc.ClientReadableStream<cc_arduino_cli_commands_v1_compile_pb.CompileResponse>; 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 17ea5b8c4..70dd7a851 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb.js @@ -74,6 +74,28 @@ function deserialize_cc_arduino_cli_commands_v1_BoardDetailsResponse(buffer_arg) return cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardIdentifyRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse(arg) { + if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardIdentifyResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_cc_arduino_cli_commands_v1_BoardListAllRequest(arg) { if (!(arg instanceof cc_arduino_cli_commands_v1_board_pb.BoardListAllRequest)) { throw new Error('Expected argument of type cc.arduino.cli.commands.v1.BoardListAllRequest'); @@ -1282,6 +1304,18 @@ boardSearch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardSearchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardSearchResponse, }, + // Identify a board using the given properties. +boardIdentify: { + path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardIdentify', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyRequest, + responseType: cc_arduino_cli_commands_v1_board_pb.BoardIdentifyResponse, + requestSerialize: serialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest, + requestDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardIdentifyRequest, + responseSerialize: serialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse, + responseDeserialize: deserialize_cc_arduino_cli_commands_v1_BoardIdentifyResponse, + }, // List boards connection and disconnected events. boardListWatch: { path: '/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardListWatch', From 0dff87e29c1d0d4f005fd0c94cd489498c749993 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:42:48 +0900 Subject: [PATCH 372/384] Updated translation files (#2597) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/af.json | 17 +- i18n/ar.json | 17 +- i18n/az.json | 17 +- i18n/be.json | 17 +- i18n/bg.json | 17 +- i18n/ca_ES.json | 17 +- i18n/cs.json | 333 +++++++++++++-------------- i18n/da.json | 17 +- i18n/de.json | 35 +-- i18n/el.json | 17 +- i18n/es.json | 19 +- i18n/eu.json | 17 +- i18n/fa.json | 17 +- i18n/fil.json | 17 +- i18n/fr.json | 223 +++++++++--------- i18n/he.json | 17 +- i18n/hu.json | 17 +- i18n/hy.json | 557 --------------------------------------------- i18n/id.json | 17 +- i18n/it.json | 17 +- i18n/ja.json | 17 +- i18n/ko.json | 17 +- i18n/my_MM.json | 17 +- i18n/ne.json | 17 +- i18n/nl.json | 17 +- i18n/no.json | 17 +- i18n/pl.json | 39 ++-- i18n/pt.json | 17 +- i18n/ro.json | 17 +- i18n/ru.json | 17 +- i18n/si.json | 17 +- i18n/sk.json | 557 --------------------------------------------- i18n/sr.json | 17 +- i18n/th.json | 563 +++++++++++++++++++++++----------------------- i18n/tr.json | 17 +- i18n/uk.json | 17 +- i18n/vi.json | 17 +- i18n/zh-Hant.json | 17 +- i18n/zh.json | 17 +- i18n/zh_TW.json | 17 +- 40 files changed, 973 insertions(+), 1897 deletions(-) delete mode 100644 i18n/hy.json delete mode 100644 i18n/sk.json diff --git a/i18n/af.json b/i18n/af.json index c6f4d2b10..4d3c5c0b9 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Aflaai", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketsboek ligging", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "oplaai", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/ar.json b/i18n/ar.json index c0df39480..5bb6fad40 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -275,6 +275,9 @@ "checkForUpdates": "جار التحقق من التحديثات لـ Arduino IDE", "closeAndInstallButton": "قم بالاغلاق و التحديث", "closeToInstallNotice": "اغلق البرمجية و حّدث الجهاز الخاص بك ", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "حمّل", "downloadingNotice": "يتم تحميل اخر نسخة من Arduino IDE", "errorCheckingForUpdates": "حدث خطأ اثناء البحث عن تحديثات للـ Arduino IDE \n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "موقع ملف المشاريع", "sketchbook.showAllFiles": "True لعرض كل مجلدات مشاريع داخل المشروع . False افتراضيا", - "survey.notification": "مفعل اذا اراد المستخدم ان يتم تبليغه في حالوجود استطلاع راي . مفعل بشكل افتراضي", "unofficialBoardSupport": "انقر لعرض قائمة عناوين URL للوحات المدعومة بشكل غير رسمي", "upload": "الرفع", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "مشروع سحابي جديد", "newSketch": "مشروع جديد" }, - "survey": { - "answerSurvey": "الاجابة على الاستبيان", - "dismissSurvey": "لا تظهر مرة اخرى", - "surveyMessage": "يرجى ان تساعدنا لنحسن ادائنا من خلال الاجابة على هذا الاستبيان القصير جدا . نحن نحترم المجتمع الخاص بنا و نريد ان نتعرف بشكل افضل على داعمينا " - }, "theme": { "currentThemeNotFound": "تعذر الحصول على السمة التي تم اختيارها : {0} . Arduino IDE اختار سمات موجودة مسبقا و متوافقة مع السمة الغير متوفرة", "dark": "غامق", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "لا يمكن استخدام المشروع '{0}' , {1} قم باعادة تسمية المشروع للتخلص من هذه الرسالة . هل تريد اعادة تسمية المشروع الان؟", "renameSketchFolderTitle": "اسم المشروع غير صالح" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' موجود مسبقا" } diff --git a/i18n/az.json b/i18n/az.json index a462a8dae..8eaa924b5 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Bağla Və Yüklə", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/be.json b/i18n/be.json index 8890f2c35..d57a5efbe 100644 --- a/i18n/be.json +++ b/i18n/be.json @@ -275,6 +275,9 @@ "checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino IDE", "closeAndInstallButton": "Зачыніць і ўсталяваць", "closeToInstallNotice": "Зачыніце праграмнае забеспячэнне і ўсталюйце абнаўленне на свой кампутар.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Спампаваць", "downloadingNotice": "Пампуе апошнюю версію Arduino IDE.", "errorCheckingForUpdates": "Памылка пры праверцы абнаўленняў Arduino IDE.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Месцазнаходжанне альбому з сцэнарамі", "sketchbook.showAllFiles": "Калі true, адлюстроўваюцца ўсе файлы сцэнараў унутры сцэнара.\nПершапачаткова false.", - "survey.notification": "Калі true, карыстальнікі павінны атрымліваць апавяшчэнні аб даступнасці апытання.\nПершапачаткова true.", "unofficialBoardSupport": "Пстрыкніце, каб праглядзець спіс адрасоў URL падтрымкі неафіцыйных плат", "upload": "выгрузіць", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Новы сцэнар у воблаку", "newSketch": "Новы сцэнар" }, - "survey": { - "answerSurvey": "Апытанне з адказамі", - "dismissSurvey": "Болей не адлюстроўваць", - "surveyMessage": "Калі ласка, дапамажыце нам стаць лепш, адказаўшы на гэтае звышкароткае апытанне.\nМы цэнім нашу супольнасць і хацелі б даведацца нашых прыхільнікаў трохі лепш." - }, "theme": { "currentThemeNotFound": "Не атрымалася знайсці абраную ў дадзены момант тэму: {0}.\nArduino IDE абрала ўбудаваную тэму, якая сумяшчальная з адсутнай.", "dark": "Цёмная", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Сцэнар '{0}' не можа быць ужыты.\n{1} Каб пазбавіцца ад гэтага паведамлення, пераназавіце сцэнар.\nЦі жадаеце вы пераназваць сцэнар?", "renameSketchFolderTitle": "Хібная назва сцэнара" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "{0}' ужо існуе." } diff --git a/i18n/bg.json b/i18n/bg.json index a36be5219..d564bf42c 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Местоположение на скицника", "sketchbook.showAllFiles": "True , за да се покажат всички файлове вътре в скицата. По подразбиране е false.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Щракнете за списък с неофициално поддържаните URL адреси на платки", "upload": "качване", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/ca_ES.json b/i18n/ca_ES.json index c39300d87..f14e61cc1 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -275,6 +275,9 @@ "checkForUpdates": "Comprova si hi ha actualitzacions de l'IDE d'Arduino", "closeAndInstallButton": "Tanca i instal·la", "closeToInstallNotice": "Tanqueu el programari i instal·leu l'actualització a la vostra màquina.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Descarrega", "downloadingNotice": "Descarregant de l'última versió de l'IDE d'Arduino.", "errorCheckingForUpdates": "S'ha produït un error en comprovar si hi ha actualitzacions de l'IDE d'Arduino.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Ubicació del quadern de programes", "sketchbook.showAllFiles": "Si està activat es mostraran els fitxers dins del programa. Per defecte està desactivat.", - "survey.notification": "Si està activat els usuaris seran notificats si hi ha una enquesta disponible. Per defecte està activat.", "unofficialBoardSupport": "Fes clic per obtenir una llista d'URLs de suport de plaques no oficials", "upload": "carrega", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Programa del núvol nou", "newSketch": "Programa nou" }, - "survey": { - "answerSurvey": "Contesta l'enquesta", - "dismissSurvey": "No ho tornes a mostrar", - "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": "No s'ha trobat el nom seleccionat: {0}. L'IDE d'Arduino ha agafat un tema compatible amb el que falta.", "dark": "Fosc", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "El programa \"{0}\" no es pot usar. {1} Per obtindre detalls del missatge, reanomena el programa. Vols reanomenar-lo ara?", "renameSketchFolderTitle": "El nom del programa no és vàlid" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "\"{0}\" ja existeix." } diff --git a/i18n/cs.json b/i18n/cs.json index 4226e419e..ea2270185 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -1,28 +1,28 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Verze: {0}\nDatum: {1}[2]\nVerze CLI: {3}{4} [{5}]\n\n{6}", "label": "O {0}" }, "account": { "goToCloudEditor": "Otevřít v cloudovém editoru", - "goToIoTCloud": "Go to IoT Cloud", + "goToIoTCloud": "Jít do IoT cloudu", "goToProfile": "Jdi do profilu", "menuTitle": "Arduino Cloud" }, "board": { "board": "Deska {0}", - "boardConfigDialogTitle": "Zvolit jinou Desku a Port", - "boardDataReloaded": "Board data reloaded.", + "boardConfigDialogTitle": "Zvolit jinou desku a port", + "boardDataReloaded": "Informace o desce znovunačteny", "boardInfo": "Info o desce", "boards": "Desky", - "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í? ", + "configDialog1": "Pokud chcete nahrát projekt do desky, musíte zvolit jak desku, tak i port.", + "configDialog2": "Pokud zvolíte pouze desku, budete schopni projekt kompilovat, ale nebudete jej moci nahrát do desky.", + "couldNotFindPreviouslySelected": "Dříve zvolená deska '{0}' v instalované platformě '{1}' nebyla nalezena. Zvolte prosím manuálně desku, kterou chcete použít. Chcete tuto desku zvolit nyní? ", "editBoardsConfig": "Editovat Desku a Port", - "getBoardInfo": "Získat info o desce.", + "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?", + "installNow": "Jádro \"{0}{1}\" musí být instalováno pro aktuálně zvolenou \"{2}\" desku. Chcete ho nyní nainstalovat?", "noBoardsFound": "Nenalezeny žádné desky pro \"{0}\"", "noNativeSerialPort": "Fyzický sériový port, nemohu získat informace.", "noPortsDiscovered": "Nenalezeny žádné porty", @@ -32,12 +32,12 @@ "port": "Port {0}", "ports": "porty", "programmer": "Programátor", - "reloadBoardData": "Reload Board Data", + "reloadBoardData": "Znovunačíst údaje o desce", "reselectLater": "Zvolit později", "revertBoardsConfig": "Použij '{0}' objeven na '{1}'", "searchBoard": "Vyhledat desku", "selectBoard": "Zvolit desku", - "selectBoardToReload": "Please select a board first.", + "selectBoardToReload": "Nejprve zvolte desku", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", "showAllAvailablePorts": "Zobrazit všechny dostupné porty (pokud je zaškrtnuto)", "showAllPorts": "Ukázat všechny porty", @@ -80,22 +80,22 @@ "checkForUpdates": "Kontrola pro aktualizace", "installAll": "Instalovat vše", "noUpdates": "Nejsou k dispozici žádné aktualizace", - "promptUpdateBoards": "Jsou k dispozici aktualizace pro některé z vašich desek ", + "promptUpdateBoards": "Pro některé z vašich desek jsou k dispozici aktualizace", "promptUpdateLibraries": "Jsou k dispozici aktualizace pro některé z vašich knihoven", "updatingBoards": "Aktualizuji desky...", "updatingLibraries": "Aktualizuji knihovny..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' nebylo nalezeno. Obsahuje váš projekt řádek '#include <Keyboard.h>'?", - "mouseError": "'Myš' nebyla nalezena. Obsahuje váš projekt řádek '#include <Mouse.h>'?" + "keyboardError": "‚Keyboard‘ nebylo nalezeno. Nechybí ve vašem projektu řádek ‚#include <Keyboard.h>‘?", + "mouseError": "‚Mouse‘ nebylo nalezeno. Nechybí ve vašem projektu řádek ‚#include <Mouse.h>‘?" }, "cloud": { - "chooseSketchVisibility": "Zvolte viditelnost sketche:", + "chooseSketchVisibility": "Zvolte viditelnost projektu:", "cloudSketchbook": "Cloudové umístění projektů", "connected": "Připojen", "continue": "Pokračovat", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "Dokončeno stahování '{0}'.", + "donePushing": "Dokončeno odesílání '{0}'.", "embed": "Vložit: ", "emptySketchbook": "Umístění projektů je prázdné", "goToCloud": "Jít na Cloud", @@ -105,92 +105,92 @@ "offline": "Nepřipojen", "openInCloudEditor": "Otevřít v cloudovém editoru", "options": "Možnosti...", - "privateVisibility": "Soukromá. Pouze vy můžete vidět tuto sketch.", + "privateVisibility": "Soukromý projekt. Pouze vy jej můžete vidět.", "profilePicture": "Profilový obrázek", - "publicVisibility": "Veřejná. Kdokoli s odkazem může vidět tuto sketch.", + "publicVisibility": "Veřejný projekt. Kdokoliv s tímto odkazem jej může vidět.", "pull": "Stáhnout", "pullFirst": "Nejprve musíte stáhnout z cloudu, aby bylo možno do něj odeslat.", - "pullSketch": "Stáhnout sketch", - "pullSketchMsg": "Stažením této sketche z cloudu přepíšete její lokální verzi. Chcete opravdu pokračovat?", + "pullSketch": "Stáhnout projekt", + "pullSketchMsg": "Stažení tohoto projektu z cloudu přepíše jeho místní verzi. Jste si jisti, že chcete pokračovat?", "push": "Odeslat", - "pushSketch": "Odeslat sketch", - "pushSketchMsg": "Toto je veřejná sketch. Před odesláním se prosím ujistěte že jsou smazané citlivé informace ze souboru arduino_secrets.h . Tuto sketch můžete změnit na soukromou v panelu pro sdílení. ", + "pushSketch": "Odeslat projekt", + "pushSketchMsg": "Toto je veřejný projekt. Před odesláním se prosím ujistěte, že všechny citlivé informace ze souboru arduino_secrets.h jsou smazané. Tento projekt můžete kdykoliv učinit znovu soukromým v panelu sdílení. ", "remote": "Vzdálený", "share": "Sdílet...", - "shareSketch": "Sdílet sketch", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "shareSketch": "Sdílet projekt", + "showHideSketchbook": "Zobrazit/skrýt cloudové projekty", "signIn": "Přihlásit se", "signInToCloud": "Přihlásit se do Arduino Cloud", "signOut": "Odhlásit se", "sync": "Synchronizovat", - "syncEditSketches": "Synchronizovat a editovat sketche v Arduino Cloud", - "visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudové sketche" + "syncEditSketches": "Synchronizujte a upravujte vaše Arduino cloudové projekty", + "visitArduinoCloud": "Navštivte Arduino Cloud pro vytvoření cloudového projektu." }, "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}'...", + "alreadyExists": "Cloudový projekt '{0}' již existuje.", + "creating": "Vytváření cloudového projektu '{0}'…", + "new": "Nový cloudový projekt", + "notFound": "Nepodařilo se odeslat cloudový projekt '{0}'. Neexistuje.", + "pulling": "Synchronizace projektů, odesílání '{0}'…", + "pushing": "Synchronizace projektů, odesílání '{0}'…", + "renaming": "Přejmenovávání cloudového projektu z '{0}' na '{1}'…", "synchronizingSketchbook": "Synchronizuji projekt..." }, "common": { "all": "Vše", - "contributed": "Contributed", + "contributed": "Přispěl", "installManually": "Instalovat ručně", "later": "Později", "noBoardSelected": "Nebyla zvolena deska", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Žádný otevřený projekt", "notConnected": "[nepřipojen]", - "offlineIndicator": "Nejspíše nejste online. Bez Internetového připojení nebude Arduino CLI schopno stáhnout potřebné zdroje a toto může způsobit chybu. Prosím připojte se k Internetu a restartujte aplikaci.", + "offlineIndicator": "Nejspíše jste offline. Bez Internetového připojení není Arduino CLI schopno stáhnout potřebné zdroje, a to může způsobit chybu. Prosím připojte se k internetu a restartujte aplikaci.", "oldFormat": "{0}používá stále starý formát `.pde`. Chcete ho převést na soubor s příponou `.ino`?", "partner": "Partner", "processing": "Zpracovávám", "recommended": "Doporučené", "retired": "Zastaralý", - "selectManually": "Select Manually", + "selectManually": "Zvolit ručně", "selectedOn": "zapnuto{0}", "serialMonitor": "Seriový monitor", "type": "typ", "unknown": "Neznámý", - "updateable": "Updatable", - "userAbort": "User abort" + "updateable": "Aktualizovatelné", + "userAbort": "Přerušení uživatelem" }, "compile": { "error": "Chyba kompilace: {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Desky obsažené v tomto balíku:", "by": "od", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "Klikněte pro otevření v prohlížeči: {0}", "filterSearch": "Filtrovat vyhledávání... ", "install": "Instalovat", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "Instalovat poslední", + "installVersion": "Instalovat {0}", + "installed": "{0} nainstalováno", "moreInfo": "Více informací", - "otherVersions": "Other Versions", + "otherVersions": "Ostatní verze", "remove": "Odstranit", - "title": "{0} by {1}", + "title": "{0} podle {1}", "uninstall": "Odinstalovat", "uninstallMsg": "Chcete odinstalovat {0}?", - "update": "Update" + "update": "Aktualizovat" }, "configuration": { "cli": { - "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + "inaccessibleDirectory": "Nepodařilo se získat přístup k lokaci projektu v '{0}': {1}" } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "Připojení ztraceno. Cloudové akce a aktualizace nebudou dostupné. " }, "contributions": { "addFile": "Přidat soubor", - "fileAdded": "Soubor byl přidán do sketche.", + "fileAdded": "Jeden soubor byl přidán do projektu.", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "Nepodařilo se otevřít sériový vykreslovač" }, "replaceTitle": "Vyměnit" }, @@ -203,27 +203,27 @@ } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "Kopírovat chybové hlášky", + "noBoardSelected": "Není vybraná žádná deska. Vyberte vaši desku z Nástroje > Deska nabídky." }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "Odeslat projekt do cloudu", "daemon": { - "restart": "Restart Daemon", + "restart": "Restartovat Daemon", "start": "Spustit Daemon", "stop": "Zastavit Daemon" }, "debug": { "debugWithMessage": "Debug - {0}", "debuggingNotSupported": "Debugging není podporován s '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Získat informace o ladění…", "noPlatformInstalledFor": "Platforma není nainstalována pro '{0}'", "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?" + "sketchIsNotCompiled": "Projekt '{0}' musí být ověřený před zahájením relace ladění. Ověřte projekt a zahajte ladění znovu. Přejete si ověřit projekt rovnou?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "Vyčistit historii seznamu desek", + "clearBoardsConfig": "Vymazat výběr desky a portu", + "dumpBoardList": "Vypsat seznam desek" }, "dialog": { "dontAskAgain": "Znovu se neptat" @@ -253,11 +253,11 @@ "failedInstall": "Instalace se nezdařila. Prosím zkuste to později. ", "install": "Instalovat", "installingFirmware": "Instaluji firmware.", - "overwriteSketch": "Instalace přepíše sketch na desce.", + "overwriteSketch": "Instalace přepíše projekt nahraný na desce.", "selectBoard": "Zvolit desku", "selectVersion": "Zvolit verzi firmwaru", "successfullyInstalled": "Firmware byl úspěšně nainstalován. ", - "updater": "Firmware Updater" + "updater": "aktualizační program firmwaru" }, "help": { "environment": "Prostředí", @@ -275,6 +275,9 @@ "checkForUpdates": "Zkontrolovat aktualizace", "closeAndInstallButton": "Zavřít a nainstalovat", "closeToInstallNotice": "Vypněte program a nainstalujte update na Váš stroj. ", + "donateLinkIconTitle": "otevřít stránku pro darování", + "donateLinkText": "darujte, abyste nás podpořili", + "donateText": "Open source is láska, {0}", "downloadButton": "Stáhnout", "downloadingNotice": "Stahuji poslední verzi Arduino IDE.", "errorCheckingForUpdates": "Nastala chyba při kontrole aktualizací Arduino IDE{0}", @@ -289,8 +292,8 @@ "versionDownloaded": "Arduino IDE {0}bylo staženo." }, "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." + "libraryInstallFailed": "Instalace knihovny '{0}{1}' se nezdařila. ", + "platformInstallFailed": "Instalace platformy '{0}{1}' se nezdařila. " }, "library": { "addZip": "Přidat .ZIP knihovnu...", @@ -298,10 +301,10 @@ "contributedLibraries": "Přispěné knihovny", "include": "Zahrnout knihovnu", "installAll": "Instalovat vše", - "installLibraryDependencies": "Install library dependencies", + "installLibraryDependencies": "Instalovat závislosti knihovny", "installMissingDependencies": "Chcete nainstalovat všechny chybějící závislosti? ", "installOneMissingDependency": "Chcete nainstalovat chybějící závislost? ", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Instalovat bez závislostí", "installedSuccessfully": "Knihovna {0}:{1}byla úspěšně nainstalována", "libraryAlreadyExists": "Knihovna již existuje. Chcete jí přepsat?", "manageLibraries": "Spravovat knihovny...", @@ -318,42 +321,42 @@ "topic": "Téma" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", + "communication": "Komunikace", + "dataProcessing": "Zpracovávání dat", + "dataStorage": "Ukládání dat", + "deviceControl": "Ovládání zařízení", + "display": "Displej", "other": "Jiné", "sensors": "Senzory", - "signalInputOutput": "Signal Input/Output", + "signalInputOutput": "Vstup/výstup signálu", "timing": "Časování", - "uncategorized": "Uncategorized" + "uncategorized": "Nezařazeno" }, "libraryType": { "installed": "Nainstalováno" }, "menu": { "advanced": "Pokročilé", - "sketch": "Sketch", + "sketch": "Projekt", "tools": "Nástroje" }, "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" + "alreadyConnectedError": "Nepovedlo se připojit k {0} {1} portu. Již připojeno.", + "baudRate": "{0} baudů", + "connectionFailedError": "Nepovedlo se připojit k {0} {1} portu.", + "connectionFailedErrorWithDetails": "{0} Nepovedlo se připojit k {1} {2} portu.", + "connectionTimeout": "Vypršel časový limit. IDE neobdrželo od sériového monitoru zprávu o úspěchu po úspěšném připojení", + "missingConfigurationError": "Nepovedlo se připojit k {0} {1} portu. Chybí konfigurace sériového monitoru.", + "notConnectedError": "Nepřipojeno k {0} {1} portu.", + "unableToCloseWebSocket": "Nelze uzavřít websocket", + "unableToConnectToWebSocket": "Nelze se připojit k websocketu" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Název nového cloudového projektu" }, "portProtocol": { "network": "Síť", - "serial": "Serial" + "serial": "Sériový" }, "preferences": { "additionalManagerURLs": "Další URL pro manager desek", @@ -364,41 +367,41 @@ "automatic": "Automaticky", "board.certificates": "Seznam certifikátů, které mohou být nahrány na desky", "browse": "Procházet", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Dostávejte oznámení o dostupných aktualizacích pro IDE, desky a knihovny. Po změně vyžaduje restart IDE. Ve výchozím nastavení zapnuto.", "choose": "Zvolit", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "Ano pokud je povolená automatická synchronizace sketche. Ano je výchozí hodnota. ", - "cloud.pull.warn": "Ano pokud by měl být uživatel varován před stahováním cloud sketche. Ano je výchozí hodnota. ", - "cloud.push.warn": "Ano pokud by měl být uživatel varován před odesláním cloud sketche. Ano je výchozí hodnota. ", - "cloud.pushpublic.warn": "Ano pokud by měl být uživatel varován před odesláním veřejné sketche do cloudu. Ano je výchozí hodnota. ", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", - "cloud.sketchSyncEndpoint": "Endpoint použitý pro stahování a odesílání sketchí z backendu. Ve výchozím stavu je toto směrováno na Arduino Cloud API.", + "cli.daemonDebug": "Zapnout ladící logování gRPC volání na Arduino CLI. Pro aplikaci tohoto nastavení je nutný restart IDE. Ve výchozím nastavení vypnuto.", + "cloud.enabled": "Zapnuto, pokud jsou zapnuty funkce synchonizace. Ve výchozím nastavení zapnuto.", + "cloud.pull.warn": "Zapnout, pokud uživatelé mají být varováni před stahování cloudového projektu. Ve výchozím nastavení zapnuto.", + "cloud.push.warn": "Zapnout, pokud uživatelé mají být varováni před odesláním cloudového projektu. Ve výchozím nastavení zapnuto.", + "cloud.pushpublic.warn": "Zapnout, pokud uživatelé mají být varováni před odesláním veřejného projektu do cloudu. Ve výchozím nastavení zapnuto. ", + "cloud.sharedSpaceId": "ID sdíleného prostoru Arduino Cloud, z nějž se načítají projekty. Pokud je prázdné, je vybrán váš soukromý prostor.", + "cloud.sketchSyncEndpoint": "Koncový bod používaný k odesílání a stahování projektů ze vzdáleného úložiště. Ve výchozím nastavení směřuje na API Arduino Cloud.", "compile": "kompilovat", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", + "compile.experimental": "Zapnout, pokud má IDE zpracovávat více chyb kompilátoru. Ve výchozím nastavení vypnuto.", + "compile.revealRange": "Upravuje způsob, jakým jsou chyby kompilátoru zobrazeny v editoru po neúspěšném ověření/nahrání. Možné hodnoty: „auto\": Posune zobrazení svisle podle potřeby a zobrazí řádek. „center\": Posune zobrazení svisle podle potřeby a zobrazí řádek ve středu. „top\": Posune zobrazení svisle podle potřeby a zobrazí řádek blízko horní části okna, optimalizováno pro zobrazení definice kódu. „centerIfOutsideViewport\": Posune zobrazení svisle podle potřeby a zobrazí řádek ve středu pouze pokud je mimo aktuální zobrazení. Výchozí hodnota je '{0}'.", "compile.verbose": "Ano pro podrobný výstup při kompilaci. Ne je výchozí hodnota. ", "compile.warnings": "Řekne gcc který stupeň varování se má použít. \"Žádný\" je výchozí hodnota. ", "compilerWarnings": "Varování kompileru", "editorFontSize": "Editor velikosti fontu", "editorQuickSuggestions": "Rychlá nápověda v editoru", "enterAdditionalURLs": "Vložte další URL, jednu pro každý řádek", - "files.inside.sketches": "Zobrazit soubory uvnitř sketche", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", + "files.inside.sketches": "Zobrazit soubory uvnitř projektů", + "ide.updateBaseUrl": "Základní URL, z níž se stahují aktualizace. Ve výchozím nastavení: 'https://downloads.arduino.cc/arduino-ide'.", "ide.updateChannel": "Výběr kanálu pro aktualizace. 'stable' pro stabilní vydání, 'nightly' pro nejnovější vývojové verze.", "interfaceScale": "Velikost rozhraní", "invalid.editorFontSize": "Neplatná velikost editoru písem: Toto číslo musí být kladné.", "invalid.sketchbook.location": "Neplatné umístění projektů:{0}", "invalid.theme": "Neplatné téma.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", - "language.log": "Ano pokud by jazykový server pro Arduino měl generovat logovací soubory do složky se sketchi, jinak ne. Ne je výchozí hodnota.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", + "language.asyncWorkers": "Počet asynchronních pracovníků – async workers – používaných Arduino Language Serverem (clangd). Indexování na pozadí používá také tento počet pracovníků. Minimální hodnota je 0 a maximální 8. Při hodnotě 0 používá jazykový server všechna dostupná jádra. Výchozí hodnota je 0.", + "language.log": "Zapnout, aby Arduino Language Server vytvářel soubory `.log` do složek projektů. Jinak vypnuto. Ve výchozím nastavení vypnuto. ", + "language.realTimeDiagnostics": "Pokud je zapnuto, jazykový server poskytuje diagnostiku v reálném čase při psaní v editoru. Ve výchozím nastavení vypnuto.", "manualProxy": "Ruční nastavení proxy", "monitor": { - "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." + "dockPanel": "Oblast aplikačního prostředí, kde bude umístěn widget _{0}_. Může být buď „bottom\" – dole – nebo „right\" – vpravo. Výchozí hodnota je „{1}\"." }, "network": "Síť", "newSketchbookLocation": "Zvolit nové umístění projektů", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "Nepovedlo se načíst CLI konfiguraci", "noProxy": "Bez proxy", "proxySettings": { "hostname": "Jméno hosta", @@ -408,71 +411,70 @@ }, "showVerbose": "Zobrazit podrobný výstup během", "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": "Cesta v souborovém systému k výchozí šabloně souborů `.ino`. Pokud je specifikována, obsah této šablony bude použit pro každý nový projekt vytvořený v IDE. Pokud není specifikována, projekty budou generovány s výchozím Arduino obsahem. Nedostupné šablony jsou ignorovány. Pro aplikaci tohoto nastavení **je potřeba restartovat IDE**." }, - "sketchbook.location": "Umístění sketche", - "sketchbook.showAllFiles": "Ano pro zobrazení všech souborů sketche. Ne je výchozí hodnota. ", - "survey.notification": "True if users should be notified if a survey is available. True by default.", + "sketchbook.location": "Umístění projektu", + "sketchbook.showAllFiles": "Zapnout zobrazování všech projektů uvnitř projektu. Ve výchozím nastavení vypnuto.", "unofficialBoardSupport": "Zde klikněte pro seznam adres neoficiálně podporovaných desek", "upload": "nahrát", - "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.autoVerify": "Zapnout, pokud má IDE automaticky ověřit kód před nahráním. Ve výchozím nastavení zapnuto. Pokud je tato hodnota vypnuta, IDE nekompiluje kód znovu před nahráním binárního souboru na desku. Nanejvýš důrazně se doporučuje nastavit tuto hodnotu na vypnuto pouze, pokud jste si naprosto jisti tím, že víte, co děláte.", "upload.verbose": "Ano pro podrobný výstup při nahrávání. Ne je výchozí hodnota. ", - "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "upload.verify": "Po nahrání ověřte, že obsah paměti na desce odpovídá nahranému binárnímu souboru.", "verifyAfterUpload": "Kontrolovat kód po nahrání", "window.autoScale": "Ano pokud se měřítko uživatelského prostředí automaticky mění s velikostí písma. ", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "Zastaralé. Použijte místo toho 'window.zoomLevel'." } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "Nový název cloudového projektu" }, "replaceMsg": "Vyměnit existující verzi {0}?", "selectZip": "Zvolte ZIP soubor s knihovnou kterou chcete přidat", "serial": { "autoscroll": "Autoscroll", "carriageReturn": "Enter (CR)", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "connecting": "Připojování k '{0}' na '{1}'…", + "message": "Zpráva (Enter pro odeslání zprávy do '{0}' na '{1}')", "newLine": "Nový řádek (NL)", "newLineCarriageReturn": "Oba NL & CR", "noLineEndings": "Bez konce řádku", "notConnected": "Nepřipojen. Zvolte desku a port pro automatické připojení.", - "openSerialPlotter": "Serial Plotter", + "openSerialPlotter": "Sériový vykreslovač", "timestamp": "Časová značka", "toggleTimestamp": "Přepnout časovou značku" }, "sketch": { - "archiveSketch": "Archivovat sketch", - "cantOpen": "Složka s názvem \"{0}\" již existuje, proto nemohu otevřít sketch. ", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", + "archiveSketch": "Archivovat projekt", + "cantOpen": "Složka s názvem \"{0}\" již existuje, proto nelze projekt otevřít. ", + "compile": "Kompiluji projekt…", + "configureAndUpload": "Nastavit a nahrát", "createdArchive": "Vytvořen archív '{0}'.", "doneCompiling": "Ověřování dokončeno.", "doneUploading": "Nahrávání dokončeno. ", - "editInvalidSketchFolderLocationQuestion": "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": "Chcete zkusit projekt uložit s jiným umístěním?", + "editInvalidSketchFolderQuestion": "Chcete zkusit projekt uložit s jiným názvem?", "exportBinary": "Exportovat kompilované soubory", - "invalidCloudSketchName": "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": "Název musí začínat písmenem, číslicí nebo podtržítkem, za nímž následují písmena, číslice, pomlčky, tečky a podtržítka. Maximální délka názvu činí 36 znaků.", + "invalidSketchFolderLocationDetails": "Projekt nelze uložit do složky uvnitř sebe sama.", + "invalidSketchFolderLocationMessage": "Neplatné umístění složky projektu: '{0}'", + "invalidSketchFolderNameMessage": "Neplatný název složky projektu '{0}'", + "invalidSketchName": "Název musí začínat písmenem, číslicí nebo podtržítkem, za nímž následují písmena, číslice, pomlčky, tečky a podtržítka. Maximální délka názvu činí 63 znaků.", "moving": "Přesouvám", - "movingMsg": "Soubor \"{0}\" musí být uvnitř složky která je shodná názvem \"{1}\".\nVytvořit složku, přesunout tam- soubor a pokračovat? ", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "movingMsg": "Soubor \"{0}\" musí být uvnitř složky pojmenované \"{1}\".\nVytvořit složku, přesunout do ní soubor a pokračovat?", + "new": "Nový projekt", + "noTrailingPeriod": "Název souboru nemůže končit tečkou", "openFolder": "Otevřít složku", "openRecent": "Otevřít nedávné", - "openSketchInNewWindow": "Otevřít sketch v novém okně", - "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "Uložit složku sketche jako...", - "saveSketch": "Uložte svůj sketch, abyste ho mohli znovu otevřít později.", - "saveSketchAs": "Uložit složku sketche jako...", - "showFolder": "Zobrazit složku sketche", - "sketch": "Sketch", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", + "openSketchInNewWindow": "Otevřít projekt v novém okně", + "reservedFilename": "'{0}' je vyhrazený název souboru.", + "saveFolderAs": "Uložit projekt jako…", + "saveSketch": "Uložte svůj projekt, abyste ho mohli znovu otevřít později.", + "saveSketchAs": "Uložit složku projektu jako…", + "showFolder": "Zobrazit složku projektu", + "sketch": "Projekt", + "sketchAlreadyContainsThisFileError": "Projekt již obsahuje soubor pojmenovaný ‚{0}‘", + "sketchAlreadyContainsThisFileMessage": "Nepovedlo se uložit projekt „{0}“ jako „{1}“. {2}", "sketchbook": "Projekty", "titleLocalSketchbook": "Složka lokálních projektů", "titleSketchbook": "Projekty", @@ -484,30 +486,25 @@ "verifyOrCompile": "Ověřit/Kompilovat" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Znovu nezobrazovat", - "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." + "newCloudSketch": "Nový cloudový projekt", + "newSketch": "Nový projekt" }, "theme": { - "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", - "dark": "Dark", - "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "Nelze najít aktuálně vybrané téma: {0}. Arduino IDE vybralo vestavěné téma kompatibilní s chybějícím tématem.", + "dark": "Tmavý", + "deprecated": "{0} (zastaralé)", + "hc": "Tmavý s vysokým kontrastem", + "hcLight": "Světlý s vysokým kontrastem", + "light": "Světlý", + "user": "{0} (uživatel)" }, "title": { "cloud": "Cloud" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "Aktualizovat indexy", + "updateLibraryIndex": "Aktualizovat index knihoven", + "updatePackageIndex": "Aktualizovat index balíků" }, "upload": { "error": "{0}chyba: {1}" @@ -518,22 +515,30 @@ "upload": "Nahrát" }, "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": "Projekt je stále neplatný. Přejete si opravit zbývající problémy? Kliknutím na '{0}' se otevře nový projekt.", + "abortFixTitle": "Neplatný projekt", + "renameSketchFileMessage": "Projekt '{0}' nelze použít. {1} Přejete si jej teď přejmenovat?", + "renameSketchFileTitle": "Neplatný název projektu", + "renameSketchFolderMessage": "Projekt '{0}' nelze použít. {1} Chcete-li se této zprávy zbavit, přejmenujte jej. Přejete si projekt teď přejmenovat?", + "renameSketchFolderTitle": "Neplatný název projektu" + }, + "versionWelcome": { + "cancelButton": "Možná později.", + "donateButton": "Darujte teď! 😀", + "donateMessage": "Arduino se zavázalo udržovat software zdarma a s otevřeným zdrojovým kódem pro všechny. Váš příspěvek nám pomáhá vyvíjet nové funkce, vylepšovat knihovny a podporovat miliony uživatelů po celém světě.", + "donateMessage2": "Zvažte prosím podporu naší práce na bezplatném a open source Arduino IDE.", + "title": "Vítejte v nové verzi Arduina IDE!", + "titleWithVersion": "Vítejte v novém Arduino IDE {0}!" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' již existuje." } }, "theia": { "core": { "cannotConnectBackend": "Nebylo možné se připojit k backendu. ", "cannotConnectDaemon": "Nebylo možné se připojit k CLI Daemon.", - "couldNotSave": "Nebylo možné uložit sketch. Zkopírujte prosím neuloženou práci do Vašeho oblíbeného textového editoru a restartujte IDE. ", + "couldNotSave": "Nebylo možné projekt uložit. Zkopírujte prosím neuloženou práci do vašeho oblíbeného textového editoru a restartujte IDE. ", "daemonOffline": "CLI Daemon nepřipojen", "offline": "Nepřipojen", "offlineText": "Nepřipojen", @@ -547,8 +552,8 @@ "expand": "Rozšířit" }, "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": "Cloudový projekt '{0}' bude navždy smazán z Arduino serverů a místní mezipaměti. Tato akce je nevratná. Přejete si pokračovat?", + "deleteCurrentSketch": "Projekt '{0}' bude navždy smazán. Tato akce je nevratná. Přejete si pokračovat?", "fileNewName": "Název pro nový soubor", "invalidExtension": ".{0}je neplatná přípona", "newFileName": "Nový název souboru" diff --git a/i18n/da.json b/i18n/da.json index 17cd55547..e6dbab0c0 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/de.json b/i18n/de.json index 392096cb1..0404d0bf5 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -12,12 +12,12 @@ }, "board": { "board": "Board{0}", - "boardConfigDialogTitle": " Anderes Board und anderen Ports wählen", - "boardDataReloaded": "Board data reloaded.", + "boardConfigDialogTitle": "Andere Boards und Ports wählen", + "boardDataReloaded": "Board Daten neu gelesen.", "boardInfo": "Board-Informationen", "boards": "Boards", "configDialog1": " Wähle ein Board und einen Port, wenn du den Sketch hochladen möchtest.", - "configDialog2": "Wenn Sie nur ein Board auswählen, werden Sie den Sketch nur kompilieren können, jedoch nicht hochladen.", + "configDialog2": " Wenn du nur das Board und keinen Port wählst, kannst du den Sketch kompilieren, aber nicht hochladen.", "couldNotFindPreviouslySelected": " Das vorher gewählte Board '{0}' gehört nicht zur installierten Plattform '{1}'. Möchtest du das Board neu auswählen?", "editBoardsConfig": "Board und Port ändern...", "getBoardInfo": "Board-Infos abrufen", @@ -32,12 +32,12 @@ "port": "Port{0}", "ports": "Ports", "programmer": "Programmer", - "reloadBoardData": "Reload Board Data", + "reloadBoardData": "Board Daten neuladen", "reselectLater": "Später auswählen", "revertBoardsConfig": "'{0}' an '{1}' verwenden", "searchBoard": "Board suchen", "selectBoard": "Board wählen", - "selectBoardToReload": "Please select a board first.", + "selectBoardToReload": "Bitte erst ein Board auswählen.", "selectPortForInfo": " Wähle einen Port, um Infos über das Board zu erhalten.", "showAllAvailablePorts": " Alle verfügbaren Ports anzeigen, wenn aktiviert.", "showAllPorts": "Alle Ports anzeigen", @@ -275,6 +275,9 @@ "checkForUpdates": "Arduino IDE Updates suchen", "closeAndInstallButton": "Schließen und Installieren", "closeToInstallNotice": "Software beenden und Update auf deinem Computer installieren", + "donateLinkIconTitle": "Öffne die Spenden Seite", + "donateLinkText": "Spenden um uns zu Unterstützen", + "donateText": "Open Source ist Liebe, {0}", "downloadButton": "Download", "downloadingNotice": "Die neueste Version der Arduino IDE wird heruntergeladen.", "errorCheckingForUpdates": "Fehler bei der Suche nach IDE Updates{0}", @@ -371,7 +374,7 @@ "cloud.pull.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Herunterladen eines Sketches aus der Cloud gewarnt. Standardmäßig aktiviert.", "cloud.push.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Hochladen eines Sketches in die Cloud gewarnt. Standardmäßig aktiviert. ", "cloud.pushpublic.warn": "Wenn diese Option aktiviert ist, werden Nutzer vor dem Hochladen eines öffentlichen Sketches in die Cloud gewarnt. Standardmäßig aktiviert. ", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", + "cloud.sharedSpaceId": "Die ID der Arduino-Cloud 'shared space' von welchem die Sketchbooks geladen werden sollen. Wenn leer, wird dein privater Bereich verwendet.", "cloud.sketchSyncEndpoint": "Endpunkt, um Sketches zu/von einem Backend zu laden. Standardeinstellung ist die Arduino Cloud API.", "compile": "Kompilieren", "compile.experimental": "Wenn diese Option aktiviert, werden mehrere Compiler-Fehler in der IDE gleichzeitig behandelt. Standardmäßig deaktiviert.", @@ -412,12 +415,11 @@ }, "sketchbook.location": "Pfad für Sketchbook", "sketchbook.showAllFiles": "Wenn diese Option aktiviert ist, werden alle Sketch-Dateien innerhalb des Sketches angezeigt. Standardmäßig deaktiviert. ", - "survey.notification": "Wenn diese Option aktiviert ist, werden Nutzer über eine verfügbare Umfrage informiert. Standardmäßig aktiviert.", "unofficialBoardSupport": "Klicke hier, um eine URL-Liste von inoffiziell unterstützten Boards anzuzeigen.", "upload": "Hochladen", - "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.autoVerify": "Wahr wenn die IDE automatisch den Code vor dem Hochladen verifizieren soll. Standard: Wahr. Wenn der Wert Falsch ist, wird die IDE den Code vor dem Upload der Binärdaten nicht noch einmal Kompilieren . Wirklich nur auf Falsch setzen wenn du genau weißt warum und was du tust!", "upload.verbose": "Wenn die Option aktiviert ist, werden ausführliche Compiler-Meldungen angezeigt. Standardmäßig deaktiviert.", - "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "upload.verify": "Verifiziere das hochzuladende Binary nach dem Hochladen im Speicher des Boards identisch ist.", "verifyAfterUpload": "Code nach Hochladen überprüfen ", "window.autoScale": "Wenn die Option aktiviert ist, skaliert die Nutzeroberfläche automatisch mit der Schriftgröße.", "window.zoomLevel": { @@ -487,11 +489,6 @@ "newCloudSketch": "Neuer Cloud-Sketch", "newSketch": "Neu" }, - "survey": { - "answerSurvey": "Umfrage beantworten", - "dismissSurvey": "Nicht erneut anzeigen", - "surveyMessage": "Helfen Sie uns, uns zu verbessern, indem Sie diese kurze Umfrage ausfüllen. Wir wissen unsere Community wertzuschätzen und möchten unsere Unterstützer gerne ein wenig besser kennenlernen." - }, "theme": { "currentThemeNotFound": "Das aktuell ausgewählte Theme konnte nicht gefunden werden: {0}. Die Arduino IDE hat ein eingebautes Theme ausgewählt, welches kompatibel mit dem fehlenden Theme ist.", "dark": "Dunkel", @@ -525,8 +522,16 @@ "renameSketchFolderMessage": "Der Sketch '{0}' kann nicht verwendet werden. {1} Um diese Meldung loszuwerden, muss der Sketch umbenannt werden. Möchtest du den Sketch jetzt umbenennen?", "renameSketchFolderTitle": "Ungültiger Sketch-Name" }, + "versionWelcome": { + "cancelButton": "Vielleicht später", + "donateButton": "Spende Jetzt", + "donateMessage": "Arduino verpflichtet sich die Software frei und quell-offen für alle zu bewahren. Deine Spende hilft uns neue Funktionalitäten, verbesserte Bibliotheken zu entwickeln, und hilft Millionen Benutzern Welt Weit.", + "donateMessage2": "Bitte denke über einen Unterstützung unserer Arbeit an der freien und quell-offenen Arduino IDE nach.", + "title": "Willkommen zu einer neuen Version der Arduino IDE!", + "titleWithVersion": "Willkommen zur neuen Arduino IDE {0}!" + }, "workspace": { - "alreadyExists": "{0} existiert bereits." + "alreadyExists": "'{0}' existiert bereits." } }, "theia": { diff --git a/i18n/el.json b/i18n/el.json index 45a2e65a9..11e3cf9d6 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -275,6 +275,9 @@ "checkForUpdates": "Ελέγξτε για νέες ενημερώσεις Arduino IDE", "closeAndInstallButton": "Κλείσιμο και εγκατάσταση", "closeToInstallNotice": "Κλείστε το πρόγραμμα και εγκαταστήστε την ενημέρωση στον υπολογιστή σας.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Κατεβάστε", "downloadingNotice": "Λήψη της πιο πρόσφατης έκδοσης του Arduino IDE.", "errorCheckingForUpdates": "Σφάλμα κατά τον έλεγχο για ενημερώσεις του Arduino IDE.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Τοποθεσία σχεδίων", "sketchbook.showAllFiles": "Αληθές για εμφάνιση όλων των αρχείων σχεδίου μεσα στο σχέδιο. Είναι ψευδές απο προεπιλογή.", - "survey.notification": "Σωστό εάν οι χρήστες πρέπει να ειδοποιούνται εάν υπάρχει διαθέσιμη έρευνα. Αληθές από προεπιλογή.", "unofficialBoardSupport": "Κλικ για λίστα Συνδέσμων ανεπίσημης υποστήριξης πλακετών", "upload": "ανέβασμα", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Νέο σχέδιο Cloud ", "newSketch": "Νέο Σχέδιο" }, - "survey": { - "answerSurvey": "Απάντηση στην έρευνα", - "dismissSurvey": "Να μην εμφανιστεί ξανά", - "surveyMessage": "Βοηθήστε μας να βελτιωθούμε απαντώντας σε αυτήν την εξαιρετικά σύντομη έρευνα. Εκτιμούμε την κοινότητά μας και θα θέλαμε να γνωρίσουμε λίγο καλύτερα τους υποστηρικτές μας." - }, "theme": { "currentThemeNotFound": "Δεν ήταν δυνατή η εύρεση του τρέχοντος επιλεγμένου θέματος:{0} . Το Arduino IDE έχει επιλέξει ένα ενσωματωμένο θέμα συμβατό με αυτό που λείπει.", "dark": "Σκοτεινό", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Το σχέδιο '{0}' δεν μπορεί να χρησιμοποιηθεί. {1}Για να απαλλαγείτε από αυτό το μήνυμα, μετονομάστε το σχέδιο. Θέλετε να μετονομάσετε το σχέδιο τώρα;", "renameSketchFolderTitle": "Μη έγκυρο όνομα σκίτσου" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' υπάρχει ήδη." } diff --git a/i18n/es.json b/i18n/es.json index c606772d4..01954663b 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -5,7 +5,7 @@ "label": "Acerca de {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", + "goToCloudEditor": "Ir a Arduino Cloud", "goToIoTCloud": "Go to IoT Cloud", "goToProfile": "Ir al Perfil", "menuTitle": "Arduino Cloud" @@ -275,6 +275,9 @@ "checkForUpdates": "Comprobar actualizaciones para Arduino IDE", "closeAndInstallButton": "Cerrar e instalar", "closeToInstallNotice": "Cierra el programa e instala la actualización en tu máquina.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Descargar", "downloadingNotice": "Descargando la última versión del Arduino IDE.", "errorCheckingForUpdates": "Error al comprobar las actualizaciones del IDE de Arduino.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Ruta del Sketchbook", "sketchbook.showAllFiles": "Verdadero para mostrar todos los archivos de bocetos dentro del boceto. Por defecto es falso.", - "survey.notification": "Verdadero si usuarios deberían ser notificados cuando una encuesta esté disponible. Verdadero es predeterminado.", "unofficialBoardSupport": "Pulsa para listar las URLs de las tarjetas no oficiales", "upload": "Carga", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Nuevo Sketch en la Nube", "newSketch": "New Sketch" }, - "survey": { - "answerSurvey": "Completar encuesta", - "dismissSurvey": "No volver a mostrar", - "surveyMessage": "Por favor ayudenos mejorar completando esta breve encuesta. Valoramos nuestra comunidad y nos gustaría conocer algo mejor a los que nos apoyan." - }, "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' ya existe." } diff --git a/i18n/eu.json b/i18n/eu.json index a0e3163ea..7b4afcf91 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Itxi eta instalatu", "closeToInstallNotice": "Itxi softwarea eta instalatu eguneratzea zure makinan.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Software eguneratzea", "downloadingNotice": "Arduino IDEren azken bertsioa deskargatzen", "errorCheckingForUpdates": "Errorea Arduino IDE eguneraketak egiaztatzean.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Programa bildumaren kokalekua", "sketchbook.showAllFiles": "Egia programaren barruko programa-fitxategi guztiak erakusteko. Lehenetsia gezurra da.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Egin klik ofizialak ez diren plaken laguntza-URL zerrenda ikusteko", "upload": "karga", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/fa.json b/i18n/fa.json index 8fba4156e..0b6f2e37f 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -275,6 +275,9 @@ "checkForUpdates": "به روز رسانی آردوینو IDE را بررسی کنید", "closeAndInstallButton": "بستن و نصب", "closeToInstallNotice": "نرم افزار را ببندید و به روز رسانی را روی دستگاه خود نصب کنید.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "دانلود", "downloadingNotice": "در حال بارگیری آخرین نسخه از آردوینو", "errorCheckingForUpdates": "خطا در حلقه بررسی برای وجود بروزرسانی برای آردوینو رخ داد. {0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "مکان منبع طرح ها", "sketchbook.showAllFiles": "همه فایل‌های طرح را در داخل طرح نشان دهد درست است. به طور پیش فرض نادرست است.", - "survey.notification": "درست است اگر در صورت وجود نظرسنجی به کاربران اطلاع داده شود. به طور پیش فرض درست است.", "unofficialBoardSupport": "برای لیستی از آدرس های اینترنتی پشتیبانی هیئت مدیره غیررسمی کلیک کنید", "upload": "بارگذاری", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "طرح جدید روی فضای ابری", "newSketch": "طرح جدید" }, - "survey": { - "answerSurvey": "به نظرسنجی پاسخ دهید", - "dismissSurvey": "دیگر نشان نده", - "surveyMessage": "لطفاً با پاسخ دادن به این نظرسنجی فوق العاده کوتاه ما را در پیشرفت خود یاری کنید. ما برای جامعه خود ارزش قائلیم و دوست داریم حامیان خود را کمی بهتر بشناسیم." - }, "theme": { "currentThemeNotFound": "طرح زمینه انتخابی فعلی یافت نشد:«{0}». پس Arduino IDE یک طرح زمینه داخلی سازگار با طرح زمینه یافت نشده انتخاب کرده است.", "dark": "تاریک", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "طرح«{0}» قابل استفاده نیست. «{1}» برای خلاص شدن از این پیام، نام طرح را تغییر دهید. اکنون می خواهید نام طرح را تغییر دهید؟", "renameSketchFolderTitle": "نام طرح بی‌اعتبار است" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' از قبل وجود دارد." } diff --git a/i18n/fil.json b/i18n/fil.json index e8bcc9c4e..266f8846d 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True para ipakita lahat ng sketch files sa loob ng isang sketch. Ito ay false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/fr.json b/i18n/fr.json index 29b80f3f3..916a94f4e 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -1,55 +1,55 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Version : {0}\nDate : {1}{2}\nVersion du CLI : {3}\n\n{4}", "label": "A propos de {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", + "goToCloudEditor": "Aller à l'éditeur du cloud", "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToProfile": "Aller au profil", "menuTitle": "Arduino Cloud" }, "board": { "board": "Carte{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardDataReloaded": "Board data reloaded.", + "boardConfigDialogTitle": "Sélectionner une autre carte et un autre port", + "boardDataReloaded": "Données de la carte rechargées.", "boardInfo": "Information de la carte", - "boards": "boards", + "boards": "cartes", "configDialog1": "Sélectionnez une carte et un port si vous souhaitez téléverser un croquis.", "configDialog2": "Si vous sélectionnez seulement une carte, vous pourrez compiler votre croquis, mais pas le téléverser.", "couldNotFindPreviouslySelected": "Impossible de trouver la carte précédente sélectionnée \"{0}\" dans les plateformes installées \"{1}\". Merci de re-sélectionner manuellement la carte que vous souhaitez utiliser. Souhaitez vous la re-sélectionner maintenant ?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "Modifier la carte et le port...", "getBoardInfo": "Obtenir les informations sur la carte", "inSketchbook": "(dans le Croquis)", "installNow": "Le \"{0} {1}\" core doit être installé pour la carte sélectionnée \"{2}\". Souhaitez vous l'installer maintenant ?", - "noBoardsFound": "No boards found for \"{0}\"", + "noBoardsFound": "Aucunes cartes trouvées pour \"{0}\"", "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", + "noPortsDiscovered": "Aucun ports découverts", "nonSerialPort": "Non-serial port, can't obtain info.", "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}", "ports": "ports", "programmer": "Programmeur", - "reloadBoardData": "Reload Board Data", + "reloadBoardData": "Recharger les données de la carte", "reselectLater": "Re-sélectionner plus tard", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", - "searchBoard": "Search board", + "revertBoardsConfig": "Utiliser '{0}' découvert sur '{1}'", + "searchBoard": "Rechercher une carte", "selectBoard": "Selectionner une carte", - "selectBoardToReload": "Please select a board first.", + "selectBoardToReload": "Merci de sélectionner une carte d’abord.", "selectPortForInfo": "Merci de choisir un port pour obtenir des informations sur la carte.", "showAllAvailablePorts": "Affiche les ports disponibles quand activer.", - "showAllPorts": "Show all ports", + "showAllPorts": "Afficher tous les ports", "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" + "unconfirmedBoard": "Carte non confirmée", + "unknownBoard": "Carte inconnue" }, - "boardsManager": "Gestionnaire de carte", + "boardsManager": "Gestionnaire de cartes", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "Arduino certifié" }, "bootloader": { "burnBootloader": "Graver la séquence d'initialisation", @@ -77,17 +77,17 @@ "uploadingCertificates": "Transfert des certificats" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "Vérifier les mises à jour d’Arduino", + "installAll": "Tout installer", + "noUpdates": "Il n'y a pas de mises à jour récentes disponibles.", + "promptUpdateBoards": "Des mises à jour sont disponibles pour certaines de vos cartes.", + "promptUpdateLibraries": "Des mises à jour sont disponibles pour certaines de vos bibliothèques.", + "updatingBoards": "Mise à jour des cartes...", + "updatingLibraries": "Mise à jour des bibliothèques..." }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "Clavier non trouvé. Votre croquis inclut-il la ligne '#include <Keyboard.h>' ?", + "mouseError": "'Mouse' non trouvé. Votre croquis inclut-il la ligne '#include <Mouse.h>' ?" }, "cloud": { "chooseSketchVisibility": "Choisissez la visibilité du croquis :", @@ -98,7 +98,7 @@ "donePushing": "Done pushing '{0}'.", "embed": "Embarqué : ", "emptySketchbook": "Votre carnet de croquis est vide", - "goToCloud": "Go to Cloud", + "goToCloud": "Aller au cloud", "learnMore": "En savoir plus", "link": "Lien :", "notYetPulled": "Impossible de push sur le Cloud. Rien n'a été pull jusque la.", @@ -118,7 +118,7 @@ "remote": "A distance", "share": "Partager...", "shareSketch": "Partager le croquis", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Montrer / Cacher le carnet de croquis du cloud.", "signIn": "Se connecter", "signInToCloud": "Se connecter à Arduino Cloud", "signOut": "Deconnexion", @@ -134,49 +134,49 @@ "pulling": "Synchronizing sketchbook, pulling '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "synchronizingSketchbook": "Synchroniser le carnet de croquis..." }, "common": { - "all": "All", + "all": "Tout", "contributed": "Contributed", "installManually": "Installer manuellement.", "later": "Plus tard", "noBoardSelected": "Aucune carte sélectionnée.", - "noSketchOpened": "No sketch opened", + "noSketchOpened": "Aucun croquis ouvert", "notConnected": "[hors ligne]", "offlineIndicator": "Il semblerait que vous êtes déconnecté. Sans connexion internet la CLI d'Arduino pourrait ne pas être en mesure de télécharger les resources requises, ce qui pourrait provoquer des dysfonctionnements. Merci de vous connecter à Internet et de redémarrer l'application.", "oldFormat": "Le '{0}' utilise toujours l'ancien format `.pde`. Souhaitez-vous utiliser le nouveau format `.ino`?", - "partner": "Partner", + "partner": "Partenaire", "processing": "Traitement en cours", - "recommended": "Recommended", - "retired": "Retired", - "selectManually": "Select Manually", + "recommended": "Recommandé", + "retired": "Retiré", + "selectManually": "Sélectionner manuellement", "selectedOn": "sur {0}", "serialMonitor": "Moniteur série", "type": "Type", "unknown": "Inconnu", - "updateable": "Updatable", - "userAbort": "User abort" + "updateable": "Pouvant être mis à jour", + "userAbort": "Abandon par l'utilisateur" }, "compile": { "error": "Erreur de compilation : {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "Cartes incluses dans ce paquet :", "by": "par", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "Cliquez pour ouvrir dans le navigateur : {0}", "filterSearch": "Filtrez votre recherche...", "install": "Installer", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "Installer la dernière", + "installVersion": "Installer {0}", + "installed": "{0} installé", "moreInfo": "Plus d'information", - "otherVersions": "Other Versions", + "otherVersions": "Autres versions", "remove": "Supprimer ", - "title": "{0} by {1}", + "title": "{0} par {1}", "uninstall": "Désinstaller", "uninstallMsg": "Voulez vous désinstaller {0}?", - "update": "Update" + "update": "Mettre à jour" }, "configuration": { "cli": { @@ -196,15 +196,15 @@ }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "Tout", + "default": "Par défaut", + "more": "Plus", + "none": "Aucun" } }, "coreContribution": { "copyError": "Copier les messages d'erreur", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "noBoardSelected": "Aucune carte sélectionnée. Merci de sélectionner votre carte Arduino dans le menu Outils > Carte." }, "createCloudCopy": "Push Sketch to Cloud", "daemon": { @@ -215,14 +215,14 @@ "debug": { "debugWithMessage": "Débogage - {0}", "debuggingNotSupported": "Le débogage n'est pas supporté pour '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Obtenir des informations de débogage...", "noPlatformInstalledFor": "La plateforme n'est pas installée pour '{0}'", "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", + "clearBoardsConfig": "Effacer la carte et la sélection du port ", "dumpBoardList": "Dump the Board List" }, "dialog": { @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Fermer et installer", "closeToInstallNotice": "Fermez le logiciel et installez la mise à jour sur votre machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "Faites un don pour nous soutenir", + "donateText": "Open source is love, {0}", "downloadButton": "Télécharger", "downloadingNotice": "Téléchargement de la dernière version de l'IDE Arduino.", "errorCheckingForUpdates": "Erreur lors de la vérification de la mise à jour de l'IDE Arduino.\n{0}", @@ -297,11 +300,11 @@ "arduinoLibraries": "Bibliothèques Arduino", "contributedLibraries": "Bibliothèques tierce-partie", "include": "Importer une bibliothèque", - "installAll": "Install All", - "installLibraryDependencies": "Install library dependencies", + "installAll": "Tout installer", + "installLibraryDependencies": "Installer les dépendances de la bibliothèque", "installMissingDependencies": "Souhaitez vous installer toutes les ressources liées manquantes ?", "installOneMissingDependency": "Souhaitez-vous installer la ressource liée manquante?", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "Installer sans les dépendances", "installedSuccessfully": "Librairie installée avec succès {0}:{1}", "libraryAlreadyExists": "Cette librairie existe déjà. Souhaitez-vous l'écraser ?", "manageLibraries": "Gérer les bibliothèques...", @@ -315,22 +318,22 @@ "zipLibrary": "Bibliothèque" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "Sujet" }, "libraryTopic": { "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "dataProcessing": "Traitement de données", + "dataStorage": "Stockage de données", + "deviceControl": "Contrôle d'appareil", + "display": "Affichage", + "other": "Autre", + "sensors": "Capteurs", + "signalInputOutput": "Signaux entrants/sortants", + "timing": "Synchronisation", + "uncategorized": "Non classé" }, "libraryType": { - "installed": "Installed" + "installed": "Installé" }, "menu": { "advanced": "Avancé", @@ -340,20 +343,20 @@ "monitor": { "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", + "connectionFailedError": "Impossible de se connecter au ports {0} {1}.", "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", + "connectionTimeout": "Délai d’attente dépassé. L’IDE n’a pas reçu le message de réussite du moniteur après s’être connecté avec succès", "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Impossible de fermer le web socket", "unableToConnectToWebSocket": "Impossible de se connecter au web socket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "Non du nouveau croquis Cloud" }, "portProtocol": { "network": "Réseau", - "serial": "Serial" + "serial": "Série" }, "preferences": { "additionalManagerURLs": "URL de gestionnaire de cartes supplémentaires", @@ -364,9 +367,9 @@ "automatic": "Automatique", "board.certificates": "Liste des certificats pouvant être téléversé vers les cartes.", "browse": "Parcourir", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", + "checkForUpdate": "Recevoir les notifications de mises à jour disponibles pour l’IDE, les cartes et les bibliothèques. Nécessite un redémarrage de l’IE après la modification. Activé par défaut.", "choose": "Choisir", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", + "cli.daemonDebug": "Activer la journalisation de débogage des appels gRPC vers le CLI Arduino. Un redémarrage de l’IDE est nécessaire pour que ce paramètre prenne effet. Désactivé par défaut.", "cloud.enabled": "Vrai si les fonctions de synchronisation de croquis est activé. Par défaut, la valeur est vrai.", "cloud.pull.warn": "Vrai si les utilisateurs devrait être averti avant de pull un croquis sur le cloud. Par défaut, la valeur est vrai.", "cloud.push.warn": "Vrai, si les utilisateurs devrait être averti avant de push un croquis sur le cloud. Par défaut, la valeur est vrai.", @@ -398,13 +401,13 @@ }, "network": "Réseau", "newSketchbookLocation": "Sélectionner la localisation du nouveau croquis.", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "Impossible de charger la configuration du CLI", "noProxy": "Aucun proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "Nom d'hôte", + "password": "Mot de passe", + "port": "Numéro de port", + "username": "Nom d'utilisateur" }, "showVerbose": "Afficher la sortie de débogage verbeuse pendant", "sketch": { @@ -412,7 +415,6 @@ }, "sketchbook.location": "Localisation du croquis.", "sketchbook.showAllFiles": "Vrai pour montrer tous les fichiers croquis à l'intérieur du croquis. La valeur par défaut est faux.", - "survey.notification": "Vrai si les utilisateurs doivent être avertis si une enquête est disponible. Vrai par défaut.", "unofficialBoardSupport": "Cliquer pour la liste non-officielle des URLs des support de cartes", "upload": "téléverser", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -451,21 +453,21 @@ "doneCompiling": "Compilation terminée.", "doneUploading": "Téléversement fait.", "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?", + "editInvalidSketchFolderQuestion": "Voulez-vous essayer d'enregistrer le croquis sous un autre nom?", "exportBinary": "Exporter les binaires compilés", "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", - "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", + "invalidSketchFolderLocationDetails": "Vous ne pouvez pas enregistrer un croquis dans un dossier qui lui est interne", "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", - "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", + "invalidSketchFolderNameMessage": "Nom de dossier de croquis invalide: '{0}'", "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", "moving": "Déplacement", "movingMsg": "Le fichier \"{0}\" à besoin d'être à l'intérieur d'un dossier de croquis appelé \"{1}\".\nCréer ce dossier, déplacer le fichier et continuer ?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "new": "Nouveau croquis", + "noTrailingPeriod": "Un nom de fichier ne peut pas se terminer par un point", "openFolder": "Ouvrir le dossier", "openRecent": "Ouvrir les récents", "openSketchInNewWindow": "Ouvrir le croquis dans une nouvelle fenêtre", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "'{0}' est un nom de fichier réservé.", "saveFolderAs": "Sauvegarder le dossier de croquis en tant que ...", "saveSketch": "Enregistrer son programme pour le rouvrir plus tard.", "saveSketchAs": "Sauvegarder un dossier de croquis comme ...", @@ -485,48 +487,51 @@ }, "sketchbook": { "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "survey": { - "answerSurvey": "Enquête sur les réponses", - "dismissSurvey": "Ne pas montrer de nouveau", - "surveyMessage": "Aide-nous à nous améliorer en répondant à cette enquête très courte. Nous apprécions notre communauté et nous aimerions connaître un peu mieux nos supporters." + "newSketch": "Nouveau croquis" }, "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", + "currentThemeNotFound": "Impossible de trouver le thème actuellement sélectionné : {0}. L'IDE Arduino a choisi un thème intégré compatible avec celui qui manque.", + "dark": "Sombre", "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", + "hc": "Sombre avec contraste élevé", + "hcLight": "Clair avec contraste élevé", + "light": "Clair", "user": "{0} (user)" }, "title": { "cloud": "Cloud" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "Mettre à jour les index", + "updateLibraryIndex": "Mettre à jour l’index des bibliothèques", + "updatePackageIndex": "Mettre à jour l’index des paquets" }, "upload": { "error": "{0} erreur : {1}" }, "userFields": { "cancel": "Annuler", - "enterField": "Enter {0}", + "enterField": "Saisir {0}", "upload": "Téléverser" }, "validateSketch": { - "abortFixMessage": "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": "Le croquis n’est toujours pas valide. Voulez -vous corriger les problèmes restants ? En cliquant sur '{0}', un nouveau croquis s’ouvrira.", + "abortFixTitle": "Croquis invalide", + "renameSketchFileMessage": "Le fichier de croquis '{0}' ne peut pas être utilisé. {1} Voulez-vous renommer le fichier de croquis maintenant ?", + "renameSketchFileTitle": "Nom de fichier du croquis invalide", + "renameSketchFolderMessage": "Le croquis '{0}' ne peut pas être utilisé. {1} Pour supprimer ce message, renommez le croquis. Voulez-vous renommer le croquis maintenant ?", + "renameSketchFolderTitle": "Nom de croquis invalide" + }, + "versionWelcome": { + "cancelButton": "Peut-être plus tard", + "donateButton": "Faire un don maintenant", + "donateMessage": "Arduino s’engage à garder les logiciels libres et gratuits pour tous. Votre don nous aide à développer de nouvelles fonctionnalités, à améliorer les bibliothèques et à soutenir des millions d’utilisateurs dans le monde entier.", + "donateMessage2": "Veuillez envisager de soutenir notre travail sur l’IDE Arduino gratuit et libre.", + "title": "Bienvenue dans une nouvelle version de l’IDE Arduino !", + "titleWithVersion": "Bienvenue dans le nouvel IDE Arduino {0}!" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' existe déjà." } }, "theia": { @@ -547,8 +552,8 @@ "expand": "Replier" }, "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": "Le croquis du cloud '{0}' sera définitivement supprimé des serveurs Arduino et des caches locaux. Cette action est irréversible. Voulez-vous supprimer le croquis actuel ?", + "deleteCurrentSketch": "Le croquis '{0}' sera définitivement supprimé. Cette action est irréversible. Voulez-vous supprimer le croquis actuel ?", "fileNewName": "Nouveau nom pour le fichier", "invalidExtension": "« .{0} » n''est pas une extension valide.", "newFileName": "Nouveau nom pour le fichier" diff --git a/i18n/he.json b/i18n/he.json index 66ed4846b..9b6c413cd 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -275,6 +275,9 @@ "checkForUpdates": "בדיקת עדכונים לArduino IDE", "closeAndInstallButton": "סגור והתקן", "closeToInstallNotice": "סגור את התוכנה והתקן את העדכון על המכונה שלך.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "הורד", "downloadingNotice": "מוריד את הגרסה המעודכנת האחרונה של Arduino IDE.", "errorCheckingForUpdates": "שגיאה בעת בדיקת עדכונים ל Arduino IDE.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, - "survey": { - "answerSurvey": "ענה על סקר", - "dismissSurvey": "אל תראה שוב.", - "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." - }, "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/hu.json b/i18n/hu.json index 0e4b75a22..d8ae57f3a 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "SketchBook elérési helye ", "sketchbook.showAllFiles": "Kipipálva: az összes vázlatfájl/sketch megjelenítése a vázlaton/sketch-en belül. Alapértelmezés szerint: nincs kipipálva.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Kattints ide a nem hivatalos alaplapok fordítási URL-jeinek listájához ", "upload": "feltöltés", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/hy.json b/i18n/hy.json deleted file mode 100644 index 17cd55547..000000000 --- a/i18n/hy.json +++ /dev/null @@ -1,557 +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", - "boardDataReloaded": "Board data reloaded.", - "boardInfo": "Board Info", - "boards": "boards", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "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}\"", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "nonSerialPort": "Non-serial port, can't obtain info.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "ports": "ports", - "programmer": "Programmer", - "reloadBoardData": "Reload Board Data", - "reselectLater": "Reselect later", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "selectBoardToReload": "Please select a board first.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "showAllPorts": "Show all ports", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." - }, - "burnBootloader": { - "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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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", - "noSketchOpened": "No sketch opened", - "notConnected": "[not connected]", - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "partner": "Partner", - "processing": "Processing", - "recommended": "Recommended", - "retired": "Retired", - "selectManually": "Select Manually", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable", - "userAbort": "User abort" - }, - "compile": { - "error": "Compilation error: {0}" - }, - "component": { - "boardsIncluded": "Boards included in this package:", - "by": "by", - "clickToOpen": "Click to open in browser: {0}", - "filterSearch": "Filter your search...", - "install": "Install", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", - "moreInfo": "More info", - "otherVersions": "Other Versions", - "remove": "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}'", - "getDebugInfo": "Getting debug info...", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging", - "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" - }, - "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" - }, - "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "Firmware Updater" - }, - "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" - }, - "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." - }, - "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "installAll": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", - "monitor": { - "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." - }, - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noCliConfig": "Could not load the CLI configuration", - "noProxy": "No proxy", - "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" - }, - "showVerbose": "Show verbose output during", - "sketch": { - "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." - }, - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", - "upload.verbose": "True for verbose upload output. False by default.", - "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." - } - }, - "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", - "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{1}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" - }, - "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", - "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", - "exportBinary": "Export Compiled Binary", - "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", - "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", - "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", - "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", - "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "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": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", - "user": "{0} (user)" - }, - "title": { - "cloud": "Cloud" - }, - "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" - }, - "upload": { - "error": "{0} error: {1}" - }, - "userFields": { - "cancel": "Cancel", - "enterField": "Enter {0}", - "upload": "Upload" - }, - "validateSketch": { - "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", - "abortFixTitle": "Invalid sketch", - "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", - "renameSketchFileTitle": "Invalid sketch filename", - "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", - "renameSketchFolderTitle": "Invalid sketch name" - }, - "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/id.json b/i18n/id.json index 8c60f75d2..095f55fdc 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Sketsa Cloud Baru", "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/it.json b/i18n/it.json index bdc3885df..584a54e5b 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -275,6 +275,9 @@ "checkForUpdates": "Controlla gli aggiornamenti dell'IDE di Arduino", "closeAndInstallButton": "Chiudi e Installa", "closeToInstallNotice": "Chiudi il software e installa l’aggiornamento sulla tua macchina", + "donateLinkIconTitle": "apri la pagina delle donazioni", + "donateLinkText": "dona per sostenerci", + "donateText": "L'open source è amore, {0}", "downloadButton": "Scarica", "downloadingNotice": "Stai scaricando l’ultima versione dell’Arduino IDE", "errorCheckingForUpdates": "Si è verificato un errore durante il controllo degli aggiornamenti per Arduino IDE {0}.", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Percorso della cartella degli sketch", "sketchbook.showAllFiles": "Vero per mostrare tutti i file relativi contenuti all'interno dello sketch. L'opzione predefinita è falso.", - "survey.notification": "Vero se gli utenti devono essere avvisati quando è disponibile un sondaggio. Vero per impostazione predefinita.", "unofficialBoardSupport": "Clicca per ottenere la lista di collegamenti per le schede di terze parti, non schede ufficiali.", "upload": "caricamento", "upload.autoVerify": "Vero se l'IDE deve verificare automaticamente il codice prima del caricamento. Vero per impostazione predefinita. Quando questo valore è falso, l'IDE non ricompila il codice prima di caricare il binario sulla scheda. Si consiglia di impostare questo valore su false solo se si sa cosa si sta facendo.", @@ -487,11 +489,6 @@ "newCloudSketch": "Nuovo sketch remoto", "newSketch": "Nuovo Sketch" }, - "survey": { - "answerSurvey": "Rispondi al questionario", - "dismissSurvey": "Non mostrare più", - "surveyMessage": "Aiutaci a migliorare rispondendo a questo brevissimo questionario. Abbiamo a cuore la nostra comunità e vorremmo conoscere meglio chi ci supporta!" - }, "theme": { "currentThemeNotFound": "Impossibile trovare il tema attualmente selezionato: {0}. Arduino IDE ha selezionato un tema integrato compatibile con quello mancante.", "dark": "Scuro", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Lo sketch '{0}' non può essere usato. {1} Per eliminare questo messaggio, rinomina lo sketch. Vuoi rinominare adesso lo sketch?", "renameSketchFolderTitle": "Il nome dello sketch non è valido" }, + "versionWelcome": { + "cancelButton": "Forse in seguito", + "donateButton": "Dona adesso", + "donateMessage": "Arduino si impegna a mantenere il software libero e open-source per tutti. La tua donazione ci aiuta a sviluppare nuove funzionalità, a migliorare le librerie e a supportare milioni di utenti in tutto il mondo.", + "donateMessage2": "Considera l'opportunità di sostenere il nostro lavoro sull'IDE open source gratuito di Arduino.", + "title": "Benvenuto nella nuova versione dell'IDE di Arduino!", + "titleWithVersion": "Benvenuto nel nuovo IDE di Arduino! {0}!" + }, "workspace": { "alreadyExists": "'{0}' è già presente." } diff --git a/i18n/ja.json b/i18n/ja.json index aca3aeaf0..3e0a869a1 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -275,6 +275,9 @@ "checkForUpdates": "Arduino IDEのアップデートを確認", "closeAndInstallButton": "終了してインストール", "closeToInstallNotice": "ソフトウェアを終了してアップデートをインストールする。", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "ダウンロード", "downloadingNotice": "Arduino IDEの最新版をダウンロード中です。", "errorCheckingForUpdates": "Arduino IDEの更新を確認中にエラーが発生しました。\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "スケッチブックの場所", "sketchbook.showAllFiles": "スケッチ内のすべてのスケッチファイルを表示するにはtrueを指定。デフォルトではfalse。", - "survey.notification": "アンケートが利用可能になったとき、通知を受け取る場合はTrueを指定します。デフォルトではTrue。", "unofficialBoardSupport": "クリックして非公式ボードをサポートするURLのリストを表示", "upload": "書き込み", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "新規クラウドスケッチ", "newSketch": "新規スケッチ" }, - "survey": { - "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "スケッチ'{0}'は使用できません。{1}このメッセージをなくすには、スケッチの名前を変えてください。今すぐスケッチ名を変更しますか?", "renameSketchFolderTitle": "無効なスケッチ名です" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}'は既に存在しています。" } diff --git a/i18n/ko.json b/i18n/ko.json index e00e56133..e20f83d77 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -275,6 +275,9 @@ "checkForUpdates": "Arduino IDE 업데이트 확인", "closeAndInstallButton": "닫고 설치하기", "closeToInstallNotice": "소프트웨어를 닫고 장치에 업데이트를 설치해주세요.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "다운로드", "downloadingNotice": "최신 버전의 Arduino IDE를 다운로드하고 있습니다.", "errorCheckingForUpdates": "Arduino IDE의 업데이트를 확인하던 중에 오류가 발생했어요.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "스케치북 위치", "sketchbook.showAllFiles": "스케치 내부의 모든 스케치 파일을 표시하려면 True입니다. 기본은 false입니다.", - "survey.notification": "설문조사를 사용할 수 있는 경우 사용자에게 알림을 보내야 하는 경우 True입니다. 기본은 True입니다.", "unofficialBoardSupport": "비공식 보드 지원 URL 목록을 보려면 클릭하십시오.", "upload": "업로드", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, - "survey": { - "answerSurvey": "설문조사 응답", - "dismissSurvey": "다시보지 않기", - "surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better." - }, "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "유효하지 않은 스케치 이름" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 88037a95a..66a465fb2 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -275,6 +275,9 @@ "checkForUpdates": "အာဒီနိုအိုင်ဒီအီးအပ်ဒိတ်များစစ်မည်", "closeAndInstallButton": "ပိတ်ပြီးသွင်းမယ်", "closeToInstallNotice": "ဆော့ဖ်ဝဲလ်ပိတ်ပြီး အသစ်ကိုသွင်းမယ်။", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "ဒေါင်းလုတ်ဆွဲမယ်", "downloadingNotice": "နောက်ဆုံးပေါ် Arduino IDE ဗားရှင်းကို ဒေါင်းလုတ်ဆွဲနေတယ်။", "errorCheckingForUpdates": "Arduino IDE အပ်ဒိတ်တွေအတွက် စစ်ဆေးနေတုန်း ပြဿနာတက်သွားတယ်။\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာ", "sketchbook.showAllFiles": "အမှန်ဖြစ်ပါက ကုတ်ဖိုင်လ်အတွင်း ဖိုင်လ်အားလုံးပြမည်။ မူရင်းတန်ဖိုး - အမှား", - "survey.notification": "စစ်တမ်းကောက်ပါက အသုံးပြုသူကို အသိပေးမည်။ မူရင်းတန်ဖိုး - အမှန်", "unofficialBoardSupport": "တရားမဝင်ဘုတ် ထောက်ပံ့မှုURLစာရင်းအတွက် ကလစ်လိုက်ပါ", "upload": "အပ်လုတ်တင်", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "New Cloud Sketch", "newSketch": "New Sketch" }, - "survey": { - "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/ne.json b/i18n/ne.json index 264a12494..fd1dcb9e4 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -275,6 +275,9 @@ "checkForUpdates": "Arduino IDE अपडेटहरूको लागि जाँच गर्नुहोस्", "closeAndInstallButton": "बन्द गरेर र स्थापना गर्नुहोस्", "closeToInstallNotice": "सफ्टवेयर बन्द गर्नुहोस् र आफ्नो मेसिनमा अपडेट स्थापना गर्नुहोस्।", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "डाउनलोड ", "downloadingNotice": "अर्डुइनो IDE को नवीनतम संस्करण डाउनलोड हुँदैछ।", "errorCheckingForUpdates": "अर्डुइनो IDE अपडेटहरूको लागि जाँच गर्दा त्रुटि भेटियो।\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "स्केचबुकको स्थान", "sketchbook.showAllFiles": "स्केच भित्र सबै स्केच फाइलहरू देखाउन सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा असक्षम छ।", - "survey.notification": "यदि सर्वेक्षण उपलब्ध छ भने प्रयोगकर्ताहरूलाई सूचित गरिनुपर्छ भने सही संकेत गर्नुहोस्। यो पूर्वनिर्धारित रूपमा सही छ।", "unofficialBoardSupport": "अनौपचारिक बोर्ड समर्थन गर्ने URL को सूचीको लागि क्लिक गर्नुहोस्", "upload": "अपलोड ", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "नयाँ क्लाउड स्केच", "newSketch": "नयाँ स्केच" }, - "survey": { - "answerSurvey": "सर्वेक्षणमा जवाफ दिनुहोस ", - "dismissSurvey": "फेरि नदेखाउनुहोस्", - "surveyMessage": "कृपया हामीलाई यो छोटो सर्वेक्षणको जवाफ दिएर सुधार गर्न मद्दत गर्नुहोस्। हामी हाम्रो समुदायको कदर गर्छौं र हाम्रा समर्थकहरूलाई अझ राम्रोसँग चिन्न चाहन्छौं।" - }, "theme": { "currentThemeNotFound": "हाल चयन गरिएको विषयवस्तु फेला पार्न सकेन: {0}। अर्डुइनो IDE ले नभएको विषयवस्तु सँग मिल्दो बिल्ट-इन थिम छनोट गरेको छ।", "dark": "गाढा ", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "स्केच '{0}' प्रयोग गर्न सकिँदैन। {1} यो सन्देशबाट छुटकारा पाउन, स्केचको नाम बदल्नुहोस्। के तपाई अहिले स्केचको नाम परिवर्तन गर्न चाहनुहुन्छ?", "renameSketchFolderTitle": "स्केचको नाम अमान्य छ" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' पहिले नै अवस्थित छ।" } diff --git a/i18n/nl.json b/i18n/nl.json index ddfa0dd30..f7bc5d843 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -275,6 +275,9 @@ "checkForUpdates": "Controleren op Arduino IDE-updates", "closeAndInstallButton": "Sluiten en installeren", "closeToInstallNotice": "Sluit de software en installeer de update op je machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Download de nieuwste versie van de Arduino IDE.", "errorCheckingForUpdates": "Fout bij het controleren op Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Schetsboek locatie", "sketchbook.showAllFiles": "Waar om al de schets bestanden in de schets weer te geven. Standaard ingesteld op onwaar.", - "survey.notification": "Waar als gebruikers een melding moeten krijgen als er een enquête beschikbaar is. Standaard is dit waar.", "unofficialBoardSupport": "Klik voor een lijst met onofficiële borden ondersteuning URL's", "upload": "uploaden", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Nieuwe Cloud Sketch", "newSketch": "Nieuwe schets" }, - "survey": { - "answerSurvey": "Antwoord enquête", - "dismissSurvey": "Niet meer tonen", - "surveyMessage": "Help ons alsjeblieft te verbeteren door deze super korte enquête te beantwoorden. We waarderen onze gemeenschap en willen onze supporters graag wat beter leren kennen." - }, "theme": { "currentThemeNotFound": "Kan het huidig geselecteerde thema niet vinden: {0}. Arduino IDE heeft een ingebouwd thema gekozen dat compatibel is met het ontbrekende.", "dark": "Donker", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "De schets '{0}' kan niet gebruikt worden. {1} Om van deze melding af te komen, hernoem de schets. Wil je de schets nu hernoemen?", "renameSketchFolderTitle": "Ongeldige schetsnaam" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' bestaat al." } diff --git a/i18n/no.json b/i18n/no.json index 4fe18ad78..739bec50d 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/pl.json b/i18n/pl.json index 201faf2b0..e7a290ba2 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -5,8 +5,8 @@ "label": "O {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", + "goToCloudEditor": "Przejdź do Edytora w Chmurze", + "goToIoTCloud": "Przejdź do IoT Cloud", "goToProfile": "Przejdź do profilu", "menuTitle": "Arduino Cloud" }, @@ -91,14 +91,14 @@ }, "cloud": { "chooseSketchVisibility": "Wybierz widoczność swojego Szkicu:", - "cloudSketchbook": "Cloud Sketchbook", + "cloudSketchbook": "Szkic w Chmurze", "connected": "Połączony", "continue": "Kontynuuj", "donePulling": "Done pulling '{0}'.", "donePushing": "Done pushing '{0}'.", "embed": "Osadzić:", "emptySketchbook": "Twój Szkicownik jest pusty", - "goToCloud": "Go to Cloud", + "goToCloud": "Przejdź do Chmury", "learnMore": "Dowiedz się więcej", "link": "Odnośnik:", "notYetPulled": "Nie można wysłać do chmury. Nie jest jeszcze wyciągnięty.", @@ -129,7 +129,7 @@ "cloudSketch": { "alreadyExists": "Cloud sketch '{0}' already exists.", "creating": "Creating cloud sketch '{0}'...", - "new": "New Cloud Sketch", + "new": "Nowy szkic w Chmurze", "notFound": "Could not pull the cloud sketch '{0}'. It does not exist.", "pulling": "Synchronizing sketchbook, pulling '{0}'...", "pushing": "Synchronizing sketchbook, pushing '{0}'...", @@ -206,7 +206,7 @@ "copyError": "Kopiuj komunikat błędu", "noBoardSelected": "Nie wybrano płytki. Proszę wybierz płytkę z Narzędzia > Lista płytek" }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "Wrzuć szkic do Chmury", "daemon": { "restart": "Restartuj Daemon", "start": "Start Daemon", @@ -215,7 +215,7 @@ "debug": { "debugWithMessage": "Debuguj - {0}", "debuggingNotSupported": "Debugowanie nie jest wspierane przez '{0}'", - "getDebugInfo": "Getting debug info...", + "getDebugInfo": "Pobieranie informacji debugowania", "noPlatformInstalledFor": "Platforma nie jest zainstalowana dla '{0}'", "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?" @@ -275,6 +275,9 @@ "checkForUpdates": "Sprawdź uaktualnienia dla Arduino IDE.", "closeAndInstallButton": "Wyjdź i instaluj", "closeToInstallNotice": "Zamknij aplikacje i zainstaluj aktualizacje.", + "donateLinkIconTitle": "Otwórz stronę pomocy dla projektu", + "donateLinkText": "Wesprzyj nasz projekt", + "donateText": "Open source is love, {0}", "downloadButton": "Pobierz", "downloadingNotice": "Pobieranie najnowszej wersji Arduino IDE.", "errorCheckingForUpdates": "Błąd podczas sprawdzania aktualizacji Arduino IDE.\n{0}", @@ -339,7 +342,7 @@ }, "monitor": { "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", + "baudRate": "1{0} baud", "connectionFailedError": "Could not connect to {0} {1} port.", "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Lokalizacja szkicownika", "sketchbook.showAllFiles": "Prawda, aby wyświetlać wszystkie pliki ze szkicu. Fałsz jest wartością domyślną.", - "survey.notification": "Prawdziwy, jeśli użytkownicy powinni być powiadamiani o dostępności ankiety. Domyślnie prawdwdziwy.", "unofficialBoardSupport": "Kliknij, aby przejść do listy linków nieoficjalnego wsparcia dla płytek.", "upload": "przesyłanie", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -484,14 +486,9 @@ "verifyOrCompile": "Weryfikuj/Kompiluj" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", + "newCloudSketch": "Nowy szkic w Chmurze", "newSketch": "New Sketch" }, - "survey": { - "answerSurvey": "Odpowiedz na ankietę", - "dismissSurvey": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają.", - "surveyMessage": "Pomóż nam się rozwijać wypełniając tą super krótką ankietę. Cenimy naszą społeczność i chcielibyśmy lepiej poznać tych którzy nas wspierają." - }, "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", @@ -502,7 +499,7 @@ "user": "{0} (user)" }, "title": { - "cloud": "Cloud" + "cloud": "Chmura" }, "updateIndexes": { "updateIndexes": "Aktualizuj indeksy", @@ -519,12 +516,20 @@ }, "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": "Nieprawidłowy szkic", "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", "renameSketchFileTitle": "Invalid sketch filename", "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Może później", + "donateButton": "Wspomóż projekt teraz", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Witaj w nowej wersji Arduino IDE!", + "titleWithVersion": "Witaj w Arduino IDE1{0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/pt.json b/i18n/pt.json index 4c33e7dae..fd7570180 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -275,6 +275,9 @@ "checkForUpdates": "Checar atualizações da Arduino IDE", "closeAndInstallButton": "Fechar e instalar ", "closeToInstallNotice": "Feche o software e instale a atualização em sua máquina. ", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Baixar", "downloadingNotice": "Baixando a versão mais recente do IDE do Arduino.", "errorCheckingForUpdates": "Erro ao verificar as atualizações do IDE do Arduino. {0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Localização do Caderno de Esboços", "sketchbook.showAllFiles": "Verdadeiro para mostrar todos os arquivos de esboço dentro do esboço. O padrão é falso.", - "survey.notification": "Verdadeiro se o usuário deve ser notificado se uma pesquisa estiver disponível. Verdadeiro por padrão", "unofficialBoardSupport": "Clique para obter uma lista de URLs de placas não oficiais suportadas", "upload": "enviar", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Novo Esboço na Nuvem", "newSketch": "Novo Esboço" }, - "survey": { - "answerSurvey": "Responder a pesquisa", - "dismissSurvey": "Não mostrar novamente", - "surveyMessage": "Por favor, ajude-nos a melhorar respondendo essa pequena pesquisa. Nós valorizamos nossa comunidade e gostaríamos de conhecer nossos colaboradores um pouco melhor." - }, "theme": { "currentThemeNotFound": "Não foi possível encontrar o tema selecionado atualmente: {0}. A IDE Arduino escolheu um tema embutido compatível com o que está faltando. ", "dark": "Escuro", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "O esboço '{0}' não pode ser usado. {1} Para se livrar dessa mensagem, renomeie o esboço. Você quer renomear o esboço agora?", "renameSketchFolderTitle": "Nome de esboço inválido." }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' já existe." } diff --git a/i18n/ro.json b/i18n/ro.json index 38e52b4d0..97950f0de 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "Adevărat pentru a afișa toate fișierele tip schița din interiorul schiței. Este fals în modul implicit.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "încarcă", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/ru.json b/i18n/ru.json index 1ee05dfad..33f53af0f 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -275,6 +275,9 @@ "checkForUpdates": "Проверка обновлений среды Arduino IDE", "closeAndInstallButton": "Закрыть и установить", "closeToInstallNotice": "Закройте программное обеспечение и установите обновление на вашем компьютере.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Скачать", "downloadingNotice": "Загрузка последней версии Arduino IDE.", "errorCheckingForUpdates": "Ошибка при проверке обновлений IDE Arduino.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Путь к альбому со скетчами", "sketchbook.showAllFiles": "True - показывать все файлы внутри скетча. По умолчанию - false.", - "survey.notification": "Включите, если пользователи должны получать уведомления, когда появится новый опрос. Включено по умолчанию.", "unofficialBoardSupport": "Список URL-адресов поддержки неофициальных плат", "upload": "выгрузке на плату", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Новый облачный скетч", "newSketch": "Новый скетч" }, - "survey": { - "answerSurvey": "Ответить на опрос", - "dismissSurvey": "Больше не показывать", - "surveyMessage": "Пожалуйста, помоги нам стать лучше, пройдя этот супер-короткий опрос. Мы ценим наше сообщество и хотели бы узнать наших сторонников немного лучше!" - }, "theme": { "currentThemeNotFound": "Не удалось найти текущую выбранную тему: {0}. Arduino IDE выбрала встроенную тему, совместимую с отсутствующей.", "dark": "Темный", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Скетч '{0}' не может быть использован. {1} Чтобы избавиться от этого сообщения, переименуйте скетч. Хотите ли вы переименовать скетч сейчас?", "renameSketchFolderTitle": "Неверное название скетча" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "{0} уже существует." } diff --git a/i18n/si.json b/i18n/si.json index 6015c08fa..d712e2a25 100644 --- a/i18n/si.json +++ b/i18n/si.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/sk.json b/i18n/sk.json deleted file mode 100644 index 17cd55547..000000000 --- a/i18n/sk.json +++ /dev/null @@ -1,557 +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", - "boardDataReloaded": "Board data reloaded.", - "boardInfo": "Board Info", - "boards": "boards", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "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}\"", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "nonSerialPort": "Non-serial port, can't obtain info.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "ports": "ports", - "programmer": "Programmer", - "reloadBoardData": "Reload Board Data", - "reselectLater": "Reselect later", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "selectBoardToReload": "Please select a board first.", - "selectPortForInfo": "Please select a port to obtain board info.", - "showAllAvailablePorts": "Shows all available ports when enabled", - "showAllPorts": "Show all ports", - "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", - "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports", - "unconfirmedBoard": "Unconfirmed board", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." - }, - "burnBootloader": { - "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 <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" - }, - "cloud": { - "chooseSketchVisibility": "Choose visibility of your Sketch:", - "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", - "continue": "Continue", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", - "embed": "Embed:", - "emptySketchbook": "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", - "noSketchOpened": "No sketch opened", - "notConnected": "[not connected]", - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "partner": "Partner", - "processing": "Processing", - "recommended": "Recommended", - "retired": "Retired", - "selectManually": "Select Manually", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable", - "userAbort": "User abort" - }, - "compile": { - "error": "Compilation error: {0}" - }, - "component": { - "boardsIncluded": "Boards included in this package:", - "by": "by", - "clickToOpen": "Click to open in browser: {0}", - "filterSearch": "Filter your search...", - "install": "Install", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", - "moreInfo": "More info", - "otherVersions": "Other Versions", - "remove": "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}'", - "getDebugInfo": "Getting debug info...", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging", - "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" - }, - "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" - }, - "dialog": { - "dontAskAgain": "Don't ask again" - }, - "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" - }, - "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" - }, - "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "Firmware Updater" - }, - "help": { - "environment": "Environment", - "faq": "Frequently Asked Questions", - "findInReference": "Find in Reference", - "gettingStarted": "Getting Started", - "keyword": "Type a keyword", - "privacyPolicy": "Privacy Policy", - "reference": "Reference", - "search": "Search on Arduino.cc", - "troubleshooting": "Troubleshooting", - "visit": "Visit Arduino.cc" - }, - "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", - "closeAndInstallButton": "Close and Install", - "closeToInstallNotice": "Close the software and install the update on your machine.", - "downloadButton": "Download", - "downloadingNotice": "Downloading the latest version of the Arduino IDE.", - "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", - "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", - "ideUpdaterDialog": "Software Update", - "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", - "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", - "notNowButton": "Not now", - "skipVersionButton": "Skip Version", - "updateAvailable": "Update Available", - "versionDownloaded": "Arduino IDE {0} has been downloaded." - }, - "installable": { - "libraryInstallFailed": "Failed to install library: '{0}{1}'.", - "platformInstallFailed": "Failed to install platform: '{0}{1}'." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "installAll": "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 <b>{0}:{1}</b> needs some other dependencies currently not installed:", - "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", - "overwriteExistingLibrary": "Do you want to overwrite the existing library?", - "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" - }, - "librarySearchProperty": { - "topic": "Topic" - }, - "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" - }, - "libraryType": { - "installed": "Installed" - }, - "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", - "baudRate": "{0} baud", - "connectionFailedError": "Could not connect to {0} {1} port.", - "connectionFailedErrorWithDetails": "{0} Could not connect to {1} {2} port.", - "connectionTimeout": "Timeout. The IDE has not received the 'success' message from the monitor after successfully connecting to it", - "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", - "notConnectedError": "Not connected to {0} {1} port.", - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" - }, - "portProtocol": { - "network": "Network", - "serial": "Serial" - }, - "preferences": { - "additionalManagerURLs": "Additional Boards Manager URLs", - "auth.audience": "The OAuth2 audience.", - "auth.clientID": "The OAuth2 client ID.", - "auth.domain": "The OAuth2 domain.", - "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", - "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", - "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", - "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", - "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", - "compile.experimental": "True if the IDE should handle multiple compiler errors. False by default", - "compile.revealRange": "Adjusts how compiler errors are revealed in the editor after a failed verify/upload. Possible values: 'auto': Scroll vertically as necessary and reveal a line. 'center': Scroll vertically as necessary and reveal a line centered vertically. 'top': Scroll vertically as necessary and reveal a line close to the top of the viewport, optimized for viewing a code definition. 'centerIfOutsideViewport': Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. The default value is '{0}'.", - "compile.verbose": "True for verbose compile output. False by default", - "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", - "editorQuickSuggestions": "Editor Quick Suggestions", - "enterAdditionalURLs": "Enter additional URLs, one for each row", - "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", - "interfaceScale": "Interface scale", - "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", - "monitor": { - "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." - }, - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", - "noCliConfig": "Could not load the CLI configuration", - "noProxy": "No proxy", - "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" - }, - "showVerbose": "Show verbose output during", - "sketch": { - "inoBlueprint": "Absolute filesystem path to the default `.ino` blueprint file. If specified, the content of the blueprint file will be used for every new sketch created by the IDE. The sketches will be generated with the default Arduino content if not specified. Unaccessible blueprint files are ignored. **A restart of the IDE is needed** for this setting to take effect." - }, - "sketchbook.location": "Sketchbook location", - "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "Click for a list of unofficial board support URLs", - "upload": "upload", - "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", - "upload.verbose": "True for verbose upload output. False by default.", - "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", - "verifyAfterUpload": "Verify code after upload", - "window.autoScale": "True if the user interface automatically scales with the font size.", - "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." - } - }, - "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" - }, - "replaceMsg": "Replace the existing version of {0}?", - "selectZip": "Select a zip file containing the library you'd like to add", - "serial": { - "autoscroll": "Autoscroll", - "carriageReturn": "Carriage Return", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{1}')", - "newLine": "New Line", - "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", - "notConnected": "Not connected. Select a board and a port to connect automatically.", - "openSerialPlotter": "Serial Plotter", - "timestamp": "Timestamp", - "toggleTimestamp": "Toggle Timestamp" - }, - "sketch": { - "archiveSketch": "Archive Sketch", - "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "compile": "Compiling sketch...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", - "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", - "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", - "exportBinary": "Export Compiled Binary", - "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", - "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", - "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", - "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", - "invalidSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.", - "moving": "Moving", - "movingMsg": "The file \"{0}\" needs to be inside a sketch folder named \"{1}\".\nCreate this folder, move the file, and continue?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", - "openFolder": "Open Folder", - "openRecent": "Open Recent", - "openSketchInNewWindow": "Open Sketch in New Window", - "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "Save sketch folder as...", - "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", - "upload": "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": "Dark High Contrast", - "hcLight": "Light High Contrast", - "light": "Light", - "user": "{0} (user)" - }, - "title": { - "cloud": "Cloud" - }, - "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" - }, - "upload": { - "error": "{0} error: {1}" - }, - "userFields": { - "cancel": "Cancel", - "enterField": "Enter {0}", - "upload": "Upload" - }, - "validateSketch": { - "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", - "abortFixTitle": "Invalid sketch", - "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", - "renameSketchFileTitle": "Invalid sketch filename", - "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", - "renameSketchFolderTitle": "Invalid sketch name" - }, - "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/sr.json b/i18n/sr.json index d1bad70cb..3486d25a8 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -275,6 +275,9 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Затвори и инсталирај", "closeToInstallNotice": "Затворите програм и покрените инсталацију надоградње на ваш рачунар.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Преузимање", "downloadingNotice": "Преузимање последње верзије Arduino IDE.", "errorCheckingForUpdates": "Грешка приликом провере надоградњи за Arduino IDE.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Локација радне свеске", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "спусти", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "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", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/i18n/th.json b/i18n/th.json index 656e98e00..621cff165 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -13,43 +13,43 @@ "board": { "board": "บอร์ด{0}", "boardConfigDialogTitle": "เลือกบอร์ดและพอร์ตอื่นๆ", - "boardDataReloaded": "Board data reloaded.", + "boardDataReloaded": "โหลดข้อมูลบอร์ดใหม่แล้ว", "boardInfo": "ข้อมูลบอร์ด", "boards": "บอร์ด", "configDialog1": "เลือกบอร์ดและพอร์ตที่คุณต้องการอัปโหลดโปรแกรมของคุณ", "configDialog2": "หากคุณแค่เลือกบอร์ดคุณจะสามารถคอมไพล์ได้ แต่สเก็ตช์ของคุณจะไม่ถูกอัปโหลด", "couldNotFindPreviouslySelected": "ไม่สามาถหาบอร์ด {0} ที่ถูกเลือกไว้ก่อนหน้านี้พบในแพลตฟอร์มที่ถูกติดตั้ง {1} กรุณาเลือกบอร์ดที่คุณต้องการใช้งานด้วยตัวเอง คุณต้องการเลือกใหม่ในตอนนี้หรือไม่?", - "editBoardsConfig": "Edit Board and Port...", + "editBoardsConfig": "แก้ไขบอร์ดและพอร์ต", "getBoardInfo": "เรียกดูข้อมูลของบอร์ด", "inSketchbook": "(ใน Sketchbook)", "installNow": "คอร์ \"{0}{1}\" ต้องถูกติดตั้งสำหรับบอร์ด \"{2}\" ที่ถูกเลือก คุณต้องการติดตั้งในตอนนี้หรือไม่?", "noBoardsFound": "ไม่พบบอร์ด \"{0}\"", - "noNativeSerialPort": "Native serial port, can't obtain info.", + "noNativeSerialPort": "พอร์ต Serial ดั้งเดิม ไม่สามารถรับข้อมูลได้", "noPortsDiscovered": "ไม่พบพอร์ต", - "nonSerialPort": "Non-serial port, can't obtain info.", + "nonSerialPort": "ไม่ใช่พอร์ต Serial ไม่สามารถรับข้อมูลได้", "openBoardsConfig": "เลือกบอร์ดอื่นและพอร์ต...", "pleasePickBoard": "กรุณาเลือกบอร์ดที่เชื่อมต่อกับพอร์ตที่คุณได้เลือกไว้", "port": "พอร์ต {0}", "ports": "พอร์ต", "programmer": "เครื่องโปรแกรม", - "reloadBoardData": "Reload Board Data", + "reloadBoardData": "โหลดข้อมูลบอร์ดใหม่", "reselectLater": "เลือกใหม่ในภายหลัง", - "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "revertBoardsConfig": "ใช้ '{0}' ค้นพบเมื่อ '{1}'", "searchBoard": "ค้นหาบอร์ด", "selectBoard": "เลือกบอร์ด", - "selectBoardToReload": "Please select a board first.", + "selectBoardToReload": "กรุณาเลือกบอร์ดก่อน", "selectPortForInfo": "กรุณาเลือกพอร์ตเพื่อดึงข้อมูลของบอร์ด", "showAllAvailablePorts": "แสดงพอร์ตทั้งหมดที่มีอยู่เมื่อเลือก", "showAllPorts": "แสดงพอร์ตทั้งหมด", "succesfullyInstalledPlatform": "ติดตั้งแพลตฟอร์ม {0}:{1} สำเร็จ", "succesfullyUninstalledPlatform": "ถอนการติดตั้งแพลตฟอร์ม {0}:{1} สำเร็จ", "typeOfPorts": "{0} พอร์ต", - "unconfirmedBoard": "Unconfirmed board", + "unconfirmedBoard": "บอร์ดไม่ได้รับการยืนยัน", "unknownBoard": "บอร์ดที่ไม่รู้จัก" }, "boardsManager": "ตัวจัดการบอร์ด", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "ได้รับการับรองจาก Arduino" }, "bootloader": { "burnBootloader": "เขียนบูทโหลดเดอร์", @@ -60,207 +60,207 @@ "error": "เกิดความผิดพลาดในขณะเขียนบูทโหลดเดอร์: {0}" }, "certificate": { - "addNew": "Add New", - "addURL": "Add URL to fetch SSL certificate", - "boardAtPort": "{0} at {1}", - "certificatesUploaded": "Certificates uploaded.", - "enterURL": "Enter URL", - "noSupportedBoardConnected": "No supported board connected", - "openContext": "Open context", - "remove": "Remove", - "selectBoard": "Select a board...", - "selectCertificateToUpload": "1. Select certificate to upload", - "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", + "addNew": "เพิ่มใหม่", + "addURL": "เพิ่ม URL เพื่อดึงใบรับรอง SSL", + "boardAtPort": "{0} ที่ {1}", + "certificatesUploaded": "อัปโหลดใบรับรองแล้ว", + "enterURL": "ใส่ URL", + "noSupportedBoardConnected": "ไม่มีบอร์ดที่รองรับเชื่อมต่ออยู่", + "openContext": "เปิดบริบท", + "remove": "นำออก", + "selectBoard": "เลือกบอร์ด...", + "selectCertificateToUpload": "1. เลือกใบรับรองที่จะอัปโหลด", + "selectDestinationBoardToUpload": "2. เลือกบอร์ดปลายทางเพื่ออัปโหลด", "upload": "อัปโหลด", - "uploadFailed": "Upload failed. Please try again.", - "uploadRootCertificates": "Upload SSL Root Certificates", - "uploadingCertificates": "Uploading certificates." + "uploadFailed": "อัปโหลดล้มเหลว โปรดลองอีกครั้ง", + "uploadRootCertificates": "อัปโหลดใบรับรองรูท SSL ", + "uploadingCertificates": "กำลังอัปโหลดใบรับรอง" }, "checkForUpdates": { - "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", - "noUpdates": "There are no recent updates available.", - "promptUpdateBoards": "Updates are available for some of your boards.", - "promptUpdateLibraries": "Updates are available for some of your libraries.", - "updatingBoards": "Updating boards...", - "updatingLibraries": "Updating libraries..." + "checkForUpdates": "ตรวจสอบการอัปเดต Arduino", + "installAll": "ติดตั้งทั้งหมด", + "noUpdates": "ไม่มีอัปเดต", + "promptUpdateBoards": "ต้องการอัปเดตบอร์ดหรือไม่?", + "promptUpdateLibraries": "ต้องการอัปเดตไลบรารีหรือไม่?", + "updatingBoards": "กำลังอัปเดตบอร์ด", + "updatingLibraries": "กำลังอัปเดตไลบรารี" }, "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include <Mouse.h>'?" + "keyboardError": "ไม่พบ 'Keyboard' ตรวจสอบว่าสเก็ตช์ของคุณมีบรรทัด '#include <Keyboard.h>' หรือไม่?", + "mouseError": " ไม่พบ 'Mouse' ตรวจสอบว่าโค้ดของคุณมีบรรทัด #include <Mouse.h> หรือไม่?" }, "cloud": { - "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." + "chooseSketchVisibility": "เลือกการเปิดเผยสเก็ตช์ของคุณ:", + "cloudSketchbook": "สมุดสเก็ตช์บนคลาวด์", + "connected": "เชื่อมต่อ", + "continue": "ดำเนินการต่อ", + "donePulling": "ดึงข้อมูลเสร็จสิ้น '{0}'", + "donePushing": "ส่งข้อมูลเสร็จสิ้น '{0}'", + "embed": "ฝัง:", + "emptySketchbook": "สมุดสเก็ตช์ของคุณว่างเปล่า", + "goToCloud": "ไปยัง Cloud", + "learnMore": "เรียนรู้เพิ่มเติม", + "link": "ลิ้งก์:", + "notYetPulled": " ไม่สามารถอัปโหลดไปยัง Cloud ได้ เนื่องจากยังไม่ได้ดึงข้อมูลลงมาก่อน", + "offline": "ออฟไลน์", + "openInCloudEditor": "เปิดใน Cloud Editor", + "options": "ตัวเลือก...", + "privateVisibility": "เป็นแบบส่วนตัว มีเพียงคุณเท่านั้นที่สามารถดู สเก็ตช์ ได้", + "profilePicture": "ภาพโปรไฟล์", + "publicVisibility": " เป็นแบบสาธารณะ ทุกคนที่มีลิงก์สามารถดู สเก็ตช์ ได้", + "pull": "ดึง", + "pullFirst": "คุณต้องดึงข้อมูลมาก่อน จึงจะสามารถอัปโหลดไปยัง Cloud ได้", + "pullSketch": "ดึง สเก็ตช์", + "pullSketchMsg": "การดึง สเก็ตช์ นี้จาก Cloud จะเขียนทับเวอร์ชันที่อยู่ในเครื่องของคุณ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "push": "ส่ง", + "pushSketch": "ส่ง สเก็ตช์", + "pushSketchMsg": " นี่คือ สเก็ตช์ สาธารณะ ก่อนอัปโหลด โปรดตรวจสอบว่าข้อมูลที่ละเอียดอ่อนถูกกำหนดไว้ในไฟล์ arduino_secrets.h แล้ว คุณสามารถทำให้ สเก็ตช์ เป็นแบบส่วนตัวได้จากเมนู แชร์", + "remote": "ระยะไกล", + "share": "แชร์...", + "shareSketch": "แชร์ สเก็ตช์", + "showHideSketchbook": "แสดง/ซ่อน Cloud Sketchbook", + "signIn": "ลงชื่อเข้าใช้", + "signInToCloud": "ลงชื่อเข้าใช้ Arduino Cloud", + "signOut": "ลงชื่อออก", + "sync": "ซิงค์", + "syncEditSketches": "ซิงค์และแก้ไข สเก็ตช์ ของคุณใน Arduino Cloud", + "visitArduinoCloud": "ไปที่ Arduino Cloud เพื่อสร้าง Cloud Sketches" }, "cloudSketch": { - "alreadyExists": "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": "Cloud Sketch ใหม่", + "notFound": "ไม่สามารถดึงสเก็ตช์จากคลาวด์ '{0}' สเก็ตช์นี้ไม่มีอยู่จริง", + "pulling": "กำลังซิงค์สมุดสเก็ตช์, ดึง '{0}'...", + "pushing": "กำลังซิงค์สมุดสเก็ตช์, กำลังอัปโหลด '{0}'...", + "renaming": "กำลังเปลี่ยนชื่อสเก็ตช์ในคลาวด์จาก '{0}' เป็น '{1}'...", + "synchronizingSketchbook": "กำลังซิงค์สมุดสเก็ตช์..." }, "common": { - "all": "All", - "contributed": "Contributed", - "installManually": "Install Manually", - "later": "Later", - "noBoardSelected": "No board selected", - "noSketchOpened": "No sketch opened", - "notConnected": "[not connected]", - "offlineIndicator": "You appear to be offline. Without an Internet connection, the Arduino CLI might not be able to download the required resources and could cause malfunction. Please connect to the Internet and restart the application.", - "oldFormat": "The '{0}' still uses the old `.pde` format. Do you want to switch to the new `.ino` extension?", - "partner": "Partner", - "processing": "Processing", - "recommended": "Recommended", - "retired": "Retired", - "selectManually": "Select Manually", - "selectedOn": "on {0}", + "all": "ทั้งหมด", + "contributed": "มีส่วนร่วม", + "installManually": "ติดตั้งด้วยตัวเอง", + "later": "ภายหลัง", + "noBoardSelected": "ไม่ได้เลือกบอร์ด :O", + "noSketchOpened": "ไม่ได้เปิด สเก็ตช์", + "notConnected": "[ไม่ได้เชื่อมต่อ]", + "offlineIndicator": "ดูเหมือนว่าคุณจะออฟไลน์อยู่ โดยไม่มีการเชื่อมต่ออินเทอร์เน็ต Arduino CLI อาจไม่สามารถดาวน์โหลดทรัพยากรที่จำเป็นและอาจทำให้เกิดการทำงานผิดปกติได้ กรุณาเชื่อมต่อกับอินเทอร์เน็ตและรีสตาร์ทแอปพลิเคชัน", + "oldFormat": "'{0}' ยังคงใช้รูปแบบเก่า .pde อยู่ คุณต้องการเปลี่ยนเป็นนามสกุลใหม่ .ino หรือไม่?", + "partner": "พาร์ทเนอร์", + "processing": "กำลังประมวลผล", + "recommended": "แนะนำ", + "retired": "ยกเลิกการใช้งาน", + "selectManually": "เลือกด้วยตัวเอง", + "selectedOn": "บน {0}", "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable", - "userAbort": "User abort" + "type": "ชนิด", + "unknown": "ไม่รู้จัก", + "updateable": "อัปเดตได้", + "userAbort": "การยกเลิกที่ผู้ใช้ทำเอง" }, "compile": { - "error": "Compilation error: {0}" + "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" + "boardsIncluded": "บอร์ดที่รวมอยู่ในแพ็คเกจนี้:", + "by": "โดย", + "clickToOpen": "คลิกเพื่อเปิดในเบราว์เซอร์: {0}", + "filterSearch": "กรองการค้นหาของคุณ...", + "install": "ติดตั้ง", + "installLatest": "ติดตั้งภายหลัง", + "installVersion": "ติดตั้ง {0}", + "installed": "ติดตั้ง {0} แล้ว", + "moreInfo": "ข้อมูลเพิ่มเติม", + "otherVersions": "เวอร์ชั่นก่อนหน้า", + "remove": "นำออก", + "title": "{0} โดย {1}", + "uninstall": "ถอนการติดตั้ง", + "uninstallMsg": "คุณต้องการถอนการติดตั้ง {0}?", + "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": "Add File", - "fileAdded": "One file added to the sketch.", + "addFile": "เพิ่มไฟล์", + "fileAdded": "เพิ่มไฟล์หนึ่งไฟล์ลงในสเก็ตช์", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "ไม่สามารถเปิด Serial Plotter ได้" }, - "replaceTitle": "Replace" + "replaceTitle": "แทนที" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "all": "ทั้งหมด", + "default": "ค่าเริ่มต้น", + "more": "อื่นๆ", + "none": "ว่าง" } }, "coreContribution": { - "copyError": "Copy error messages", - "noBoardSelected": "No board selected. Please select your Arduino board from the Tools > Board menu." + "copyError": "คัดลอกข้อความแสดงข้อผิดพลาด", + "noBoardSelected": "ยังไม่ได้เลือกบอร์ด กรุณาเลือกบอร์ด Arduino ของคุณจากเมนู เครื่องมือ > บอร์ด" }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "อัพโหลดสเก็ตช์ขึ้นคลาวด์", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "รีสตาร์ท Daemon", + "start": "เริ่ม Daemon", + "stop": "หยุด Daemon" }, "debug": { - "debugWithMessage": "Debug - {0}", - "debuggingNotSupported": "Debugging is not supported by '{0}'", - "getDebugInfo": "Getting debug info...", - "noPlatformInstalledFor": "Platform is not installed for '{0}'", - "optimizeForDebugging": "Optimize for Debugging", - "sketchIsNotCompiled": "Sketch '{0}' must be verified before starting a debug session. Please verify the sketch and start debugging again. Do you want to verify the sketch now?" + "debugWithMessage": "ดีบัก - {0}", + "debuggingNotSupported": "'{0}' ไม่รองรับการดีบัก", + "getDebugInfo": "กำลังรับข้อมูลการดีบัก", + "noPlatformInstalledFor": "ไม่ได้ติดตั้งแฟลตฟอร์มสำหรับ '{0}'", + "optimizeForDebugging": "ปรับให้เหมาะสมสำหรับการดีบัก", + "sketchIsNotCompiled": "สเก็ตช์ '{0}' ต้องได้รับการตรวจสอบก่อนเริ่มการดีบัก กรุณาตรวจสอบสเก็ตช์แล้วลองดีบักอีกครั้ง คุณต้องการตรวจสอบสเก็ตช์ตอนนี้หรือไม่?" }, "developer": { - "clearBoardList": "Clear the Board List History", - "clearBoardsConfig": "Clear the Board and Port Selection", - "dumpBoardList": "Dump the Board List" + "clearBoardList": "ล้างประวัติรายการบอร์ด", + "clearBoardsConfig": "ล้างการเลือกบอร์ดและพอร์ต", + "dumpBoardList": "แสดงรายการบอร์ด" }, "dialog": { - "dontAskAgain": "Don't ask again" + "dontAskAgain": "อย่าถามอีก 😠" }, "editor": { - "autoFormat": "Auto Format", - "commentUncomment": "Comment/Uncomment", - "copyForForum": "Copy for Forum (Markdown)", - "decreaseFontSize": "Decrease Font Size", - "decreaseIndent": "Decrease Indent", - "increaseFontSize": "Increase Font Size", - "increaseIndent": "Increase Indent", - "nextError": "Next Error", - "previousError": "Previous Error", - "revealError": "Reveal Error" + "autoFormat": "จัดรูปแบบอัตโนมัติ", + "commentUncomment": "คอมเมนต์/ยกเลิกคอมเมนต์", + "copyForForum": "คัดลอกสำหรับฟอรั่ม (Markdown)", + "decreaseFontSize": "ลดขนาดฟอนต์", + "decreaseIndent": "ลดการเยื้อง", + "increaseFontSize": "เพิ่มขนาดฟอนต์", + "increaseIndent": "เพิ่มการเยื้อง", + "nextError": "ข้อผิดพลาดถัดไป", + "previousError": "ข้อผิดพลาดก่อนหน้า", + "revealError": "ดูข้อผิดพลาด" }, "examples": { - "builtInExamples": "Built-in examples", - "couldNotInitializeExamples": "Could not initialize built-in examples.", - "customLibrary": "Examples from Custom Libraries", - "for": "Examples for {0}", - "forAny": "Examples for any board", - "menu": "Examples" + "builtInExamples": "ตัวอย่างที่มีมาให้", + "couldNotInitializeExamples": "ไม่สามารถเริ่มต้นตัวอย่างที่มีมาให้", + "customLibrary": "ตัวอย่างจากไลบรารีที่กำหนดเอง", + "for": "ตัวอย่างสำหรับ {0}", + "forAny": "ตัวอย่างสำหรับบอร์ดใดก็ได้", + "menu": "ตัวอย่าง" }, "firmware": { - "checkUpdates": "Check Updates", - "failedInstall": "Installation failed. Please try again.", - "install": "Install", - "installingFirmware": "Installing firmware.", - "overwriteSketch": "Installation will overwrite the Sketch on the board.", + "checkUpdates": "ตรวจหาอัปเดต", + "failedInstall": "ติดตั้งล้มเหลว โปรดลองอีกครั้ง", + "install": "ติดตั้ง", + "installingFirmware": "กำลังติดตั้งเฟิร์มแวร์", + "overwriteSketch": "การติดตั้งจะเขียนทับสเก็ตช์บนบอร์ด", "selectBoard": "เลือกบอร์ด", - "selectVersion": "Select firmware version", - "successfullyInstalled": "Firmware successfully installed.", - "updater": "Firmware Updater" + "selectVersion": "เลือกเวอร์ชั่นเฟิร์มแวร์", + "successfullyInstalled": "การติดตั้งเฟิร์มแวร์เสร็จสิ้น 😁", + "updater": "อัปเดตเฟิร์มแวร์" }, "help": { - "environment": "Environment", + "environment": "สภาพแวดล้อม", "faq": "Frequently Asked Questions", "findInReference": "Find in Reference", "gettingStarted": "Getting Started", @@ -275,11 +275,14 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", "goToDownloadButton": "Go To Download", - "goToDownloadPage": "An update for the Arduino IDE is available, but we're not able to download and install it automatically. Please go to the download page and download the latest version from there.", + "goToDownloadPage": "มีการอัปเดตสำหรับ Arduino IDE แต่เราไม่สามารถดาวน์โหลดและติดตั้งมันโดยอัตโนมัติได้ กรุณาไปที่หน้าดาวน์โหลดและดาวน์โหลดเวอร์ชันล่าสุดจากที่นั่น", "ideUpdaterDialog": "Software Update", "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", @@ -293,13 +296,13 @@ "platformInstallFailed": "Failed to install platform: '{0}{1}'." }, "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?", + "addZip": "เพิ่มไลบารี .zip...", + "arduinoLibraries": "ไลบารีของ Arduino", + "contributedLibraries": "ไลบรารีที่มีการร่วมพัฒนา", + "include": "รวมไลบารี", + "installAll": "ติดตั้งทั้งหมด", + "installLibraryDependencies": "ติดตั้งการเพิ่งพาไลบารี", + "installMissingDependencies": "คุณต้องการติดตั้งการพึ่งพาที่ขาดหายไปทั้งหมดหรือไม่?", "installOneMissingDependency": "Would you like to install the missing dependency?", "installWithoutDependencies": "Install without dependencies", "installedSuccessfully": "Successfully installed library {0}:{1}", @@ -310,39 +313,39 @@ "needsOneDependency": "The library <b>{0}:{1}</b> needs another dependency currently not installed:", "overwriteExistingLibrary": "Do you want to overwrite the existing library?", "successfullyInstalledZipLibrary": "Successfully installed library from {0} archive", - "title": "Library Manager", - "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", - "zipLibrary": "Library" + "title": "ตัวจัดการไลบารี", + "uninstalledSuccessfully": "ถอนการติดตั้งไลบารี {0};{1} สำเร็จ", + "zipLibrary": "ไลบารี" }, "librarySearchProperty": { - "topic": "Topic" + "topic": "หัวข้อ" }, "libraryTopic": { - "communication": "Communication", - "dataProcessing": "Data Processing", - "dataStorage": "Data Storage", - "deviceControl": "Device Control", - "display": "Display", - "other": "Other", - "sensors": "Sensors", - "signalInputOutput": "Signal Input/Output", - "timing": "Timing", - "uncategorized": "Uncategorized" + "communication": "การสื่อสาร", + "dataProcessing": "ประมวลผลข้อมูล", + "dataStorage": "การจัดเก็บข้อมูล", + "deviceControl": "ควบคุมอุปกรณ์", + "display": "จอแสดงผล", + "other": "อื่นๆ", + "sensors": "เซนเซอร์", + "signalInputOutput": "สัญญาณ เข้า/ออก", + "timing": "เวลา", + "uncategorized": "ไม่มีหมวดหมู่" }, "libraryType": { - "installed": "Installed" + "installed": "ติดตั้งอยู่" }, "menu": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" + "advanced": "ขั้นสูง", + "sketch": "สเก็ตช์", + "tools": "เครื่องมื่อ" }, "monitor": { "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", + "connectionTimeout": "หมดเวลา. IDE ไม่ได้รับข้อความ 'success' จากตัวมอนิเตอร์หลังจากเชื่อมต่อสำเร็จ", "missingConfigurationError": "Could not connect to {0} {1} port. The monitor configuration is missing.", "notConnectedError": "Not connected to {0} {1} port.", "unableToCloseWebSocket": "Unable to close websocket", @@ -352,7 +355,7 @@ "newSketchTitle": "Name of the new Cloud Sketch" }, "portProtocol": { - "network": "Network", + "network": "เน็ตเวิร์ก", "serial": "Serial" }, "preferences": { @@ -361,61 +364,60 @@ "auth.clientID": "The OAuth2 client ID.", "auth.domain": "The OAuth2 domain.", "auth.registerUri": "The URI used to register a new user.", - "automatic": "Automatic", + "automatic": "อัตโนมัติ", "board.certificates": "List of certificates that can be uploaded to boards", - "browse": "Browse", - "checkForUpdate": "Receive notifications of available updates for the IDE, boards, and libraries. Requires an IDE restart after change. It's true by default.", - "choose": "Choose", - "cli.daemonDebug": "Enable debug logging of the gRPC calls to the Arduino CLI. A restart of the IDE is needed for this setting to take effect. It's false by default.", - "cloud.enabled": "True if the sketch sync functions are enabled. Defaults to true.", - "cloud.pull.warn": "True if users should be warned before pulling a cloud sketch. Defaults to true.", - "cloud.push.warn": "True if users should be warned before pushing a cloud sketch. Defaults to true.", + "browse": "เรียกดู", + "checkForUpdate": "รับการแจ้งเตือนเกี่ยวกับการอัปเดตที่มีสำหรับ IDE, บอร์ด และไลบรารี จำเป็นต้องรีสตาร์ท IDE หลังจากการเปลี่ยนแปลง ค่าเริ่มต้นเป็น true", + "choose": "เลือก", + "cli.daemonDebug": "เปิดการบันทึกดีบักของการเรียก gRPC ไปยัง Arduino CLI จำเป็นต้องรีสตาร์ท IDE เพื่อให้การตั้งค่านี้มีผล ค่าเริ่มต้นเป็น false", + "cloud.enabled": "เป็น true หากฟังก์ชันการซิงค์สเก็ตช์เปิดใช้งาน ค่าเริ่มต้นเป็น true", + "cloud.pull.warn": "เป็น true หากผู้ใช้ควรได้รับการเตือนก่อนดึงสเก็ตช์จากคลาวด์ ค่าเริ่มต้นเป็น true", + "cloud.push.warn": "เป็น true หากผู้ใช้ควรได้รับการเตือนก่อนอัปโหลดสเก็ตช์ไปยังคลาวด์ ค่าเริ่มต้นเป็น true", "cloud.pushpublic.warn": "True if users should be warned before pushing a public sketch to the cloud. Defaults to true.", "cloud.sharedSpaceId": "The ID of the Arduino Cloud shared space to load the sketchbook from. If empty, your private space is selected.", "cloud.sketchSyncEndpoint": "The endpoint used to push and pull sketches from a backend. By default it points to Arduino Cloud API.", - "compile": "compile", + "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.revealRange": "ปรับแต่งวิธีการแสดงข้อผิดพลาดของคอมไพเลอร์ในตัวแก้ไขหลังจากการตรวจสอบ/อัปโหลดล้มเหลว ค่าที่เป็นไปได้ ได้แก่:\n'auto': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัด\n'center': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัดที่ตรงกลางแนวตั้ง\n'top': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัดที่ใกล้กับด้านบนของหน้าจอ แนะนำสำหรับการดูการนิยามของโค้ด\n'centerIfOutsideViewport': เลื่อนแนวตั้งตามที่จำเป็นและแสดงบรรทัดที่ตรงกลางแนวตั้งเฉพาะเมื่อบรรทัดนั้นอยู่นอกหน้าจอ\nค่าเริ่มต้นคือ '{0}'", "compile.verbose": "True for verbose compile output. False by default", "compile.warnings": "Tells gcc which warning level to use. It's 'None' by default", - "compilerWarnings": "Compiler warnings", - "editorFontSize": "Editor font size", + "compilerWarnings": "คำเตือนของคอมไพเลอร์", + "editorFontSize": "แก้ไขขนาดตัวอักษร", "editorQuickSuggestions": "Editor Quick Suggestions", "enterAdditionalURLs": "Enter additional URLs, one for each row", "files.inside.sketches": "Show files inside Sketches", - "ide.updateBaseUrl": "The base URL where to download updates from. Defaults to 'https://downloads.arduino.cc/arduino-ide'", - "ide.updateChannel": "Release channel to get updated from. 'stable' is the stable release, 'nightly' is the latest development build.", + "ide.updateBaseUrl": "URL หลักที่ใช้สำหรับดาวน์โหลดการอัปเดต ค่าเริ่มต้นเป็น 'https://downloads.arduino.cc/arduino-ide'", + "ide.updateChannel": "ช่องการอัปเดตที่ใช้สำหรับดาวน์โหลดการอัปเดต 'stable' คือเวอร์ชันที่เสถียร, 'nightly' คือการพัฒนาล่าสุด", "interfaceScale": "Interface scale", "invalid.editorFontSize": "Invalid editor font size. It must be a positive integer.", - "invalid.sketchbook.location": "Invalid sketchbook location: {0}", - "invalid.theme": "Invalid theme.", - "language.asyncWorkers": "Number of async workers used by the Arduino Language Server (clangd). Background index also uses this many workers. The minimum value is 0, and the maximum is 8. When it is 0, the language server uses all available cores. The default value is 0.", - "language.log": "True if the Arduino Language Server should generate log files into the sketch folder. Otherwise, false. It's false by default.", - "language.realTimeDiagnostics": "If true, the language server provides real-time diagnostics when typing in the editor. It's false by default.", - "manualProxy": "Manual proxy configuration", + "invalid.sketchbook.location": "สมุดสเก็ตช์ท้องถิ่น ไม่ถูกต้อง: {0}", + "invalid.theme": "ธีมไม่ถูกต้อง", + "language.asyncWorkers": "จำนวนของผู้ทำงานแบบอะซิงโครนัสที่ใช้โดย Arduino Language Server (clangd) การสร้างดัชนีพื้นหลังยังใช้จำนวนผู้ทำงานเหล่านี้ ค่าขั้นต่ำคือ 0 และค่าสูงสุดคือ 8 เมื่อเป็น 0 เซิร์ฟเวอร์ภาษาใช้ทุกคอร์ที่มีอยู่ ค่าเริ่มต้นคือ 0", + "language.log": "เป็น true หาก Arduino Language Server ควรสร้างไฟล์บันทึกลงในโฟลเดอร์สเก็ตช์ มิฉะนั้นเป็น false ค่าเริ่มต้นเป็น false", + "language.realTimeDiagnostics": "ถ้าเป็น true เซิร์ฟเวอร์ภาษาจะให้การวินิจฉัยแบบเรียลไทม์เมื่อพิมพ์ในตัวแก้ไข ค่าเริ่มต้นเป็น false", + "manualProxy": "กำหนดค่า proxy เอง", "monitor": { "dockPanel": "The area of the application shell where the _{0}_ widget will reside. It is either \"bottom\" or \"right\". It defaults to \"{1}\"." }, - "network": "Network", - "newSketchbookLocation": "Select new sketchbook location", + "network": "เน็ตเวิร์ก", + "newSketchbookLocation": "เลือกสมุดสเก็ตช์ท้องถิ่นใหม่", "noCliConfig": "Could not load the CLI configuration", - "noProxy": "No proxy", + "noProxy": "ไม่มี proxy", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "ชื่อ Host", + "password": "รหัสผ่าน", + "port": "หมายเลขพอร์ต", + "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." + "inoBlueprint": "เส้นทางระบบไฟล์ที่สมบูรณ์ไปยังไฟล์แม่แบบ .ino เริ่มต้น หากระบุไว้ เนื้อหาของไฟล์แม่แบบจะถูกใช้สำหรับสเก็ตช์ใหม่ทุกครั้งที่สร้างโดย IDE สเก็ตช์จะถูกสร้างขึ้นด้วยเนื้อหามาตรฐานของ Arduino หากไม่ระบุ ไฟล์แม่แบบที่ไม่สามารถเข้าถึงได้จะถูกละเลย ต้องรีสตาร์ท IDE เพื่อให้การตั้งค่านี้มีผล" }, "sketchbook.location": "Sketchbook location", "sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Click for a list of unofficial board support URLs", "upload": "upload", - "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.autoVerify": "เป็น true หาก IDE ควรตรวจสอบโค้ดโดยอัตโนมัติก่อนการอัปโหลด ค่าเริ่มต้นเป็นจริง เมื่อค่าตั้งเป็นเท็จ IDE จะไม่คอมไพล์โค้ดใหม่ก่อนที่จะอัปโหลดไบนารีไปยังบอร์ด ⚠️ ขอแนะนำให้ตั้งค่านี้เป็น false เฉพาะเมื่อคุณแน่ใจในสิ่งที่กำลังทำ ⚠️", "upload.verbose": "True for verbose upload output. False by default.", "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", "verifyAfterUpload": "Verify code after upload", @@ -430,13 +432,13 @@ "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}'...", + "autoscroll": "เลื่อนอัตโนมัติ", + "carriageReturn": "การคืนตำแหน่งของตัวพิมพ์", + "connecting": "เชื่อมต่อกับ '{0}' บน '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", - "newLine": "New Line", + "newLine": "บรรทัดใหม่", "newLineCarriageReturn": "Both NL & CR", - "noLineEndings": "No Line Ending", + "noLineEndings": "ไม่มีการสิ้นสุดบรรทัด", "notConnected": "Not connected. Select a board and a port to connect automatically.", "openSerialPlotter": "Serial Plotter", "timestamp": "Timestamp", @@ -448,109 +450,112 @@ "compile": "Compiling sketch...", "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", - "doneCompiling": "Done compiling.", - "doneUploading": "Done uploading.", + "doneCompiling": "การคอมไพล์เสร็จสิ้น", + "doneUploading": "การอัปโหลดเสร็จสิ้น", "editInvalidSketchFolderLocationQuestion": "Do you want to try saving the sketch to a different location?", "editInvalidSketchFolderQuestion": "Do you want to try saving the sketch with a different name?", "exportBinary": "Export Compiled Binary", - "invalidCloudSketchName": "The name must start with a letter, number, or underscore, followed by letters, numbers, dashes, dots and underscores. Maximum length is 36 characters.", + "invalidCloudSketchName": "ชื่อจะต้องเริ่มต้นด้วยตัวอักษร ตัวเลข หรือขีดล่าง ตามด้วยตัวอักษร ตัวเลข ขีด จุด และขีดล่าง ความยาวสูงสุดคือ 36 อักขระ", "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", "invalidSketchFolderNameMessage": "Invalid sketch folder name: '{0}'", - "invalidSketchName": "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", + "invalidSketchName": "ชื่อจะต้องเริ่มต้นด้วยตัวอักษร ตัวเลข หรือขีดล่าง ตามด้วยตัวอักษร ตัวเลข ขีด จุด และขีดล่าง ความยาวสูงสุดคือ 63 อักขระ", + "moving": "ย้าย", + "movingMsg": "ไฟล์ \"{0}\" จำเป็นต้องอยู่ภายในโฟลเดอร์สเก็ตช์ที่ชื่อว่า \"{1}\" \nสร้างโฟลเดอร์นี้ หรือ ย้ายไฟล์ และดำเนินการต่อหรือไม่?", + "new": "สเก็ตช์ ใหม่", "noTrailingPeriod": "A filename cannot end with a dot", - "openFolder": "Open Folder", + "openFolder": "เปิดโฟลเดอร์", "openRecent": "Open Recent", "openSketchInNewWindow": "Open Sketch in New Window", "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "Save sketch folder as...", + "saveFolderAs": "บันทึกโฟลเดอร์สเก็ตช์เป็น...", "saveSketch": "Save your sketch to open it again later.", - "saveSketchAs": "Save sketch folder as...", - "showFolder": "Show Sketch Folder", - "sketch": "Sketch", - "sketchAlreadyContainsThisFileError": "The sketch already contains a file named '{0}'", - "sketchAlreadyContainsThisFileMessage": "Failed to save sketch \"{0}\" as \"{1}\". {2}", - "sketchbook": "Sketchbook", - "titleLocalSketchbook": "Local Sketchbook", - "titleSketchbook": "Sketchbook", + "saveSketchAs": "บันทึกโฟลเดอร์สเก็ตช์เป็น...", + "showFolder": "แสดงโฟลเดอร์สเก็ตช์", + "sketch": "สเก็ตช์", + "sketchAlreadyContainsThisFileError": "สเก็ตช์นี้มีไฟล์ที่มีชื่อว่า '{0}' อยู่แล้ว", + "sketchAlreadyContainsThisFileMessage": "ไม่สามารถบันทึกสเก็ตช์ \"{0}\" เป็น \"{1}\" ได้ {2}", + "sketchbook": "สมุดสเก็ตช์", + "titleLocalSketchbook": "สมุดสเก็ตช์ ท้องถื่น", + "titleSketchbook": "สมุดสเก็ตช์", "upload": "อัปโหลด", - "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", - "userFieldsNotFoundError": "Can't find user fields for connected board", - "verify": "Verify", - "verifyOrCompile": "Verify/Compile" + "uploadUsingProgrammer": "อัปโหลดโดยใช้โปรแกรมเมอร์", + "uploading": "กำลังอัปโหลด", + "userFieldsNotFoundError": "ไม่สามารถค้นหาฟิลด์ผู้ใช้สำหรับบอร์ดที่เชื่อมต่ออยู่", + "verify": "ยืนยัน", + "verifyOrCompile": "ยืนยัน/คอมไพล์" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "survey": { - "answerSurvey": "ตอบแบบสอบถาม", - "dismissSurvey": "ไม่แสดงสิ่งนี้อีก", - "surveyMessage": "กรุณาช่วยพวกเราปรับปรุงพัฒนาโดยตอบแบบสอบถามสั้นมากเหล่านี้ พวกเราเล็งเห็นถึงคุณค่าของคอมมูนิตี้และอยากที่จะทำความเข้าใจผู้สนับสนุนของเราให้ได้ดีขึ้นมากกว่าเดิมแม้เพียงสักเล็กน้อย" + "newCloudSketch": "Cloud Sketch ใหม่", + "newSketch": "สเก็ตช์ ใหม่" }, "theme": { - "currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.", + "currentThemeNotFound": " ไม่สามารถค้นหาธีมที่เลือกไว้ในปัจจุบัน: {0} Arduino IDE ได้เลือกธีมที่มีในตัวที่เข้ากันได้กับธีมที่หายไป", "dark": "มืด", - "deprecated": "{0} (deprecated)", - "hc": "Dark High Contrast", - "hcLight": "Light High Contrast", + "deprecated": "{0} (เลิกใช้แล้ว)", + "hc": "มืด", + "hcLight": "สว่าง", "light": "สว่าง", - "user": "{0} (user)" + "user": "{0} (ผู้ใช้)" }, "title": { "cloud": "Cloud" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "อัปเดตดัชนี", + "updateLibraryIndex": "อัปเดตดัชนีของไลบารี", + "updatePackageIndex": "อัปเดตดัชนีของแพ็กเกจ" }, "upload": { - "error": "{0} error: {1}" + "error": "{0} ล้มเหลว: {1}" }, "userFields": { "cancel": "ยกเลิก", - "enterField": "Enter {0}", + "enterField": "ป้อน {0}", "upload": "อัปโหลด" }, "validateSketch": { - "abortFixMessage": "The sketch is still invalid. Do you want to fix the remaining problems? By clicking '{0}', a new sketch will open.", - "abortFixTitle": "Invalid sketch", - "renameSketchFileMessage": "The sketch file '{0}' cannot be used. {1} Do you want to rename the sketch file now?", - "renameSketchFileTitle": "Invalid sketch filename", - "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", - "renameSketchFolderTitle": "Invalid sketch name" + "abortFixMessage": "สเก็ตช์ยังไม่ถูกต้อง คุณต้องการแก้ไขปัญหาที่เหลืออยู่หรือไม่? โดยการคลิก '{0}' จะเปิดสเก็ตช์ใหม่", + "abortFixTitle": "สเก็ตช์ไม่ถูกต้อง", + "renameSketchFileMessage": "ไฟล์สเก็ตช์ '{0}' ไม่สามารถใช้ได้ {1} เนื่องจากชื่อสเก็ตซ์ของคุณโหดเกินไป คุณต้องการเปลี่ยนชื่อสเก็ตช์ตอนนี้หรือไม่?", + "renameSketchFileTitle": "ชื่อไฟล์สเก็ตช์ไม่ถูกต้อง", + "renameSketchFolderMessage": "สเก็ตช์ '{0}' ไม่สามารถใช้ได้ {1} เนื่องจากชื่อสเก็ตซ์ของคุณโหดเกินไป เพื่อกำจัดข้อความนี้ กรุณาเปลี่ยนชื่อสเก็ตช์ คุณต้องการเปลี่ยนชื่อสเก็ตช์ตอนนี้หรือไม่?", + "renameSketchFolderTitle": "ชื่อสเก็ตช์ไม่ถูกต้อง" + }, + "versionWelcome": { + "cancelButton": "อาจจะในภายหลัง", + "donateButton": "บริจาคเลย!", + "donateMessage": "Arduino มุ่งมั่นที่จะรักษาซอฟต์แวร์ให้ฟรีและเป็นโอเพ่นซอร์สสำหรับทุกคน การบริจาคของคุณช่วยให้เราพัฒนาฟีเจอร์ใหม่ ปรับปรุงไลบรารี และรองรับผู้ใช้หลายล้านคนทั่วโลก!", + "donateMessage2": "โปรดพิจารณาสนับสนุนงานของเราบน Arduino IDE ที่เป็นโอเพนซอร์สฟรี", + "title": "ยินดีต้อนรับสู่เวอร์ชันใหม่ของ Arduino IDE!", + "titleWithVersion": "ยินดีต้อนรับสู่ Arduino IDE ใหม่ {0}!" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' มีอยู่แล้ว" } }, "theia": { "core": { - "cannotConnectBackend": "Cannot connect to the backend.", - "cannotConnectDaemon": "Cannot connect to the CLI daemon.", + "cannotConnectBackend": "ไม่สามารถเชื่อมต่อกับแบ็กแอนด์ได้", + "cannotConnectDaemon": "ไม่สามารถเชื่อมต่อกับ CLI daemon", "couldNotSave": "ไม่สามารถบันทึกสเก็ตช์ได้ กรุณาคัดลอกงานที่ยังไม่ถูกบันทึกไปยังโปรแกรม Text Editor อื่นที่คุณใช้งาน และรีสตาร์ท IDE", - "daemonOffline": "CLI Daemon Offline", - "offline": "Offline", - "offlineText": "Offline", + "daemonOffline": "CLI Daemon ออฟไลน์", + "offline": "ออฟไลน์", + "offlineText": "ออฟไลน์", "quitTitle": "คุณแน่ใจว่าต้องการออกใช่หรือไม่" }, "editor": { - "unsavedTitle": "Unsaved – {0}" + "unsavedTitle": "ไม่ได้บันทึก – {0}" }, "messages": { "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?", + "deleteCloudSketch": "สเก็ตช์ในคลาวด์ '{0}' จะถูกลบออกถาวรจากเซิร์ฟเวอร์ของ Arduino และแคชท้องถิ่น การกระทำนี้ไม่สามารถย้อนกลับได้ คุณต้องการลบสเก็ตช์ปัจจุบันหรือไม่?", + "deleteCurrentSketch": " สเก็ตช์ '{0}' จะถูกลบออกถาวร การกระทำนี้ไม่สามารถย้อนกลับได้ คุณต้องการลบสเก็ตช์ปัจจุบันหรือไม่", "fileNewName": "ชื่อสำหรับไฟล์ใหม่", - "invalidExtension": ".{0} is not a valid extension", + "invalidExtension": "{0} ไม่ใช่ส่วนขยายที่ถูกต้อง!", "newFileName": "ชื่อใหม่สำหรับไฟล์" } } diff --git a/i18n/tr.json b/i18n/tr.json index 32cd6720c..6e5b1e470 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -275,6 +275,9 @@ "checkForUpdates": "Arduino IDE Güncellemelerini kontrol et", "closeAndInstallButton": "Kapat ve Kur", "closeToInstallNotice": "Yazılımı kapatın ve güncellemeyi makinanıza yükleyin.", + "donateLinkIconTitle": "bağış sayfasını aç", + "donateLinkText": "bizi desteklemek için bağış yap", + "donateText": "Açık kaynak aşktır, {0}", "downloadButton": "İndir", "downloadingNotice": "Arduino IDE'nin son sürümü indiriliyor.", "errorCheckingForUpdates": "Arduino IDE güncellemelerini kontrol ederken hata oluştu.{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Eskiz Defteri konumu", "sketchbook.showAllFiles": "Tüm eskiz dosyalarını eskiz içinde görüntülemek için açın. Varsayılan: kapalı.", - "survey.notification": "Bir anket bulunduğunda kullanıcılara gösterilecekse açın. Varsayılan olarak açıktır.", "unofficialBoardSupport": "Desteklenmeyen kart destek URL'leri listesi için tıklayın", "upload": "yükle", "upload.autoVerify": "Açıldığında IDE yükleme öncesinde kodu otomatik olarak doğrular. Varsayılan olarak açıktır. Bu değer kapalı olduğunda, IDE ikili dosyayı karta yüklemeden önce tekrar derlemez. Bu ayarı sadece gerçekten ne yaptığınızı biliyor olduğunuz durumlarda kapatmanız önerilir.", @@ -487,11 +489,6 @@ "newCloudSketch": "Yeni Bulut Eskiz", "newSketch": "Yeni Eskiz" }, - "survey": { - "answerSurvey": "Anketi yanıtla", - "dismissSurvey": "Tekrar gösterme", - "surveyMessage": "Lütfen bu çok kısa anketi yanıtlayarak gelişmemize yardım edin. Topluluğumuza değer veriyoruz e destekçilerimizi biraz daha iyi tanımak isteriz." - }, "theme": { "currentThemeNotFound": "Mevcut seçili tema bulunamadı: {0}. Arduino IDE kayıp olanın yerine uyumlu dahili bir tane seçti.", "dark": "Koyu", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "'{0}' eskizi kullanılamaz. {1} Bu mesajdan kurtulmak için eskizi yeniden adlandırın. Eskizi şimdi yeniden adlandırmak istiyor musunuz?", "renameSketchFolderTitle": "Hatalı eskiz adı" }, + "versionWelcome": { + "cancelButton": "Belki sonra", + "donateButton": "Şimdi bağış yap", + "donateMessage": "Arduino, yazılımı herkes için ücretsiz ve açık kaynaklı tutmaya adanmıştır. Bağışınız yeni özellikler geliştirmemize, kütüphaneleri daha iyi yapmamıza ve dünya çapındaki milyonlarca kullanıcıyı desteklememize yardım eder.", + "donateMessage2": "Lütfen özgür açık kaynaklı Arduino IDE üzerindeki çalışmalarımızı desteklemeyi gözden geçirin.", + "title": "Arduino IDE'nin yeni sürümüne hoş geldiniz!", + "titleWithVersion": "Yeni Arduino IDE'ye hoş geldin {0}!" + }, "workspace": { "alreadyExists": "'{0}' zaten mevcut." } diff --git a/i18n/uk.json b/i18n/uk.json index 408b39bbe..621c9bba1 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -275,6 +275,9 @@ "checkForUpdates": "Перевірка оновлень Arduino IDE", "closeAndInstallButton": "Закрити та Встановити", "closeToInstallNotice": "Закрийте програму та встановіть оновлення.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Завантажити", "downloadingNotice": "Завантажити останню версію Arduino IDE.", "errorCheckingForUpdates": "Помилка під час перевірки оновлень Arduino IDE {0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Шлях до книги скетчів", "sketchbook.showAllFiles": "\"Так\" для відображення усіх файлів скетчу в середені скетчу. \"Ні\" за замовчуванням.", - "survey.notification": "\"Так\", якщо треба повідомляти про доступні опитування користувачів. \"Так\" за замовчуванням.", "unofficialBoardSupport": "Клацніть, щоб переглянути список неофіційних форумів підтримки", "upload": "завантажити", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Новий хмарний скетч", "newSketch": "Новий скетч" }, - "survey": { - "answerSurvey": "Відповідь на опитування", - "dismissSurvey": "Більше не показувати", - "surveyMessage": "Будь ласка, допоможіть нам покращитися, відповівши на це надкоротке опитування. Ми цінуємо нашу спільноту і хочемо ближче познайомитися з нашими прихильниками." - }, "theme": { "currentThemeNotFound": "Не вдалося знайти поточну вибрану тему: {0}. Arduino IDE вибрала вбудовану тему, сумісну з відсутньою.", "dark": "Темна", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Скетч '{0}' не може бути використаний. {1} Щоб позбутися цього повідомлення, перейменуйте скетч. Бажаєте перейменувати скетч зараз?", "renameSketchFolderTitle": "Помилка в назві скетча" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' вже існує." } diff --git a/i18n/vi.json b/i18n/vi.json index 3105486f0..87e5215d4 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -275,6 +275,9 @@ "checkForUpdates": "Kiểm tra bản cập nhật phần mềm", "closeAndInstallButton": "Đóng và cài đặt", "closeToInstallNotice": "Đóng ứng dụng và cài đặt bản cập nhật mới nhất lên máy bạn.", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "Tải về", "downloadingNotice": "Đang tải về bản mới nhất của Arduino IDE.", "errorCheckingForUpdates": "Có lỗi xảy ra trong quá trình kiểm tra cập nhật Arduino IDE.\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "Địa điểm chứa sketchbook", "sketchbook.showAllFiles": "'True' để hiển thị tất cả các tệp sketch trong sketch. Mặc định là 'false'.", - "survey.notification": "True if users should be notified if a survey is available. True by default.", "unofficialBoardSupport": "Nhấp vào đây để hiển thị danh sách các URLs hỗ trợ các bo mạch không chính thức", "upload": "nạp ", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "Bản phác thảo đám mây mới", "newSketch": "Bản phác thảo mới" }, - "survey": { - "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": "Tối", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Tên bản phác thảo không hợp lệ" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}'đã tồn tại." } diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index 17eb473ce..d5af38d46 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -275,6 +275,9 @@ "checkForUpdates": "檢查 Arduino IDE 更新", "closeAndInstallButton": "關閉並安裝。", "closeToInstallNotice": "關閉本程式後安裝更新。", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "下載", "downloadingNotice": "正在下載最新版本的Arduino IDE。", "errorCheckingForUpdates": "檢查 Arduino IDE 更新時發生錯誤。\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "sketchbook 位置", "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", - "survey.notification": "有新問卷時會通知使用者, 預設為: true。", "unofficialBoardSupport": "點擊來取得非官方開發版的支援網址", "upload": "上傳", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "新增雲 sketch", "newSketch": "新增 sketch" }, - "survey": { - "answerSurvey": "填寫問卷", - "dismissSurvey": "不要再顯示", - "surveyMessage": "請回答超短的問卷來協助我們改善。 我們重視本社群, 希望能更了解我們的支持者。 " - }, "theme": { "currentThemeNotFound": "找不到目前選擇的主題:{0} 。 Arduino IDE 挑選了一個內建的相容主題。", "dark": "暗色", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Sketch '{0}' 無法被使用。 {1} 要擺脫這則訊息,請更改 sketch 檔名。要現在更改檔名嗎?", "renameSketchFolderTitle": "無效的 sketch 檔名" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}'已存在。" } diff --git a/i18n/zh.json b/i18n/zh.json index 68fd336c7..2b489266a 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -275,6 +275,9 @@ "checkForUpdates": "检查 Arduino IDE 更新", "closeAndInstallButton": "关闭并安装", "closeToInstallNotice": "关闭软件并安装更新。", + "donateLinkIconTitle": "open donation page", + "donateLinkText": "donate to support us", + "donateText": "Open source is love, {0}", "downloadButton": "下载", "downloadingNotice": "正在下载 Arduino IDE 的最新版本。", "errorCheckingForUpdates": "检查 Arduino IDE 更新时出错。{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "项目文件夹地址", "sketchbook.showAllFiles": "True 则显示项目中的所有项目文件。默认情况下为 False。", - "survey.notification": "True 则在有调查时应通知用户。默认为 True。", "unofficialBoardSupport": "点击获取支持的非官方开发板地址列表", "upload": "上传", "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", @@ -487,11 +489,6 @@ "newCloudSketch": "新的云端项目", "newSketch": "新建项目" }, - "survey": { - "answerSurvey": "回答问卷", - "dismissSurvey": "不要再显示", - "surveyMessage": "请回答这份很短的调查来帮助我们改进。我们重视我们的社区,也希望能够更好地了解我们的支持者。" - }, "theme": { "currentThemeNotFound": "找不到当前选中的主题:{0}。Arduino IDE 已选择一个与缺失者兼容的内置主题。", "dark": "暗黑", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "不能使用项目 '{0}'。 '{1}' 要删除此消息,请重命名项目。 现在要重命名项目吗?", "renameSketchFolderTitle": "无效的项目名" }, + "versionWelcome": { + "cancelButton": "Maybe later", + "donateButton": "Donate now", + "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", + "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", + "title": "Welcome to a new version of the Arduino IDE!", + "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + }, "workspace": { "alreadyExists": "'{0}' 已经存在。" } diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index ffad200de..b0aa30c67 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -275,6 +275,9 @@ "checkForUpdates": "檢查 Arduino IDE 更新", "closeAndInstallButton": "關閉並安裝。", "closeToInstallNotice": "關閉本程式後安裝更新。", + "donateLinkIconTitle": "開啟捐款頁面", + "donateLinkText": "捐款來支持我們", + "donateText": "公開程式碼就是愛, {0}", "downloadButton": "下載", "downloadingNotice": "正在下載最新版本的Arduino IDE。", "errorCheckingForUpdates": "檢查Arduino IDE更新時發生錯誤。\n{0}", @@ -412,7 +415,6 @@ }, "sketchbook.location": "sketchbook 位置", "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", - "survey.notification": "有新問卷時會通知使用者, 預設為: true。", "unofficialBoardSupport": "點擊來取得非官方開發板的支援網址", "upload": "上傳", "upload.autoVerify": "預設為是,IDE會在上載前自動驗証。如選否,IDE在上載前不會重編譯程式碼。強烈建議除非你知道自己在幹嘛才這麼做。", @@ -487,11 +489,6 @@ "newCloudSketch": "新增雲 sketch", "newSketch": "新增 sketch" }, - "survey": { - "answerSurvey": "填寫問卷", - "dismissSurvey": "不要再顯示", - "surveyMessage": "請回答超短的問卷來協助我們改善。 我們重視本社群, 希望能更了解我們的支持者。 " - }, "theme": { "currentThemeNotFound": "找不到目前選擇的主題:{0} 。 Arduino IDE 挑選了一個內建的相容主題。", "dark": "暗", @@ -525,6 +522,14 @@ "renameSketchFolderMessage": "Sketch '{0}' 無法被使用。 {1} 要擺脫這則訊息,請更改 sketch 檔名。要現在更改檔名嗎?", "renameSketchFolderTitle": "無效的 sketch 檔名" }, + "versionWelcome": { + "cancelButton": "讓我考慮一下", + "donateButton": "現在捐", + "donateMessage": "Arduino 致力讓軟體保持自由並對大家開放程式碼,您的捐款可以幫助我們開發新功能、改善程式庫及對全球數百萬用戶的支持。", + "donateMessage2": "期盼您考慮支持我們對自由軟體 Arduino IDE 所做的努力。", + "title": "歡迎使用新版 Arduino IDE !", + "titleWithVersion": "歡迎使用新版 Arduino IDE {0} !" + }, "workspace": { "alreadyExists": "'{0}'已存在。" } From 9b15695c60e070cd1661899a7b868e9f46cecce2 Mon Sep 17 00:00:00 2001 From: Per Tillisch <accounts@perglass.com> Date: Tue, 1 Apr 2025 00:27:06 -0700 Subject: [PATCH 373/384] Give build workflow step access to required deployment environment (#2672) * Trim trailing whitespace in build workflow * Give build workflow step access to required deployment environment Certain operations in the "Arduino IDE" GitHub Actions workflow use GitHub Actions "secrets" which are defined in the repository's administrative settings. These secrets will typically not be defined when the workflow is run in a fork. However, the workflow's base functionality, the automated building of the application, does not require secrets. Since that base functionality alone is very useful to contributors (either to validate relevant changes to the application and infrastructure, or to generate tester builds) who are performing development work in a fork. For this reason, the workflow is configured to only perform the secret-dependent operations when the required secrets have been defined in the repository settings. One such operation is publishing the generated builds to Amazon S3, which Arduino uses to host files for distribution. This operation depends on the "AWS_ROLE_ARN" secret. As a security measure, this secret is defined inside a deployment environment (named "production"). GitHub Actions workflow jobs can only use secrets from deployment environments which they have been explicitly configured to have access to. At the time the workflow was originally developed, GitHub did not have the deployment environment feature, and so the workflow was not configured to use environments. The switch to using a deployment environment for this secret was made only recently, and when that was done, the workflow job that checks whether the secret is defined was not configured to have access to the "production" environment. This caused the workflow to think it was running in a context where that secret is not defined even when the secret is in fact defined. The bug caused the workflow to always spuriously skip the "publish" job which publishes nightly builds of Arduino IDE, and the "publish release" step which publishes production releases. The bug is fixed by configuring the "build-type-determination" job so that it has access to the "production" environment. --- .github/workflows/build.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a4dcfa052..d4dd809c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,6 +172,7 @@ jobs: is-nightly: ${{ steps.determination.outputs.is-nightly }} channel-name: ${{ steps.determination.outputs.channel-name }} publish-to-s3: ${{ steps.determination.outputs.publish-to-s3 }} + environment: production permissions: {} steps: - name: Determine the type of build @@ -589,7 +590,7 @@ jobs: permissions: id-token: write - contents: read + contents: read steps: - name: Download all job transfer artifacts @@ -602,8 +603,8 @@ jobs: - name: Configure AWS Credentials for Nightly [S3] uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 + role-to-assume: ${{ secrets.AWS_ROLE_ARN }} + aws-region: us-east-1 - name: Publish Nightly [S3] run: | @@ -661,8 +662,8 @@ jobs: if: needs.build-type-determination.outputs.publish-to-s3 == 'true' uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 + role-to-assume: ${{ secrets.AWS_ROLE_ARN }} + aws-region: us-east-1 - name: Publish Release [S3] if: needs.build-type-determination.outputs.publish-to-s3 == 'true' From 4b0982ccb3f31b51c03dec6843234e0d55ee2b9b Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 1 Apr 2025 18:42:04 +0900 Subject: [PATCH 374/384] fix: safer electron version parsing for electron-builder command (#2673) --- electron-app/scripts/package.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/electron-app/scripts/package.js b/electron-app/scripts/package.js index 3baa1ea4c..9e3593e64 100644 --- a/electron-app/scripts/package.js +++ b/electron-app/scripts/package.js @@ -6,8 +6,14 @@ const { isNightly, isRelease } = require('./utils'); async function run() { /** @type {string} */ - const electronVersion = + const rawElectronVersion = require('../package.json').devDependencies['electron']; + const electronVersion = semver.clean(rawElectronVersion.replace(/^\^/, '')); + if (!electronVersion) { + throw new Error( + `Electron semver validation failed for version: '${rawElectronVersion}'.` + ); + } const platform = electronPlatform(); const version = await getVersion(); /** @type {string|unknown} */ @@ -18,7 +24,7 @@ async function run() { '--publish', 'never', '-c.electronVersion', - semver.clean(electronVersion.replace(/^\^/, '')), + electronVersion, '-c.extraMetadata.version', version, // overrides the `name` in the `package.json` to keep the `localStorage` location. (https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1554005028) From d293595b8959cc96b38b30808e2e62409f253710 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 2 Apr 2025 09:23:57 +0900 Subject: [PATCH 375/384] fix: add missing linux dependencies (#2675) --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d4dd809c6..b71ff4f44 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -473,6 +473,12 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} version: 3.x + - name: Install dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Install dependencies run: yarn From 8aa3c28c509341d912da74d8a7f34e10821254a3 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 2 Apr 2025 21:51:35 +0900 Subject: [PATCH 376/384] fix: allow write permission on release job (#2676) Permission were previously changed here https://github.com/arduino/arduino-ide/pull/2651 Repo write permission is needed to allow creating the github release and publishing files --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b71ff4f44..8d8fb2557 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -639,7 +639,7 @@ jobs: permissions: id-token: write - contents: read + contents: write steps: - name: Download all job transfer artifacts From 39c8db8e90642c403cd270d0572dd2c9da55b7e2 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 2 Apr 2025 23:24:35 +0900 Subject: [PATCH 377/384] fix: add missing linux dependencies for `create-changelog` job (#2677) --- .github/workflows/compose-full-changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 2c328e52e..0e669cf8f 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -29,6 +29,12 @@ jobs: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' + - name: Install Dependencies (Linux only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxkbfile-dev libsecret-1-dev + - name: Get Tag id: tag_name run: | From 4d52bb2843709b07568092470f88c44ee6d86d7e Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 4 Apr 2025 00:51:12 +0900 Subject: [PATCH 378/384] chore: switch to version 2.3.6 after the release (#2682) --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 953331109..3d478a88e 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.5", + "version": "2.3.6", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index bee426096..5bf2b0f18 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.5", + "version": "2.3.6", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.57.0", "@theia/terminal": "1.57.0", "@theia/workspace": "1.57.0", - "arduino-ide-extension": "2.3.5" + "arduino-ide-extension": "2.3.6" }, "devDependencies": { "@theia/cli": "1.57.0", diff --git a/package.json b/package.json index 2215352d6..f71303a0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.5", + "version": "2.3.6", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From e36f393682872456667cfa2f98899ccbff58264c Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 4 Apr 2025 00:51:30 +0900 Subject: [PATCH 379/384] fix: prevent `OutputWidget` to gain focus when updated (#2681) --- .../browser/theia/core/application-shell.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/arduino-ide-extension/src/browser/theia/core/application-shell.ts b/arduino-ide-extension/src/browser/theia/core/application-shell.ts index 379fb0ff5..82867adaa 100644 --- a/arduino-ide-extension/src/browser/theia/core/application-shell.ts +++ b/arduino-ide-extension/src/browser/theia/core/application-shell.ts @@ -13,6 +13,8 @@ import { MessageService } from '@theia/core/lib/common/message-service'; import { inject, injectable } from '@theia/core/shared/inversify'; import { ApplicationConnectionStatusContribution } from './connection-status-service'; import { ToolbarAwareTabBar } from './tab-bars'; +import { find } from '@theia/core/shared/@phosphor/algorithm'; +import { OutputWidget } from '@theia/output/lib/browser/output-widget'; @injectable() export class ApplicationShell extends TheiaApplicationShell { @@ -48,6 +50,38 @@ export class ApplicationShell extends TheiaApplicationShell { return super.addWidget(widget, { ...options, ref }); } + override doRevealWidget(id: string): Widget | undefined { + let widget = find(this.mainPanel.widgets(), (w) => w.id === id); + if (!widget) { + widget = find(this.bottomPanel.widgets(), (w) => w.id === id); + if (widget) { + this.expandBottomPanel(); + } + } + if (widget) { + const tabBar = this.getTabBarFor(widget); + if (tabBar) { + tabBar.currentTitle = widget.title; + } + } + if (!widget) { + widget = this.leftPanelHandler.expand(id); + } + if (!widget) { + widget = this.rightPanelHandler.expand(id); + } + if (widget) { + // Prevent focusing the output widget when is updated + // See https://github.com/arduino/arduino-ide/issues/2679 + if (!(widget instanceof OutputWidget)) { + this.windowService.focus(); + } + return widget; + } else { + return this.secondaryWindowHandler.revealWidget(id); + } + } + override handleEvent(): boolean { // NOOP, dragging has been disabled return false; From 56ab87417722f0b88f1775c4c3627d39a5eb243e Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Sat, 5 Apr 2025 19:56:00 +0900 Subject: [PATCH 380/384] fix: propagate electron params in second instance startup (#2686) --- .../src/electron-main/theia/electron-main-application.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 e6f91f5b9..ba1851ff4 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 @@ -385,10 +385,11 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } private async launchFromArgs( - params: ElectronMainCommandOptions + params: ElectronMainCommandOptions, + argv?: string[] ): Promise<boolean> { // Copy to prevent manipulation of original array - const argCopy = [...this.argv]; + const argCopy = [...(argv || this.argv)]; let path: string | undefined; for (const maybePath of argCopy) { const resolvedPath = await this.resolvePath(maybePath, params.cwd); @@ -526,7 +527,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { argv: string[], cwd: string ): Promise<void> { - if (await this.launchFromArgs({ cwd, secondInstance: true })) { + if (await this.launchFromArgs({ cwd, secondInstance: true }, argv)) { // Application has received a file in its arguments return; } From a669a43449e01509038cbf084270e07c049cdc73 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 8 Apr 2025 02:15:59 +0900 Subject: [PATCH 381/384] fix: wait for theia `initalWindow` to be set before opening sketch through `open-file` event (#2693) * chore: use actual app name as `uriScheme` * fix: wait for `initialWindow` to be set before opening sketch from file --- arduino-ide-extension/src/common/utils.ts | 23 +++++++++++++++++++ .../theia/electron-main-application.ts | 16 ++++++++++++- electron-app/package.json | 3 ++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/common/utils.ts b/arduino-ide-extension/src/common/utils.ts index 56ed366c1..8a392c770 100644 --- a/arduino-ide-extension/src/common/utils.ts +++ b/arduino-ide-extension/src/common/utils.ts @@ -38,3 +38,26 @@ export function uint8ArrayToString(uint8Array: Uint8Array): string { export function stringToUint8Array(text: string): Uint8Array { return Uint8Array.from(text, (char) => char.charCodeAt(0)); } + +export function poolWhile( + whileCondition: () => boolean, + intervalMs: number, + timeoutMs: number +): Promise<void> { + return new Promise((resolve, reject) => { + if (!whileCondition) { + resolve(); + } + + const start = Date.now(); + const interval = setInterval(() => { + if (!whileCondition()) { + clearInterval(interval); + resolve(); + } else if (Date.now() - start > timeoutMs) { + clearInterval(interval); + reject(new Error('Timed out while polling.')); + } + }, intervalMs); + }); +} diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index ba1851ff4..b6d0ff294 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts @@ -30,6 +30,7 @@ import type { AddressInfo } from 'node:net'; import { isAbsolute, join, resolve } from 'node:path'; import type { Argv } from 'yargs'; import { Sketch } from '../../common/protocol'; +import { poolWhile } from '../../common/utils'; import { AppInfo, appInfoPropertyLiterals, @@ -292,6 +293,16 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { ); if (sketchFolderPath) { this.openFilePromise.reject(new InterruptWorkspaceRestoreError()); + + // open-file event is triggered before the app is ready and initialWindow is created. + // Wait for initialWindow to be set before opening the sketch on the first instance. + // See https://github.com/arduino/arduino-ide/pull/2693 + try { + await app.whenReady(); + if (!this.firstWindowId) { + await poolWhile(() => !this.initialWindow, 100, 3000); + } + } catch {} await this.openSketch(sketchFolderPath); } } @@ -890,7 +901,10 @@ const fallbackFrontendAppConfig: FrontendApplicationConfig = { defaultIconTheme: 'none', validatePreferencesSchema: false, defaultLocale: '', - electron: { showWindowEarly: true, uriScheme: 'custom://arduino-ide' }, + electron: { + showWindowEarly: true, + uriScheme: 'arduino-ide', + }, reloadOnReconnect: true, }; diff --git a/electron-app/package.json b/electron-app/package.json index 5bf2b0f18..6a31d222a 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -67,7 +67,8 @@ "defaultIconTheme": "none", "validatePreferencesSchema": false, "electron": { - "showWindowEarly": true + "showWindowEarly": true, + "uriScheme": "arduino-ide" }, "reloadOnReconnect": true, "preferences": { From e3319dab1a41aa8a3bc771e31436f59d87fcfb4c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 16:14:03 +0700 Subject: [PATCH 382/384] Updated translation files (#2692) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/be.json | 28 ++++++++++++++-------------- i18n/da.json | 32 ++++++++++++++++---------------- i18n/it.json | 28 ++++++++++++++-------------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/i18n/be.json b/i18n/be.json index d57a5efbe..6b753341b 100644 --- a/i18n/be.json +++ b/i18n/be.json @@ -13,7 +13,7 @@ "board": { "board": "Плата{0}", "boardConfigDialogTitle": "Абярыце іншую плату і порт", - "boardDataReloaded": "Board data reloaded.", + "boardDataReloaded": "Дадзеныя на плату былі загружаныя нанова.", "boardInfo": "Інфармацыя пра плату", "boards": "платы", "configDialog1": "Абярыце як плату, так і порт, калі вы жадаеце загрузіць сцэнар.", @@ -32,12 +32,12 @@ "port": "Порт{0}", "ports": "порты", "programmer": "Сродак праграмавання", - "reloadBoardData": "Reload Board Data", + "reloadBoardData": "Загрузіць дадзеныя на плату нанова", "reselectLater": "Абярыце паўторна пазней", "revertBoardsConfig": "Ужыта '{0}' выяўлена ў '{1}'", "searchBoard": "Знайсці плату", "selectBoard": "Знайсці плату", - "selectBoardToReload": "Please select a board first.", + "selectBoardToReload": "Калі ласка, спачатку абярыце плату.", "selectPortForInfo": "Калі ласка, абярыце порт, каб атрымаць інфармацыю пра плату.", "showAllAvailablePorts": "Паказвае ўсе даступныя порты, калі яны ўключаныя", "showAllPorts": "Паказаць усе порты", @@ -275,9 +275,9 @@ "checkForUpdates": "Праверыць наяўнасць абнаўленняў Arduino IDE", "closeAndInstallButton": "Зачыніць і ўсталяваць", "closeToInstallNotice": "Зачыніце праграмнае забеспячэнне і ўсталюйце абнаўленне на свой кампутар.", - "donateLinkIconTitle": "open donation page", - "donateLinkText": "donate to support us", - "donateText": "Open source is love, {0}", + "donateLinkIconTitle": "адчыніць старонку ахвяраванняў", + "donateLinkText": "ахвяраваць, каб падтрымаць нас", + "donateText": "Адкрыты зыходны код - гэта любоў, {0}", "downloadButton": "Спампаваць", "downloadingNotice": "Пампуе апошнюю версію Arduino IDE.", "errorCheckingForUpdates": "Памылка пры праверцы абнаўленняў Arduino IDE.\n{0}", @@ -417,9 +417,9 @@ "sketchbook.showAllFiles": "Калі true, адлюстроўваюцца ўсе файлы сцэнараў унутры сцэнара.\nПершапачаткова false.", "unofficialBoardSupport": "Пстрыкніце, каб праглядзець спіс адрасоў URL падтрымкі неафіцыйных плат", "upload": "выгрузіць", - "upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.", + "upload.autoVerify": "True, калі IDE павінна аўтаматычна правяраць код перад загрузкай.\nПершапачаткова значэнне роўнае true.\nКалі false, IDE не кампілюе код нанова перад загрузкай двайковага файла на плату.\nНастойліва рэкамендуецца ўсталяваць false толькі калі вы ведаеце, што робіце.", "upload.verbose": "Калі true, каб быў падрабязны вывад пры загрузцы.\nПершапачаткова false.", - "upload.verify": "After upload, verify that the contents of the memory on the board match the uploaded binary.", + "upload.verify": "Пасля загрузкі пераканайцеся, што змест памяці на плаце адпавядае загружанаму двайковаму файлу.", "verifyAfterUpload": "Праверыць код пасля выгрузкі", "window.autoScale": "Калі true, карыстальніцкі інтэрфейс аўтаматычна маштабуецца ў адпаведнасці з памерам шрыфту.", "window.zoomLevel": { @@ -523,12 +523,12 @@ "renameSketchFolderTitle": "Хібная назва сцэнара" }, "versionWelcome": { - "cancelButton": "Maybe later", - "donateButton": "Donate now", - "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", - "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", - "title": "Welcome to a new version of the Arduino IDE!", - "titleWithVersion": "Welcome to the new Arduino IDE {0}!" + "cancelButton": "Можа, пазней", + "donateButton": "Ахвераваць зараз", + "donateMessage": "Arduino імкнецца захаваць праграмнае забеспячэнне бясплатным і з адкрытым зыходным кодам для ўсіх.\nВашыя ахвяраванні дапамагаюць нам распрацоўваць новыя функцыі, удасканальваць бібліятэкі і падтрымліваць мільёны карыстальнікаў па ўсім свеце.", + "donateMessage2": "Калі ласка, падумайце пра падтрымку нашай працы над бясплатнай Arduino IDE з адкрытым зыходным кодам.", + "title": "Сардэчна запрашаем у новую версію Arduino IDE!", + "titleWithVersion": "Сардэчна запрашаем у новае асяроддзе распрацоўкі Arduino IDE {0}!" }, "workspace": { "alreadyExists": "{0}' ужо існуе." diff --git a/i18n/da.json b/i18n/da.json index e6dbab0c0..b07fbd894 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -2,28 +2,28 @@ "arduino": { "about": { "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", - "label": "About {0}" + "label": "Om 1{0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToCloudEditor": "Gå til Cloud Editor", + "goToIoTCloud": "Gå til IoT Cloud", + "goToProfile": "Gå til Profil", "menuTitle": "Arduino Cloud" }, "board": { "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "boardDataReloaded": "Board data reloaded.", - "boardInfo": "Board Info", - "boards": "boards", - "configDialog1": "Select both a Board and a Port if you want to upload a sketch.", - "configDialog2": "If you only select a Board you will be able to compile, but not to upload your sketch.", - "couldNotFindPreviouslySelected": "Could not find previously selected board '{0}' in installed platform '{1}'. Please manually reselect the board you want to use. Do you want to reselect it now?", - "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}\"", + "boardConfigDialogTitle": "Vælg andet Board og Port", + "boardDataReloaded": "Board data genhentet", + "boardInfo": "Board info", + "boards": "Boards", + "configDialog1": "Vælg både et Board og en Port, hvis du ønsker at oploade en skitse", + "configDialog2": "Hvis du kun vælger et Board, vil du kunne kompilere, men ikke uploade din skitse.", + "couldNotFindPreviouslySelected": "Kunne ikke finde tidligere valgte board '1 {0}' i installerede platform '2 {1}'. Vælg venligst det board du ønsker at anvende. Ønsker du at vælge det nu?", + "editBoardsConfig": "Ret Board og Port...", + "getBoardInfo": "Hent Board info", + "inSketchbook": "(I skitsebog)", + "installNow": "\" 1 {0} 2 {1} \" kerne skal installeres for det nuværende valgte \" 3 {2}\" board. Vil du installere det nu?", + "noBoardsFound": "Intet board fundet for \" 1 {0} \"", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", "nonSerialPort": "Non-serial port, can't obtain info.", diff --git a/i18n/it.json b/i18n/it.json index 584a54e5b..85a4132c0 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -107,14 +107,14 @@ "options": "Opzioni...", "privateVisibility": "Privato. Solo tu potrai vedere lo sketch.", "profilePicture": "Immagine profilo", - "publicVisibility": "Pubblico. Chiunque abbia il link può vedere lo Sketch.", + "publicVisibility": "Pubblico. Chiunque abbia il link può vedere lo sketch.", "pull": "Richiedi", "pullFirst": "Nel Cloud devi prima effettuare il Pull per poi poter eseguire il Push.", - "pullSketch": "Richiedi lo Sketch", - "pullSketchMsg": "Richiedendo questo Sketch tramite il Cloud, lo stesso sovrascriverà quello presente in locale. Sei sicuro di dover continuare?", + "pullSketch": "Richiedi lo sketch", + "pullSketchMsg": "Richiedendo questo sketch tramite il cloud, lo stesso sovrascriverà quello presente in locale. Sei sicuro di voler continuare?", "push": "Push", - "pushSketch": "Invia lo Sketch", - "pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente puoi rendere lo sketch privato dal Pannello di Condivisione.", + "pushSketch": "Invia lo sketch", + "pushSketchMsg": "Questo è uno sketch pubblico. Prima di inviarlo, verifica che tutte le informazioni sensibili siano all'interno di arduino_secrets.h. Eventualmente, puoi rendere lo sketch privato dal pannello della condivisione.", "remote": "Remoto", "share": "Condividi...", "shareSketch": "Condividi sketch", @@ -123,8 +123,8 @@ "signInToCloud": "Effettua la registrazione su Arduino Cloud", "signOut": "Disconnetti", "sync": "Sincronizza", - "syncEditSketches": "Sincronizza e modifica la tua raccolta di Sketches sul Cloud Arduino", - "visitArduinoCloud": "Visita Arduino Cloud per creare Cloud Sketch " + "syncEditSketches": "Sincronizza e modifica la tua raccolta degli sketch sul cloud di Arduino", + "visitArduinoCloud": "Visita il cloud di Arduino per creare gli sketch." }, "cloudSketch": { "alreadyExists": "Lo sketch remoto '{0}' è già presente.", @@ -217,7 +217,7 @@ "debuggingNotSupported": "Il debug non è supportato da '{0}'", "getDebugInfo": "Acquisizione delle informazioni di debug in corso...", "noPlatformInstalledFor": "La piattaforma non è ancora stata installata per '{0}'", - "optimizeForDebugging": "Ottimizzato per il Debug.", + "optimizeForDebugging": "Ottimizzato per il debug", "sketchIsNotCompiled": "Lo sketch '{0}' deve essere verificato prima di avviare una sessione di debug. Verificare lo sketch e avviare nuovamente il debug. Si desidera verificare lo sketch adesso?" }, "developer": { @@ -385,7 +385,7 @@ "editorFontSize": "Dimensione del carattere dell'editor", "editorQuickSuggestions": "Suggerimenti rapidi dell'editor", "enterAdditionalURLs": "Aggiungi degli URLs aggiuntivi, uno per ogni riga", - "files.inside.sketches": "Mostra i file all'interno degli Sketch", + "files.inside.sketches": "Mostra i file all'interno degli sketch", "ide.updateBaseUrl": "L'URL base da cui scaricare gli aggiornamenti. Il valore predefinito è 'https://downloads.arduino.cc/arduino-ide'", "ide.updateChannel": "Canale di rilascio per le versioni aggiornate. 'stable' è per le versioni stabili, 'nightly' è per l'ultima versione in sviluppo.", "interfaceScale": "Scalabilità dell'interfaccia", @@ -448,7 +448,7 @@ "archiveSketch": "Archivia sketch", "cantOpen": "Una cartella di nome \"{0}\" esiste già. Impossibile aprire lo sketch.", "compile": "Compilazione dello sketch in corso...", - "configureAndUpload": "Configura e Carica", + "configureAndUpload": "Configura e carica", "createdArchive": "Creato l'archivio '{0}'.", "doneCompiling": "Compilazione completata.", "doneUploading": "Caricamento terminato.", @@ -466,12 +466,12 @@ "noTrailingPeriod": "Il nome di un file non può terminare con un punto", "openFolder": "Apri Cartella", "openRecent": "Apri recenti", - "openSketchInNewWindow": "Apri lo sketch in una Nuova Finestra", + "openSketchInNewWindow": "Apri lo sketch in una nuova finestra", "reservedFilename": "'{0}' è il nome di un file riservato.", "saveFolderAs": "Salva la cartella sketch come...", "saveSketch": "Salva il tuo sketch per riaprirlo in seguito.", "saveSketchAs": "Salva la cartella dello sketch come...", - "showFolder": "Mostra la cartella dello Sketch", + "showFolder": "Mostra la cartella dello sketch", "sketch": "Sketch", "sketchAlreadyContainsThisFileError": "Lo sketch contiene già un file denominato '{0}'", "sketchAlreadyContainsThisFileMessage": "Impossibile salvare lo sketch \"{0}\" come \"{1}\". {2}", @@ -479,7 +479,7 @@ "titleLocalSketchbook": "Cartella degli sketch locali", "titleSketchbook": "Sketchbook", "upload": "Carica", - "uploadUsingProgrammer": "Carica tramite Programmatore", + "uploadUsingProgrammer": "Carica tramite programmatore", "uploading": "Caricamento in corso...", "userFieldsNotFoundError": "Non è possibile trovare i campi utente per connettere la scheda", "verify": "Verifica", @@ -487,7 +487,7 @@ }, "sketchbook": { "newCloudSketch": "Nuovo sketch remoto", - "newSketch": "Nuovo Sketch" + "newSketch": "Nuovo sketch" }, "theme": { "currentThemeNotFound": "Impossibile trovare il tema attualmente selezionato: {0}. Arduino IDE ha selezionato un tema integrato compatibile con quello mancante.", From 2f0414a5a1c52c24e14b4d9972647b3a7e8426a5 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:58:47 +0700 Subject: [PATCH 383/384] fix: use `ElectronConnectionHandler` to connect ide updater services (#2697) --- .../arduino-electron-main-module.ts | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) 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 b6fd604e4..f1cd406ef 100644 --- a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts +++ b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts @@ -1,5 +1,5 @@ -import { ConnectionHandler } from '@theia/core/lib/common/messaging/handler'; -import { JsonRpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory'; +import { ElectronConnectionHandler } from '@theia/core/lib/electron-main/messaging/electron-connection-handler'; +import { RpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory'; import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service'; import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main'; import { @@ -33,18 +33,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(IDEUpdaterImpl).toSelf().inSingletonScope(); bind(IDEUpdater).toService(IDEUpdaterImpl); bind(ElectronMainApplicationContribution).toService(IDEUpdater); - bind(ConnectionHandler) + bind(ElectronConnectionHandler) .toDynamicValue( (context) => - new JsonRpcConnectionHandler<IDEUpdaterClient>( - IDEUpdaterPath, - (client) => { - const server = context.container.get<IDEUpdater>(IDEUpdater); - server.setClient(client); - client.onDidCloseConnection(() => server.disconnectClient(client)); - return server; - } - ) + new RpcConnectionHandler<IDEUpdaterClient>(IDEUpdaterPath, (client) => { + const server = context.container.get<IDEUpdater>(IDEUpdater); + server.setClient(client); + client.onDidCloseConnection(() => server.disconnectClient(client)); + return server; + }) ) .inSingletonScope(); From 0f9f0d07b7d5ff0cdefda3e77eb6b5ce2854c4a8 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 9 Apr 2025 19:48:50 +0700 Subject: [PATCH 384/384] chore: switch to version 2.3.7 after the release (#2701) --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3d478a88e..ff9a09eff 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.6", + "version": "2.3.7", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 6a31d222a..774fe56bc 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.6", + "version": "2.3.7", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.57.0", "@theia/terminal": "1.57.0", "@theia/workspace": "1.57.0", - "arduino-ide-extension": "2.3.6" + "arduino-ide-extension": "2.3.7" }, "devDependencies": { "@theia/cli": "1.57.0", diff --git a/package.json b/package.json index f71303a0d..8b5356b49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.6", + "version": "2.3.7", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA",